summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/pdfinput/pdf-parser.cpp
diff options
context:
space:
mode:
authorPeter Moulder <peter.moulder@monash.edu>2008-07-19 14:45:13 +0000
committerpjrm <pjrm@users.sourceforge.net>2008-07-19 14:45:13 +0000
commit49781f0c54c6b93f774dda03265bae496597a031 (patch)
tree7927c24bb9959d14db568600ae340139bd6c9390 /src/extension/internal/pdfinput/pdf-parser.cpp
parentconfigure.ac: Add test for POPPLER_NEW_GFXFONT. (diff)
downloadinkscape-49781f0c54c6b93f774dda03265bae496597a031.tar.gz
inkscape-49781f0c54c6b93f774dda03265bae496597a031.zip
noop: Refactor massive copy&paste of PdfParser::doShowText, in exchange for using three one-line-each #ifdef/#else blocks instead of one big one covering the whole function.
(bzr r6365)
Diffstat (limited to 'src/extension/internal/pdfinput/pdf-parser.cpp')
-rw-r--r--src/extension/internal/pdfinput/pdf-parser.cpp153
1 files changed, 13 insertions, 140 deletions
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 390d52479..05bf3bf92 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -2192,10 +2192,9 @@ void PdfParser::opShowSpaceText(Object args[], int numArgs) {
}
-#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?
*/
@@ -2205,143 +2204,11 @@ void PdfParser::doShowText(GooString *s) {
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];
@@ -2389,7 +2256,11 @@ void PdfParser::doShowText(GooString *s) {
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 == ' ') {
@@ -2438,7 +2309,11 @@ void PdfParser::doShowText(GooString *s) {
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) {
@@ -2470,8 +2345,6 @@ void PdfParser::doShowText(GooString *s) {
builder->endString(state);
}
-#endif /* POPPLER_NEW_GFXFONT */
-
//------------------------------------------------------------------------
// XObject operators