[poppler] poppler/CairoOutputDev.cc poppler/CairoOutputDev.h
Carlos Garcia Campos
carlosgc at kemper.freedesktop.org
Tue Jan 4 01:18:52 PST 2011
poppler/CairoOutputDev.cc | 46 +++++++++++++++++++++++++++++++---------------
poppler/CairoOutputDev.h | 1 +
2 files changed, 32 insertions(+), 15 deletions(-)
New commits:
commit bebc530cbde7898759e1bd3629d2836ce0fb1d08
Author: Adrian Johnson <ajohnson at redneon.com>
Date: Fri Dec 31 12:11:40 2010 +1030
cairo: Don't set JPX mime data if the stream specifies a colorspace
The stream colorspace overides, and may be different to, the
colorspace in the JPX data.
https://bugs.freedesktop.org/show_bug.cgi?id=32746
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
index 0507f8c..bc0bfb9 100644
--- a/poppler/CairoOutputDev.cc
+++ b/poppler/CairoOutputDev.cc
@@ -2283,6 +2283,36 @@ GBool CairoOutputDev::getStreamData (Stream *str, char **buffer, int *length)
return gTrue;
}
+void CairoOutputDev::setMimeData(Stream *str, cairo_surface_t *image)
+{
+ char *strBuffer;
+ int len;
+ Object obj;
+
+ if (!printing || !(str->getKind() == strDCT || str->getKind() == strJPX))
+ return;
+
+ // colorspace in stream dict may be different from colorspace in jpx
+ // data
+ if (str->getKind() == strJPX) {
+ GBool hasColorSpace = !str->getDict()->lookup("ColorSpace", &obj)->isNull();
+ obj.free();
+ if (hasColorSpace)
+ return;
+ }
+
+ if (getStreamData (str->getNextStream(), &strBuffer, &len)) {
+ cairo_status_t st;
+ st = cairo_surface_set_mime_data (image,
+ str->getKind() == strDCT ?
+ CAIRO_MIME_TYPE_JPEG : CAIRO_MIME_TYPE_JP2,
+ (const unsigned char *)strBuffer, len,
+ gfree, strBuffer);
+ if (st)
+ gfree (strBuffer);
+ }
+}
+
void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
int width, int height,
GfxImageColorMap *colorMap,
@@ -2396,21 +2426,7 @@ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
cairo_surface_mark_dirty (image);
- if (printing && (str->getKind() == strDCT || str->getKind() == strJPX)) {
- char *strBuffer;
- int len;
-
- if (getStreamData (str->getNextStream(), &strBuffer, &len)) {
- cairo_status_t st;
- st = cairo_surface_set_mime_data (image,
- str->getKind() == strDCT ?
- CAIRO_MIME_TYPE_JPEG : CAIRO_MIME_TYPE_JP2,
- (const unsigned char *)strBuffer, len,
- gfree, strBuffer);
- if (st)
- gfree (strBuffer);
- }
- }
+ setMimeData(str, image);
pattern = cairo_pattern_create_for_surface (image);
cairo_surface_destroy (image);
diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h
index 26efadc..30acf81 100644
--- a/poppler/CairoOutputDev.h
+++ b/poppler/CairoOutputDev.h
@@ -275,6 +275,7 @@ protected:
cairo_filter_t getFilterForSurface(cairo_surface_t *image,
GBool interpolate);
GBool getStreamData (Stream *str, char **buffer, int *length);
+ void setMimeData(Stream *str, cairo_surface_t *image);
GfxRGB fill_color, stroke_color;
cairo_pattern_t *fill_pattern, *stroke_pattern;
More information about the poppler
mailing list