Implemented hex color font coloring.

pull/28/head
sigonasr2 1 year ago
parent 88a239cd91
commit df1d9771aa
  1. 22
      Crawler/State_GameRun.cpp
  2. 1
      Crawler/State_GameRun.h
  3. 2
      Crawler/Version.h
  4. 113
      Crawler/olcPGEX_TTF.h
  5. 142
      Crawler/olcPixelGameEngine.h

@ -50,7 +50,7 @@ void State_GameRun::OnStateChange(GameState*prevState){
Menu::CloseAllMenus();
}
game->GetPlayer()->SetState(State::NORMAL);
};
}
void State_GameRun::OnUserUpdate(Crawler*game){
game->bossDisplayTimer=std::max(0.f,game->bossDisplayTimer-game->GetElapsedTime());
if(game->encounterStarted&&game->totalBossEncounterMobs>0){
@ -72,7 +72,23 @@ void State_GameRun::OnUserUpdate(Crawler*game){
ItemDrop::UpdateDrops(game->GetElapsedTime());
game->UpdateBullets(game->GetElapsedTime());
game->UpdateCamera(game->GetElapsedTime());
};
}
void State_GameRun::Draw(Crawler*game){
game->RenderHud();
};
//FontTest(); //Enable to test font coloring.
}
void State_GameRun::FontTest(){
game->DrawStringDecal({8,8},"#000000This is a #000066test of hex");
game->DrawStringDecal({8,16},"#FF0000This is a #BFA6F9test of hex");
game->DrawStringDecal({8,24},"#00FF00This is a #E9A6F9test of hex");
game->DrawStringDecal({8,32},"#0000FFThis is a #F9E8A6test of hex");
game->DrawShadowStringDecal({8,40},"#000000This is a #000066test of hex");
game->DrawShadowStringDecal({8,48},"#FF0000This is a #BFA6F9test of hex");
game->DrawShadowStringDecal({8,56},"#00FF00This is a #E9A6F9test of hex");
game->DrawShadowStringDecal({8,64},"#0000FFThis is a #F9E8A6test of hex");
game->DrawShadowStringDecal(VisualNovel::font,{8,72},U"#000000This is a #000066test of hex");
game->DrawShadowStringDecal(VisualNovel::font,{8,80},U"#FF0000This is a #BFA6F9test of hex");
game->DrawShadowStringDecal(VisualNovel::font,{8,88},U"#00FF00This is a #E9A6F9test of hex");
game->DrawShadowStringDecal(VisualNovel::font,{8,96},U"#0000FFThis is a #F9E8A6test of hex");
}

@ -42,4 +42,5 @@ class State_GameRun:public GameState{
virtual void OnStateChange(GameState*prevState)override final;
virtual void OnUserUpdate(Crawler*game)override final;
virtual void Draw(Crawler*game)override final;
void FontTest();
};

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 0
#define VERSION_MINOR 2
#define VERSION_PATCH 1
#define VERSION_BUILD 3570
#define VERSION_BUILD 3591
#define stringify(a) stringify_(a)
#define stringify_(a) #a

@ -95,79 +95,6 @@ namespace olc {
return *this;
}
void DrawString(std::u32string string, int x, int y,
olc::Pixel color = olc::BLACK, float angle = 0.0f) {
FT_Matrix rotMat;
rotMat.xx = (FT_Fixed)(std::cos(angle) * 0x10000L);
rotMat.xy = (FT_Fixed)(-std::sin(angle) * 0x10000L);
rotMat.yx = (FT_Fixed)(std::sin(angle) * 0x10000L);
rotMat.yy = (FT_Fixed)(std::cos(angle) * 0x10000L);
FT_Vector pen;
pen.x = x * 64;
pen.y = (pge->ScreenHeight() - y) * 64;
olc::Pixel::Mode prevMode = pge->GetPixelMode();
pge->SetPixelMode(olc::Pixel::ALPHA);
Font *prevToUse = nullptr;
for (size_t i = 0; i < string.size(); i++) {
char32_t chr = string[i];
if(chr=='\r')continue;
Font *toUse = this;
FT_UInt chrIndex = GetCharIndex(chr);
if (chrIndex == 0) {
for (auto &font : fallbacks) {
FT_UInt fbChr = font.GetCharIndex(chr);
if (fbChr != 0) {
chrIndex = fbChr;
toUse = &font;
}
}
}
if (prevToUse == toUse) {
FT_Vector kern;
FT_Get_Kerning(fontFace, string[i - 1], chr,
FT_KERNING_DEFAULT, &kern);
pen.x += kern.x;
pen.y += kern.y;
}
FT_Set_Transform(toUse->fontFace, &rotMat, &pen);
FT_Error error = FT_Load_Char(toUse->fontFace, chr,
FT_LOAD_RENDER | FT_LOAD_COLOR);
FT_Bitmap bmp = toUse->fontFace->glyph->bitmap;
FT_GlyphSlot slot = toUse->fontFace->glyph;
pen.x += toUse->fontFace->glyph->advance.x;
pen.y += toUse->fontFace->glyph->advance.y;
if(chr=='\n'){
int scaled_line_spacing = fontFace->size->metrics.height;
pen.y -=scaled_line_spacing;
pen.x=x*64;
} else {
DrawBitmap(slot->bitmap_left,
pge->ScreenHeight() - slot->bitmap_top, bmp, color);
}
prevToUse = toUse;
}
pge->SetPixelMode(prevMode);
}
void DrawString(std::u32string string, olc::vi2d pos,
olc::Pixel color = olc::BLACK, float angle = 0.0f) {
DrawString(string, pos.x, pos.y, color, angle);
}
private:
FontRect _GetStringBounds(std::u32string string, float angle = 0.0f) {
FT_Matrix rotMat;
@ -190,11 +117,20 @@ namespace olc {
int maxY = intMin;
Font *prevToUse = nullptr;
int skip=0;
for (size_t i = 0; i < string.size(); i++) {
char32_t chr = string[i];
if(skip){
skip--;
continue;
}
if(chr=='\r')continue;
else if(chr<0)continue;
else if (chr=='#')
{
skip=6;
continue;
}
int prevmaxX=maxX;
@ -289,9 +225,17 @@ namespace olc {
olc::Font *prevToUse = nullptr;
Pixel textCol=color;
int skip=0;
for (size_t i = 0; i < string.size(); i++) {
char32_t chr = string[i];
const auto hexToNumber=[](char c){
if(c<='9')return c-'0';
return (c-'A')+10;
};
if(skip){
skip--;
continue;
}
if(chr=='\r')continue;
else if (chr>=-128&&chr<-105)
{
@ -301,6 +245,25 @@ namespace olc {
else if (chr==Color::Reset[0])
{
textCol=color;
continue;
}
else if (chr=='#')
{
skip=6;
textCol=BLACK;
for(int j=1;j<7;j++){
if(j<3){
textCol.r*=16;
textCol.r+=hexToNumber(string[i+j]);
}else
if(j<5){
textCol.g*=16;
textCol.g+=hexToNumber(string[i+j]);
}else{
textCol.b*=16;
textCol.b+=hexToNumber(string[i+j]);
}
}
continue;
}
Font *toUse = this;

@ -3340,8 +3340,17 @@ namespace olc
{
olc::vf2d spos = { 0.0f, 0.0f };
Pixel textCol=col;
for (auto c : sText)
const auto hexToNumber=[](char c){
if(c<='9')return c-'0';
return (c-'A')+10;
};
for (int skip=0,index=-1;auto c : sText)
{
index++;
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n')
{
@ -3355,9 +3364,23 @@ namespace olc
{
textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a};
}
else if (c==Reset[0])
else if (c=='#')
{
textCol=col;
skip=6;
textCol=BLACK;
for(int i=1;i<7;i++){
if(i<3){
textCol.r*=16;
textCol.r+=hexToNumber(sText[index+i]);
}else
if(i<5){
textCol.g*=16;
textCol.g+=hexToNumber(sText[index+i]);
}else{
textCol.b*=16;
textCol.b+=hexToNumber(sText[index+i]);
}
}
}
else
{
@ -3373,8 +3396,17 @@ namespace olc
{
olc::vf2d spos = { 0.0f, 0.0f };
Pixel textCol=col;
for (auto c : sText)
const auto hexToNumber=[](char c){
if(c<='9')return c-'0';
return (c-'A')+10;
};
for (int skip=0,index=-1;auto c : sText)
{
index++;
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n')
{
@ -3392,6 +3424,24 @@ namespace olc
{
textCol=col;
}
else if (c=='#')
{
skip=6;
textCol=BLACK;
for(int i=1;i<7;i++){
if(i<3){
textCol.r*=16;
textCol.r+=hexToNumber(sText[index+i]);
}else
if(i<5){
textCol.g*=16;
textCol.g+=hexToNumber(sText[index+i]);
}else{
textCol.b*=16;
textCol.b+=hexToNumber(sText[index+i]);
}
}
}
else
{
int32_t ox = (c - 32) % 16;
@ -3405,6 +3455,8 @@ namespace olc
void PixelGameEngine::DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){
std::string strippedText=sText;
std::erase_if(strippedText,[](char chr){return chr<0;});
int skip=0;
std::erase_if(strippedText,[&](char chr){if(skip>0){skip--;return true;}if(chr=='#'){skip=6;return true;}return false;});
for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){
for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){
if(x!=0||y!=0){
@ -3494,6 +3546,8 @@ namespace olc
void PixelGameEngine::DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){
std::string strippedText=sText;
std::erase_if(strippedText,[](char chr){return chr<0;});
int skip=0;
std::erase_if(strippedText,[&](char chr){if(skip>0){skip--;return true;}if(chr=='#'){skip=6;return true;}return false;});
for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){
for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){
if(x!=0||y!=0){
@ -3602,12 +3656,21 @@ namespace olc
{
olc::vi2d size = { 0,1 };
olc::vi2d pos = { 0,1 };
for (auto c : s)
for (int skip=0;auto c : s)
{
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n') { pos.y++; pos.x = 0; }
else if (c == '\t') { pos.x += nTabSizeInSpaces; }
else if(c<0)continue;
else if (c=='#')
{
skip=6;
continue;
}
else pos.x++;
size.x = std::max(size.x, pos.x);
size.y = std::max(size.y, pos.y);
@ -3630,8 +3693,17 @@ namespace olc
if (col.a != 255) SetPixelMode(Pixel::ALPHA);
else SetPixelMode(Pixel::MASK);
}
for (auto c : sText)
const auto hexToNumber=[](char c){
if(c<='9')return c-'0';
return (c-'A')+10;
};
for (int skip=0,index=-1;auto c : sText)
{
index++;
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n')
{
@ -3645,6 +3717,24 @@ namespace olc
{
textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a};
}
else if (c=='#')
{
skip=6;
textCol=BLACK;
for(int i=1;i<7;i++){
if(i<3){
textCol.r*=16;
textCol.r+=hexToNumber(sText[index+i]);
}else
if(i<5){
textCol.g*=16;
textCol.g+=hexToNumber(sText[index+i]);
}else{
textCol.b*=16;
textCol.b+=hexToNumber(sText[index+i]);
}
}
}
else if (c==Reset[0])
{
textCol=col;
@ -3680,12 +3770,21 @@ namespace olc
{
olc::vi2d size = { 0,1 };
olc::vi2d pos = { 0,1 };
for (auto c : s)
for (int skip=0;auto c : s)
{
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n') { pos.y += 1; pos.x = 0; }
else if (c == '\t') { pos.x += nTabSizeInSpaces * 8; }
else if(c<0)continue;
else if (c=='#')
{
skip=6;
continue;
}
else pos.x += vFontSpacing[c - 32].y;
size.x = std::max(size.x, pos.x);
size.y = std::max(size.y, pos.y);
@ -3704,13 +3803,22 @@ namespace olc
int32_t sy = 0;
Pixel::Mode m = nPixelMode;
Pixel textCol=col;
const auto hexToNumber=[](char c){
if(c<='9')return c-'0';
return (c-'A')+10;
};
if (m != Pixel::CUSTOM)
{
if (col.a != 255) SetPixelMode(Pixel::ALPHA);
else SetPixelMode(Pixel::MASK);
}
for (auto c : sText)
for (int skip=0,index=-1;auto c : sText)
{
index++;
if(skip){
skip--;
continue;
}
if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
if (c == '\n')
{
@ -3728,6 +3836,24 @@ namespace olc
{
textCol=col;
}
else if (c=='#')
{
skip=6;
textCol=BLACK;
for(int i=1;i<7;i++){
if(i<3){
textCol.r*=16;
textCol.r+=hexToNumber(sText[index+i]);
}else
if(i<5){
textCol.g*=16;
textCol.g+=hexToNumber(sText[index+i]);
}else{
textCol.b*=16;
textCol.b+=hexToNumber(sText[index+i]);
}
}
}
else
{
int32_t ox = (c - 32) % 16;

Loading…
Cancel
Save