[MPlayer-cvslog] r37891 - in trunk/gui/skin: font.c font.h

ib subversion at mplayerhq.hu
Thu Aug 25 14:27:59 EEST 2016


Author: ib
Date: Thu Aug 25 14:27:58 2016
New Revision: 37891

Log:
Use dynamic memory allocation when parsing a font description file.

It still limits font description files to 256 characters, but prepares
the lifting of this limitation.

Additionally, rename bmpFont member nonASCIIidx bit8_chr.

Modified:
   trunk/gui/skin/font.c
   trunk/gui/skin/font.h

Modified: trunk/gui/skin/font.c
==============================================================================
--- trunk/gui/skin/font.c	Thu Aug 25 14:22:44 2016	(r37890)
+++ trunk/gui/skin/font.c	Thu Aug 25 14:27:58 2016	(r37891)
@@ -35,6 +35,10 @@
 #include "mp_msg.h"
 #include "libavutil/avstring.h"
 
+#define ASCII_CHRS 128   // number of ASCII characters
+#define EXTRA_CHRS 128   // (arbitrary) number of non-ASCII characters
+#define UTF8LENGTH 4     // length of an UTF-8 encoding according to RFC 3629
+
 #define MAX_FONTS 25
 
 #define fntAlignLeft   0
@@ -68,6 +72,13 @@ static int fntAddNewFont(char *name)
 
     av_strlcpy(Fonts[id]->name, name, MAX_FONT_NAME);
 
+    Fonts[id]->Chr = calloc(ASCII_CHRS + EXTRA_CHRS, sizeof(*Fonts[id]->Chr));
+
+    if (!Fonts[id]->Chr) {
+        nfree(Fonts[id]);
+        return -1;
+    }
+
     for (i = 0; i < ASCII_CHRS + EXTRA_CHRS; i++) {
         Fonts[id]->Chr[i].x = -1;
         Fonts[id]->Chr[i].y = -1;
@@ -75,6 +86,15 @@ static int fntAddNewFont(char *name)
         Fonts[id]->Chr[i].h = -1;
     }
 
+    Fonts[id]->bit8_chr = calloc(EXTRA_CHRS * UTF8LENGTH, sizeof(*Fonts[id]->bit8_chr));
+
+    if (!Fonts[id]->bit8_chr) {
+        nfree(Fonts[id]->Chr);
+        nfree(Fonts[id]);
+        return -1;
+    } else
+        Fonts[id]->extra_chrs = EXTRA_CHRS;
+
     return id;
 }
 
@@ -85,6 +105,8 @@ static int fntAddNewFont(char *name)
  */
 static void fntFreeFont(int id)
 {
+    free(Fonts[id]->Chr);
+    free(Fonts[id]->bit8_chr);
     bpFree(&Fonts[id]->Bitmap);
     nfree(Fonts[id]);
 }
@@ -154,14 +176,14 @@ int fntRead(char *path, char *fname)
                 cutStr(item, item, '"', 1);
 
             if (item[0] & 0x80) {
-                for (i = 0; i < EXTRA_CHRS; i++) {
-                    if (!Fonts[id]->nonASCIIidx[i][0]) {
-                        strncpy(Fonts[id]->nonASCIIidx[i], item, UTF8LENGTH);
+                for (i = 0; i < Fonts[id]->extra_chrs; i++) {
+                    if (!(Fonts[id]->bit8_chr + i * UTF8LENGTH)[0]) {
+                        strncpy(Fonts[id]->bit8_chr + i * UTF8LENGTH, item, UTF8LENGTH);
                         break;
                     }
                 }
 
-                if (i == EXTRA_CHRS)
+                if (i == Fonts[id]->extra_chrs)
                     continue;
 
                 i += ASCII_CHRS;
@@ -250,14 +272,14 @@ static int fntGetCharIndex(int id, unsig
             *str    += direction;
         }
 
-        for (i = 0; (i < EXTRA_CHRS) && Fonts[id]->nonASCIIidx[i][0]; i++) {
-            if (strncmp(Fonts[id]->nonASCIIidx[i], uchar, UTF8LENGTH) == 0)
+        for (i = 0; (i < Fonts[id]->extra_chrs) && (Fonts[id]->bit8_chr + i * UTF8LENGTH)[0]; i++) {
+            if (strncmp(Fonts[id]->bit8_chr + i * UTF8LENGTH, uchar, UTF8LENGTH) == 0)
                 return i + ASCII_CHRS;
 
             if (!utf8 &&
-                (Fonts[id]->nonASCIIidx[i][0] == (*uchar >> 6 | 0xc0) &&
-                 Fonts[id]->nonASCIIidx[i][1] == ((*uchar & 0x3f) | 0x80) &&
-                 Fonts[id]->nonASCIIidx[i][2] == 0))
+                ((Fonts[id]->bit8_chr + i * UTF8LENGTH)[0] == (*uchar >> 6 | 0xc0) &&
+                 (Fonts[id]->bit8_chr + i * UTF8LENGTH)[1] == ((*uchar & 0x3f) | 0x80) &&
+                 (Fonts[id]->bit8_chr + i * UTF8LENGTH)[2] == 0))
                 c = i + ASCII_CHRS;
         }
     } else {

Modified: trunk/gui/skin/font.h
==============================================================================
--- trunk/gui/skin/font.h	Thu Aug 25 14:22:44 2016	(r37890)
+++ trunk/gui/skin/font.h	Thu Aug 25 14:27:58 2016	(r37891)
@@ -22,10 +22,6 @@
 #include "gui/app/app.h"
 #include "gui/util/bitmap.h"
 
-#define ASCII_CHRS 128   // number of ASCII characters
-#define EXTRA_CHRS 128   // (arbitrary) number of non-ASCII characters
-#define UTF8LENGTH 4     // length of an UTF-8 encoding according to RFC 3629
-
 #define MAX_FONT_NAME 128
 
 typedef struct {
@@ -34,8 +30,9 @@ typedef struct {
 } fntChar;
 
 typedef struct {
-    fntChar Chr[ASCII_CHRS + EXTRA_CHRS];
-    unsigned char nonASCIIidx[EXTRA_CHRS][UTF8LENGTH];
+    fntChar *Chr;
+    int extra_chrs;
+    unsigned char *bit8_chr;
     guiImage Bitmap;
     char name[MAX_FONT_NAME];
 } bmpFont;


More information about the MPlayer-cvslog mailing list