{"Symbol", "s050000l"},
{"ZapfDingbats", "d050000l"}};
+class SWFOutputState {
+ public:
+ int clipping;
+ int textRender;
+ SWFOutputState() {
+ this->clipping = 0;
+ this->textRender = 0;
+ }
+};
+
class SWFOutputDev: public OutputDev {
int outputstarted;
struct swfoutput output;
//----- text drawing
virtual void beginString(GfxState *state, GString *s) ;
virtual void endString(GfxState *state) ;
+ virtual void endTextObject(GfxState *state);
virtual void drawChar(GfxState *state, double x, double y,
double dx, double dy,
double originX, double originY,
void drawGeneralImage(GfxState *state, Object *ref, Stream *str,
int width, int height, GfxImageColorMap*colorMap, GBool invert,
GBool inlineImg, int mask, int *maskColors);
- int clipping[64];
- int clippos;
+ SWFOutputState states[64];
+ int statepos;
int currentpage;
linkinfo = 0;
pbminfo = 0;
type3active = 0;
- clippos = 0;
- clipping[clippos] = 0;
+ statepos = 0;
outputstarted = 0;
xref = 0;
substitutepos = 0;
}
swfoutput_startclip(&output, line);
- clipping[clippos] ++;
+ states[statepos].clipping++;
gfxline_free(line);
}
void SWFOutputDev::eoClip(GfxState *state)
}
swfoutput_startclip(&output, line);
- clipping[clippos] ++;
+ states[statepos].clipping++;
gfxline_free(line);
}
return gTrue;
}
+char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible",
+ "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"};
+
void SWFOutputDev::beginString(GfxState *state, GString *s)
{
+ int render = state->getRender();
+ 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();
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], 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 ((state->getRender() & 3) == 3)
+ if (render == 3)
return;
+
+ if(states[statepos].textRender != render)
+ msg("<error> Internal error: drawChar.render!=beginString.render");
+
GfxRGB rgb;
double opaq = state->getFillOpacity();
state->getFillRGB(&rgb);
if(font->getType() == fontType3) {
/* type 3 chars are passed as graphics */
+ msg("<debug> type3 char at %f/%f", x, y);
return;
}
double x1,y1;
}
if (CIDToGIDMap) {
- msg("<debug> drawChar(%f, %f, c='%c' (%d), GID=%d, u=%d <%d>) CID=%d name=\"%s\"\n", x, y, (c&127)>=32?c:'?', c, CIDToGIDMap[c], u, uLen, font->isCIDFont(), FIXNULL(name));
+ msg("<debug> drawChar(%f, %f, c='%c' (%d), GID=%d, u=%d <%d>) CID=%d name=\"%s\" render=%d\n", x, y, (c&127)>=32?c:'?', c, CIDToGIDMap[c], u, uLen, font->isCIDFont(), FIXNULL(name), render);
swfoutput_drawchar(&output, x1, y1, name, CIDToGIDMap[c], u, &col);
} else {
- msg("<debug> drawChar(%f,%f,c='%c' (%d), u=%d <%d>) CID=%d name=\"%s\"\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name));
+ 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);
swfoutput_drawchar(&output, x1, y1, name, c, u, &col);
}
}
-void SWFOutputDev::endString(GfxState *state) {
+void SWFOutputDev::endString(GfxState *state)
+{
+ msg("<trace> endString()");
}
+void SWFOutputDev::endTextObject(GfxState *state)
+{
+ msg("<trace> endTextObject()");
+}
+
/* the logic seems to be as following:
first, beginType3Char is called, with the charcode and the coordinates.
if this function returns true, it already knew about the char and has now drawn it.
}
void SWFOutputDev::saveState(GfxState *state) {
- msg("<debug> saveState\n");
+ msg("<trace> saveState\n");
updateAll(state);
- if(clippos<64)
- clippos ++;
- else
+ if(statepos>=64) {
msg("<error> Too many nested states in pdf.");
- clipping[clippos] = 0;
+ return;
+ }
+ statepos ++;
+ states[statepos].clipping = 0; //? shouldn't this be the current value?
+ states[statepos].textRender = states[statepos-1].textRender;
};
void SWFOutputDev::restoreState(GfxState *state) {
- msg("<debug> restoreState\n");
+ msg("<trace> restoreState\n");
updateAll(state);
- while(clipping[clippos]) {
+ while(states[statepos].clipping) {
swfoutput_endclip(&output);
- clipping[clippos]--;
+ states[statepos].clipping--;
}
- clippos--;
+ statepos--;
}
char* SWFOutputDev::searchFont(char*name)
int width, int height, GBool invert,
GBool inlineImg)
{
+ if(states[statepos].textRender & 4) //clipped
+ return;
msg("<verbose> drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg);
drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1, 0);
}
int width, int height, GfxImageColorMap *colorMap,
int *maskColors, GBool inlineImg)
{
+ if(states[statepos].textRender & 4) //clipped
+ return;
+
msg("<verbose> drawImage %dx%d, %s %s, inline=%d", width, height,
colorMap?"colorMap":"no colorMap",
maskColors?"maskColors":"no maskColors",