*/}}
Bläddra i källkod

Font texture buffer auto grow.

YimingWu 1 år sedan
förälder
incheckning
efe0de7b67
3 ändrade filer med 29 tillägg och 108 borttagningar
  1. 4 3
      la_tns.h
  2. 21 105
      la_tns_kernel.c
  3. 4 0
      resources/la_properties.c

+ 4 - 3
la_tns.h

@@ -403,6 +403,8 @@ struct _tnsFontManager
 
     tnsFont *VectorsGrapghs;
 
+    int BufferWidth;
+
     unsigned LastDlst;
 };
 
@@ -412,8 +414,7 @@ struct _tnsFontBoundBox
     int x, y, w, h; /* Upper Left and width,height */
 };
 
-#define TNS_FONT_BUFFER_W 512
-#define TNS_FONT_BUFFER_H 512
+#define TNS_FONT_BUFFER_W_DEFAULT 512
 
 //=====================================================[3d comp]
 
@@ -1244,7 +1245,7 @@ void tnsDrawToScreen();
 int tnsUseFont(char *name);
 int laStopFontService();
 
-tnsFontSingleCharacter *tfntFetchVectorGraphTextureIDW(uint32_t ID);
+void tfntResizeFontTexture(tnsFont* f, int size);
 
 int tnsStringGetDimension(char* content, uint32_t* contentU, int Count, int WLimit, int* Rows, int UseMono);
 int tnsStringGetWidth(char *content, int Count, int UseMono);

+ 21 - 105
la_tns_kernel.c

@@ -2539,6 +2539,7 @@ tnsFontManager *FM;
 
 void tnsSetuptnsFontManager(){
     FM = CreateNew(tnsFontManager);
+    FM->BufferWidth = TNS_FONT_BUFFER_W_DEFAULT;
 };
 void tnsQuitFontManager(){
     tnsInvalidateFontCache();
@@ -2587,7 +2588,7 @@ int tnsInvalidateFontCache(){
         f->MonoAdvance=(real)f->ftfacemono->glyph->advance.x/64.0;
         if(glyph) FT_Done_Glyph(glyph);
     }
-    glClearTexImage(f->TexBuffer.GLTexHandle, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+    if(glClearTexImage) glClearTexImage(f->TexBuffer.GLTexHandle, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
 }
 tnsFontSingleCharacter *tfntFetchCharTextureIDW(uint32_t ch, int UseMono);
 
@@ -2639,7 +2640,7 @@ int tnsLoadSystemFont(char* from, char* name){
         f->characters=calloc(1, sizeof(tnsFontSingleCharacter*)*TNS_UNICODE_COUNT);
         f->monocharacters=calloc(1, sizeof(tnsFontSingleCharacter*)*TNS_MONO_COUNT);
         f->height = LA_RH*(MAIN.FontSize/2.0f+0.5f);
-        tnsInit2DTexture(&f->TexBuffer, GL_RED, TNS_FONT_BUFFER_W, TNS_FONT_BUFFER_H, 0);
+        tnsInit2DTexture(&f->TexBuffer, GL_RED, FM->BufferWidth, FM->BufferWidth, 0);
         lstAppendItem(&FM->Fonts, f); FM->UsingFont=f;
         if (FT_Init_FreeType(&f->ftlib)) SEND_PANIC_ERROR("Freetype Init Failed!");
         logPrintNew("Loading fonts...\n");
@@ -2676,35 +2677,19 @@ int tnsLoadSystemFont(char* from, char* name){
 
     return 0;
 };
-int tnsLoadVectorGraphPackage(const char *name, unsigned int size){
-    char i;
-
-    tnsFont *f = CreateNew(tnsFont);
-
-    f->height = (int)((real)size * 1.4);
-    f->fontName = name;
-
-    if (FT_Init_FreeType(&f->ftlib)) SEND_PANIC_ERROR("Can't Load Main Font:Freetype Init Failed!");
-    if (FT_New_Face(f->ftlib, name, 0, &f->ftface)) SEND_PANIC_ERROR("Can't Load Main Font:Freetype Can't Init Face");
-
-    FT_Select_Charmap(f->ftface, FT_ENCODING_UNICODE);
-    FT_Set_Char_Size(f->ftface, size << 6, size << 6, 96, 96);
-
-    //tnsInit2DTexture(&f->TexBuffer, GL_ALPHA, TNS_FONT_BUFFER_W, TNS_FONT_BUFFER_H, 0);
-
-    //lstAppendItem(&FM->Fonts, f);
-
-    //tnsUseFont(name);
-
-    FM->VectorsGrapghs = f;
-};
 
 int tfntBufferWidthEnough(int total_width, int current_width, int this_width){
     return (current_width + this_width +1 < total_width);
 }
 
+void tfntResizeFontTexture(tnsFont* f, int size){
+    FM->BufferWidth=size;
+    f->TexBuffer.Width=f->TexBuffer.Height=FM->BufferWidth;
+    tnsConfigure2DTexture(&f->TexBuffer);
+}
+
 void tfntApplyCharacterBufferOffset(tnsFont *f, tnsFontSingleCharacter *fsc){
-    if (!tfntBufferWidthEnough(TNS_FONT_BUFFER_W, f->CurrentX, fsc->width)){
+    if (!tfntBufferWidthEnough(FM->BufferWidth, f->CurrentX, fsc->width)){
         f->CurrentY += (f->height+1);
         f->CurrentX = 0;
     }
@@ -2713,82 +2698,6 @@ void tfntApplyCharacterBufferOffset(tnsFont *f, tnsFontSingleCharacter *fsc){
     f->CurrentX += (fsc->width+1);
 }
 
-tnsFontSingleCharacter *tfntFetchVectorGraphTextureIDW(uint32_t ID){
-    //GLuint revel = 0;
-    //tnsFont *f = FM->VectorsGrapghs;
-    //tnsFontSingleCharacter *fsc = 0;
-    //FT_Glyph glyph = 0;
-    //FT_BitmapGlyph bitmap_glyph;
-    //FT_Bitmap bm;
-    //FT_Face face;
-    //int w, h, i, j;
-    //GLubyte *buf = 0;
-    //int a;
-    //int Size = ((int)(_ICON_SYMBOL_SIZE[ID - 0)) << 6;
-    //int ret;
-
-    //if (!f)
-    //    return 0;
-
-    //if (revel = f->icons[ID].Generated)
-    //    return &f->icons[ID];
-
-    //FT_Set_Char_Size(f->ftface, Size, Size, 96, 96);
-
-    //if (ret = FT_Load_Char(f->ftface, ID, FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP))
-    //    return 0;
-
-    //fsc = &f->icons[ID];
-
-    //face = f->ftface;
-
-    //if (FT_Get_Glyph(face->glyph, &glyph))
-    //    return 0;
-
-    //FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
-
-    //FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
-    //bitmap_glyph = glyph;
-    //bm = bitmap_glyph->bitmap;
-
-    //w = bm.width;
-    //h = bm.rows;
-    //fsc->width = w;
-    //fsc->height = h;
-    //fsc->advx = face->glyph->advance.x / 64.0f;
-    //fsc->advy = face->size->metrics.y_ppem;
-    //fsc->deltax = bitmap_glyph->left;
-    //fsc->deltay = bitmap_glyph->top - h;
-
-    ////tfntApplyCharacterBufferOffset(f, fsc);
-
-    ////glBindTexture(GL_TEXTURE_2D, f->TexBuffer.GLTexHandle);
-
-    //buf = CreateNewBuffer(GLubyte, w * h);
-
-    //for (j = 0; j < h; j++)
-    //{
-    //    for (i = 0; i < w; i++)
-    //    {
-    //        char _vl = bm.buffer[i + w * j];
-    //        buf[i + (h - j - 1) * w] = _vl;
-    //    }
-    //}
-
-    //glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-    //fsc->Tex = tnsCreate2DTexture(GL_ALPHA, w, h, buf);
-
-    //glBindTexture(GL_TEXTURE_2D, 0);
-
-    ////glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buf);
-    //glBindTexture(GL_TEXTURE_2D, 0);
-
-    //FreeMem(buf);
-
-    //fsc->Generated = 1;
-    //return fsc;
-}
 tnsFontSingleCharacter *tfntFetchCharTextureIDW(uint32_t ch, int UseMono){
     GLuint revel = 0;
     tnsFont *f = FM->UsingFont;
@@ -2844,6 +2753,13 @@ tnsFontSingleCharacter *tfntFetchCharTextureIDW(uint32_t ch, int UseMono){
 
     tfntApplyCharacterBufferOffset(f, fsc);
 
+    if(fsc->buffery+h>=FM->BufferWidth){
+        tfntResizeFontTexture(f,FM->BufferWidth*2); tnsInvalidateFontCache();
+        FreeMem(buf); FT_Done_Glyph(glyph);
+        return tfntFetchCharTextureIDW(ch,UseMono);
+    }
+
+
     tnsBindTexture(&f->TexBuffer);
     //glBindTexture(GL_TEXTURE_2D, f->TexBuffer.GLTexHandle);
 
@@ -3054,10 +2970,10 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
 
         cx = sx + fsc->deltax;
         cy = sy - fsc->deltay;
-        xo = (real)fsc->bufferx / (real)TNS_FONT_BUFFER_W;
-        yo = (real)fsc->buffery / (real)TNS_FONT_BUFFER_H;
-        xl = (real)(fsc->bufferx + fsc->width) / (real)TNS_FONT_BUFFER_W;
-        yl = (real)(fsc->buffery + fsc->height) / (real)TNS_FONT_BUFFER_H;
+        xo = (real)fsc->bufferx / (real)FM->BufferWidth;
+        yo = (real)fsc->buffery / (real)FM->BufferWidth;
+        xl = (real)(fsc->bufferx + fsc->width) / (real)FM->BufferWidth;
+        yl = (real)(fsc->buffery + fsc->height) / (real)FM->BufferWidth;
 
         tnsMakeQuadT2d(TexCoord, xo, yl, xo, yo, xl, yl, xl, yo);
         if (RevY) tnsMakeQuadT2d(VertArr,

+ 4 - 0
resources/la_properties.c

@@ -126,10 +126,13 @@ void* laget_DetachedControllerFirst(void* unused,void* unused2){
     return MAIN.Controllers.pFirst;
 }
 
+extern tnsFontManager* FM;
+
 void laset_UiRowHeight(void* unused, int val){
     MAIN.UiRowHeight = val;
     MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
     la_RefreshThemeColor(MAIN.CurrentTheme);
+    tfntResizeFontTexture(FM->UsingFont, TNS_FONT_BUFFER_W_DEFAULT);
     tnsInvalidateFontCache();
     laRedrawAllWindows();
 }
@@ -137,6 +140,7 @@ void laset_FontSize(void* unused, real val){
     MAIN.FontSize = val;
     MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
     tnsInvalidateFontCache();
+    tfntResizeFontTexture(FM->UsingFont, TNS_FONT_BUFFER_W_DEFAULT);
     laRedrawAllWindows();
 }
 void laset_MarginSize(void* unused, real val){