Compare commits
5 Commits
Author | SHA1 | Date |
---|---|---|
Matt Mascarenhas | 14dafa4abe | |
Matt Mascarenhas | 213bb2f882 | |
Matt Mascarenhas | 77aec74483 | |
Matt Mascarenhas | 6852d06e04 | |
Matt Mascarenhas | 52d6d989f8 |
225
cinera/cinera.c
225
cinera/cinera.c
|
@ -23,7 +23,7 @@ typedef struct
|
||||||
version CINERA_APP_VERSION = {
|
version CINERA_APP_VERSION = {
|
||||||
.Major = 0,
|
.Major = 0,
|
||||||
.Minor = 10,
|
.Minor = 10,
|
||||||
.Patch = 27
|
.Patch = 30
|
||||||
};
|
};
|
||||||
|
|
||||||
#define __USE_XOPEN2K8 // NOTE(matt): O_NOFOLLOW
|
#define __USE_XOPEN2K8 // NOTE(matt): O_NOFOLLOW
|
||||||
|
@ -903,8 +903,8 @@ FreeBook(memory_book *M)
|
||||||
void
|
void
|
||||||
FreeAndReinitialiseBook(memory_book *M)
|
FreeAndReinitialiseBook(memory_book *M)
|
||||||
{
|
{
|
||||||
int PageSize = M->PageSize;
|
uint64_t PageSize = M->PageSize;
|
||||||
int DataWidthInBytes = M->DataWidthInBytes;
|
uint64_t DataWidthInBytes = M->DataWidthInBytes;
|
||||||
|
|
||||||
FreeBook(M);
|
FreeBook(M);
|
||||||
|
|
||||||
|
@ -4172,6 +4172,68 @@ LogEdit(edit_type_id EditType, string Lineage, string EntryID, string *EntryTitl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CINERA_HSL_TRANSPARENT_HUE 65535
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int Hue:16;
|
||||||
|
unsigned int Saturation:8;
|
||||||
|
unsigned int Lightness:8;
|
||||||
|
} hsl_colour;
|
||||||
|
|
||||||
|
hsl_colour
|
||||||
|
CharToColour(char Char)
|
||||||
|
{
|
||||||
|
hsl_colour Colour;
|
||||||
|
if(Char >= 'a' && Char <= 'z')
|
||||||
|
{
|
||||||
|
Colour.Hue = (((float)Char - 'a') / ('z' - 'a') * 360);
|
||||||
|
Colour.Saturation = (((float)Char - 'a') / ('z' - 'a') * 26 + 74);
|
||||||
|
}
|
||||||
|
else if(Char >= 'A' && Char <= 'Z')
|
||||||
|
{
|
||||||
|
Colour.Hue = (((float)Char - 'A') / ('Z' - 'A') * 360);
|
||||||
|
Colour.Saturation = (((float)Char - 'A') / ('Z' - 'A') * 26 + 74);
|
||||||
|
}
|
||||||
|
else if(Char >= '0' && Char <= '9')
|
||||||
|
{
|
||||||
|
Colour.Hue = (((float)Char - '0') / ('9' - '0') * 360);
|
||||||
|
Colour.Saturation = (((float)Char - '0') / ('9' - '0') * 26 + 74);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Colour.Hue = 180;
|
||||||
|
Colour.Saturation = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Colour;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StringToColourHash(hsl_colour *Colour, string String)
|
||||||
|
{
|
||||||
|
Colour->Hue = 0;
|
||||||
|
Colour->Saturation = 0;
|
||||||
|
Colour->Lightness = 74;
|
||||||
|
|
||||||
|
for(int i = 0; i < String.Length; ++i)
|
||||||
|
{
|
||||||
|
Colour->Hue += CharToColour(String.Base[i]).Hue;
|
||||||
|
Colour->Saturation += CharToColour(String.Base[i]).Saturation;
|
||||||
|
}
|
||||||
|
|
||||||
|
Colour->Hue = Colour->Hue % 360;
|
||||||
|
Colour->Saturation = Colour->Saturation % 26 + 74;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
IsValidHSLColour(hsl_colour Colour)
|
||||||
|
{
|
||||||
|
return (Colour.Hue >= 0 && Colour.Hue < 360)
|
||||||
|
&& (Colour.Saturation >= 0 && Colour.Saturation <= 100)
|
||||||
|
&& (Colour.Lightness >= 0 && Colour.Lightness <= 100);
|
||||||
|
}
|
||||||
|
|
||||||
#define SLASH 1
|
#define SLASH 1
|
||||||
#define NULLTERM 1
|
#define NULLTERM 1
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -4326,6 +4388,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
string Marker;
|
string Marker;
|
||||||
string WrittenText;
|
string WrittenText;
|
||||||
|
hsl_colour Colour;
|
||||||
} category_info;
|
} category_info;
|
||||||
|
|
||||||
#define CopyString(Dest, DestSize, Format, ...) CopyString_(__LINE__, (Dest), (DestSize), (Format), ##__VA_ARGS__)
|
#define CopyString(Dest, DestSize, Format, ...) CopyString_(__LINE__, (Dest), (DestSize), (Format), ##__VA_ARGS__)
|
||||||
|
@ -4720,18 +4783,16 @@ typedef struct
|
||||||
bool Resolving;
|
bool Resolving;
|
||||||
} clash_resolver;
|
} clash_resolver;
|
||||||
|
|
||||||
clash_resolver
|
void
|
||||||
InitClashResolver(void)
|
InitClashResolver(clash_resolver *ClashResolver)
|
||||||
{
|
{
|
||||||
clash_resolver Result = {};
|
ClashResolver->Book[0] = InitBook(sizeof(clash_entry), 8);
|
||||||
Result.Book[0] = InitBook(sizeof(clash_entry), 8);
|
ClashResolver->Book[1] = InitBook(sizeof(clash_entry), 8);
|
||||||
Result.Book[1] = InitBook(sizeof(clash_entry), 8);
|
ClashResolver->Main = &ClashResolver->Book[0];
|
||||||
Result.Main = &Result.Book[0];
|
ClashResolver->Holder = &ClashResolver->Book[1];
|
||||||
Result.Holder = &Result.Book[1];
|
ClashResolver->Chain = InitBookOfPointers(8);
|
||||||
Result.Chain = InitBookOfPointers(8);
|
ClashResolver->ChainStructure = CS_OPEN_ENDED;
|
||||||
Result.ChainStructure = CS_OPEN_ENDED;
|
ClashResolver->Resolving = FALSE;
|
||||||
Result.Resolving = FALSE;
|
|
||||||
return Result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -5481,58 +5542,6 @@ TimecodeToDottedSeconds(v4 Timecode)
|
||||||
return (float)Timecode.Hours * SECONDS_PER_HOUR + (float)Timecode.Minutes * SECONDS_PER_MINUTE + (float)Timecode.Seconds + (float)Timecode.Milliseconds / 1000;
|
return (float)Timecode.Hours * SECONDS_PER_HOUR + (float)Timecode.Minutes * SECONDS_PER_MINUTE + (float)Timecode.Seconds + (float)Timecode.Milliseconds / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned int Hue:16;
|
|
||||||
unsigned int Saturation:8;
|
|
||||||
unsigned int Lightness:8;
|
|
||||||
} hsl_colour;
|
|
||||||
|
|
||||||
hsl_colour
|
|
||||||
CharToColour(char Char)
|
|
||||||
{
|
|
||||||
hsl_colour Colour;
|
|
||||||
if(Char >= 'a' && Char <= 'z')
|
|
||||||
{
|
|
||||||
Colour.Hue = (((float)Char - 'a') / ('z' - 'a') * 360);
|
|
||||||
Colour.Saturation = (((float)Char - 'a') / ('z' - 'a') * 26 + 74);
|
|
||||||
}
|
|
||||||
else if(Char >= 'A' && Char <= 'Z')
|
|
||||||
{
|
|
||||||
Colour.Hue = (((float)Char - 'A') / ('Z' - 'A') * 360);
|
|
||||||
Colour.Saturation = (((float)Char - 'A') / ('Z' - 'A') * 26 + 74);
|
|
||||||
}
|
|
||||||
else if(Char >= '0' && Char <= '9')
|
|
||||||
{
|
|
||||||
Colour.Hue = (((float)Char - '0') / ('9' - '0') * 360);
|
|
||||||
Colour.Saturation = (((float)Char - '0') / ('9' - '0') * 26 + 74);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Colour.Hue = 180;
|
|
||||||
Colour.Saturation = 50;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Colour;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
StringToColourHash(hsl_colour *Colour, string String)
|
|
||||||
{
|
|
||||||
Colour->Hue = 0;
|
|
||||||
Colour->Saturation = 0;
|
|
||||||
Colour->Lightness = 74;
|
|
||||||
|
|
||||||
for(int i = 0; i < String.Length; ++i)
|
|
||||||
{
|
|
||||||
Colour->Hue += CharToColour(String.Base[i]).Hue;
|
|
||||||
Colour->Saturation += CharToColour(String.Base[i]).Saturation;
|
|
||||||
}
|
|
||||||
|
|
||||||
Colour->Hue = Colour->Hue % 360;
|
|
||||||
Colour->Saturation = Colour->Saturation % 26 + 74;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
SanitisePunctuation(char *String)
|
SanitisePunctuation(char *String)
|
||||||
{
|
{
|
||||||
|
@ -8102,7 +8111,7 @@ BuildCredits(string HMMLFilepath, buffer *CreditsMenu, HMML_VideoMetaData *Metad
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_info) *LocalTopics, _memory_book(category_info) *GlobalMedia, _memory_book(category_info) *LocalMedia, string Marker)
|
InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_info) *LocalTopics, _memory_book(category_info) *GlobalMedia, _memory_book(category_info) *LocalMedia, string Marker, hsl_colour *Colour)
|
||||||
{
|
{
|
||||||
medium *Medium = GetMediumFromProject(CurrentProject, Marker);
|
medium *Medium = GetMediumFromProject(CurrentProject, Marker);
|
||||||
|
|
||||||
|
@ -8203,11 +8212,15 @@ InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_
|
||||||
{
|
{
|
||||||
category_info *Src = GetPlaceInBook(LocalTopics, CategoryCount - 1);
|
category_info *Src = GetPlaceInBook(LocalTopics, CategoryCount - 1);
|
||||||
category_info *Dest = GetPlaceInBook(LocalTopics, CategoryCount);
|
category_info *Dest = GetPlaceInBook(LocalTopics, CategoryCount);
|
||||||
Dest->Marker = Src->Marker;
|
*Dest = *Src;
|
||||||
}
|
}
|
||||||
|
|
||||||
category_info *New = GetPlaceInBook(LocalTopics, CategoryCount);
|
category_info *New = GetPlaceInBook(LocalTopics, CategoryCount);
|
||||||
New->Marker = Marker;
|
New->Marker = Marker;
|
||||||
|
if(Colour)
|
||||||
|
{
|
||||||
|
New->Colour = *Colour;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8218,6 +8231,10 @@ InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_
|
||||||
{
|
{
|
||||||
category_info *New = GetPlaceInBook(LocalTopics, TopicIndex);
|
category_info *New = GetPlaceInBook(LocalTopics, TopicIndex);
|
||||||
New->Marker = Marker;
|
New->Marker = Marker;
|
||||||
|
if(Colour)
|
||||||
|
{
|
||||||
|
New->Colour = *Colour;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MadeGlobalSpace = FALSE;
|
bool MadeGlobalSpace = FALSE;
|
||||||
|
@ -8241,11 +8258,15 @@ InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_
|
||||||
{
|
{
|
||||||
category_info *Src = GetPlaceInBook(GlobalTopics, CategoryCount - 1);
|
category_info *Src = GetPlaceInBook(GlobalTopics, CategoryCount - 1);
|
||||||
category_info *Dest = GetPlaceInBook(GlobalTopics, CategoryCount);
|
category_info *Dest = GetPlaceInBook(GlobalTopics, CategoryCount);
|
||||||
Dest->Marker = Src->Marker;
|
*Dest = *Src;
|
||||||
}
|
}
|
||||||
|
|
||||||
category_info *New = GetPlaceInBook(GlobalTopics, CategoryCount);
|
category_info *New = GetPlaceInBook(GlobalTopics, CategoryCount);
|
||||||
New->Marker = Marker;
|
New->Marker = Marker;
|
||||||
|
if(Colour)
|
||||||
|
{
|
||||||
|
New->Colour = *Colour;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8257,6 +8278,10 @@ InsertCategory(_memory_book(category_info) *GlobalTopics, _memory_book(category_
|
||||||
{
|
{
|
||||||
category_info *New = GetPlaceInBook(GlobalTopics, TopicIndex);
|
category_info *New = GetPlaceInBook(GlobalTopics, TopicIndex);
|
||||||
New->Marker = Marker;
|
New->Marker = Marker;
|
||||||
|
if(Colour)
|
||||||
|
{
|
||||||
|
New->Colour = *Colour;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8348,9 +8373,18 @@ BuildCategoryIcons(buffer *CategoryIcons, _memory_book(category_info) *LocalTopi
|
||||||
CopyString(SanitisedMarker, sizeof(SanitisedMarker), "%.*s", (int)This->Marker.Length, This->Marker.Base);
|
CopyString(SanitisedMarker, sizeof(SanitisedMarker), "%.*s", (int)This->Marker.Length, This->Marker.Base);
|
||||||
SanitisePunctuation(SanitisedMarker);
|
SanitisePunctuation(SanitisedMarker);
|
||||||
|
|
||||||
CopyStringToBuffer(CategoryIcons, "<div title=\"%.*s\" class=\"category %s\"></div>",
|
CopyStringToBuffer(CategoryIcons,
|
||||||
|
"<div title=\"%.*s\" class=\"category %s\"",
|
||||||
(int)This->Marker.Length, This->Marker.Base,
|
(int)This->Marker.Length, This->Marker.Base,
|
||||||
SanitisedMarker);
|
SanitisedMarker);
|
||||||
|
if(IsValidHSLColour(This->Colour))
|
||||||
|
{
|
||||||
|
CopyStringToBuffer(CategoryIcons,
|
||||||
|
" data-hue=\"%u\" data-saturation=\"%u%%\"",
|
||||||
|
This->Colour.Hue, This->Colour.Saturation);
|
||||||
|
}
|
||||||
|
CopyStringToBuffer(CategoryIcons,
|
||||||
|
"></div>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8630,7 +8664,7 @@ BuildQuote(memory_book *Strings, quote_info *Info, string Speaker, int ID, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
rc
|
rc
|
||||||
GenerateTopicColours(neighbourhood *N, string Topic)
|
GenerateTopicColours(neighbourhood *N, string Topic, hsl_colour *Dest)
|
||||||
{
|
{
|
||||||
rc Result = RC_SUCCESS;
|
rc Result = RC_SUCCESS;
|
||||||
// NOTE(matt): Stack-string
|
// NOTE(matt): Stack-string
|
||||||
|
@ -8641,6 +8675,15 @@ GenerateTopicColours(neighbourhood *N, string Topic)
|
||||||
medium *Medium = GetMediumFromProject(CurrentProject, Topic);
|
medium *Medium = GetMediumFromProject(CurrentProject, Topic);
|
||||||
if(!Medium)
|
if(!Medium)
|
||||||
{
|
{
|
||||||
|
if(StringsMatch(Topic, Wrap0("nullTopic")))
|
||||||
|
{
|
||||||
|
Dest->Hue = CINERA_HSL_TRANSPARENT_HUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringToColourHash(Dest, Topic);
|
||||||
|
}
|
||||||
|
|
||||||
file Topics = {};
|
file Topics = {};
|
||||||
Topics.Path = 0;
|
Topics.Path = 0;
|
||||||
Topics.Buffer.ID = BID_TOPICS;
|
Topics.Buffer.ID = BID_TOPICS;
|
||||||
|
@ -8706,10 +8749,8 @@ GenerateTopicColours(neighbourhood *N, string Topic)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hsl_colour Colour;
|
|
||||||
StringToColourHash(&Colour, Topic);
|
|
||||||
WriteToFile(Topics.Handle, ".category.%s { border: 1px solid hsl(%d, %d%%, %d%%); background: hsl(%d, %d%%, %d%%); }\n",
|
WriteToFile(Topics.Handle, ".category.%s { border: 1px solid hsl(%d, %d%%, %d%%); background: hsl(%d, %d%%, %d%%); }\n",
|
||||||
SanitisedTopic, Colour.Hue, Colour.Saturation, Colour.Lightness, Colour.Hue, Colour.Saturation, Colour.Lightness);
|
SanitisedTopic, Dest->Hue, Dest->Saturation, Dest->Lightness, Dest->Hue, Dest->Saturation, Dest->Lightness);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG_MEM
|
#if DEBUG_MEM
|
||||||
|
@ -10899,7 +10940,7 @@ ProcessTimestamp(buffers *CollationBuffers, neighbourhood *N, string Filepath, m
|
||||||
{
|
{
|
||||||
*HasFilterMenu = TRUE;
|
*HasFilterMenu = TRUE;
|
||||||
}
|
}
|
||||||
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0("authored"));
|
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0("authored"), NULL);
|
||||||
hsl_colour AuthorColour;
|
hsl_colour AuthorColour;
|
||||||
StringToColourHash(&AuthorColour, Author);
|
StringToColourHash(&AuthorColour, Author);
|
||||||
// TODO(matt): That EDITION_NETWORK site database API-polling stuff
|
// TODO(matt): That EDITION_NETWORK site database API-polling stuff
|
||||||
|
@ -10924,14 +10965,15 @@ ProcessTimestamp(buffers *CollationBuffers, neighbourhood *N, string Filepath, m
|
||||||
HMML_MarkerType Type = Timestamp->markers[MarkerIndex].type;
|
HMML_MarkerType Type = Timestamp->markers[MarkerIndex].type;
|
||||||
if(Type == HMML_CATEGORY)
|
if(Type == HMML_CATEGORY)
|
||||||
{
|
{
|
||||||
Result = GenerateTopicColours(N, Wrap0(Timestamp->markers[MarkerIndex].marker));
|
hsl_colour TopicColour = {};
|
||||||
|
Result = GenerateTopicColours(N, Wrap0(Timestamp->markers[MarkerIndex].marker), &TopicColour);
|
||||||
if(Result == RC_SUCCESS)
|
if(Result == RC_SUCCESS)
|
||||||
{
|
{
|
||||||
if(!*HasFilterMenu)
|
if(!*HasFilterMenu)
|
||||||
{
|
{
|
||||||
*HasFilterMenu = TRUE;
|
*HasFilterMenu = TRUE;
|
||||||
}
|
}
|
||||||
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0(Timestamp->markers[MarkerIndex].marker));
|
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0(Timestamp->markers[MarkerIndex].marker), &TopicColour);
|
||||||
CopyStringToBuffer(&IndexBuffers->Text, "%.*s", (int)StringLength(Readable), InPtr);
|
CopyStringToBuffer(&IndexBuffers->Text, "%.*s", (int)StringLength(Readable), InPtr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -11162,14 +11204,15 @@ ProcessTimestamp(buffers *CollationBuffers, neighbourhood *N, string Filepath, m
|
||||||
|
|
||||||
while(MarkerIndex < Timestamp->marker_count)
|
while(MarkerIndex < Timestamp->marker_count)
|
||||||
{
|
{
|
||||||
Result = GenerateTopicColours(N, Wrap0(Timestamp->markers[MarkerIndex].marker));
|
hsl_colour TopicColour = {};
|
||||||
|
Result = GenerateTopicColours(N, Wrap0(Timestamp->markers[MarkerIndex].marker), &TopicColour);
|
||||||
if(Result == RC_SUCCESS)
|
if(Result == RC_SUCCESS)
|
||||||
{
|
{
|
||||||
if(!*HasFilterMenu)
|
if(!*HasFilterMenu)
|
||||||
{
|
{
|
||||||
*HasFilterMenu = TRUE;
|
*HasFilterMenu = TRUE;
|
||||||
}
|
}
|
||||||
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0(Timestamp->markers[MarkerIndex].marker));
|
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0(Timestamp->markers[MarkerIndex].marker), &TopicColour);
|
||||||
++MarkerIndex;
|
++MarkerIndex;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -11182,10 +11225,11 @@ ProcessTimestamp(buffers *CollationBuffers, neighbourhood *N, string Filepath, m
|
||||||
{
|
{
|
||||||
if(LocalTopics.ItemCount == 0)
|
if(LocalTopics.ItemCount == 0)
|
||||||
{
|
{
|
||||||
Result = GenerateTopicColours(N, Wrap0("nullTopic"));
|
hsl_colour TopicColour = {};
|
||||||
|
Result = GenerateTopicColours(N, Wrap0("nullTopic"), &TopicColour);
|
||||||
if(Result == RC_SUCCESS)
|
if(Result == RC_SUCCESS)
|
||||||
{
|
{
|
||||||
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0("nullTopic"));
|
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, Wrap0("nullTopic"), &TopicColour);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11193,7 +11237,7 @@ ProcessTimestamp(buffers *CollationBuffers, neighbourhood *N, string Filepath, m
|
||||||
{
|
{
|
||||||
if(LocalMedia.ItemCount == 0)
|
if(LocalMedia.ItemCount == 0)
|
||||||
{
|
{
|
||||||
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, DefaultMedium->ID);
|
InsertCategory(Topics, &LocalTopics, Media, &LocalMedia, DefaultMedium->ID, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildTimestampClass(&IndexBuffers->Class, &LocalTopics, &LocalMedia, DefaultMedium->ID);
|
BuildTimestampClass(&IndexBuffers->Class, &LocalTopics, &LocalMedia, DefaultMedium->ID);
|
||||||
|
@ -11992,12 +12036,20 @@ HMMLToBuffers(buffers *CollationBuffers, template *BespokeTemplate, string BaseF
|
||||||
bool NullTopic = StringsMatch(This->Marker, Wrap0("nullTopic"));
|
bool NullTopic = StringsMatch(This->Marker, Wrap0("nullTopic"));
|
||||||
CopyStringToBuffer(&MenuBuffers.FilterTopics,
|
CopyStringToBuffer(&MenuBuffers.FilterTopics,
|
||||||
" <div%s class=\"filter_content %s\">\n"
|
" <div%s class=\"filter_content %s\">\n"
|
||||||
" <span class=\"icon category %s\"></span><span class=\"cineraText\">%.*s</span>\n"
|
" <span class=\"icon category %s\"",
|
||||||
" </div>\n",
|
|
||||||
|
|
||||||
NullTopic ? " title=\"Timestamps that don't fit into the above topic(s) may be filtered using this pseudo-topic\"" : "",
|
NullTopic ? " title=\"Timestamps that don't fit into the above topic(s) may be filtered using this pseudo-topic\"" : "",
|
||||||
SanitisedMarker,
|
SanitisedMarker,
|
||||||
SanitisedMarker,
|
SanitisedMarker);
|
||||||
|
if(IsValidHSLColour(This->Colour))
|
||||||
|
{
|
||||||
|
CopyStringToBuffer(&MenuBuffers.FilterTopics,
|
||||||
|
" data-hue=\"%u\" data-saturation=\"%u%%\"",
|
||||||
|
This->Colour.Hue, This->Colour.Saturation);
|
||||||
|
}
|
||||||
|
CopyStringToBuffer(&MenuBuffers.FilterTopics,
|
||||||
|
"></span><span class=\"cineraText\">%.*s</span>\n"
|
||||||
|
" </div>\n",
|
||||||
NullTopic ? (int)sizeof("(null topic)")-1 : (int)This->Marker.Length,
|
NullTopic ? (int)sizeof("(null topic)")-1 : (int)This->Marker.Length,
|
||||||
NullTopic ? "(null topic)" : This->Marker.Base);
|
NullTopic ? "(null topic)" : This->Marker.Base);
|
||||||
}
|
}
|
||||||
|
@ -18271,7 +18323,8 @@ main(int ArgC, char **Args)
|
||||||
CollationBuffers.Search.ID = BID_COLLATION_BUFFERS_SEARCH; // NOTE(matt): Allocated by SearchToBuffer()
|
CollationBuffers.Search.ID = BID_COLLATION_BUFFERS_SEARCH; // NOTE(matt): Allocated by SearchToBuffer()
|
||||||
|
|
||||||
memory_book TokensList = InitBook(sizeof(tokens), 8);
|
memory_book TokensList = InitBook(sizeof(tokens), 8);
|
||||||
clash_resolver ClashResolver = InitClashResolver();
|
clash_resolver ClashResolver = {};
|
||||||
|
InitClashResolver(&ClashResolver);
|
||||||
template BespokeTemplate = {};
|
template BespokeTemplate = {};
|
||||||
neighbourhood Neighbourhood = {};
|
neighbourhood Neighbourhood = {};
|
||||||
|
|
||||||
|
|
|
@ -65,3 +65,12 @@ document.addEventListener("keydown", function(ev) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener("fullscreenchange", function() {
|
||||||
|
if(!document.fullscreenElement && CineraProps.V == views.SUPERTHEATRE)
|
||||||
|
{
|
||||||
|
CineraProps.V = views.THEATRE;
|
||||||
|
localStorage.setItem(player.cineraViewStorageItem, views.THEATRE);
|
||||||
|
player.updateSize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -1554,10 +1554,11 @@ Player.prototype.updateLink = function()
|
||||||
} break;
|
} break;
|
||||||
case vod_platform.VIMEO:
|
case vod_platform.VIMEO:
|
||||||
{
|
{
|
||||||
|
var Parent = this;
|
||||||
this.platformPlayer.getCurrentTime()
|
this.platformPlayer.getCurrentTime()
|
||||||
.then(function(Response)
|
.then(function(Response)
|
||||||
{
|
{
|
||||||
this.link.value = baseURL + "#" + Math.round(Response);
|
Parent.link.value = baseURL + "#" + Math.round(Response);
|
||||||
});
|
});
|
||||||
} break;
|
} break;
|
||||||
case vod_platform.YOUTUBE:
|
case vod_platform.YOUTUBE:
|
||||||
|
@ -1630,6 +1631,7 @@ Player.prototype.toggleMenuVisibility = function(MenuID, Trigger) {
|
||||||
if(element.classList.contains("visible"))
|
if(element.classList.contains("visible"))
|
||||||
{
|
{
|
||||||
HideMenu(element);
|
HideMenu(element);
|
||||||
|
this.MenusFocused.MenuID = menu_id.UNSET;
|
||||||
|
|
||||||
if(Trigger == trigger_id.KEYBOARD && this.Menus[menu_id.MARKERS].Item.LastFocused)
|
if(Trigger == trigger_id.KEYBOARD && this.Menus[menu_id.MARKERS].Item.LastFocused)
|
||||||
{
|
{
|
||||||
|
|
|
@ -551,35 +551,6 @@ BindHelp(Button, DocumentationContainer)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function RGBtoHSL(colour)
|
|
||||||
{
|
|
||||||
var rgb = colour.slice(4, -1).split(", ");
|
|
||||||
var red = rgb[0];
|
|
||||||
var green = rgb[1];
|
|
||||||
var blue = rgb[2];
|
|
||||||
var min = Math.min(red, green, blue);
|
|
||||||
var max = Math.max(red, green, blue);
|
|
||||||
var chroma = max - min;
|
|
||||||
var hue = 0;
|
|
||||||
if(max == red)
|
|
||||||
{
|
|
||||||
hue = ((green - blue) / chroma) % 6;
|
|
||||||
}
|
|
||||||
else if(max == green)
|
|
||||||
{
|
|
||||||
hue = ((blue - red) / chroma) + 2;
|
|
||||||
}
|
|
||||||
else if(max == blue)
|
|
||||||
{
|
|
||||||
hue = ((red - green) / chroma) + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
var saturation = chroma / 255 * 100;
|
|
||||||
hue = (hue * 60) < 0 ? 360 + (hue * 60) : (hue * 60);
|
|
||||||
|
|
||||||
return [hue, saturation]
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBackgroundColourRGB(element) {
|
function getBackgroundColourRGB(element) {
|
||||||
var Colour = getComputedStyle(element).getPropertyValue("background-color");
|
var Colour = getComputedStyle(element).getPropertyValue("background-color");
|
||||||
var depth = 0;
|
var depth = 0;
|
||||||
|
@ -610,6 +581,8 @@ function setTextLightness(textElement)
|
||||||
{
|
{
|
||||||
var textHue = textElement.getAttribute("data-hue");
|
var textHue = textElement.getAttribute("data-hue");
|
||||||
var textSaturation = textElement.getAttribute("data-saturation");
|
var textSaturation = textElement.getAttribute("data-saturation");
|
||||||
|
if(textHue && textSaturation)
|
||||||
|
{
|
||||||
if(getBackgroundBrightness(textElement.parentNode) < 127)
|
if(getBackgroundBrightness(textElement.parentNode) < 127)
|
||||||
{
|
{
|
||||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 76%)");
|
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 76%)");
|
||||||
|
@ -619,19 +592,23 @@ function setTextLightness(textElement)
|
||||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 24%)");
|
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 24%)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function setDotLightness(topicDot)
|
function setDotLightness(topicDot)
|
||||||
{
|
{
|
||||||
var Hue = RGBtoHSL(getComputedStyle(topicDot).getPropertyValue("background-color"))[0];
|
var dotHue = topicDot.getAttribute("data-hue");
|
||||||
var Saturation = RGBtoHSL(getComputedStyle(topicDot).getPropertyValue("background-color"))[1];
|
var dotSaturation = topicDot.getAttribute("data-saturation");
|
||||||
|
if(dotHue && dotSaturation)
|
||||||
|
{
|
||||||
if(getBackgroundBrightness(topicDot.parentNode) < 127)
|
if(getBackgroundBrightness(topicDot.parentNode) < 127)
|
||||||
{
|
{
|
||||||
topicDot.style.backgroundColor = ("hsl(" + Hue + ", " + Saturation + "%, 76%)");
|
topicDot.style.backgroundColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 76%)");
|
||||||
topicDot.style.borderColor = ("hsl(" + Hue + ", " + Saturation + "%, 76%)");
|
topicDot.style.borderColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 76%)");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
topicDot.style.backgroundColor = ("hsl(" + Hue + ", " + Saturation + "%, 47%)");
|
topicDot.style.backgroundColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 47%)");
|
||||||
topicDot.style.borderColor = ("hsl(" + Hue + ", " + Saturation + "%, 47%)");
|
topicDot.style.borderColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 47%)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue