[poppler] splash/Splash.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Thu Feb 21 10:46:40 PST 2008


 splash/Splash.cc |   76 +++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 49 insertions(+), 27 deletions(-)

New commits:
commit 452ae6f5674b00b43955952961f7ca0583f73e27
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 21 19:46:19 2008 +0100

    Make sure we don't draw outside the bitmap on Splash::fillGlyph2

diff --git a/splash/Splash.cc b/splash/Splash.cc
index d9306fa..bf6d506 100644
--- a/splash/Splash.cc
+++ b/splash/Splash.cc
@@ -1723,15 +1723,37 @@ void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip)
   Guchar *p;
   int x1, y1, xx, xx1, yy;
 
+  p = glyph->data;
+  int xStart = x0 - glyph->x;
+  int yStart = y0 - glyph->y;
+  int xxLimit = glyph->w;
+  int yyLimit = glyph->h;
+
+  if (yStart < 0)
+  {
+    p += glyph->w * -yStart; // move p to the beginning of the first painted row
+    yyLimit += yStart;
+    yStart = 0;
+  }
+
+  if (xStart < 0)
+  {
+    p += -xStart; // move p to the first painted pixel
+    xxLimit += xStart;
+    xStart = 0;
+  }
+
+  if (xxLimit + xStart >= bitmap->width) xxLimit = bitmap->width - xStart;
+  if (yyLimit + yStart >= bitmap->height) yyLimit = bitmap->height - yStart;
+
   if (noClip) {
     if (glyph->aa) {
-      pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
+      pipeInit(&pipe, xStart, yStart,
                state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse);
-      p = glyph->data;
-      for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
-        pipeSetXY(&pipe, x0 - glyph->x, y1);
-        for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
-          alpha = *p++;
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) {
+          alpha = p[xx];
           if (alpha != 0) {
             pipe.shape = (SplashCoord)(alpha / 255.0);
             pipeRun(&pipe);
@@ -1741,16 +1763,16 @@ void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip)
             pipeIncX(&pipe);
           }
         }
+        p += glyph->w;
       }
     } else {
-      pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
+      pipeInit(&pipe, xStart, yStart,
                state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse);
-      p = glyph->data;
-      for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
-        pipeSetXY(&pipe, x0 - glyph->x, y1);
-        for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) {
-          alpha0 = *p++;
-          for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) {
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) {
+          alpha0 = p[xx];
+          for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) {
             if (alpha0 & 0x80) {
               pipeRun(&pipe);
               updateModX(x1);
@@ -1761,18 +1783,18 @@ void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip)
             alpha0 <<= 1;
           }
         }
+        p += glyph->w;
       }
     }
   } else {
     if (glyph->aa) {
-      pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
+      pipeInit(&pipe, xStart, yStart,
                state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse);
-      p = glyph->data;
-      for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
-        pipeSetXY(&pipe, x0 - glyph->x, y1);
-        for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) {
           if (state->clip->test(x1, y1)) {
-            alpha = *p++;
+            alpha = p[xx];
             if (alpha != 0) {
               pipe.shape = (SplashCoord)(alpha / 255.0);
               pipeRun(&pipe);
@@ -1783,19 +1805,18 @@ void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip)
             }
           } else {
             pipeIncX(&pipe);
-            ++p;
           }
         }
+        p += glyph->w;
       }
     } else {
-      pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
+      pipeInit(&pipe, xStart, yStart,
                state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse);
-      p = glyph->data;
-      for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
-        pipeSetXY(&pipe, x0 - glyph->x, y1);
-        for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) {
-          alpha0 = *p++;
-          for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) {
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) {
+          alpha0 = p[xx];
+          for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) {
             if (state->clip->test(x1, y1)) {
               if (alpha0 & 0x80) {
                 pipeRun(&pipe);
@@ -1810,6 +1831,7 @@ void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip)
             alpha0 <<= 1;
           }
         }
+        p += glyph->w;
       }
     }
   }


More information about the poppler mailing list