summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 06b31ee)
raw | patch | inline | side by side (parent: 06b31ee)
author | pjrm <pjrm@users.sourceforge.net> | |
Sat, 19 Jul 2008 14:45:13 +0000 (14:45 +0000) | ||
committer | pjrm <pjrm@users.sourceforge.net> | |
Sat, 19 Jul 2008 14:45:13 +0000 (14:45 +0000) |
src/extension/internal/pdfinput/pdf-parser.cpp | patch | blob | history |
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 390d524790866caeac9e8679512482d81f22c738..05bf3bf92383d395fece1ada099ea21c98633984 100644 (file)
}
-#ifdef POPPLER_NEW_GFXFONT
-/**
- * This is for the change to GfxFont's getNextChar() call.
+/*
+ * The `POPPLER_NEW_GFXFONT' stuff is for the change to GfxFont's getNextChar() call.
* Thanks to tsdgeos for the fix.
* Miklos, does this look ok?
*/
int wMode;
double riseX, riseY;
CharCode code;
+#ifdef POPPLER_NEW_GFXFONT
Unicode *u = NULL;
- double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY;
- double originX, originY, tOriginX, tOriginY;
- double oldCTM[6], newCTM[6];
- double *mat;
- Object charProc;
- Dict *resDict;
- Parser *oldParser;
- char *p;
- int len, n, uLen, nChars, nSpaces, i;
-
- font = state->getFont();
- wMode = font->getWMode();
-
- builder->beginString(state, s);
-
- // handle a Type 3 char
- if (font->getType() == fontType3 && 0) {//out->interpretType3Chars()) {
- mat = state->getCTM();
- for (i = 0; i < 6; ++i) {
- oldCTM[i] = mat[i];
- }
- mat = state->getTextMat();
- newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2];
- newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3];
- newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2];
- newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3];
- mat = font->getFontMatrix();
- newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2];
- newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3];
- newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2];
- newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3];
- newCTM[0] *= state->getFontSize();
- newCTM[1] *= state->getFontSize();
- newCTM[2] *= state->getFontSize();
- newCTM[3] *= state->getFontSize();
- newCTM[0] *= state->getHorizScaling();
- newCTM[2] *= state->getHorizScaling();
- state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
- curX = state->getCurX();
- curY = state->getCurY();
- lineX = state->getLineX();
- lineY = state->getLineY();
- oldParser = parser;
- p = s->getCString();
- len = s->getLength();
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- &u, &uLen,
- &dx, &dy, &originX, &originY);
- dx = dx * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dx += state->getWordSpace();
- }
- dx *= state->getHorizScaling();
- dy *= state->getFontSize();
- state->textTransformDelta(dx, dy, &tdx, &tdy);
- state->transform(curX + riseX, curY + riseY, &x, &y);
- saveState();
- state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y);
- //~ the CTM concat values here are wrong (but never used)
- //out->updateCTM(state, 1, 0, 0, 1, 0, 0);
- if (0){ /*!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy,
- code, u, uLen)) {*/
- ((Gfx8BitFont *)font)->getCharProc(code, &charProc);
- if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
- pushResources(resDict);
- }
- if (charProc.isStream()) {
- //parse(&charProc, gFalse); // TODO: parse into SVG font
- } else {
- error(getPos(), "Missing or bad Type3 CharProc entry");
- }
- //out->endType3Char(state);
- if (resDict) {
- popResources();
- }
- charProc.free();
- }
- restoreState();
- // GfxState::restore() does *not* restore the current position,
- // so we deal with it here using (curX, curY) and (lineX, lineY)
- curX += tdx;
- curY += tdy;
- state->moveTo(curX, curY);
- state->textSetPos(lineX, lineY);
- p += n;
- len -= n;
- }
- parser = oldParser;
-
- } else {
- state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
- p = s->getCString();
- len = s->getLength();
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- &u, &uLen,
- &dx, &dy, &originX, &originY);
-
- if (wMode) {
- dx *= state->getFontSize();
- dy = dy * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dy += state->getWordSpace();
- }
- } else {
- dx = dx * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dx += state->getWordSpace();
- }
- dx *= state->getHorizScaling();
- dy *= state->getFontSize();
- }
- state->textTransformDelta(dx, dy, &tdx, &tdy);
- originX *= state->getFontSize();
- originY *= state->getFontSize();
- state->textTransformDelta(originX, originY, &tOriginX, &tOriginY);
- builder->addChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
- dx, dy, tOriginX, tOriginY, code, n, u, uLen);
- state->shift(tdx, tdy);
- p += n;
- len -= n;
- }
- }
-
- builder->endString(state);
-}
-
-#else /* !POPPLER_NEW_GFXFONT */
-
-void PdfParser::doShowText(GooString *s) {
- GfxFont *font;
- int wMode;
- double riseX, riseY;
- CharCode code;
+#else
Unicode u[8];
+#endif
double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY;
double originX, originY, tOriginX, tOriginY;
double oldCTM[6], newCTM[6];
len = s->getLength();
while (len > 0) {
n = font->getNextChar(p, len, &code,
+#ifdef POPPLER_NEW_GFXFONT
+ &u, &uLen, /* TODO: This looks like a memory leak for u. */
+#else
u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+#endif
&dx, &dy, &originX, &originY);
dx = dx * state->getFontSize() + state->getCharSpace();
if (n == 1 && *p == ' ') {
len = s->getLength();
while (len > 0) {
n = font->getNextChar(p, len, &code,
+#ifdef POPPLER_NEW_GFXFONT
+ &u, &uLen, /* TODO: This looks like a memory leak for u. */
+#else
u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+#endif
&dx, &dy, &originX, &originY);
if (wMode) {
builder->endString(state);
}
-#endif /* POPPLER_NEW_GFXFONT */
-
//------------------------------------------------------------------------
// XObject operators