X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fextension%2Finternal%2Fcairo-render-context.cpp;h=a040d5c099c387a9f0bce9ccc2d59abc1f52675c;hb=3955580a5a68a873b098921626f5b9d841b964ec;hp=1697719d716735596c97eec1d8dfbf94ee58fc26;hpb=df413c27bf29b1738765699fb50b9178bc01b977;p=inkscape.git diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 1697719d7..a040d5c09 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -70,7 +71,7 @@ #endif -#ifndef PANGO_ENABLE_BACKEND +#ifdef CAIRO_HAS_FT_FONT #include #endif @@ -108,6 +109,7 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) : _ps_level(1), _is_texttopath(FALSE), _is_filtertobitmap(FALSE), + _bitmapresolution(72), _stream(NULL), _is_valid(FALSE), _vector_based_target(FALSE), @@ -394,6 +396,11 @@ void CairoRenderContext::setPSLevel(unsigned int level) _ps_level = level; } +unsigned int CairoRenderContext::getPSLevel(void) +{ + return _ps_level; +} + void CairoRenderContext::setPDFLevel(unsigned int level) { _pdf_level = level; @@ -409,6 +416,21 @@ void CairoRenderContext::setFilterToBitmap(bool filtertobitmap) _is_filtertobitmap = filtertobitmap; } +bool CairoRenderContext::getFilterToBitmap(void) +{ + return _is_filtertobitmap; +} + +void CairoRenderContext::setBitmapResolution(int resolution) +{ + _bitmapresolution = resolution; +} + +int CairoRenderContext::getBitmapResolution(void) +{ + return _bitmapresolution; +} + cairo_surface_t* CairoRenderContext::getSurface(void) { @@ -694,6 +716,9 @@ CairoRenderContext::setupSurface(double width, double height) case CAIRO_SURFACE_TYPE_PS: surface = cairo_ps_surface_create_for_stream(Inkscape::Extension::Internal::_write_callback, _stream, width, height); #if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2)) + if(CAIRO_STATUS_SUCCESS != cairo_surface_status(surface)) { + return FALSE; + } cairo_ps_surface_restrict_to_level (surface, (cairo_ps_level_t)_ps_level); #endif break; @@ -722,6 +747,13 @@ CairoRenderContext::setSurfaceTarget(cairo_surface_t *surface, bool is_vector) bool CairoRenderContext::_finishSurfaceSetup(cairo_surface_t *surface) { + if(surface == NULL) { + return FALSE; + } + if(CAIRO_STATUS_SUCCESS != cairo_surface_status(surface)) { + return FALSE; + } + _cr = cairo_create(surface); _surface = surface; @@ -770,7 +802,7 @@ CairoRenderContext::finish(void) } void -CairoRenderContext::transform(NRMatrix const *transform) +CairoRenderContext::transform(NR::Matrix const *transform) { g_assert( _is_valid ); @@ -783,7 +815,7 @@ CairoRenderContext::transform(NRMatrix const *transform) } void -CairoRenderContext::setTransform(NRMatrix const *transform) +CairoRenderContext::setTransform(NR::Matrix const *transform) { g_assert( _is_valid ); @@ -794,7 +826,7 @@ CairoRenderContext::setTransform(NRMatrix const *transform) } void -CairoRenderContext::getTransform(NRMatrix *copy) const +CairoRenderContext::getTransform(NR::Matrix *copy) const { g_assert( _is_valid ); @@ -809,12 +841,12 @@ CairoRenderContext::getTransform(NRMatrix *copy) const } void -CairoRenderContext::getParentTransform(NRMatrix *copy) const +CairoRenderContext::getParentTransform(NR::Matrix *copy) const { g_assert( _is_valid ); CairoRenderState *parent_state = getParentState(); - memcpy(copy, &parent_state->transform, sizeof(NRMatrix)); + memcpy(copy, &parent_state->transform, sizeof(NR::Matrix)); } void @@ -862,9 +894,9 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver SPPattern *pat = SP_PATTERN (paintserver); - NRMatrix ps2user, pcs2dev; - nr_matrix_set_identity(&ps2user); - nr_matrix_set_identity(&pcs2dev); + NR::Matrix ps2user, pcs2dev; + ps2user.set_identity(); + pcs2dev.set_identity(); double x = pattern_x(pat); double y = pattern_y(pat); @@ -889,8 +921,8 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver } // apply pattern transformation - NRMatrix pattern_transform(pattern_patternTransform(pat)); - nr_matrix_multiply(&ps2user, &ps2user, &pattern_transform); + NR::Matrix pattern_transform(pattern_patternTransform(pat)); + ps2user *= pattern_transform; // create pattern contents coordinate system if (pat->viewBox_set) { @@ -918,8 +950,8 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver // calculate the size of the surface which has to be created // the scaling needs to be taken into account in the ctm after the pattern transformation - NRMatrix temp; - nr_matrix_multiply(&temp, &pattern_transform, &_state->transform); + NR::Matrix temp; + temp = pattern_transform * _state->transform; double width_scaler = sqrt(temp[0] * temp[0] + temp[2] * temp[2]); double height_scaler = sqrt(temp[1] * temp[1] + temp[3] * temp[3]); @@ -940,12 +972,8 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver double scale_height = surface_height / (bbox_height_scaler * height); if (scale_width != 1.0 || scale_height != 1.0 || _vector_based_target) { TRACE(("needed to scale with %f %f\n", scale_width, scale_height)); - NRMatrix scale; - nr_matrix_set_scale(&scale, 1.0 / scale_width, 1.0 / scale_height); - nr_matrix_multiply(&pcs2dev, &pcs2dev, &scale); - - nr_matrix_set_scale(&scale, scale_width, scale_height); - nr_matrix_multiply(&ps2user, &ps2user, &scale); + pcs2dev *= NR::scale(1.0 / scale_width, 1.0 / scale_height); + ps2user *= NR::scale(scale_width, scale_height); } pattern_ctx->setTransform(&pcs2dev); @@ -1220,7 +1248,7 @@ CairoRenderContext::renderPath(NRBPath const *bpath, SPStyle const *style, NRRec cairo_set_fill_rule(_cr, CAIRO_FILL_RULE_WINDING); } cairo_fill(_cr); - cairo_surface_write_to_png (_surface, "gtar2.png"); + TEST(cairo_surface_write_to_png (_surface, "pathmask.png")); } return true; } @@ -1270,7 +1298,7 @@ CairoRenderContext::renderPath(NRBPath const *bpath, SPStyle const *style, NRRec bool CairoRenderContext::renderImage(guchar *px, unsigned int w, unsigned int h, unsigned int rs, - NRMatrix const *image_transform, SPStyle const *style) + NR::Matrix const *image_transform, SPStyle const *style) { g_assert( _is_valid ); @@ -1385,7 +1413,7 @@ CairoRenderContext::_showGlyphs(cairo_t *cr, PangoFont *font, std::vector const &glyphtext, SPStyle const *style) { // create a cairo_font_face from PangoFont @@ -1395,7 +1423,7 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, NRMatrix const *font_matrix cairo_save(_cr); -#ifndef PANGO_ENABLE_BACKEND +#ifdef CAIRO_HAS_FT_FONT cairo_font_face_t *font_face = cairo_ft_font_face_create_for_pattern(fc_pattern); cairo_set_font_face(_cr, font_face); @@ -1414,25 +1442,21 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, NRMatrix const *font_matrix } else { cairo_set_fill_rule(_cr, CAIRO_FILL_RULE_WINDING); } - cairo_set_source_rgba (_cr, 1.0, 1.0, 1.0, 1.0); - cairo_rectangle (_cr, 0, 0, 30, 40); - cairo_fill (_cr); _showGlyphs(_cr, font, glyphtext, FALSE); - //cairo_fill(_cr); } else { // just add the glyph paths to the current context _showGlyphs(_cr, font, glyphtext, TRUE); } } else { - if (style->fill.type == SP_PAINT_TYPE_COLOR || style->fill.type == SP_PAINT_TYPE_PAINTSERVER) { + if (style->fill.isColor() || style->fill.isPaintserver()) { // set fill style _setFillStyle(style, NULL); _showGlyphs(_cr, font, glyphtext, FALSE); } - if (style->stroke.type == SP_PAINT_TYPE_COLOR || style->stroke.type == SP_PAINT_TYPE_PAINTSERVER) { + if (style->stroke.isColor() || style->stroke.isPaintserver()) { // set stroke style _setStrokeStyle(style, NULL); @@ -1448,6 +1472,8 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, NRMatrix const *font_matrix #else (void)size; (void)fc_pattern; + + cairo_restore(_cr); #endif return true; @@ -1509,7 +1535,7 @@ CairoRenderContext::_concatTransform(cairo_t *cr, double xx, double yx, double x } void -CairoRenderContext::_initCairoMatrix(cairo_matrix_t *matrix, NRMatrix const *transform) +CairoRenderContext::_initCairoMatrix(cairo_matrix_t *matrix, NR::Matrix const *transform) { matrix->xx = (*transform)[0]; matrix->yx = (*transform)[1]; @@ -1520,7 +1546,7 @@ CairoRenderContext::_initCairoMatrix(cairo_matrix_t *matrix, NRMatrix const *tra } void -CairoRenderContext::_concatTransform(cairo_t *cr, NRMatrix const *transform) +CairoRenderContext::_concatTransform(cairo_t *cr, NR::Matrix const *transform) { _concatTransform(cr, (*transform)[0], (*transform)[1], (*transform)[2], (*transform)[3],