From 33ad8406854ea77f18f849ab77f1efdf7ceafc7f Mon Sep 17 00:00:00 2001 From: kramm Date: Sun, 8 May 2005 13:48:32 +0000 Subject: [PATCH] added gfx font loading --- pdf2swf/SWFOutputDev.cc | 209 +++++++++++------------------------------------ 1 file changed, 49 insertions(+), 160 deletions(-) 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(" 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(" 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;tnum_glyphs;t++) { - if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,charname)) { - msg(" 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;tnum_glyphs;t++) { - if(font->glyphs[t].name && !strcasecmp(font->glyphs[t].name,charname)) { - msg(" Char [%d,>>%s<<,%d] maps to %d\n", charnr, charname, u, t); - return t; - } - } - } - - /* try to use the unicode id */ - if(u>=0 && umax_unicode && font->unicode2glyph[u]>=0) { - msg(" Char [%d,%s,>%d<] maps to %d\n", charnr, charname, u, font->unicode2glyph[u]); - return font->unicode2glyph[u]; - } - - if(charnr>=0 && charnrnum_glyphs) { - msg(" 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: Incompatible change of text rendering to %d while inside cliptext", render); - - msg(" beginString(%s) render=%d", makeStringPrintable(s->getCString()), render); + msg(" beginString(%s) render=%d", s->getCString(), render); double m11,m21,m12,m22; // msg(" %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(" 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(" 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(" 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(" 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(" 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(" 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(" 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(" endString() render=%d textstroke=%08x", render, current_text_stroke); - if(states[statepos].textRender != render) - msg(" 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(" endString()"); } void SWFOutputDev::endTextObject(GfxState *state) { - int render = state->getRender(); - msg(" endTextObject() render=%d textstroke=%08x", render, current_text_stroke); - if(states[statepos].textRender != render) + if(states[statepos].textRender != state->getRender()) msg(" 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(" 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(" 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(" updateFont(%s) -> %s", fontid, fileName); dumpFontInfo("", gfxFont); - //swfoutput_setfont(&output, fontid, fileName); + swfoutput_setfont(&output, fontid, fileName); if(!setGfxFont(fontid, 0)) { setGfxFont(fontid, fileName); -- 1.7.10.4