[poppler] poppler/CharCodeToUnicode.cc poppler/Gfx.cc poppler/GfxFont.cc poppler/GlobalParams.cc poppler/GlobalParams.h
Thomas Freitag
Thomas.Freitag at kabelmail.de
Tue Mar 27 08:59:18 PDT 2012
Am 27.03.2012 11:32, schrieb mpsuzuki at hiroshima-u.ac.jp:
> Dear Thomas,
>
> Excuse me, could you post a patch after a check that proposed
> patch does not break the compilation? Your last patch broke
> the building under the configuration using win32 font backend.
> Unfortunately, it is already committed to git head and I could
> not build Win32 binary. I got following error.
>
> Yet I've not checked if MSVC environment can build it, but the
> error messages by GCC look quite fundamental error (e.g. the
> number of arguments does not match), so I guess it is not mingw-gcc
> specific issue.
>
> I attached a patch to finish the compilation successfully, but
> I'm not sure it is correctly reflecting your intention of the
> patch. Please review and fix this issue until the official release
> of 0.20.
Sorry. My intention was to solve a problem we have with fontconfig and
base14 fonts. I've missed that because of these changes we need an
adjustment also in the Windows routines. And the last days I tested only
under Unix...
Your changes are better than what I would have done: Because there is no
well implemented routine to find a fitting font under Windows, I would
have ignored the new parameters under Windows.
So thank You for Your patch,
Thomas
>
> Regards,
> mpsuzuki
>
> make[3]: Entering directory `/tmp/poppler-current/build-mingw/poppler'
> /bin/sh ../libtool --tag=CXX --mode=compile Sorry. My intention was to solve a problem we have with fontconfig and
> base14 fonts. I've missed that because of these changes we need an
> adjustment also in the Windows routines
>
> i586-mingw32msvc-g++ -DHAVE_CONFIG_H -I. -I/tmp/poppler-current/poppler -I.. -I/tmp/poppler-current -I/tmp/poppler-current/goo -I/tmp/libpng-mingw/include -I/tmp/zlib-mingw/include -I/tmp/ft2-mingwinclude/freetype2 -I/tmp/ft2-mingwinclude -D_WIN32_IE=0x0500 -Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common -g -O2 -MT GlobalParams.lo -MD -MP -MF .deps/GlobalParams.Tpo -c -o GlobalParams.lo /tmp/poppler-current/poppler/GlobalParams.cc
> libtool: compile: i586-mingw32msvc-g++ -DHAVE_CONFIG_H -I. -I/tmp/poppler-current/poppler -I.. -I/tmp/poppler-current -I/tmp/poppler-current/goo -I/tmp/libpng-mingw/include -I/tmp/zlib-mingw/include -I/tmp/ft2-mingwinclude/freetype2 -I/tmp/ft2-mingwinclude -D_WIN32_IE=0x0500 -Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common -g -O2 -MT GlobalParams.lo -MD -MP -MF .deps/GlobalParams.Tpo -c /tmp/poppler-current/poppler/GlobalParams.cc -o GlobalParams.o
> /tmp/poppler-current/poppler/GlobalParams.cc: In function 'char* get_poppler_datadir()':
> /tmp/poppler-current/poppler/GlobalParams.cc:180: warning: deprecated conversion from string constant to 'char*'
> In file included from /tmp/poppler-current/poppler/GlobalParams.cc:1340:
> /tmp/poppler-current/poppler/GlobalParamsWin.cc: In member function 'void SysFontList::scanWindowsFonts(GooString*)':
> /tmp/poppler-current/poppler/GlobalParamsWin.cc:243: warning: deprecated conversion from string constant to 'char*'
> /tmp/poppler-current/poppler/GlobalParamsWin.cc:245: warning: deprecated conversion from string constant to 'char*'
> /tmp/poppler-current/poppler/GlobalParamsWin.cc: In member function 'SysFontInfo* SysFontList::makeWindowsFont(char*, int, char*)':
> /tmp/poppler-current/poppler/GlobalParamsWin.cc:353: error: no matching function for call to 'SysFontInfo::SysFontInfo(GooString*&, GBool&, GBool&, GooString*, SysFontType&, int&)'
> /tmp/poppler-current/poppler/GlobalParams.cc:225: note: candidates are: SysFontInfo::SysFontInfo(GooString*, GBool, GBool, GBool, GBool, GooString*, SysFontType, int)
> /tmp/poppler-current/poppler/GlobalParams.cc:205: note: SysFontInfo::SysFontInfo(const SysFontInfo&)
> /tmp/poppler-current/poppler/GlobalParamsWin.cc: At global scope:
> /tmp/poppler-current/poppler/GlobalParamsWin.cc:475: error: prototype for 'GooString* GlobalParams::findSystemFontFile(GfxFont*, SysFontType*, int*, GooString*)' does not match any in class 'GlobalParams'
> /tmp/poppler-current/poppler/GlobalParams.h:151: error: candidate is: GooString* GlobalParams::findSystemFontFile(GfxFont*, SysFontType*, int*, GooString*, GooString*)
> /tmp/poppler-current/poppler/GlobalParamsWin.cc:452: warning: 'const char* findSubstituteName(GfxFont*, GooHash*, const char*)' defined but not used
> make[3]: *** [GlobalParams.lo] Error 1
>
>
>
>
>
>
>
>
> On Mon, 26 Mar 2012 15:02:29 -0700 (PDT)
> aacid at kemper.freedesktop.org (Albert Astals Cid) wrote:
>
>> poppler/CharCodeToUnicode.cc | 5
>> poppler/Gfx.cc | 329 +++++++++++++++++++------------------------
>> poppler/GfxFont.cc | 3
>> poppler/GlobalParams.cc | 78 +++++++---
>> poppler/GlobalParams.h | 6
>> 5 files changed, 218 insertions(+), 203 deletions(-)
>>
>> New commits:
>> commit d6a1b7dcaeac1e49533519b9f8a279fd64d04c67
>> Author: Thomas Freitag<Thomas.Freitag at alfa.de>
>> Date: Tue Mar 27 00:00:05 2012 +0200
>>
>> Some regression fixes/improvements
>>
>> I just finished the patch for these regressions, they had differents reasons
>> 1. In CharCodeToUnicode::mapToUnicode the identity support was missing
>> 2. The new algorithms for axial and radial shading caused problems in
>> cairo. I revert these changes but removed the examination of hidden
>> content (this is already done in the calling function)
>> 3. The examination of optional hidden content in showing text was wrong:
>> of course hidden text should not be shown, but text parameters like text
>> position in the state must be changed!
>> 4. Searching and finding fonts especially with base14 fonts should be
>> more exact than just looking at the base14 name (i.e. fixed width and so
>> on) when using fontconfig. I implement that to find the best font
>> fitting to the needs.
>>
>> diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc
>> index 076f5ba..d0e6c7f 100644
>> --- a/poppler/CharCodeToUnicode.cc
>> +++ b/poppler/CharCodeToUnicode.cc
>> @@ -20,6 +20,7 @@
>> // Copyright (C) 2008 Vasile Gaburici<gaburici at cs.umd.edu>
>> // Copyright (C) 2010 William Bader<williambader at hotmail.com>
>> // Copyright (C) 2010 Jakub Wilk<ubanus at users.sf.net>
>> +// Copyright (C) 2012 Thomas Freitag<Thomas.Freitag at alfa.de>
>> //
>> // To see a description of the changes please see the Changelog file that
>> // came with your tarball or type make ChangeLog if you are building from git
>> @@ -621,6 +622,10 @@ int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode **u) {
>> int CharCodeToUnicode::mapToCharCode(Unicode* u, CharCode *c, int usize) {
>> //look for charcode in map
>> if (usize == 1) {
>> + if (isIdentity) {
>> + *c = (CharCode) *u;
>> + return 1;
>> + }
>> for (CharCode i=0; i<mapLen; i++) {
>> if (map[i] == *u) {
>> *c = i;
>> diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
>> index 2cc8e28..958194b 100644
>> --- a/poppler/Gfx.cc
>> +++ b/poppler/Gfx.cc
>> @@ -28,7 +28,7 @@
>> // Copyright (C) 2008 Michael Vrable<mvrable at cs.ucsd.edu>
>> // Copyright (C) 2008 Hib Eris<hib at hiberis.nl>
>> // Copyright (C) 2009 M Joonas Pihlaja<jpihlaja at cc.helsinki.fi>
>> -// Copyright (C) 2009-2011 Thomas Freitag<Thomas.Freitag at alfa.de>
>> +// Copyright (C) 2009-2012 Thomas Freitag<Thomas.Freitag at alfa.de>
>> // Copyright (C) 2009 William Bader<williambader at hotmail.com>
>> // Copyright (C) 2009, 2010 David Benjamin<davidben at mit.edu>
>> // Copyright (C) 2010 Nils H?glund<nils.hoglund at gmail.com>
>> @@ -2576,10 +2576,10 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> double xMin, yMin, xMax, yMax;
>> double x0, y0, x1, y1;
>> double dx, dy, mul;
>> - GBool dxdyZero, horiz;
>> + GBool dxZero, dyZero;
>> double bboxIntersections[4];
>> double tMin, tMax, tx, ty;
>> - double sMin, sMax, tmp;
>> + double s[4], sMin, sMax, tmp;
>> double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1;
>> double t0, t1, tt;
>> double ta[axialMaxSplits + 1];
>> @@ -2597,9 +2597,9 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> shading->getCoords(&x0,&y0,&x1,&y1);
>> dx = x1 - x0;
>> dy = y1 - y0;
>> - dxdyZero = fabs(dx)< 0.01&& fabs(dy)< 0.01;
>> - horiz = fabs(dy)< fabs(dx);
>> - if (dxdyZero) {
>> + dxZero = fabs(dx)< 0.01;
>> + dyZero = fabs(dy)< 0.01;
>> + if (dxZero&& dyZero) {
>> tMin = tMax = 0;
>> } else {
>> mul = 1 / (dx * dx + dy * dy);
>> @@ -2636,16 +2636,18 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> // y(s) = ty + s * dx --> s = (y - ty) / dx
>> //
>> // Then look at the intersection of this line with the bounding box
>> - // (xMin, yMin, xMax, yMax). For -1< |dy/dx|< 1, look at the
>> - // intersection with yMin, yMax:
>> - //
>> - // s0 = (yMin - ty) / dx
>> - // s1 = (yMax - ty) / dx
>> - //
>> - // else look at the intersection with xMin, xMax:
>> + // (xMin, yMin, xMax, yMax). In the general case, there are four
>> + // intersection points:
>> //
>> // s0 = (xMin - tx) / -dy
>> // s1 = (xMax - tx) / -dy
>> + // s2 = (yMin - ty) / dx
>> + // s3 = (yMax - ty) / dx
>> + //
>> + // and we want the middle two s values.
>> + //
>> + // In the case where dx = 0, take s0 and s1; in the case where dy =
>> + // 0, take s2 and s3.
>> //
>> // Each filled polygon is bounded by two of these line segments
>> // perpdendicular to the t axis.
>> @@ -2654,10 +2656,13 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> // difference across a region is small enough, and then the region
>> // is painted with a single color.
>>
>> - // set up
>> + // set up: require at least one split to avoid problems when the two
>> + // ends of the t axis have the same color
>> nComps = shading->getColorSpace()->getNComps();
>> ta[0] = tMin;
>> - next[0] = axialMaxSplits;
>> + next[0] = axialMaxSplits / 2;
>> + ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax);
>> + next[axialMaxSplits / 2] = axialMaxSplits;
>> ta[axialMaxSplits] = tMax;
>>
>> // compute the color at t = tMin
>> @@ -2681,19 +2686,24 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> // bounding box
>> tx = x0 + tMin * dx;
>> ty = y0 + tMin * dy;
>> - if (dxdyZero) {
>> + if (dxZero&& dyZero) {
>> sMin = sMax = 0;
>> + } else if (dxZero) {
>> + sMin = (xMin - tx) / -dy;
>> + sMax = (xMax - tx) / -dy;
>> + if (sMin> sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
>> + } else if (dyZero) {
>> + sMin = (yMin - ty) / dx;
>> + sMax = (yMax - ty) / dx;
>> + if (sMin> sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
>> } else {
>> - if (horiz) {
>> - sMin = (yMin - ty) / dx;
>> - sMax = (yMax - ty) / dx;
>> - } else {
>> - sMin = (xMin - tx) / -dy;
>> - sMax = (xMax - tx) / -dy;
>> - }
>> - if (sMin> sMax) {
>> - tmp = sMin; sMin = sMax; sMax = tmp;
>> - }
>> + s[0] = (yMin - ty) / dx;
>> + s[1] = (yMax - ty) / dx;
>> + s[2] = (xMin - tx) / -dy;
>> + s[3] = (xMax - tx) / -dy;
>> + bubbleSort(s);
>> + sMin = s[1];
>> + sMax = s[2];
>> }
>> ux0 = tx - sMin * dy;
>> uy0 = ty + sMin * dx;
>> @@ -2702,7 +2712,7 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>>
>> i = 0;
>> bool doneBBox1, doneBBox2;
>> - if (dxdyZero) {
>> + if (dxZero&& dyZero) {
>> doneBBox1 = doneBBox2 = true;
>> } else {
>> doneBBox1 = bboxIntersections[1]< tMin;
>> @@ -2782,21 +2792,24 @@ void Gfx::doAxialShFill(GfxAxialShading *shading) {
>> // bounding box
>> tx = x0 + ta[j] * dx;
>> ty = y0 + ta[j] * dy;
>> - tx = x0 + ta[j] * dx;
>> - ty = y0 + ta[j] * dy;
>> - if (dxdyZero) {
>> + if (dxZero&& dyZero) {
>> sMin = sMax = 0;
>> + } else if (dxZero) {
>> + sMin = (xMin - tx) / -dy;
>> + sMax = (xMax - tx) / -dy;
>> + if (sMin> sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
>> + } else if (dyZero) {
>> + sMin = (yMin - ty) / dx;
>> + sMax = (yMax - ty) / dx;
>> + if (sMin> sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
>> } else {
>> - if (horiz) {
>> - sMin = (yMin - ty) / dx;
>> - sMax = (yMax - ty) / dx;
>> - } else {
>> - sMin = (xMin - tx) / -dy;
>> - sMax = (xMax - tx) / -dy;
>> - }
>> - if (sMin> sMax) {
>> - tmp = sMin; sMin = sMax; sMax = tmp;
>> - }
>> + s[0] = (yMin - ty) / dx;
>> + s[1] = (yMax - ty) / dx;
>> + s[2] = (xMin - tx) / -dy;
>> + s[3] = (xMax - tx) / -dy;
>> + bubbleSort(s);
>> + sMin = s[1];
>> + sMax = s[2];
>> }
>> ux1 = tx - sMin * dy;
>> uy1 = ty + sMin * dx;
>> @@ -2874,10 +2887,7 @@ void Gfx::doRadialShFill(GfxRadialShading *shading) {
>> GfxColor colorA, colorB;
>> double xa, ya, xb, yb, ra, rb;
>> double ta, tb, sa, sb;
>> - double sMin, sMax, h;
>> - double sLeft, sRight, sTop, sBottom, sZero, sDiag;
>> - GBool haveSLeft, haveSRight, haveSTop, haveSBottom, haveSZero;
>> - GBool haveSMin, haveSMax;
>> + double sz, xz, yz, sMin, sMax;
>> GBool enclosed;
>> int ia, ib, k, n;
>> double *ctm;
>> @@ -2892,21 +2902,24 @@ void Gfx::doRadialShFill(GfxRadialShading *shading) {
>>
>> // Compute the point at which r(s) = 0; check for the enclosed
>> // circles case; and compute the angles for the tangent lines.
>> - h = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
>> - if (h == 0) {
>> + if (x0 == x1&& y0 == y1) {
>> enclosed = gTrue;
>> theta = 0; // make gcc happy
>> - } else if (r1 - r0 == 0) {
>> + sz = 0; // make gcc happy
>> + } else if (r0 == r1) {
>> enclosed = gFalse;
>> theta = 0;
>> - } else if (fabs(r1 - r0)>= h) {
>> - enclosed = gTrue;
>> - theta = 0; // make gcc happy
>> + sz = 0; // make gcc happy
>> } else {
>> - enclosed = gFalse;
>> - theta = asin((r1 - r0) / h);
>> + sz = (r1> r0) ? -r0 / (r1 - r0) : -r1 / (r0 - r1);
>> + xz = x0 + sz * (x1 - x0);
>> + yz = y0 + sz * (y1 - y0);
>> + enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0)<= r0 * r0;
>> + theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz)));
>> + if (r0> r1) {
>> + theta = -theta;
>> + }
>> }
>> -
>> if (enclosed) {
>> alpha = 0;
>> } else {
>> @@ -2919,101 +2932,59 @@ void Gfx::doRadialShFill(GfxRadialShading *shading) {
>> sMin = 0;
>> sMax = 1;
>> } else {
>> - // solve x(sLeft) + r(sLeft) = xMin
>> - if ((haveSLeft = fabs((x1 + r1) - (x0 + r0))> 0.000001)) {
>> - sLeft = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0));
>> - } else {
>> - sLeft = 0; // make gcc happy
>> - }
>> - // solve x(sRight) - r(sRight) = xMax
>> - if ((haveSRight = fabs((x1 - r1) - (x0 - r0))> 0.000001)) {
>> - sRight = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0));
>> - } else {
>> - sRight = 0; // make gcc happy
>> - }
>> - // solve y(sBottom) + r(sBottom) = yMin
>> - if ((haveSBottom = fabs((y1 + r1) - (y0 + r0))> 0.000001)) {
>> - sBottom = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0));
>> - } else {
>> - sBottom = 0; // make gcc happy
>> - }
>> - // solve y(sTop) - r(sTop) = yMax
>> - if ((haveSTop = fabs((y1 - r1) - (y0 - r0))> 0.000001)) {
>> - sTop = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0));
>> - } else {
>> - sTop = 0; // make gcc happy
>> + sMin = 1;
>> + sMax = 0;
>> + // solve for x(s) + r(s) = xMin
>> + if ((x1 + r1) - (x0 + r0) != 0) {
>> + sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0));
>> + if (sa< sMin) {
>> + sMin = sa;
>> + } else if (sa> sMax) {
>> + sMax = sa;
>> + }
>> }
>> - // solve r(sZero) = 0
>> - if ((haveSZero = fabs(r1 - r0)> 0.000001)) {
>> - sZero = -r0 / (r1 - r0);
>> - } else {
>> - sZero = 0; // make gcc happy
>> + // solve for x(s) - r(s) = xMax
>> + if ((x1 - r1) - (x0 - r0) != 0) {
>> + sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0));
>> + if (sa< sMin) {
>> + sMin = sa;
>> + } else if (sa> sMax) {
>> + sMax = sa;
>> + }
>> }
>> - // solve r(sDiag) = sqrt((xMax-xMin)^2 + (yMax-yMin)^2)
>> - if (haveSZero) {
>> - sDiag = (sqrt((xMax - xMin) * (xMax - xMin) +
>> - (yMax - yMin) * (yMax - yMin)) - r0) / (r1 - r0);
>> - } else {
>> - sDiag = 0; // make gcc happy
>> + // solve for y(s) + r(s) = yMin
>> + if ((y1 + r1) - (y0 + r0) != 0) {
>> + sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0));
>> + if (sa< sMin) {
>> + sMin = sa;
>> + } else if (sa> sMax) {
>> + sMax = sa;
>> + }
>> }
>> - // compute sMin
>> - if (shading->getExtend0()) {
>> - sMin = 0;
>> - haveSMin = gFalse;
>> - if (x0< x1&& haveSLeft&& sLeft< 0) {
>> - sMin = sLeft;
>> - haveSMin = gTrue;
>> - } else if (x0> x1&& haveSRight&& sRight< 0) {
>> - sMin = sRight;
>> - haveSMin = gTrue;
>> + // solve for y(s) - r(s) = yMax
>> + if ((y1 - r1) - (y0 - r0) != 0) {
>> + sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0));
>> + if (sa< sMin) {
>> + sMin = sa;
>> + } else if (sa> sMax) {
>> + sMax = sa;
>> }
>> - if (y0< y1&& haveSBottom&& sBottom< 0) {
>> - if (!haveSMin || sBottom> sMin) {
>> - sMin = sBottom;
>> - haveSMin = gTrue;
>> - }
>> - } else if (y0> y1&& haveSTop&& sTop< 0) {
>> - if (!haveSMin || sTop> sMin) {
>> - sMin = sTop;
>> - haveSMin = gTrue;
>> - }
>> + }
>> + // check against sz
>> + if (r0< r1) {
>> + if (sMin< sz) {
>> + sMin = sz;
>> }
>> - if (haveSZero&& sZero< 0) {
>> - if (!haveSMin || sZero> sMin) {
>> - sMin = sZero;
>> - }
>> + } else if (r0> r1) {
>> + if (sMax> sz) {
>> + sMax = sz;
>> }
>> - } else {
>> + }
>> + // check the 'extend' flags
>> + if (!shading->getExtend0()&& sMin< 0) {
>> sMin = 0;
>> }
>> - // compute sMax
>> - if (shading->getExtend1()) {
>> - sMax = 1;
>> - haveSMax = gFalse;
>> - if (x1< x0&& haveSLeft&& sLeft> 1) {
>> - sMax = sLeft;
>> - haveSMax = gTrue;
>> - } else if (x1> x0&& haveSRight&& sRight> 1) {
>> - sMax = sRight;
>> - haveSMax = gTrue;
>> - }
>> - if (y1< y0&& haveSBottom&& sBottom> 1) {
>> - if (!haveSMax || sBottom< sMax) {
>> - sMax = sBottom;
>> - haveSMax = gTrue;
>> - }
>> - } else if (y1> y0&& haveSTop&& sTop> 1) {
>> - if (!haveSMax || sTop< sMax) {
>> - sMax = sTop;
>> - haveSMax = gTrue;
>> - }
>> - }
>> - if (haveSZero&& sDiag> 1) {
>> - if (!haveSMax || sDiag< sMax) {
>> - sMax = sDiag;
>> - }
>> - }
>> - } else {
>> + if (!shading->getExtend1()&& sMax> 1) {
>> sMax = 1;
>> }
>> }
>> @@ -3758,11 +3729,10 @@ void Gfx::opShowText(Object args[], int numArgs) {
>> out->updateFont(state);
>> fontChanged = gFalse;
>> }
>> - if (ocState) {
>> - out->beginStringOp(state);
>> - doShowText(args[0].getString());
>> - out->endStringOp(state);
>> - } else {
>> + out->beginStringOp(state);
>> + doShowText(args[0].getString());
>> + out->endStringOp(state);
>> + if (!ocState) {
>> doIncCharCount(args[0].getString());
>> }
>> }
>> @@ -3782,11 +3752,10 @@ void Gfx::opMoveShowText(Object args[], int numArgs) {
>> ty = state->getLineY() - state->getLeading();
>> state->textMoveTo(tx, ty);
>> out->updateTextPos(state);
>> - if (ocState) {
>> - out->beginStringOp(state);
>> - doShowText(args[0].getString());
>> - out->endStringOp(state);
>> - } else {
>> + out->beginStringOp(state);
>> + doShowText(args[0].getString());
>> + out->endStringOp(state);
>> + if (!ocState) {
>> doIncCharCount(args[0].getString());
>> }
>> }
>> @@ -3810,11 +3779,10 @@ void Gfx::opMoveSetShowText(Object args[], int numArgs) {
>> out->updateWordSpace(state);
>> out->updateCharSpace(state);
>> out->updateTextPos(state);
>> + out->beginStringOp(state);
>> + doShowText(args[2].getString());
>> + out->endStringOp(state);
>> if (ocState) {
>> - out->beginStringOp(state);
>> - doShowText(args[2].getString());
>> - out->endStringOp(state);
>> - } else {
>> doIncCharCount(args[2].getString());
>> }
>> }
>> @@ -3833,34 +3801,33 @@ void Gfx::opShowSpaceText(Object args[], int numArgs) {
>> out->updateFont(state);
>> fontChanged = gFalse;
>> }
>> - if (ocState) {
>> - out->beginStringOp(state);
>> - wMode = state->getFont()->getWMode();
>> - a = args[0].getArray();
>> - for (i = 0; i< a->getLength(); ++i) {
>> - a->get(i,&obj);
>> - if (obj.isNum()) {
>> + out->beginStringOp(state);
>> + wMode = state->getFont()->getWMode();
>> + a = args[0].getArray();
>> + for (i = 0; i< a->getLength(); ++i) {
>> + a->get(i,&obj);
>> + if (obj.isNum()) {
>> // this uses the absolute value of the font size to match
>> // Acrobat's behavior
>> - if (wMode) {
>> - state->textShift(0, -obj.getNum() * 0.001 *
>> - state->getFontSize());
>> - } else {
>> - state->textShift(-obj.getNum() * 0.001 *
>> - state->getFontSize() *
>> - state->getHorizScaling(), 0);
>> - }
>> - out->updateTextShift(state, obj.getNum());
>> - } else if (obj.isString()) {
>> - doShowText(obj.getString());
>> + if (wMode) {
>> + state->textShift(0, -obj.getNum() * 0.001 *
>> + state->getFontSize());
>> } else {
>> - error(errSyntaxError, getPos(),
>> - "Element of show/space array must be number or string");
>> + state->textShift(-obj.getNum() * 0.001 *
>> + state->getFontSize() *
>> + state->getHorizScaling(), 0);
>> }
>> - obj.free();
>> + out->updateTextShift(state, obj.getNum());
>> + } else if (obj.isString()) {
>> + doShowText(obj.getString());
>> + } else {
>> + error(errSyntaxError, getPos(),
>> + "Element of show/space array must be number or string");
>> }
>> - out->endStringOp(state);
>> - } else {
>> + obj.free();
>> + }
>> + out->endStringOp(state);
>> + if (!ocState) {
>> a = args[0].getArray();
>> for (i = 0; i< a->getLength(); ++i) {
>> a->get(i,&obj);
>> @@ -4018,7 +3985,8 @@ void Gfx::doShowText(GooString *s) {
>> originX *= state->getFontSize();
>> originY *= state->getFontSize();
>> state->textTransformDelta(originX, originY,&tOriginX,&tOriginY);
>> - out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
>> + if (ocState)
>> + out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
>> tdx, tdy, tOriginX, tOriginY, code, n, u, uLen);
>> state->shift(tdx, tdy);
>> p += n;
>> @@ -4055,7 +4023,8 @@ void Gfx::doShowText(GooString *s) {
>> dy *= state->getFontSize();
>> }
>> state->textTransformDelta(dx, dy,&tdx,&tdy);
>> - out->drawString(state, s);
>> + if (ocState)
>> + out->drawString(state, s);
>> state->shift(tdx, tdy);
>> }
>>
>> @@ -4063,7 +4032,7 @@ void Gfx::doShowText(GooString *s) {
>> out->endString(state);
>> }
>>
>> - if (patternFill) {
>> + if (patternFill&& ocState) {
>> out->saveTextPos(state);
>> // tell the OutputDev to do the clipping
>> out->endTextObject(state);
>> diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc
>> index b3016f4..ea22af8 100644
>> --- a/poppler/GfxFont.cc
>> +++ b/poppler/GfxFont.cc
>> @@ -29,6 +29,7 @@
>> // Copyright (C) 2011, 2012 Adrian Johnson<ajohnson at redneon.com>
>> // Copyright (C) 2012 Yi Yang<ahyangyi at gmail.com>
>> // Copyright (C) 2012 Suzuki Toshiya<mpsuzuki at hiroshima-u.ac.jp>
>> +// Copyright (C) 2012 Thomas Freitag<Thomas.Freitag at alfa.de>
>> //
>> // To see a description of the changes please see the Changelog file that
>> // came with your tarball or type make ChangeLog if you are building from git
>> @@ -693,7 +694,7 @@ GfxFontLoc *GfxFont::locateFont(XRef *xref, GBool ps) {
>> //----- external font file for Base-14 font
>> if (!ps&& !isCIDFont()&& ((Gfx8BitFont *)this)->base14) {
>> base14Name = new GooString(((Gfx8BitFont *)this)->base14->base14Name);
>> - if ((path = globalParams->findFontFile(base14Name))) {
>> + if ((path = globalParams->findBase14FontFile(base14Name, this))) {
>> if ((fontLoc = getExternalFont(path, gFalse))) {
>> delete base14Name;
>> return fontLoc;
>> diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc
>> index 76da74a..662f8f9 100644
>> --- a/poppler/GlobalParams.cc
>> +++ b/poppler/GlobalParams.cc
>> @@ -208,22 +208,27 @@ public:
>> GooString *name;
>> GBool bold;
>> GBool italic;
>> + GBool oblique;
>> + GBool fixedWidth;
>> GooString *path;
>> SysFontType type;
>> int fontNum; // for TrueType collections
>>
>> - SysFontInfo(GooString *nameA, GBool boldA, GBool italicA,
>> + SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA,
>> GooString *pathA, SysFontType typeA, int fontNumA);
>> ~SysFontInfo();
>> GBool match(SysFontInfo *fi);
>> + GBool match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA);
>> GBool match(GooString *nameA, GBool boldA, GBool italicA);
>> };
>>
>> -SysFontInfo::SysFontInfo(GooString *nameA, GBool boldA, GBool italicA,
>> +SysFontInfo::SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA,
>> GooString *pathA, SysFontType typeA, int fontNumA) {
>> name = nameA;
>> bold = boldA;
>> italic = italicA;
>> + oblique = obliqueA;
>> + fixedWidth = fixedWidthA;
>> path = pathA;
>> type = typeA;
>> fontNum = fontNumA;
>> @@ -236,7 +241,12 @@ SysFontInfo::~SysFontInfo() {
>>
>> GBool SysFontInfo::match(SysFontInfo *fi) {
>> return !strcasecmp(name->getCString(), fi->name->getCString())&&
>> - bold == fi->bold&& italic == fi->italic;
>> + bold == fi->bold&& italic == fi->italic&& oblique == fi->oblique&& fixedWidth == fi->fixedWidth;
>> +}
>> +
>> +GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA) {
>> + return !strcasecmp(name->getCString(), nameA->getCString())&&
>> + bold == boldA&& italic == italicA&& oblique == obliqueA&& fixedWidth == fixedWidthA;
>> }
>>
>> GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA) {
>> @@ -253,7 +263,7 @@ public:
>>
>> SysFontList();
>> ~SysFontList();
>> - SysFontInfo *find(GooString *name, GBool exact);
>> + SysFontInfo *find(GooString *name, GBool isFixedWidth, GBool exact);
>>
>> #ifdef WIN32
>> void scanWindowsFonts(GooString *winFontDir);
>> @@ -279,9 +289,9 @@ SysFontList::~SysFontList() {
>> deleteGooList(fonts, SysFontInfo);
>> }
>>
>> -SysFontInfo *SysFontList::find(GooString *name, GBool exact) {
>> +SysFontInfo *SysFontList::find(GooString *name, GBool fixedWidth, GBool exact) {
>> GooString *name2;
>> - GBool bold, italic;
>> + GBool bold, italic, oblique;
>> SysFontInfo *fi;
>> char c;
>> int n, i;
>> @@ -321,6 +331,15 @@ SysFontInfo *SysFontList::find(GooString *name, GBool exact) {
>> italic = gFalse;
>> }
>>
>> + // look for "Oblique"
>> + if (n> 6&& !strcmp(name2->getCString() + n - 7, "Oblique")) {
>> + name2->del(n - 7, 7);
>> + oblique = gTrue;
>> + n -= 6;
>> + } else {
>> + oblique = gFalse;
>> + }
>> +
>> // look for "Bold"
>> if (n> 4&& !strcmp(name2->getCString() + n - 4, "Bold")) {
>> name2->del(n - 4, 4);
>> @@ -352,7 +371,7 @@ SysFontInfo *SysFontList::find(GooString *name, GBool exact) {
>> fi = NULL;
>> for (i = 0; i< fonts->getLength(); ++i) {
>> fi = (SysFontInfo *)fonts->get(i);
>> - if (fi->match(name2, bold, italic)) {
>> + if (fi->match(name2, bold, italic, oblique, fixedWidth)) {
>> break;
>> }
>> fi = NULL;
>> @@ -623,9 +642,7 @@ GlobalParams::GlobalParams(const char *customPopplerDataDir)
>> unicodeMapCache = new UnicodeMapCache();
>> cMapCache = new CMapCache();
>>
>> -#ifdef _WIN32
>> baseFontsInitialized = gFalse;
>> -#endif
>> #ifdef ENABLE_PLUGINS
>> plugins = new GooList();
>> securityHandlers = new GooList();
>> @@ -985,7 +1002,7 @@ static const char *getFontLang(GfxFont *font)
>> return lang;
>> }
>>
>> -static FcPattern *buildFcPattern(GfxFont *font)
>> +static FcPattern *buildFcPattern(GfxFont *font, GooString *base14Name)
>> {
>> int weight = -1,
>> slant = -1,
>> @@ -997,7 +1014,7 @@ static FcPattern *buildFcPattern(GfxFont *font)
>> FcPattern *p;
>>
>> // this is all heuristics will be overwritten if font had proper info
>> - name = font->getName()->getCString();
>> + name = (base14Name == NULL) ? font->getName()->getCString() : base14Name->getCString();
>>
>> modifiers = strchr (name, ',');
>> if (modifiers == NULL)
>> @@ -1113,8 +1130,8 @@ GooString *GlobalParams::findFontFile(GooString *fontName) {
>> FILE *f;
>> int i, j;
>>
>> - lockGlobalParams;
>> setupBaseFonts(NULL);
>> + lockGlobalParams;
>> if ((path = (GooString *)fontFiles->lookup(fontName))) {
>> path = path->copy();
>> unlockGlobalParams;
>> @@ -1152,9 +1169,16 @@ GooString *GlobalParams::findFontFile(GooString *fontName) {
>> void GlobalParams::setupBaseFonts(char *dir) {
>> }
>>
>> +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
>> + SysFontType type;
>> + int fontNum;
>> +
>> + return findSystemFontFile(font,&type,&fontNum, NULL, base14Name);
>> +}
>> +
>> GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> SysFontType *type,
>> - int *fontNum, GooString *substituteFontName) {
>> + int *fontNum, GooString *substituteFontName, GooString *base14Name) {
>> SysFontInfo *fi = NULL;
>> FcPattern *p=0;
>> GooString *path = NULL;
>> @@ -1163,7 +1187,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> fontName = fontName->copy();
>> lockGlobalParams;
>>
>> - if ((fi = sysFonts->find(fontName, gTrue))) {
>> + if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gTrue))) {
>> path = fi->path->copy();
>> *type = fi->type;
>> *fontNum = fi->fontNum;
>> @@ -1174,7 +1198,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> FcFontSet *set;
>> int i;
>> FcLangSet *lb = NULL;
>> - p = buildFcPattern(font);
>> + p = buildFcPattern(font, base14Name);
>>
>> if (!p)
>> goto fin;
>> @@ -1241,6 +1265,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> int weight, slant;
>> GBool bold = font->isBold();
>> GBool italic = font->isItalic();
>> + GBool oblique = gFalse;
>> FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0,&weight);
>> FcPatternGetInteger(set->fonts[i], FC_SLANT, 0,&slant);
>> if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD
>> @@ -1250,10 +1275,12 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> }
>> if (slant == FC_SLANT_ITALIC)
>> italic = gTrue;
>> + if (slant == FC_SLANT_OBLIQUE)
>> + oblique = gTrue;
>> *fontNum = 0;
>> *type = (!strncasecmp(ext,".ttc",4)) ? sysFontTTC : sysFontTTF;
>> FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum);
>> - fi = new SysFontInfo(fontName->copy(), bold, italic,
>> + fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(),
>> new GooString((char*)s), *type, *fontNum);
>> sysFonts->addFcFont(fi);
>> path = new GooString((char*)s);
>> @@ -1263,6 +1290,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> int weight, slant;
>> GBool bold = font->isBold();
>> GBool italic = font->isItalic();
>> + GBool oblique = gFalse;
>> FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0,&weight);
>> FcPatternGetInteger(set->fonts[i], FC_SLANT, 0,&slant);
>> if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD
>> @@ -1272,10 +1300,12 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> }
>> if (slant == FC_SLANT_ITALIC)
>> italic = gTrue;
>> + if (slant == FC_SLANT_OBLIQUE)
>> + oblique = gTrue;
>> *fontNum = 0;
>> *type = (!strncasecmp(ext,".pfa",4)) ? sysFontPFA : sysFontPFB;
>> FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum);
>> - fi = new SysFontInfo(fontName->copy(), bold, italic,
>> + fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(),
>> new GooString((char*)s), *type, *fontNum);
>> sysFonts->addFcFont(fi);
>> path = new GooString((char*)s);
>> @@ -1294,7 +1324,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>> }
>> FcFontSetDestroy(set);
>> }
>> - if (path == NULL&& (fi = sysFonts->find(fontName, gFalse))) {
>> + if (path == NULL&& (fi = sysFonts->find(fontName, font->isFixedWidth(), gFalse))) {
>> path = fi->path->copy();
>> *type = fi->type;
>> *fontNum = fi->fontNum;
>> @@ -1308,7 +1338,15 @@ fin:
>>
>> #elif WITH_FONTCONFIGURATION_WIN32
>> #include "GlobalParamsWin.cc"
>> +
>> +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
>> + return findFontFile(base14Name);
>> +}
>> #else
>> +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
>> + return findFontFile(base14Name);
>> +}
>> +
>> static struct {
>> const char *name;
>> const char *t1FileName;
>> @@ -1390,12 +1428,12 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font,
>>
>> path = NULL;
>> lockGlobalParams;
>> - if ((fi = sysFonts->find(font->getName(), gFalse))) {
>> + if ((fi = sysFonts->find(font->getName(), font->isFixedWidth(), gFalse))) {
>> path = fi->path->copy();
>> *type = fi->type;
>> *fontNum = fi->fontNum;
>> }
>> - unlockGlobalParams;
>> + unlockGlobalParams;
>> return path;
>> }
>> #endif
>> diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h
>> index be14123..375ac2c 100644
>> --- a/poppler/GlobalParams.h
>> +++ b/poppler/GlobalParams.h
>> @@ -147,8 +147,10 @@ public:
>> FILE *findCMapFile(GooString *collection, GooString *cMapName);
>> FILE *findToUnicodeFile(GooString *name);
>> GooString *findFontFile(GooString *fontName);
>> + GooString *findBase14FontFile(GooString *base14Name, GfxFont *font);
>> GooString *findSystemFontFile(GfxFont *font, SysFontType *type,
>> - int *fontNum, GooString *substituteFontName = NULL);
>> + int *fontNum, GooString *substituteFontName = NULL,
>> + GooString *base14Name = NULL);
>> GooString *findCCFontFile(GooString *collection);
>> GBool getPSExpandSmaller();
>> GBool getPSShrinkLarger();
>> @@ -286,8 +288,8 @@ private:
>> GooHash *cMapDirs; // list of CMap dirs, indexed by collection
>> // name [GooList[GooString]]
>> GooList *toUnicodeDirs; // list of ToUnicode CMap dirs [GooString]
>> -#ifdef _WIN32
>> GBool baseFontsInitialized;
>> +#ifdef _WIN32
>> GooHash *substFiles; // windows font substitutes (for CID fonts)
>> #endif
>> GooHash *fontFiles; // font files: font name mapped to path
>>
>>
>>
>> _______________________________________________
>> poppler mailing list
>> poppler at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/poppler
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/poppler/attachments/20120327/4be03cc2/attachment-0001.htm>
More information about the poppler
mailing list