From e88b0aab3142fb383e9a9c9c82219a63437f4726 Mon Sep 17 00:00:00 2001
From: Carlos Garcia Campos
Date: Thu, 21 Jun 2012 09:50:45 +0200
Subject: [PATCH] Don't use sizeof SplashColor as the number of color
components
That's not valid for poppler where sizeof SplashColor is always 4, but
number of color components depend on the bitmap color mode. Use
splashColorModeNComps array instead. This fixes a crash in
BitmapOutputDev::flushBitmap() when using poppler.
---
lib/pdf/BitmapOutputDev.cc | 8 +++++---
lib/pdf/FullBitmapOutputDev.cc | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc
index 11fa842..5b24dfe 100644
--- a/lib/pdf/BitmapOutputDev.cc
+++ b/lib/pdf/BitmapOutputDev.cc
@@ -199,6 +199,7 @@ void BitmapOutputDev::flushBitmap()
SplashColorPtr rgb = rgbbitmap->getDataPtr();
Guchar*alpha = rgbbitmap->getAlphaPtr();
+ int color_comps = splashColorModeNComps[rgbbitmap->getMode()];
Guchar*alpha2 = stalepolybitmap->getDataPtr();
int bitmap_width8 = (stalepolybitmap->getWidth()+7)/8;
@@ -256,7 +257,7 @@ void BitmapOutputDev::flushBitmap()
img->height = rangey;
int x,y;
for(y=0;ydata[y*rangex];
Guchar*ain = &alpha[(y+ymin)*bitmap_width+xmin];
Guchar*ain2 = &alpha2[(y+ymin)*bitmap_width8];
@@ -1458,8 +1459,9 @@ char area_is_plain_colored(GfxState*state, SplashBitmap*boolpoly, SplashBitmap*r
return 0;
}
gfxcolor_t color = gfxstate_getfillcolor(state);
+ int color_comps = splashColorModeNComps[rgbbitmap->getMode()];
SplashColorPtr rgb = rgbbitmap->getDataPtr()
- + (y1*width+x1)*sizeof(SplashColor);
+ + (y1*width+x1)*color_comps;
int width8 = (width+7)/8;
unsigned char*bits = (unsigned char*)boolpoly->getDataPtr()
+ (y1*width8+x1);
@@ -1473,7 +1475,7 @@ char area_is_plain_colored(GfxState*state, SplashBitmap*boolpoly, SplashBitmap*r
rgb[x*3+2] != color.b)
return 0;
}
- rgb += width*sizeof(SplashColor);
+ rgb += width*color_comps;
}
return 1;
}
diff --git a/lib/pdf/FullBitmapOutputDev.cc b/lib/pdf/FullBitmapOutputDev.cc
index b9efc8e..6b0a854 100644
--- a/lib/pdf/FullBitmapOutputDev.cc
+++ b/lib/pdf/FullBitmapOutputDev.cc
@@ -115,6 +115,7 @@ void FullBitmapOutputDev::flushBitmap()
SplashColorPtr rgb = rgbdev->getBitmap()->getDataPtr();
Guchar*alpha = rgbdev->getBitmap()->getAlphaPtr();
+ int color_comps = splashColorModeNComps[rgbdev->getBitmap()->getMode()];
int xmin,ymin,xmax,ymax;
getBitmapBBox(alpha, width, height, &xmin,&ymin,&xmax,&ymax);
@@ -146,7 +147,7 @@ void FullBitmapOutputDev::flushBitmap()
img->height = rangey;
int x,y;
for(y=0;ydata[y*rangex];
Guchar*ain = &alpha[(y+ymin)*width+xmin];
for(x=0;x