From: kramm <kramm>
Date: Sun, 8 May 2005 13:48:32 +0000 (+0000)
Subject: added gfx font loading
X-Git-Tag: release-0-7-0~89
X-Git-Url: http://git.asbjorn.it/?a=commitdiff_plain;h=33ad8406854ea77f18f849ab77f1efdf7ceafc7f;p=swftools.git

added gfx font loading
---

diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc
index fe6f296..43f106f 100644
--- a/pdf2swf/SWFOutputDev.cc
+++ b/pdf2swf/SWFOutputDev.cc
@@ -237,9 +237,6 @@ public:
 				   int width, int height, GfxImageColorMap*colorMap, GBool invert,
 				   GBool inlineImg, int mask, int *maskColors);
   int SWFOutputDev::setGfxFont(char*id, char*filename);
-  void strokeGfxline(GfxState *state, gfxline_t*line);
-  void clipToGfxLine(GfxState *state, gfxline_t*line);
-  void fillGfxLine(GfxState *state, gfxline_t*line);
 
   SWFOutputState states[64];
   int statepos;
@@ -275,8 +272,6 @@ public:
   gfxline_t* current_text_stroke;
   char* current_font_id;
   gfxfont_t* current_gfxfont;
-  gfxmatrix_t current_font_matrix;
-
   fontlist_t* fontlist;
 };
 
@@ -698,13 +693,6 @@ gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed)
 void SWFOutputDev::stroke(GfxState *state) 
 {
     GfxPath * path = state->getPath();
-    gfxline_t*line= gfxPath_to_gfxline(state, path, 0);
-    strokeGfxline(state, line);
-    gfxline_free(line);
-}
-
-void SWFOutputDev::strokeGfxline(GfxState *state, gfxline_t*line)
-{
     int lineCap = state->getLineCap(); // 0=butt, 1=round 2=square
     int lineJoin = state->getLineJoin(); // 0=miter, 1=round 2=bevel
     double miterLimit = state->getMiterLimit();
@@ -732,6 +720,8 @@ void SWFOutputDev::strokeGfxline(GfxState *state, gfxline_t*line)
     else if(lineJoin == 1) joinType = gfx_joinRound;
     else if(lineJoin == 2) joinType = gfx_joinBevel;
 
+    gfxline_t*line= gfxPath_to_gfxline(state, path, 0);
+    
     int dashnum = 0;
     double dashphase = 0;
     double * ldash = 0;
@@ -774,42 +764,41 @@ void SWFOutputDev::strokeGfxline(GfxState *state, gfxline_t*line)
     }
    
     swfoutput_drawgfxline(&output, line, width, &col, capType, joinType, miterLimit);
+    gfxline_free(line);
 }
-
-gfxcolor_t getFillColor(GfxState * state)
+void SWFOutputDev::fill(GfxState *state) 
 {
-    GfxRGB rgb;
+    GfxPath * path = state->getPath();
     double opaq = state->getFillOpacity();
+    GfxRGB rgb;
     state->getFillRGB(&rgb);
     gfxcolor_t col;
     col.r = (unsigned char)(rgb.r*255);
     col.g = (unsigned char)(rgb.g*255);
     col.b = (unsigned char)(rgb.b*255);
     col.a = (unsigned char)(opaq*255);
-    return col;
-}
 
-void SWFOutputDev::fillGfxLine(GfxState *state, gfxline_t*line) 
-{
-    gfxcolor_t col = getFillColor(state);
+    gfxline_t*line= gfxPath_to_gfxline(state, path, 1);
 
     if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> fill %02x%02x%02x%02x\n", col.r, col.g, col.b, col.a);
         dump_outline(line);
     }
+
     swfoutput_fillgfxline(&output, line, &col);
-}
-void SWFOutputDev::fill(GfxState *state) 
-{
-    GfxPath * path = state->getPath();
-    gfxline_t*line= gfxPath_to_gfxline(state, path, 1);
-    fillGfxLine(state, line);
     gfxline_free(line);
 }
 void SWFOutputDev::eoFill(GfxState *state) 
 {
     GfxPath * path = state->getPath();
-    gfxcolor_t col = getFillColor(state);
+    double opaq = state->getFillOpacity();
+    GfxRGB rgb;
+    state->getFillRGB(&rgb);
+    gfxcolor_t col;
+    col.r = (unsigned char)(rgb.r*255);
+    col.g = (unsigned char)(rgb.g*255);
+    col.b = (unsigned char)(rgb.b*255);
+    col.a = (unsigned char)(opaq*255);
 
     gfxline_t*line= gfxPath_to_gfxline(state, path, 1);
 
@@ -821,17 +810,11 @@ void SWFOutputDev::eoFill(GfxState *state)
     swfoutput_fillgfxline(&output, line, &col);
     gfxline_free(line);
 }
-
 void SWFOutputDev::clip(GfxState *state) 
 {
     GfxPath * path = state->getPath();
     gfxline_t*line = gfxPath_to_gfxline(state, path, 1);
-    clipToGfxLine(state, line);
-    gfxline_free(line);
-}
 
-void SWFOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line) 
-{
     if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> clip\n");
         dump_outline(line);
@@ -839,6 +822,7 @@ void SWFOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line)
 
     swfoutput_startclip(&output, line);
     states[statepos].clipping++;
+    gfxline_free(line);
 }
 void SWFOutputDev::eoClip(GfxState *state) 
 {
@@ -907,12 +891,6 @@ GBool SWFOutputDev::useGradients()
 char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible",
                       "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"};
 
-#define RENDER_FILL 0
-#define RENDER_STROKE 1
-#define RENDER_FILLSTROKE 2
-#define RENDER_INVISIBLE 3
-#define RENDER_CLIP 4
-
 static char tmp_printstr[4096];
 char* makeStringPrintable(char*str)
 {
@@ -939,74 +917,30 @@ char* makeStringPrintable(char*str)
     return tmp_printstr;
 }
 
-
-int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u)
-{
-    int t;
-    if(charname) {
-	for(t=0;t<font->num_glyphs;t++) {
-	    if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,charname)) {
-		msg("<debug> Char [%d,>%s<,%d] maps to %d\n", charnr, charname, u, t);
-		return t;
-	    }
-	}
-	/* if we didn't find the character, maybe
-	   we can find the capitalized version */
-	for(t=0;t<font->num_glyphs;t++) {
-	    if(font->glyphs[t].name && !strcasecmp(font->glyphs[t].name,charname)) {
-		msg("<debug> Char [%d,>>%s<<,%d] maps to %d\n", charnr, charname, u, t);
-		return t;
-	    }
-	}
-    }
-
-    /* try to use the unicode id */
-    if(u>=0 && u<font->max_unicode && font->unicode2glyph[u]>=0) {
-	msg("<debug> Char [%d,%s,>%d<] maps to %d\n", charnr, charname, u, font->unicode2glyph[u]);
-	return font->unicode2glyph[u];
-    }
-
-    if(charnr>=0 && charnr<font->num_glyphs) {
-	msg("<debug> Char [>%d<,%s,%d] maps to %d\n", charnr, charname, u, charnr);
-	return charnr;
-    }
-    
-    return -1;
-}
-
-
 void SWFOutputDev::beginString(GfxState *state, GString *s) 
 { 
     int render = state->getRender();
-    if(current_text_stroke)
-	msg("<error> Error: Incompatible change of text rendering to %d while inside cliptext", render);
-
-    msg("<trace> beginString(%s) render=%d", makeStringPrintable(s->getCString()), render);
+    msg("<trace> beginString(%s) render=%d", s->getCString(), render);
     double m11,m21,m12,m22;
 //    msg("<debug> %s beginstring \"%s\"\n", gfxstate2str(state), s->getCString());
     state->getFontTransMat(&m11, &m12, &m21, &m22);
     m11 *= state->getHorizScaling();
     m21 *= state->getHorizScaling();
-
-    this->current_font_matrix.m00 = m11 / 1024.0;
-    this->current_font_matrix.m01 = m12 / 1024.0;
-    this->current_font_matrix.m10 = -m21 / 1024.0;
-    this->current_font_matrix.m11 = -m22 / 1024.0;
-    this->current_font_matrix.tx = 0;
-    this->current_font_matrix.ty = 0;
-
-    gfxmatrix_t m = this->current_font_matrix;
-
-    /*if(render != 3 && render != 0)
-	msg("<warning> Text rendering mode %d (%s) not fully supported yet (for text \"%s\")", render, renderModeDesc[render&7], makeStringPrintable(s->getCString()));*/
+    swfoutput_setfontmatrix(&output, m11, -m21, m12, -m22);
+    if(render != 3 && render != 0)
+	msg("<warning> Text rendering mode %d (%s) not fully supported yet (for text \"%s\")", render, renderModeDesc[render&7], makeStringPrintable(s->getCString()));
     states[statepos].textRender = render;
 }
 
+static int textCount = 0;
+
 void SWFOutputDev::drawChar(GfxState *state, double x, double y,
 			double dx, double dy,
 			double originX, double originY,
 			CharCode c, Unicode *_u, int uLen)
 {
+    textCount++;
+
     int render = state->getRender();
     // check for invisible text -- this is used by Acrobat Capture
     if (render == 3)
@@ -1015,7 +949,14 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y,
     if(states[statepos].textRender != render)
 	msg("<error> Internal error: drawChar.render!=beginString.render");
 
-    gfxcolor_t col = getFillColor(state);
+    GfxRGB rgb;
+    double opaq = state->getFillOpacity();
+    state->getFillRGB(&rgb);
+    gfxcolor_t col;
+    col.r = (unsigned char)(rgb.r*255);
+    col.g = (unsigned char)(rgb.g*255);
+    col.b = (unsigned char)(rgb.b*255);
+    col.a = (unsigned char)(opaq*255);
 
     Gushort *CIDToGIDMap = 0;
     GfxFont*font = state->getFont();
@@ -1025,6 +966,10 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y,
 	msg("<debug> type3 char at %f/%f", x, y);
 	return;
     }
+    double x1,y1;
+    x1 = x;
+    y1 = y;
+    state->transform(x, y, &x1, &y1);
     
     Unicode u=0;
     char*name=0;
@@ -1064,72 +1009,19 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y,
 	msg("<debug> drawChar(%f,%f,c='%c' (%d), u=%d <%d>) CID=%d name=\"%s\" render=%d\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name), render);
     }
 
-    int charid = getGfxCharID(current_gfxfont, c, name, u);
-    if(charid<0) {
-	msg("<warning> Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", 
-		FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs);
-	return;
-    }
-
-    gfxmatrix_t m = this->current_font_matrix;
-    state->transform(x, y, &m.tx, &m.ty);
-
-    if(render == RENDER_FILL) {
-	swfoutput_gfxdrawchar(&output, current_font_id, charid, &col, &m);
-    } else {
-	msg("<debug> Drawing glyph %d as shape", charid);
-	gfxline_t*glyph = current_gfxfont->glyphs[charid].line;
-	gfxline_t*tglyph = gfxline_clone(glyph);
-	gfxline_transform(tglyph, &m);
-	current_text_stroke = gfxline_append(current_text_stroke, tglyph);
-    }
+    swfoutput_drawchar(&output, x1, y1, name, c, u, &col);
 }
 
 void SWFOutputDev::endString(GfxState *state) 
 { 
-    int render = state->getRender();
-    msg("<trace> endString() render=%d textstroke=%08x", render, current_text_stroke);
-    if(states[statepos].textRender != render)
-	msg("<error> Internal error: drawChar.render!=beginString.render");
-    
-    if(current_text_stroke) {
-	/* fillstroke and stroke text rendering objects we can process right
-	   now (as there may be texts of other rendering modes in this
-	   text object)- clipping objects have to wait until endTextObject,
-	   however */
-	if(render == RENDER_FILLSTROKE) {
-	    fillGfxLine(state, current_text_stroke);
-	    strokeGfxline(state, current_text_stroke);
-	    gfxline_free(current_text_stroke);
-	    current_text_stroke = 0;
-	} else if(render == RENDER_STROKE) {
-	    strokeGfxline(state, current_text_stroke);
-	    gfxline_free(current_text_stroke);
-	    current_text_stroke = 0;
-	}
-    }
+    msg("<trace> endString()");
 }    
 
 void SWFOutputDev::endTextObject(GfxState *state)
 {
-    int render = state->getRender();
-    msg("<trace> endTextObject() render=%d textstroke=%08x", render, current_text_stroke);
-    if(states[statepos].textRender != render)
+    if(states[statepos].textRender != state->getRender())
 	msg("<error> Internal error: drawChar.render!=beginString.render");
-    
-    if(current_text_stroke) {
-	if((render&3) == RENDER_FILL || (render&3) == RENDER_FILLSTROKE) {
-	    fillGfxLine(state, current_text_stroke);
-	}
-	if((render&3) == RENDER_STROKE || (render&3) == RENDER_FILLSTROKE) {
-	    strokeGfxline(state, current_text_stroke);
-	}
-	if((render&4) == RENDER_CLIP) {
-	    clipToGfxLine(state, current_text_stroke);
-	}
-	gfxline_free(current_text_stroke);
-	current_text_stroke = 0;
-    }
+    msg("<trace> endTextObject()");
 }
 
 /* the logic seems to be as following:
@@ -1749,7 +1641,6 @@ int SWFOutputDev::setGfxFont(char*id, char*filename)
 	    current_font_id = l->id;
 	    current_gfxfont = l->font;
 	    font = l->font;
-	    swfoutput_gfxaddfont(&this->output, id, current_gfxfont);
 	    return 1;
 	}
 	l = l->next;
@@ -1768,7 +1659,6 @@ int SWFOutputDev::setGfxFont(char*id, char*filename)
     } else {
 	this->fontlist = l;
     }
-    swfoutput_gfxaddfont(&this->output, id, current_gfxfont);
     return 1;
 }
 
@@ -1793,18 +1683,17 @@ void SWFOutputDev::updateFont(GfxState *state)
 	}
     }
 
-    /* second, see if this is a font which was used before-
-       if so, we are done */
-    if(setGfxFont(fontid, 0)) {
-	free(fontid);
-	return;
-    }
-/*    if(swfoutput_queryfont(&output, fontid))
+    /* second, see if swfoutput already has this font
+       cached- if so, we are done */
+    setGfxFont(fontid, 0);
+    if(swfoutput_queryfont(&output, fontid))
+    {
 	swfoutput_setfont(&output, fontid, 0);
 	
 	msg("<debug> updateFont(%s) [cached]", fontid);
+	free(fontid);
 	return;
-    }*/
+    }
 
     // look for Type 3 font
     if (gfxFont->getType() == fontType3) {
@@ -1857,7 +1746,7 @@ void SWFOutputDev::updateFont(GfxState *state)
     msg("<verbose> updateFont(%s) -> %s", fontid, fileName);
     dumpFontInfo("<verbose>", gfxFont);
 
-    //swfoutput_setfont(&output, fontid, fileName);
+    swfoutput_setfont(&output, fontid, fileName);
     
     if(!setGfxFont(fontid, 0)) {
 	setGfxFont(fontid, fileName);