fix character searching in fonts.
authorkramm <kramm>
Wed, 3 Jul 2002 18:51:28 +0000 (18:51 +0000)
committerkramm <kramm>
Wed, 3 Jul 2002 18:51:28 +0000 (18:51 +0000)
pdf2swf/swfoutput.cc
pdf2swf/swfoutput.h

index 330c890..27fdced 100644 (file)
@@ -451,7 +451,7 @@ static void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int cha
     }
     else
     {
-        T1_OUTLINE*outline = font->getOutline(character);
+        T1_OUTLINE*outline = font->getOutline(character, charnr);
         char* charname = character;
 
         if(!outline) {
@@ -699,40 +699,51 @@ SWFFont::~SWFFont()
     free(char2swfcharid);
 }
 
-T1_OUTLINE*SWFFont::getOutline(char*name)
+T1_OUTLINE*SWFFont::getOutline(char*name, int charnr)
 {
     int t;
     for(t=0;t<this->charnum;t++) {
         if(!strcmp(this->charname[t],name)) {
-            if(!used[t])
-            {
-                swfcharid2char[swfcharpos] = t;
-                char2swfcharid[t] = swfcharpos;
-                swfcharpos++;
-                used[t] = 1;
-            }
             return outline[t];
         }
     }
+    
+    /* if we didn't find the character, maybe
+       we can find the capitalized version */
+    for(t=0;t<this->charnum;t++) {
+        if(!strcasecmp(this->charname[t],name))
+           return outline[t];
+    }
+
+    /* if we didn't find it by name, use the names of the first 256 characters
+       of the font to try a new name based on charnr */
+    if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) {
+       return getOutline(this->standardtable[charnr], -1);
+    }
+
+    logf("<warning> Didn't find character '%s' in font '%s'", FIXNULL(name), this->name);
     return 0;
 }
 
-int SWFFont::getWidth(char*name)
+int SWFFont::getSWFCharID(char*name, int charnr)
 {
     int t;
     for(t=0;t<this->charnum;t++) {
         if(!strcmp(this->charname[t],name)) {
-            return this->width[t];
+            if(!used[t])
+            {
+                swfcharid2char[swfcharpos] = t;
+                char2swfcharid[t] = swfcharpos++;
+                used[t] = 1;
+            }
+            return char2swfcharid[t];
         }
     }
-    return 0;
-}
 
-int SWFFont::getSWFCharID(char*name, int charnr)
-{
-    int t;
+    /* if we didn't find the character, maybe
+       we can find the capitalized version */
     for(t=0;t<this->charnum;t++) {
-        if(!strcmp(this->charname[t],name)) {
+        if(!strcasecmp(this->charname[t],name)) {
             if(!used[t])
             {
                 swfcharid2char[swfcharpos] = t;
@@ -742,6 +753,9 @@ int SWFFont::getSWFCharID(char*name, int charnr)
             return char2swfcharid[t];
         }
     }
+
+    /* if we didn't find it by name, use the names of the first 256 (or so) characters
+       of the font to try a new name based on charnr */
     if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) {
        return getSWFCharID(this->standardtable[charnr], -1);
     }
@@ -749,6 +763,17 @@ int SWFFont::getSWFCharID(char*name, int charnr)
     return 0;
 }
 
+int SWFFont::getWidth(char*name)
+{
+    int t;
+    for(t=0;t<this->charnum;t++) {
+        if(!strcmp(this->charname[t],name)) {
+            return this->width[t];
+        }
+    }
+    return 0;
+}
+
 char*SWFFont::getName()
 {
     return this->name;
index 896de37..32aaf13 100644 (file)
@@ -59,7 +59,7 @@ class SWFFont
 
     SWFFont(char*name, int t1id, char*filename);
     SWFFont::~SWFFont();
-    T1_OUTLINE*getOutline(char*charname);
+    T1_OUTLINE*getOutline(char*charname, int charnr);
     int getSWFCharID(char*name, int charnr);
     int getWidth(char*name);
     char*getName();