]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - ft2.c
do not parse $variable stuff inside //comments
[xonotic/darkplaces.git] / ft2.c
diff --git a/ft2.c b/ft2.c
index 6b9152c17116b9aa70a32053e35c637e478e383a..790f79989448d3afe650503a5dfb21a513f44ec8 100644 (file)
--- a/ft2.c
+++ b/ft2.c
@@ -186,8 +186,8 @@ qboolean Font_OpenLibrary (void)
        const char* dllnames [] =
        {
 #if defined(WIN32)
-               "freetype6.dll",
                "libfreetype-6.dll",
+               "freetype6.dll",
 #elif defined(MACOSX)
                "libfreetype.6.dylib",
                "libfreetype.dylib",
@@ -290,7 +290,7 @@ ft2_font_t *Font_Alloc(void)
 {
        if (!ft2_dll)
                return NULL;
-       return Mem_Alloc(font_mempool, sizeof(ft2_font_t));
+       return (ft2_font_t *)Mem_Alloc(font_mempool, sizeof(ft2_font_t));
 }
 
 qboolean Font_Attach(ft2_font_t *font, ft2_attachment_t *attachment)
@@ -387,9 +387,13 @@ qboolean Font_LoadFont(const char *name, dp_font_t *dpfnt)
 
                if (!Font_LoadFile(dpfnt->fallbacks[i], dpfnt->fallback_faces[i], &dpfnt->settings, fb))
                {
-                       Con_Printf("Failed to allocate font for fallback %i of font %s\n", i, name);
+                       if(!FS_FileExists(va("%s.tga", dpfnt->fallbacks[i])))
+                       if(!FS_FileExists(va("%s.png", dpfnt->fallbacks[i])))
+                       if(!FS_FileExists(va("%s.jpg", dpfnt->fallbacks[i])))
+                       if(!FS_FileExists(va("%s.pcx", dpfnt->fallbacks[i])))
+                               Con_Printf("Failed to load font %s for fallback %i of font %s\n", dpfnt->fallbacks[i], i, name);
                        Mem_Free(fb);
-                       break;
+                       continue;
                }
                count = 0;
                for (s = 0; s < MAX_FONT_SIZES && dpfnt->req_sizes[s] >= 0; ++s)
@@ -510,6 +514,7 @@ static qboolean Font_LoadFile(const char *name, int _face, ft2_settings_t *setti
                _face = 0;
                status = qFT_New_Memory_Face(font_ft2lib, (FT_Bytes)data, datasize, 0, (FT_Face*)&font->face);
        }
+       font->data = data;
        if (status)
        {
                Con_Printf("ERROR: can't create face for %s\n"
@@ -527,7 +532,7 @@ static qboolean Font_LoadFile(const char *name, int _face, ft2_settings_t *setti
                args.flags = FT_OPEN_MEMORY;
                args.memory_base = (const FT_Byte*)font->attachments[i].data;
                args.memory_size = font->attachments[i].size;
-               if (qFT_Attach_Stream(font->face, &args))
+               if (qFT_Attach_Stream((FT_Face)font->face, &args))
                        Con_Printf("Failed to add attachment %u to %s\n", (unsigned)i, font->name);
        }
 
@@ -586,7 +591,7 @@ void Font_Postprocess_Update(ft2_font_t *fnt, int bpp, int w, int h)
                if(pp.buf)
                        Mem_Free(pp.buf);
                pp.bufsize = needed * 4;
-               pp.buf = Mem_Alloc(font_mempool, pp.bufsize);
+               pp.buf = (unsigned char *)Mem_Alloc(font_mempool, pp.bufsize);
                pp.buf2 = pp.buf + needed;
        }
 }
@@ -773,9 +778,9 @@ static qboolean Font_LoadSize(ft2_font_t *font, float size, qboolean check_only)
                        for (r = 0; r < 256; ++r)
                        {
                                FT_ULong ul, ur;
-                               ul = qFT_Get_Char_Index(font->face, l);
-                               ur = qFT_Get_Char_Index(font->face, r);
-                               if (qFT_Get_Kerning(font->face, ul, ur, FT_KERNING_DEFAULT, &kernvec))
+                               ul = qFT_Get_Char_Index((FT_Face)font->face, l);
+                               ur = qFT_Get_Char_Index((FT_Face)font->face, r);
+                               if (qFT_Get_Kerning((FT_Face)font->face, ul, ur, FT_KERNING_DEFAULT, &kernvec))
                                {
                                        fmap->kerning.kerning[l][r][0] = 0;
                                        fmap->kerning.kerning[l][r][1] = 0;
@@ -923,9 +928,9 @@ qboolean Font_GetKerningForMap(ft2_font_t *font, int map_index, float w, float h
                        Con_Printf("Failed to get kerning for %s\n", font->name);
                        return false;
                }
-               ul = qFT_Get_Char_Index(font->face, left);
-               ur = qFT_Get_Char_Index(font->face, right);
-               if (qFT_Get_Kerning(font->face, ul, ur, FT_KERNING_DEFAULT, &kernvec))
+               ul = qFT_Get_Char_Index((FT_Face)font->face, left);
+               ur = qFT_Get_Char_Index((FT_Face)font->face, right);
+               if (qFT_Get_Kerning((FT_Face)font->face, ul, ur, FT_KERNING_DEFAULT, &kernvec))
                {
                        if (outx) *outx = Font_SnapTo(kernvec.x * fmap->sfx, 1 / fmap->size);// * (w / (float)fmap->size);
                        if (outy) *outy = Font_SnapTo(kernvec.y * fmap->sfy, 1 / fmap->size);// * (h / (float)fmap->size);
@@ -955,8 +960,17 @@ static void UnloadMapRec(ft2_font_map_t *map)
 void Font_UnloadFont(ft2_font_t *font)
 {
        int i;
+
+       // unload fallbacks
+       if(font->next)
+               Font_UnloadFont(font->next);
+
        if (font->attachments && font->attachmentcount)
        {
+               for (i = 0; i < (int)font->attachmentcount; ++i) {
+                       if (font->attachments[i].data)
+                               Mem_Free(font->attachments[i].data);
+               }
                Mem_Free(font->attachments);
                font->attachmentcount = 0;
                font->attachments = NULL;
@@ -977,6 +991,10 @@ void Font_UnloadFont(ft2_font_t *font)
                        font->face = NULL;
                }
        }
+       if (font->data) {
+           Mem_Free(font->data);
+           font->data = NULL;
+       }
 }
 
 static float Font_SearchSize(ft2_font_t *font, FT_Face fontface, float size)
@@ -1107,7 +1125,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                return false;
        }
 
-       map = Mem_Alloc(font_mempool, sizeof(ft2_font_map_t));
+       map = (ft2_font_map_t *)Mem_Alloc(font_mempool, sizeof(ft2_font_map_t));
        if (!map)
        {
                Con_Printf("ERROR: Out of memory when loading fontmap for %s\n", font->name);
@@ -1124,7 +1142,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
        map->sfy = mapstart->sfy;
 
        pitch = map->glyphSize * FONT_CHARS_PER_LINE * bytesPerPixel;
-       data = Mem_Alloc(font_mempool, (FONT_CHAR_LINES * map->glyphSize) * pitch);
+       data = (unsigned char *)Mem_Alloc(font_mempool, (FONT_CHAR_LINES * map->glyphSize) * pitch);
        if (!data)
        {
                Con_Printf("ERROR: Failed to allocate memory for font %s size %g\n", font->name, map->size);
@@ -1185,7 +1203,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                imagedata += gpad_t * pitch + gpad_l * bytesPerPixel;
                //status = qFT_Load_Char(face, ch, FT_LOAD_RENDER);
                // we need the glyphIndex
-               face = font->face;
+               face = (FT_Face)font->face;
                usefont = NULL;
                if (font->image_font && mapch == ch && img_fontmap[mapch])
                {
@@ -1202,7 +1220,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                                if (!Font_SetSize(usefont, mapstart->intSize, mapstart->intSize))
                                        continue;
                                // try that glyph
-                               face = usefont->face;
+                               face = (FT_Face)usefont->face;
                                glyphIndex = qFT_Get_Char_Index(face, ch);
                                if (glyphIndex == 0)
                                        continue;
@@ -1215,7 +1233,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                        {
                                //Con_Printf("failed to load fallback glyph for char %lx from font %s\n", (unsigned long)ch, font->name);
                                // now we let it use the "missing-glyph"-glyph
-                               face = font->face;
+                               face = (FT_Face)font->face;
                                glyphIndex = 0;
                        }
                }
@@ -1223,7 +1241,7 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                if (!usefont)
                {
                        usefont = font;
-                       face = font->face;
+                       face = (FT_Face)font->face;
                        status = qFT_Load_Glyph(face, glyphIndex, FT_LOAD_RENDER | load_flags);
                        if (status)
                        {
@@ -1399,12 +1417,12 @@ static qboolean Font_LoadMap(ft2_font_t *font, ft2_font_map_t *mapstart, Uchar _
                map->texture = R_LoadTexture2D(font_texturepool, map_identifier,
                                               map->glyphSize * FONT_CHARS_PER_LINE,
                                               map->glyphSize * FONT_CHAR_LINES,
-                                              data, TEXTYPE_ALPHA, TEXF_ALPHA /*gone: | TEXF_ALWAYSPRECACHE*/ /* | TEXF_MIPMAP*/, NULL);
+                                              data, TEXTYPE_ALPHA, TEXF_ALPHA /*gone: | TEXF_ALWAYSPRECACHE*/ /* | TEXF_MIPMAP*/, -1, NULL);
        } else {
                map->texture = R_LoadTexture2D(font_texturepool, map_identifier,
                                               map->glyphSize * FONT_CHARS_PER_LINE,
                                               map->glyphSize * FONT_CHAR_LINES,
-                                              data, TEXTYPE_RGBA, TEXF_ALPHA /*gone: | TEXF_ALWAYSPRECACHE*/ /* | TEXF_MIPMAP*/, NULL);
+                                              data, TEXTYPE_RGBA, TEXF_ALPHA /*gone: | TEXF_ALWAYSPRECACHE*/ /* | TEXF_MIPMAP*/, -1, NULL);
        }
 
        Mem_Free(data);