poppler/CairoFontEngine.cc | 27 ++++++++++++++++++++++++--- poppler/CairoOutputDev.cc | 7 +++++++ poppler/CairoOutputDev.h | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-)
New commits: commit 7f2b2964297e4d381b43ad5710540fedfe216a2c Author: Adrian Johnson <[email protected]> Date: Sat Mar 19 17:59:39 2022 +1030 Fix clang warning diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index 1da0bfdc..efde742a 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -588,8 +588,9 @@ static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsi } status = CAIRO_STATUS_SUCCESS; - if (color && !output_dev->hasColor()) + if (color && !output_dev->hasColor()) { status = CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED; + } delete gfx; delete output_dev; commit 61f6d6d1492b9a8bfa19dfe4bfa4a7294a9a29bd Author: Adrian Johnson <[email protected]> Date: Sat Mar 19 15:06:58 2022 +1030 Cairo color type 3 fonts Fixes #729 Fixes #944 diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index 759c61b0..1da0bfdc 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -519,7 +519,7 @@ static cairo_status_t _init_type3_glyph(cairo_scaled_font_t *scaled_font, cairo_ return CAIRO_STATUS_SUCCESS; } -static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics) +static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics, bool color) { Dict *charProcs; Object charProc; @@ -530,6 +530,7 @@ static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsi PDFRectangle box; type3_font_info_t *info; Gfx *gfx; + cairo_status_t status; info = (type3_font_info_t *)cairo_font_face_get_user_data(cairo_scaled_font_get_font_face(scaled_font), &type3_font_key); @@ -586,10 +587,26 @@ static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsi metrics->height = bbox[3] - bbox[1]; } + status = CAIRO_STATUS_SUCCESS; + if (color && !output_dev->hasColor()) + status = CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED; + delete gfx; delete output_dev; - return CAIRO_STATUS_SUCCESS; + return status; +} + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 17, 6) +static cairo_status_t _render_type3_color_glyph(cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics) +{ + return _render_type3_glyph(scaled_font, glyph, cr, metrics, true); +} +#endif + +static cairo_status_t _render_type3_noncolor_glyph(cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics) +{ + return _render_type3_glyph(scaled_font, glyph, cr, metrics, false); } CairoType3Font *CairoType3Font::create(const std::shared_ptr<const GfxFont> &gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref) @@ -605,7 +622,10 @@ CairoType3Font *CairoType3Font::create(const std::shared_ptr<const GfxFont> &gfx ref = *gfxFont->getID(); font_face = cairo_user_font_face_create(); cairo_user_font_face_set_init_func(font_face, _init_type3_glyph); - cairo_user_font_face_set_render_glyph_func(font_face, _render_type3_glyph); +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 17, 6) + cairo_user_font_face_set_render_color_glyph_func(font_face, _render_type3_color_glyph); +#endif + cairo_user_font_face_set_render_glyph_func(font_face, _render_type3_noncolor_glyph); type3_font_info_t *info = new type3_font_info_t(gfxFont, doc, fontEngine, printing, xref); cairo_font_face_set_user_data(font_face, &type3_font_key, (void *)info, _free_type3_font_info); diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index f6a005f6..d51ae4e6 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -156,6 +156,7 @@ CairoOutputDev::CairoOutputDev() inUncoloredPattern = false; inType3Char = false; t3_glyph_has_bbox = false; + has_color = false; text_matrix_valid = true; groupColorSpaceStack = nullptr; @@ -545,6 +546,7 @@ void CairoOutputDev::updateFillColor(GfxState *state) LOG(printf("fill color: %d %d %d\n", fill_color.r, fill_color.g, fill_color.b)); } + has_color = true; } void CairoOutputDev::updateStrokeColor(GfxState *state) @@ -562,6 +564,7 @@ void CairoOutputDev::updateStrokeColor(GfxState *state) LOG(printf("stroke color: %d %d %d\n", stroke_color.r, stroke_color.g, stroke_color.b)); } + has_color = true; } void CairoOutputDev::updateFillOpacity(GfxState *state) @@ -613,6 +616,7 @@ void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) auto opacity = (state->getStrokePattern()) ? state->getStrokeOpacity() : state->getFillOpacity(); cairo_pattern_add_color_stop_rgba(fill_pattern, offset, colToDbl(fill_color.r), colToDbl(fill_color.g), colToDbl(fill_color.b), opacity); + has_color = true; LOG(printf("fill color stop: %f (%d, %d, %d, %d)\n", offset, fill_color.r, fill_color.g, fill_color.b, dblToCol(opacity))); } @@ -2845,6 +2849,7 @@ void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *s cairo_pattern_destroy(maskPattern); cairo_pattern_destroy(pattern); + has_color = true; cleanup: imgStr->close(); @@ -3499,6 +3504,7 @@ void CairoImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, i setCairo(nullptr); cairo_surface_destroy(surface); cairo_destroy(cr); + has_color = true; } } @@ -3556,5 +3562,6 @@ void CairoImageOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream * setCairo(nullptr); cairo_surface_destroy(surface); cairo_destroy(cr); + has_color = true; } } diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h index 9a3bb7dc..75f28748 100644 --- a/poppler/CairoOutputDev.h +++ b/poppler/CairoOutputDev.h @@ -249,6 +249,7 @@ public: } bool hasType3GlyphBBox() { return t3_glyph_has_bbox; } double *getType3GlyphBBox() { return t3_glyph_bbox; } + bool hasColor() { return has_color; } protected: void doPath(cairo_t *cairo, GfxState *state, const GfxPath *path); @@ -316,6 +317,7 @@ protected: bool inType3Char; // inside a Type 3 CharProc double t3_glyph_wx, t3_glyph_wy; bool t3_glyph_has_bbox; + bool has_color; double t3_glyph_bbox[4]; bool prescaleImages;
