[poppler] Branch 'xpdf303merge' - 5 commits - poppler/Page.h splash/SplashClip.h splash/SplashMath.h utils/ImageOutputDev.cc utils/ImageOutputDev.h
Albert Astals Cid
aacid at kemper.freedesktop.org
Thu Sep 1 07:43:16 PDT 2011
poppler/Page.h | 1
splash/SplashClip.h | 6 ++
splash/SplashMath.h | 118 ++++++++++++++++++++++++++++++++++++++++++++++++
utils/ImageOutputDev.cc | 9 +++
utils/ImageOutputDev.h | 12 ++++
5 files changed, 145 insertions(+), 1 deletion(-)
New commits:
commit f848edab849910b8291c7974e484ef5d02b2234c
Author: Albert Astals Cid <aacid at kde.org>
Date: Thu Sep 1 16:42:30 2011 +0200
xpdf303: Do not extract the million tiles of a pattern
diff --git a/utils/ImageOutputDev.cc b/utils/ImageOutputDev.cc
index 99b3319..6ca5ef4 100644
--- a/utils/ImageOutputDev.cc
+++ b/utils/ImageOutputDev.cc
@@ -70,6 +70,15 @@ void ImageOutputDev::setFilename(const char *fileExt) {
}
}
+GBool ImageOutputDev::tilingPatternFill(GfxState *state, Catalog *cat, Object *str,
+ double *pmat, int paintType, int tilingType, Dict *resDict,
+ double *mat, double *bbox,
+ int x0, int y0, int x1, int y1,
+ double xStep, double yStep) {
+ return gTrue;
+ // do nothing -- this avoids the potentially slow loop in Gfx.cc
+}
+
void ImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
int width, int height, GBool invert,
GBool interpolate, GBool inlineImg) {
diff --git a/utils/ImageOutputDev.h b/utils/ImageOutputDev.h
index e5dacc9..1e43308 100644
--- a/utils/ImageOutputDev.h
+++ b/utils/ImageOutputDev.h
@@ -58,6 +58,11 @@ public:
// Check if file was successfully created.
virtual GBool isOk() { return ok; }
+ // Does this device use tilingPatternFill()? If this returns false,
+ // tiling pattern fills will be reduced to a series of other drawing
+ // operations.
+ virtual GBool useTilingPatternFill() { return gTrue; }
+
// Does this device use beginType3Char/endType3Char? Otherwise,
// text in Type 3 fonts will be drawn with drawChar/drawString.
virtual GBool interpretType3Chars() { return gFalse; }
@@ -78,6 +83,13 @@ public:
// Does this device use drawChar() or drawString()?
virtual GBool useDrawChar() { return gFalse; }
+ //----- path painting
+ virtual GBool tilingPatternFill(GfxState *state, Catalog *cat, Object *str,
+ double *pmat, int paintType, int tilingType, Dict *resDict,
+ double *mat, double *bbox,
+ int x0, int y0, int x1, int y1,
+ double xStep, double yStep);
+
//----- image drawing
virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
int width, int height, GBool invert,
commit 01adb7ef6a524d7313a45e7c5f441da4fd0250bd
Author: Albert Astals Cid <aacid at kde.org>
Date: Thu Sep 1 16:31:50 2011 +0200
xpdf303: Assembler for some functions
diff --git a/splash/SplashMath.h b/splash/SplashMath.h
index 5aa3789..1886dec 100644
--- a/splash/SplashMath.h
+++ b/splash/SplashMath.h
@@ -45,6 +45,42 @@ static inline int splashFloor(SplashCoord x) {
return FixedPoint::floor(x);
#elif USE_FLOAT
return (int)floorf(x);
+ #elif __GNUC__ && __i386__
+ // floor() and (int)() are implemented separately, which results
+ // in changing the FPCW multiple times - so we optimize it with
+ // some inline assembly
+ Gushort oldCW, newCW, t;
+ int result;
+
+ __asm__ volatile("fldl %4\n"
+ "fnstcw %0\n"
+ "movw %0, %3\n"
+ "andw $0xf3ff, %3\n"
+ "orw $0x0400, %3\n"
+ "movw %3, %1\n" // round down
+ "fldcw %1\n"
+ "fistpl %2\n"
+ "fldcw %0\n"
+ : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+ : "m" (x));
+ return result;
+ #elif defined(WIN32) && defined(_M_IX86)
+ // floor() and (int)() are implemented separately, which results
+ // in changing the FPCW multiple times - so we optimize it with
+ // some inline assembly
+ Gushort oldCW, newCW;
+ int result;
+
+ __asm fld QWORD PTR x
+ __asm fnstcw WORD PTR oldCW
+ __asm mov ax, WORD PTR oldCW
+ __asm and ax, 0xf3ff
+ __asm or ax, 0x0400
+ __asm mov WORD PTR newCW, ax // round down
+ __asm fldcw WORD PTR newCW
+ __asm fistp DWORD PTR result
+ __asm fldcw WORD PTR oldCW
+ return result;
#else
if (x > 0) return (int)x;
else return (int)floor(x);
@@ -56,6 +92,42 @@ static inline int splashCeil(SplashCoord x) {
return FixedPoint::ceil(x);
#elif USE_FLOAT
return (int)ceilf(x);
+#elif __GNUC__ && __i386__
+ // ceil() and (int)() are implemented separately, which results
+ // in changing the FPCW multiple times - so we optimize it with
+ // some inline assembly
+ Gushort oldCW, newCW, t;
+ int result;
+
+ __asm__ volatile("fldl %4\n"
+ "fnstcw %0\n"
+ "movw %0, %3\n"
+ "andw $0xf3ff, %3\n"
+ "orw $0x0800, %3\n"
+ "movw %3, %1\n" // round up
+ "fldcw %1\n"
+ "fistpl %2\n"
+ "fldcw %0\n"
+ : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+ : "m" (x));
+ return result;
+#elif defined(WIN32) && defined(_M_IX86)
+ // ceil() and (int)() are implemented separately, which results
+ // in changing the FPCW multiple times - so we optimize it with
+ // some inline assembly
+ Gushort oldCW, newCW;
+ int result;
+
+ __asm fld QWORD PTR x
+ __asm fnstcw WORD PTR oldCW
+ __asm mov ax, WORD PTR oldCW
+ __asm and ax, 0xf3ff
+ __asm or ax, 0x0800
+ __asm mov WORD PTR newCW, ax // round up
+ __asm fldcw WORD PTR newCW
+ __asm fistp DWORD PTR result
+ __asm fldcw WORD PTR oldCW
+ return result;
#else
return (int)ceil(x);
#endif
@@ -64,6 +136,44 @@ static inline int splashCeil(SplashCoord x) {
static inline int splashRound(SplashCoord x) {
#if USE_FIXEDPOINT
return FixedPoint::round(x);
+#elif __GNUC__ && __i386__
+ // this could use round-to-nearest mode and avoid the "+0.5",
+ // but that produces slightly different results (because i+0.5
+ // sometimes rounds up and sometimes down using the even rule)
+ Gushort oldCW, newCW, t;
+ int result;
+
+ x += 0.5;
+ __asm__ volatile("fldl %4\n"
+ "fnstcw %0\n"
+ "movw %0, %3\n"
+ "andw $0xf3ff, %3\n"
+ "orw $0x0400, %3\n"
+ "movw %3, %1\n" // round down
+ "fldcw %1\n"
+ "fistpl %2\n"
+ "fldcw %0\n"
+ : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+ : "m" (x));
+ return result;
+#elif defined(WIN32) && defined(_M_IX86)
+ // this could use round-to-nearest mode and avoid the "+0.5",
+ // but that produces slightly different results (because i+0.5
+ // sometimes rounds up and sometimes down using the even rule)
+ Gushort oldCW, newCW;
+ int result;
+
+ x += 0.5;
+ __asm fld QWORD PTR x
+ __asm fnstcw WORD PTR oldCW
+ __asm mov ax, WORD PTR oldCW
+ __asm and ax, 0xf3ff
+ __asm or ax, 0x0400
+ __asm mov WORD PTR newCW, ax // round down
+ __asm fldcw WORD PTR newCW
+ __asm fistp DWORD PTR result
+ __asm fldcw WORD PTR oldCW
+ return result;
#else
return (int)splashFloor(x + 0.5);
#endif
commit 4f87a3163f133565e8774ef416e67d05f906723d
Author: Albert Astals Cid <aacid at kde.org>
Date: Thu Sep 1 16:25:19 2011 +0200
xpdf303: Add splashAvg
diff --git a/splash/SplashMath.h b/splash/SplashMath.h
index 0749c78..5aa3789 100644
--- a/splash/SplashMath.h
+++ b/splash/SplashMath.h
@@ -69,6 +69,14 @@ static inline int splashRound(SplashCoord x) {
#endif
}
+static inline SplashCoord splashAvg(SplashCoord x, SplashCoord y) {
+#if USE_FIXEDPOINT
+ return FixedPoint::avg(x, y);
+#else
+ return 0.5 * (x + y);
+#endif
+}
+
static inline SplashCoord splashSqrt(SplashCoord x) {
#if USE_FIXEDPOINT
return FixedPoint::sqrt(x);
commit 64cf42f89939763d105be4948a20e9ecb81a64c1
Author: Albert Astals Cid <aacid at kde.org>
Date: Thu Sep 1 16:23:08 2011 +0200
xpdf303: Add getters to SplashClip
diff --git a/splash/SplashClip.h b/splash/SplashClip.h
index 7933017..3eb2d78 100644
--- a/splash/SplashClip.h
+++ b/splash/SplashClip.h
@@ -118,6 +118,12 @@ public:
// will update <x0> and <x1>.
void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y);
+ // Get the rectangle part of the clip region.
+ SplashCoord getXMin() { return xMin; }
+ SplashCoord getXMax() { return xMax; }
+ SplashCoord getYMin() { return yMin; }
+ SplashCoord getYMax() { return yMax; }
+
// Get the rectangle part of the clip region, in integer coordinates.
int getXMinI() { return xMinI; }
int getXMaxI() { return xMaxI; }
commit 28c6a55742f55a719ef63b8e0eff7c242653cf36
Author: Albert Astals Cid <aacid at kde.org>
Date: Thu Sep 1 16:17:56 2011 +0200
xpdf303: unneeded forward declare
diff --git a/poppler/Page.h b/poppler/Page.h
index f78be70..c5ff8d7 100644
--- a/poppler/Page.h
+++ b/poppler/Page.h
@@ -39,7 +39,6 @@ class PDFDoc;
class XRef;
class OutputDev;
class Links;
-class Catalog;
class Annots;
class Annot;
class Gfx;
More information about the poppler
mailing list