splash/Splash.cc | 25 +++++++++++++------------ splash/SplashBitmap.cc | 25 +++++++++++++++++++++++-- splash/SplashClip.cc | 40 ++++++++++++++-------------------------- splash/SplashClip.h | 43 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 91 insertions(+), 42 deletions(-)
New commits: commit d074485aa9d9fac6b715382002f53e3303bbc519 Author: Albert Astals Cid <[email protected]> Date: Sat Feb 20 10:08:33 2010 +0000 Do not call getPixel if we know how to access the data Gives a 20% speed increase in some pdf diff --git a/splash/Splash.cc b/splash/Splash.cc index 202fe45..8b11583 100644 --- a/splash/Splash.cc +++ b/splash/Splash.cc @@ -3163,7 +3163,7 @@ void Splash::compositeBackground(SplashColorPtr color) { SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc, int xDest, int yDest, int w, int h) { SplashColor pixel; - SplashColorPtr p; + SplashColorPtr p, sp; Guchar *q; int x, y, mask; @@ -3203,23 +3203,24 @@ SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc, case splashModeBGR8: for (y = 0; y < h; ++y) { p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + 3 * xSrc]; for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - *p++ = pixel[0]; - *p++ = pixel[1]; - *p++ = pixel[2]; + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; } } break; case splashModeXBGR8: for (y = 0; y < h; ++y) { p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + 4 * xSrc]; for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - *p++ = pixel[0]; - *p++ = pixel[1]; - *p++ = pixel[2]; + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; *p++ = 255; + *sp++; } } break; commit d4cafe357bd86feb4b56e5dfbf5b7822e237a2ee Author: Albert Astals Cid <[email protected]> Date: Sat Feb 20 10:07:20 2010 +0000 Only call getPixel when really needed Gives a 8% speed increase in some pdf diff --git a/splash/Splash.cc b/splash/Splash.cc index 834cb10..202fe45 100644 --- a/splash/Splash.cc +++ b/splash/Splash.cc @@ -11,7 +11,7 @@ // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // -// Copyright (C) 2005-2009 Albert Astals Cid <[email protected]> +// Copyright (C) 2005-2010 Albert Astals Cid <[email protected]> // Copyright (C) 2005 Marco Pesenti Gritti <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -3018,11 +3018,11 @@ SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc, pipeSetXY(&pipe, xDest, yDest + y); ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); alpha = *ap++; if (noClip || state->clip->test(xDest + x, yDest + y)) { // this uses shape instead of alpha, which isn't technically // correct, but works out the same + src->getPixel(xSrc + x, ySrc + y, pixel); pipe.shape = (SplashCoord)(alpha / 255.0); pipeRun(&pipe); updateModX(xDest + x); @@ -3038,8 +3038,8 @@ SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc, for (y = 0; y < h; ++y) { pipeSetXY(&pipe, xDest, yDest + y); for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); if (noClip || state->clip->test(xDest + x, yDest + y)) { + src->getPixel(xSrc + x, ySrc + y, pixel); pipeRun(&pipe); updateModX(xDest + x); updateModY(yDest + y); commit c3122cfbe090f3a4045269222f941cd5ce77c171 Author: Albert Astals Cid <[email protected]> Date: Sat Feb 20 10:04:37 2010 +0000 Move test code to the header to it can be inlined Gives a 10% speed increase in some documents diff --git a/splash/SplashClip.cc b/splash/SplashClip.cc index 87b0d7e..5add152 100644 --- a/splash/SplashClip.cc +++ b/splash/SplashClip.cc @@ -4,6 +4,20 @@ // //======================================================================== +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Albert Astals Cid <[email protected]> +// +// 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 +// +//======================================================================== + #include <config.h> #ifdef USE_GCC_PRAGMAS @@ -248,32 +262,6 @@ SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix, return splashOk; } -GBool SplashClip::test(int x, int y) { - int i; - - // check the rectangle - if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) { - return gFalse; - } - - // check the paths - if (antialias) { - for (i = 0; i < length; ++i) { - if (!scanners[i]->test(x * splashAASize, y * splashAASize)) { - return gFalse; - } - } - } else { - for (i = 0; i < length; ++i) { - if (!scanners[i]->test(x, y)) { - return gFalse; - } - } - } - - return gTrue; -} - SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin, int rectXMax, int rectYMax) { // This tests the rectangle: diff --git a/splash/SplashClip.h b/splash/SplashClip.h index 1864149..7933017 100644 --- a/splash/SplashClip.h +++ b/splash/SplashClip.h @@ -4,6 +4,20 @@ // //======================================================================== +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Albert Astals Cid <[email protected]> +// +// 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 +// +//======================================================================== + #ifndef SPLASHCLIP_H #define SPLASHCLIP_H @@ -13,10 +27,10 @@ #include "SplashTypes.h" #include "SplashMath.h" +#include "SplashXPathScanner.h" class SplashPath; class SplashXPath; -class SplashXPathScanner; class SplashBitmap; //------------------------------------------------------------------------ @@ -57,7 +71,32 @@ public: SplashCoord flatness, GBool eo); // Returns true if (<x>,<y>) is inside the clip. - GBool test(int x, int y); + GBool test(int x, int y) + { + int i; + + // check the rectangle + if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) { + return gFalse; + } + + // check the paths + if (antialias) { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x * splashAASize, y * splashAASize)) { + return gFalse; + } + } + } else { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x, y)) { + return gFalse; + } + } + } + + return gTrue; + } // Tests a rectangle against the clipping region. Returns one of: // - splashClipAllInside if the entire rectangle is inside the commit d987fb9b77e6da454eb898cc6c8baaf747b7ac4f Author: Albert Astals Cid <[email protected]> Date: Fri Feb 19 23:59:03 2010 +0000 implement writeImgFile for splashModeXBGR8 diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc index 4844d0b..6832293 100644 --- a/splash/SplashBitmap.cc +++ b/splash/SplashBitmap.cc @@ -11,7 +11,7 @@ // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // -// Copyright (C) 2006, 2009 Albert Astals Cid <[email protected]> +// Copyright (C) 2006, 2009, 2010 Albert Astals Cid <[email protected]> // Copyright (C) 2007 Ilmari Heikkinen <[email protected]> // Copyright (C) 2009 Shen Liang <[email protected]> // Copyright (C) 2009 Stefan Thomas <[email protected]> @@ -307,7 +307,7 @@ SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, FILE *f, in return splashErrGeneric; } - if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1) { + if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1 && mode != splashModeXBGR8) { error(-1, "unsupported SplashBitmap mode"); return splashErrGeneric; } @@ -337,6 +337,27 @@ SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, FILE *f, in } break; + case splashModeXBGR8: + { + unsigned char *row = new unsigned char[3 * width]; + for (int y = 0; y < height; y++) { + // Convert into a PNG row + for (int x = 0; x < width; x++) { + row[3*x] = data[y * rowSize + x * 4 + 2]; + row[3*x+1] = data[y * rowSize + x * 4 + 1]; + row[3*x+2] = data[y * rowSize + x * 4]; + } + + if (!writer->writeRow(&row)) { + delete[] row; + delete writer; + return splashErrGeneric; + } + } + delete[] row; + } + break; + case splashModeMono8: { unsigned char *row = new unsigned char[3 * width]; _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
