From 7786b8fe4e7a2c73767be3ce7ae64389d09984d9 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Tue, 16 Oct 2018 10:31:48 -0700 Subject: Drop skia backend Commit 38806bc3 already disabled the backend from use, now drop the code. --- README | 6 - configure.ac | 26 - src/Makefile.sources | 7 - src/cairo-pattern.c | 2 +- src/cairo-skia-surface.cpp | 1202 -------------------------- src/cairo-skia.h | 66 -- src/cairo.h | 1 - src/skia/cairo-skia-context.cpp | 1781 --------------------------------------- src/skia/cairo-skia-private.h | 127 --- src/skia/cairo-skia-surface.cpp | 323 ------- 10 files changed, 1 insertion(+), 3540 deletions(-) delete mode 100644 src/cairo-skia-surface.cpp delete mode 100644 src/cairo-skia.h delete mode 100644 src/skia/cairo-skia-context.cpp delete mode 100644 src/skia/cairo-skia-private.h delete mode 100644 src/skia/cairo-skia-surface.cpp diff --git a/README b/README index 9cfa34355..0bcf14012 100644 --- a/README +++ b/README @@ -181,12 +181,6 @@ Experimental surface backends packages and developer dependencies are available at Netlabs: ftp://ftp.netlabs.org/pub/cairo - skia backend - ------------ - Requires the skia library as of June 2014. Since skia is not - API stable, building against newer (or older) versions of skia - will probably fail. - Compiling ========= diff --git a/configure.ac b/configure.ac index f1487271a..5e33c96ea 100644 --- a/configure.ac +++ b/configure.ac @@ -249,31 +249,6 @@ AM_CONDITIONAL(CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE, test "x$test_win32_printin dnl =========================================================================== -dnl NOTE: We're temporarily disabiling this backend to see if anyone -dnl is actually using it. If you are, please mention on the cairo -dnl mailing list. - -dnl CAIRO_ENABLE_SURFACE_BACKEND(skia, Skia, no, [ -dnl AC_ARG_WITH([skia], -dnl [AS_HELP_STRING([--with-skia=/path/to/skia], -dnl [directory to find compiled skia sources])], -dnl [skia_DIR="$withval"], -dnl [skia_DIR="`pwd`/../skia"]) -dnl AC_ARG_WITH([skia-build-type], -dnl [AS_HELP_STRING([--with-skia-build-type=(Release|Debug)] -dnl [build of skia to link with, default is Release])], -dnl [skia_BUILD_TYPE="$withval"], -dnl [skia_BUILD_TYPE="Release"]) -dnl skia_NONPKGCONFIG_CFLAGS="-I$skia_DIR/include/config -I$skia_DIR/include/core -I$skia_DIR/include/effects" -dnl if test "x$skia_BUILD_TYPE" = "xRelease"; then -dnl skia_NONPKGCONFIG_CFLAGS="-DSK_RELEASE -DSK_CAN_USE_FLOAT $skia_NONPKGCONFIG_CFLAGS" -dnl fi -dnl skia_NONPKGCONFIG_LIBS="-L$skia_DIR/out/$skia_BUILD_TYPE/lib.target/ -lskia -lstdc++" -dnl AC_SUBST(skia_DIR) -dnl ]) - -dnl =========================================================================== - CAIRO_ENABLE_SURFACE_BACKEND(os2, OS/2, no, [ case "$host" in *-*-os2*) @@ -887,7 +862,6 @@ dnl =========================================================================== dnl Extra stuff we need to do when building C++ code need_cxx="no" -dnl AS_IF([test "x$use_skia" = "xyes"], [need_cxx="yes"]) AS_IF([test "x$use_qt" = "xyes"], [need_cxx="yes"]) AS_IF([test "x$use_beos" = "xyes"], [need_cxx="yes"]) diff --git a/src/Makefile.sources b/src/Makefile.sources index e50a4d48f..096a3bcfa 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -375,13 +375,6 @@ cairo_win32_font_sources = \ win32/cairo-win32-font.c \ $(NULL) -cairo_skia_headers = cairo-skia.h -cairo_skia_private = skia/cairo-skia-private.h -cairo_skia_cxx_sources = \ - skia/cairo-skia-context.cpp \ - skia/cairo-skia-surface.cpp \ - $(NULL) - cairo_os2_headers = cairo-os2.h cairo_os2_private = cairo-os2-private.h cairo_os2_sources = cairo-os2-surface.c diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 745b95011..fde044a4d 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -4694,7 +4694,7 @@ _cairo_debug_print_surface_pattern (FILE *file, case CAIRO_SURFACE_TYPE_DRM: s = "drm"; break; case CAIRO_SURFACE_TYPE_TEE: s = "tee"; break; case CAIRO_SURFACE_TYPE_XML: s = "xml"; break; - case CAIRO_SURFACE_TYPE_SKIA: s = "skia"; break; + case CAIRO_SURFACE_TYPE_SKIA: s = "skia"; break; /* Deprecated */ case CAIRO_SURFACE_TYPE_SUBSURFACE: s = "subsurface"; break; case CAIRO_SURFACE_TYPE_COGL: s = "cogl"; break; default: s = "invalid"; ASSERT_NOT_REACHED; break; diff --git a/src/cairo-skia-surface.cpp b/src/cairo-skia-surface.cpp deleted file mode 100644 index aeb69cfcd..000000000 --- a/src/cairo-skia-surface.cpp +++ /dev/null @@ -1,1202 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Corporation. - * - * Contributor(s): - * Vladimir Vukicevic - */ - -#include "cairoint.h" - -#include "cairo-skia.h" - -#include "cairo-surface-clipper-private.h" -#include "cairo-image-surface-inline.h" - -#include -#include -#include -#include - -#include - -#include -#include - -/** - * SECTION:cairo-skia - * @Title: Skia Surfaces - * @Short_Description: Rendering to Skia surfaces - * @See_Also: #cairo_surface_t - * - * Originally written by Vladimir Vukicevic to investigate using Skia for - * Mozilla, it provides a nice integration with a rather interesting code - * base. By hooking Skia underneath Cairo it allows us to directly compare - * code paths... which is interesting. - **/ - -/** - * CAIRO_HAS_SKIA_SURFACE: - * - * Defined if the Skia surface backend is available. - * This macro can be used to conditionally compile backend-specific code. - * - * Since: 1.10 - **/ - -#if (CAIRO_FIXED_BITS == 32) && (CAIRO_FIXED_FRAC_BITS == 16) && defined(SK_SCALAR_IS_FIXED) -# define CAIRO_FIXED_TO_SK_SCALAR(x) (x) -#elif defined(SK_SCALAR_IS_FIXED) -/* This can be done better, but this will do for now */ -# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) -#else -# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) -#endif - -#ifndef CAIRO_INT_STATUS_SUCCESS -# define CAIRO_INT_STATUS_SUCCESS ((cairo_int_status_t) CAIRO_STATUS_SUCCESS) -#endif - -#define DEBUG_SKIA 0 - -#if DEBUG_SKIA -#define UNSUPPORTED(reason) ({ \ - fprintf (stderr, \ - "cairo-skia : hit unsupported operation in %s(), line %d: %s\n", \ - __FUNCTION__, __LINE__, reason); \ - return CAIRO_INT_STATUS_UNSUPPORTED; \ -}) -#else -#define UNSUPPORTED(reason) ({ \ - return CAIRO_INT_STATUS_UNSUPPORTED; \ -})#endif - - -typedef struct cairo_skia_surface { - cairo_surface_t base; - - SkBitmap *bitmap; - SkCanvas *canvas; - - cairo_surface_clipper_t clipper; - - cairo_image_surface_t *_image_surface; /* wrapper around bitmap */ -} cairo_skia_surface_t; - -static cairo_skia_surface_t * -_cairo_skia_surface_create_internal (SkBitmap::Config config, - bool opaque, - unsigned char *data, - int width, - int height, - int stride); - -/* - * conversion methods - */ - -/* - * format conversion - */ -static inline bool -format_to_sk_config (cairo_format_t format, - SkBitmap::Config& config, - bool& opaque) -{ - opaque = false; - - switch (format) { - case CAIRO_FORMAT_ARGB32: - config = SkBitmap::kARGB_8888_Config; - break; - case CAIRO_FORMAT_RGB24: - config = SkBitmap::kARGB_8888_Config; - opaque = true; - break; - case CAIRO_FORMAT_A8: - config = SkBitmap::kA8_Config; - break; - case CAIRO_FORMAT_A1: - config = SkBitmap::kA1_Config; - break; - default: - return false; - } - - return true; -} - -static inline cairo_format_t -sk_config_to_format (SkBitmap::Config config, - bool opaque) -{ - switch (config) { - case SkBitmap::kARGB_8888_Config: - if (opaque) - return CAIRO_FORMAT_RGB24; - return CAIRO_FORMAT_ARGB32; - - case SkBitmap::kA8_Config: - return CAIRO_FORMAT_A8; - - case SkBitmap::kA1_Config: - return CAIRO_FORMAT_A1; - - case SkBitmap::kNo_Config: - case SkBitmap::kIndex8_Config: - case SkBitmap::kRLE_Index8_Config: - case SkBitmap::kRGB_565_Config: - case SkBitmap::kARGB_4444_Config: - case SkBitmap::kConfigCount: - default: - return (cairo_format_t) -1; - } -} - -/* - * image surface wrapping - */ -static inline bool -surface_to_sk_bitmap (cairo_surface_t *surface, SkBitmap& bitmap) -{ - cairo_image_surface_t *img = (cairo_image_surface_t *) surface; - SkBitmap::Config config; - bool opaque; - - if (unlikely (! format_to_sk_config (img->format, config, opaque))) - return false; - - bitmap.reset (); - bitmap.setConfig (config, img->width, img->height, img->stride); - bitmap.setIsOpaque (opaque); - bitmap.setPixels (img->data); - - return true; -} - -/* - * operator conversion - */ - -static inline SkXfermode::Mode -operator_to_sk (cairo_operator_t op) -{ - static const SkXfermode::Mode modeMap[] = { - SkXfermode::kClear_Mode, - - SkXfermode::kSrc_Mode, - SkXfermode::kSrcOver_Mode, - SkXfermode::kSrcIn_Mode, - SkXfermode::kSrcOut_Mode, - SkXfermode::kSrcATop_Mode, - - SkXfermode::kDst_Mode, - SkXfermode::kDstOver_Mode, - SkXfermode::kDstIn_Mode, - SkXfermode::kDstOut_Mode, - SkXfermode::kDstATop_Mode, - - SkXfermode::kXor_Mode, - SkXfermode::kPlus_Mode, // XXX Add? - SkXfermode::kPlus_Mode, // XXX SATURATE - - SkXfermode::kPlus_Mode, - SkXfermode::kMultiply_Mode, - SkXfermode::kScreen_Mode, - SkXfermode::kOverlay_Mode, - SkXfermode::kDarken_Mode, - SkXfermode::kLighten_Mode, - SkXfermode::kColorDodge_Mode, - SkXfermode::kColorBurn_Mode, - SkXfermode::kHardLight_Mode, - SkXfermode::kSoftLight_Mode, - SkXfermode::kDifference_Mode, - SkXfermode::kExclusion_Mode, - - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_HUE - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_SATURATION, - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_COLOR, - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_LUMINOSITY - }; - - return modeMap[op]; -} - -/* - * tiling mode conversion - */ -static SkShader::TileMode -extend_to_sk (cairo_extend_t extend) -{ - static const SkShader::TileMode modeMap[] = { - SkShader::kClamp_TileMode, // NONE behaves like PAD, because noone wants NONE - SkShader::kRepeat_TileMode, - SkShader::kMirror_TileMode, - SkShader::kClamp_TileMode - }; - - return modeMap[extend]; -} - -/* - * color conversion - */ -static inline SkColor -color_to_sk (const cairo_color_t& c) -{ - /* Need unpremultiplied 1-byte values */ - return SkColorSetARGB ((U8CPU) (c.alpha * 255), - (U8CPU) (c.red * 255), - (U8CPU) (c.green * 255), - (U8CPU) (c.blue * 255)); -} - -/* - * matrix conversion - */ -static inline SkMatrix -matrix_to_sk (const cairo_matrix_t& mat) -{ - SkMatrix skm; - - skm.reset (); - skm.set (SkMatrix::kMScaleX, SkFloatToScalar (mat.xx)); - skm.set (SkMatrix::kMSkewX, SkFloatToScalar (mat.xy)); - skm.set (SkMatrix::kMTransX, SkFloatToScalar (mat.x0)); - skm.set (SkMatrix::kMSkewY, SkFloatToScalar (mat.yx)); - skm.set (SkMatrix::kMScaleY, SkFloatToScalar (mat.yy)); - skm.set (SkMatrix::kMTransY, SkFloatToScalar (mat.y0)); - - /* - skm[6] = SkFloatToScalar (0.0); - skm[7] = SkFloatToScalar (0.0); - skm[8] = SkFloatToScalar (1.0); -- this isn't right, it wants a magic value in there that it'll set itself. It wants Sk_Fract1 (2.30), not Sk_Scalar1 - */ - - return skm; -} - -static inline SkMatrix -matrix_inverse_to_sk (const cairo_matrix_t& mat) -{ - cairo_matrix_t inv = mat; - cairo_status_t status = cairo_matrix_invert (&inv); - assert (status == CAIRO_STATUS_SUCCESS); - return matrix_to_sk (inv); -} - -/* - * pattern conversion - */ -static inline cairo_surface_t * -surface_from_pattern (const cairo_pattern_t *pattern) -{ - return (reinterpret_cast (pattern))->surface; -} - -static SkShader* -pattern_to_sk_shader (cairo_skia_surface_t *dst, const cairo_pattern_t *pattern, - cairo_image_surface_t **image, void **image_extra) -{ - SkShader *shader = NULL; - - if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; - return new SkColorShader (color_to_sk (solid->color)); - } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { - cairo_surface_t *surface = surface_from_pattern (pattern); - - if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - - shader = SkShader::CreateBitmapShader (*esurf->bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend)); - } else { - SkBitmap bitmap; - - if (! _cairo_surface_is_image (surface)) { - cairo_status_t status; - - status = _cairo_surface_acquire_source_image (surface, - image, image_extra); - if (status) - return NULL; - - surface = &(*image)->base; - } - - - if (unlikely (! surface_to_sk_bitmap (surface, bitmap))) - return NULL; - - shader = SkShader::CreateBitmapShader (bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend)); - } - } else if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR - /* || pattern->type == CAIRO_PATTERN_TYPE_RADIAL */) - { - cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; - SkColor colors_stack[10]; - SkScalar pos_stack[10]; - SkColor *colors = colors_stack; - SkScalar *pos = pos_stack; - - if (gradient->n_stops > 10) { - colors = new SkColor[gradient->n_stops]; - pos = new SkScalar[gradient->n_stops]; - } - - for (unsigned int i = 0; i < gradient->n_stops; i++) { - pos[i] = CAIRO_FIXED_TO_SK_SCALAR (gradient->stops[i].offset); - colors[i] = color_to_sk (gradient->stops[i].color); - } - - if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { - cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; - SkPoint points[2]; - - points[0].set (SkFloatToScalar (linear->pd1.x), - SkFloatToScalar (linear->pd1.y)); - points[1].set (SkFloatToScalar (linear->pd2.x), - SkFloatToScalar (linear->pd2.y)); - shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, - extend_to_sk (pattern->extend)); - } else { - // XXX todo -- implement real radial shaders in Skia - } - - if (gradient->n_stops > 10) { - delete [] colors; - delete [] pos; - } - } - - if (shader && ! _cairo_matrix_is_identity (&pattern->matrix)) - shader->setLocalMatrix (matrix_inverse_to_sk (pattern->matrix)); - - return shader; -} - -static inline bool -pattern_filter_to_sk (const cairo_pattern_t *pattern) -{ - switch (pattern->filter) { - case CAIRO_FILTER_GOOD: - case CAIRO_FILTER_BEST: - case CAIRO_FILTER_BILINEAR: - case CAIRO_FILTER_GAUSSIAN: - return true; - default: - case CAIRO_FILTER_FAST: - case CAIRO_FILTER_NEAREST: - return false; - } -} - -static inline bool -pattern_to_sk_color (const cairo_pattern_t *pattern, SkColor& color) -{ - if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) - return false; - - color = color_to_sk (((cairo_solid_pattern_t *) pattern)->color); - return true; -} - -/* - * path conversion - */ - -struct cpc { - SkPath skPath; - cairo_matrix_t *matrix; -}; - -static cairo_status_t -cpc_move_to (void *closure, const cairo_point_t *point) -{ - struct cpc *cpc = static_cast (closure); - if (cpc->matrix) { - double x = _cairo_fixed_to_double (point->x); - double y = _cairo_fixed_to_double (point->y); - cairo_matrix_transform_point (cpc->matrix, &x, &y); - cpc->skPath.moveTo (SkFloatToScalar (x), SkFloatToScalar (y)); - } else { - cpc->skPath.moveTo (CAIRO_FIXED_TO_SK_SCALAR (point->x), - CAIRO_FIXED_TO_SK_SCALAR (point->y)); - } - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -cpc_line_to (void *closure, const cairo_point_t *point) -{ - struct cpc *cpc = static_cast (closure); - if (cpc->matrix) { - double x = _cairo_fixed_to_double (point->x); - double y = _cairo_fixed_to_double (point->y); - cairo_matrix_transform_point (cpc->matrix, &x, &y); - cpc->skPath.lineTo (SkFloatToScalar (x), SkFloatToScalar (y)); - } else { - cpc->skPath.lineTo (CAIRO_FIXED_TO_SK_SCALAR (point->x), - CAIRO_FIXED_TO_SK_SCALAR (point->y)); - } - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -cpc_curve_to (void *closure, - const cairo_point_t *p0, - const cairo_point_t *p1, - const cairo_point_t *p2) -{ - struct cpc *cpc = static_cast (closure); - if (cpc->matrix) { - double x0 = _cairo_fixed_to_double (p0->x); - double y0 = _cairo_fixed_to_double (p0->y); - double x1 = _cairo_fixed_to_double (p1->x); - double y1 = _cairo_fixed_to_double (p1->y); - double x2 = _cairo_fixed_to_double (p2->x); - double y2 = _cairo_fixed_to_double (p2->y); - cairo_matrix_transform_point (cpc->matrix, &x0, &y0); - cairo_matrix_transform_point (cpc->matrix, &x1, &y1); - cairo_matrix_transform_point (cpc->matrix, &x2, &y2); - - cpc->skPath.cubicTo (SkFloatToScalar (x0), - SkFloatToScalar (y0), - SkFloatToScalar (x1), - SkFloatToScalar (y1), - SkFloatToScalar (x2), - SkFloatToScalar (y2)); - } else { - cpc->skPath.cubicTo (CAIRO_FIXED_TO_SK_SCALAR (p0->x), - CAIRO_FIXED_TO_SK_SCALAR (p0->y), - CAIRO_FIXED_TO_SK_SCALAR (p1->x), - CAIRO_FIXED_TO_SK_SCALAR (p1->y), - CAIRO_FIXED_TO_SK_SCALAR (p2->x), - CAIRO_FIXED_TO_SK_SCALAR (p2->y)); - } - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -cpc_close_path (void *closure) -{ - struct cpc *cpc = static_cast (closure); - cpc->skPath.close (); - return CAIRO_STATUS_SUCCESS; -} - -static inline SkPath -path_to_sk (cairo_path_fixed_t *path, - cairo_matrix_t *mat = NULL) -{ - struct cpc data; - cairo_status_t status; - - if (mat && _cairo_matrix_is_identity (mat)) - mat = NULL; - data.matrix = mat; - - status = _cairo_path_fixed_interpret (path, - cpc_move_to, - cpc_line_to, - cpc_curve_to, - cpc_close_path, - &data); - assert (status == CAIRO_STATUS_SUCCESS); - - return data.skPath; -} - -static inline SkPath -path_to_sk (cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - cairo_matrix_t *mat = NULL) -{ - SkPath skPath = path_to_sk (path, mat); - - if (fill_rule == CAIRO_FILL_RULE_EVEN_ODD) - skPath.setFillType (SkPath::kEvenOdd_FillType); - else - skPath.setFillType (SkPath::kWinding_FillType); - - return skPath; -} - -/* - * cairo surface methods - */ - -static cairo_surface_t * -_cairo_skia_surface_create_similar (void *asurface, - cairo_content_t content, - int width, - int height) -{ - SkBitmap::Config config; - bool opaque; - - if (! format_to_sk_config (_cairo_format_from_content (content), - config, opaque)) - { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - - return &_cairo_skia_surface_create_internal (config, opaque, - NULL, - width, height, - 0)->base; -} - -static cairo_status_t -_cairo_skia_surface_finish (void *asurface) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - _cairo_surface_clipper_reset (&surface->clipper); - cairo_surface_destroy (&surface->_image_surface->base); - - delete surface->canvas; - delete surface->bitmap; - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_image_surface_t * -_get_image_surface (cairo_skia_surface_t *surface) -{ - if (! surface->_image_surface) { - SkBitmap *bitmap = surface->bitmap; - surface->_image_surface = (cairo_image_surface_t *) - cairo_image_surface_create_for_data ((unsigned char *) bitmap->getPixels (), - sk_config_to_format (bitmap->config (), - bitmap->isOpaque ()), - bitmap->width (), - bitmap->height (), - bitmap->rowBytes ()); - } - - return surface->_image_surface; -} - -static cairo_status_t -_cairo_skia_surface_acquire_source_image (void *asurface, - cairo_image_surface_t **image_out, - void **image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_image_surface_t *image = _get_image_surface (surface); - - if (unlikely (image->base.status)) - return image->base.status; - - surface->bitmap->lockPixels (); - - *image_out = image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_surface_release_source_image (void *asurface, - cairo_image_surface_t *image, - void *image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - surface->bitmap->unlockPixels (); -} - -static cairo_status_t -_cairo_skia_surface_acquire_dest_image (void *asurface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t **image_out, - cairo_rectangle_int_t *image_rect, - void **image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_image_surface_t *image = _get_image_surface (surface); - - if (unlikely (image->base.status)) - return image->base.status; - - image_rect->x = 0; - image_rect->y = 0; - image_rect->width = image->width; - image_rect->height = image->height; - - surface->bitmap->lockPixels (); - - *image_out = image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_surface_release_dest_image (void *asurface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t *image, - cairo_rectangle_int_t *image_rect, - void *image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - surface->bitmap->notifyPixelsChanged (); - surface->bitmap->unlockPixels (); -} - -#if 0 -static cairo_status_t -_cairo_skia_surface_clone_similar (void *asurface, - cairo_surface_t *src, - cairo_content_t content, - int src_x, - int src_y, - int width, - int height, - int *clone_offset_x, - int *clone_offset_y, - cairo_surface_t **clone_out) -{ - if (src->type == CAIRO_SURFACE_TYPE_SKIA || _cairo_surface_is_image (src)) { - *clone_offset_x = 0; - *clone_offset_y = 0; - *clone_out = cairo_surface_reference (src); - return CAIRO_STATUS_SUCCESS; - } - - return (cairo_status_t) CAIRO_INT_STATUS_UNSUPPORTED; -} -#endif - -static cairo_status_t -_cairo_skia_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, - cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias) -{ - cairo_skia_surface_t *surface = cairo_container_of (clipper, - cairo_skia_surface_t, - clipper); - - if (path == NULL) { - /* XXX TODO: teach Skia how to reset the clip path */ - surface->canvas->restore (); - surface->canvas->save (); - } else { - surface->canvas->clipPath (path_to_sk (path, fill_rule)); - } - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_bool_t -_cairo_skia_surface_get_extents (void *asurface, - cairo_rectangle_int_t *extents) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - extents->x = 0; - extents->y = 0; - extents->width = surface->bitmap->width (); - extents->height = surface->bitmap->height (); - - return TRUE; -} - -/* - * Core drawing operations - */ - -static SkBitmap * -pattern_to_sk_bitmap (cairo_skia_surface_t *dst, - const cairo_pattern_t *pattern, - SkMatrix *matrix, - cairo_image_surface_t **image, - void **image_extra) -{ - if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) - return NULL; - - if (pattern->extend != CAIRO_EXTEND_NONE) - return NULL; - - cairo_surface_t *surface = surface_from_pattern (pattern); - SkBitmap *bitmap; - - if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { - bitmap = new SkBitmap (*((cairo_skia_surface_t *) surface)->bitmap); - } else { - if (surface->type != CAIRO_SURFACE_TYPE_IMAGE) { - cairo_status_t status; - - status = _cairo_surface_acquire_source_image (surface, - image, image_extra); - if (unlikely (status)) - return NULL; - - surface = &(*image)->base; - } - - bitmap = new SkBitmap; - if (unlikely (! surface_to_sk_bitmap (surface, *bitmap))) - return NULL; - } - - *matrix = matrix_inverse_to_sk (pattern->matrix); - return bitmap; -} - -static cairo_int_status_t -_cairo_skia_surface_paint (void *asurface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_clip_t *clip) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_image_surface_t *image = NULL; - cairo_status_t status; - void *image_extra; - SkColor color; - - status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (status)) - return (cairo_int_status_t) status; - - if (pattern_to_sk_color (source, color)) { - surface->canvas->drawColor (color, operator_to_sk (op)); - return CAIRO_INT_STATUS_SUCCESS; - } - - SkMatrix bitmapMatrix; - SkBitmap *bitmap = pattern_to_sk_bitmap (surface, source, &bitmapMatrix, - &image, &image_extra); - SkShader *shader = NULL; - if (!bitmap) - shader = pattern_to_sk_shader (surface, source, &image, &image_extra); - - if (!bitmap && !shader) - return UNSUPPORTED("pattern to bitmap and shader conversion"); - - SkPaint paint; - paint.setFilterBitmap (pattern_filter_to_sk (source)); - paint.setXfermodeMode (operator_to_sk (op)); - - if (shader) { - paint.setShader (shader); - surface->canvas->drawPaint (paint); - } else { - surface->canvas->drawBitmapMatrix (*bitmap, bitmapMatrix, &paint); - } - - if (bitmap) - delete bitmap; - if (shader) - shader->unref (); - - if (image != NULL) { - _cairo_surface_release_source_image (&surface->base, - image, image_extra); - } - - return CAIRO_INT_STATUS_SUCCESS; -} - -static cairo_int_status_t -_cairo_skia_surface_stroke (void *asurface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_path_fixed_t *path, - cairo_stroke_style_t *style, - cairo_matrix_t *ctm, - cairo_matrix_t *ctm_inverse, - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_image_surface_t *image = NULL; - cairo_status_t status; - void *image_extra; - - status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (status)) - return (cairo_int_status_t) status; - - SkPaint paint; - paint.setStyle (SkPaint::kStroke_Style); - - SkColor color; - if (pattern_to_sk_color (source, color)) { - paint.setColor (color); - } else { - SkShader *shader = pattern_to_sk_shader (surface, - source, &image, &image_extra); - if (shader == NULL) - return UNSUPPORTED("pattern to shader conversion"); - - paint.setShader (shader); - shader->unref (); - - paint.setFilterBitmap (pattern_filter_to_sk (source)); - } - - paint.setXfermodeMode (operator_to_sk (op)); - paint.setAntiAlias (antialias != CAIRO_ANTIALIAS_NONE); - - /* Convert the various stroke rendering bits */ - paint.setStrokeWidth (SkFloatToScalar (style->line_width)); - paint.setStrokeMiter (SkFloatToScalar (style->miter_limit)); - - static const SkPaint::Cap capMap[] = { - SkPaint::kButt_Cap, - SkPaint::kRound_Cap, - SkPaint::kSquare_Cap - }; - paint.setStrokeCap (capMap[style->line_cap]); - - static const SkPaint::Join joinMap[] = { - SkPaint::kMiter_Join, - SkPaint::kRound_Join, - SkPaint::kBevel_Join - }; - paint.setStrokeJoin (joinMap[style->line_join]); - - /* If we have a dash pattern, we need to - * create a SkDashPathEffect and set it on the Paint. - */ - if (style->dash != NULL) { - SkScalar intervals_static[20]; - SkScalar *intervals = intervals_static; - - int loop = 0; - unsigned int dash_count = style->num_dashes; - if ((dash_count & 1) != 0) { - loop = 1; - dash_count <<= 1; - } - - if (dash_count > 20) - intervals = new SkScalar[dash_count]; - - unsigned int i = 0; - do { - for (unsigned int j = 0; i < style->num_dashes; j++) - intervals[i++] = SkFloatToScalar (style->dash[j]); - } while (loop--); - - SkDashPathEffect *dash = new SkDashPathEffect (intervals, - dash_count, - SkFloatToScalar (style->dash_offset)); - - paint.setPathEffect (dash); - dash->unref (); - } - - surface->canvas->save (SkCanvas::kMatrix_SaveFlag); - surface->canvas->concat (matrix_to_sk (*ctm)); - surface->canvas->drawPath (path_to_sk (path, ctm_inverse), paint); - surface->canvas->restore (); - - if (image != NULL) { - _cairo_surface_release_source_image (&surface->base, - image, image_extra); - } - - return CAIRO_INT_STATUS_SUCCESS; -} - -static cairo_int_status_t -_cairo_skia_surface_fill (void *asurface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, - cairo_clip_t *clip) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_image_surface_t *image = NULL; - cairo_status_t status; - void *image_extra; - - status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); - if (unlikely (status)) - return (cairo_int_status_t) status; - - - SkPaint paint; - paint.setStyle (SkPaint::kFill_Style); - - SkColor color; - if (pattern_to_sk_color (source, color)) { - paint.setColor (color); - } else { - SkShader *shader = pattern_to_sk_shader (surface, - source, &image, &image_extra); - if (shader == NULL) - return UNSUPPORTED("pattern to shader conversion"); - - paint.setShader (shader); - shader->unref (); - - paint.setFilterBitmap (pattern_filter_to_sk (source)); - } - - paint.setXfermodeMode (operator_to_sk (op)); - paint.setAntiAlias (antialias != CAIRO_ANTIALIAS_NONE); - - surface->canvas->drawPath (path_to_sk (path, fill_rule), paint); - - if (image != NULL) { - _cairo_surface_release_source_image (&surface->base, - image, image_extra); - } - - return CAIRO_INT_STATUS_SUCCESS; -} - -static const struct _cairo_surface_backend -cairo_skia_surface_backend = { - CAIRO_SURFACE_TYPE_SKIA, - _cairo_skia_surface_create_similar, - _cairo_skia_surface_finish, - _cairo_skia_surface_acquire_source_image, - _cairo_skia_surface_release_source_image, - _cairo_skia_surface_acquire_dest_image, - _cairo_skia_surface_release_dest_image, - - NULL, // _cairo_skia_surface_clone_similar, - NULL, /* composite */ - NULL, /* fill_rectangles */ - NULL, /* composite_trapezoids */ - NULL, /* create_span_renderer */ - NULL, /* check_span_renderer */ - - NULL, /* copy_page */ - NULL, /* show_page */ - - _cairo_skia_surface_get_extents, - NULL, /* old_show_glyphs */ - NULL, /* get_font_options */ - NULL, /* flush */ - NULL, /* mark_dirty_rectangle */ - NULL, /* scaled_font_fini */ - NULL, /* scaled_glyph_fini */ - - _cairo_skia_surface_paint, - NULL, /* mask? */ - _cairo_skia_surface_stroke, - _cairo_skia_surface_fill, - NULL, /* show_glyphs */ - - NULL, /* snapshot */ - NULL, /* is_similar */ - NULL, /* reset */ -}; - -/* - * Surface constructors - */ - -static cairo_skia_surface_t * -_cairo_skia_surface_create_internal (SkBitmap::Config config, - bool opaque, - unsigned char *data, - int width, - int height, - int stride) -{ - cairo_skia_surface_t *surface; - cairo_format_t format; - - surface = (cairo_skia_surface_t *) _cairo_malloc (sizeof (cairo_skia_surface_t)); - if (surface == NULL) - return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - - memset (surface, 0, sizeof (cairo_skia_surface_t)); - - format = sk_config_to_format (config, opaque); - assert (format != -1); - - _cairo_surface_init (&surface->base, - &cairo_skia_surface_backend, - NULL, /* device */ - _cairo_content_from_format (format)); - - _cairo_surface_clipper_init (&surface->clipper, - _cairo_skia_surface_clipper_intersect_clip_path); - - surface->bitmap = new SkBitmap; - if (data == NULL) - stride = cairo_format_stride_for_width (format, width); - surface->bitmap->setConfig (config, width, height, stride); - surface->bitmap->setIsOpaque (opaque); - if (data != NULL) - surface->bitmap->setPixels (data); - else - surface->bitmap->allocPixels (); - - surface->canvas = new SkCanvas (*surface->bitmap); - //surface->canvas->translate (SkIntToScalar (0), SkIntToScalar (height)); - //surface->canvas->scale (SkIntToScalar (1), SkIntToScalar (-1)); - surface->canvas->save (); - - return surface; -} - -cairo_surface_t * -cairo_skia_surface_create (cairo_format_t format, - int width, - int height) -{ - SkBitmap::Config config; - bool opaque; - - if (! CAIRO_FORMAT_VALID (format) || - ! format_to_sk_config (format, config, opaque)) - { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - - return &_cairo_skia_surface_create_internal (config, opaque, - NULL, - width, height, 0)->base; -} - -cairo_surface_t * -cairo_skia_surface_create_for_data (unsigned char *data, - cairo_format_t format, - int width, - int height, - int stride) -{ - SkBitmap::Config config; - bool opaque; - - if (! CAIRO_FORMAT_VALID (format) || - ! format_to_sk_config (format, config, opaque)) - { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - - return &_cairo_skia_surface_create_internal (config, opaque, - data, - width, height, stride)->base; -} - -unsigned char * -cairo_skia_surface_get_data (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return NULL; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return (unsigned char *) esurf->bitmap->getPixels (); -} - -cairo_format_t -cairo_skia_surface_get_format (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return (cairo_format_t) -1; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return sk_config_to_format (esurf->bitmap->config (), - esurf->bitmap->isOpaque ()); -} - -int -cairo_skia_surface_get_width (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return 0; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return esurf->bitmap->width (); -} - -int -cairo_skia_surface_get_height (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return 0; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return esurf->bitmap->height (); -} - -int -cairo_skia_surface_get_stride (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return 0; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return esurf->bitmap->rowBytes (); -} - -cairo_surface_t * -cairo_skia_surface_get_image (cairo_surface_t *surface) -{ - if (surface->type != CAIRO_SURFACE_TYPE_SKIA) - return NULL; - - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - return &_get_image_surface (esurf)->base; -} - -/* - -Todo: - -*** Skia: - -- mask() - -*** Sk: - -High: -- antialiased clipping? - -Medium: -- implement clip path reset (to avoid restore/save) -- implement complex radial patterns (2 centers and 2 radii) - -Low: -- implement EXTEND_NONE - -*/ diff --git a/src/cairo-skia.h b/src/cairo-skia.h deleted file mode 100644 index 99b928656..000000000 --- a/src/cairo-skia.h +++ /dev/null @@ -1,66 +0,0 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth - */ - -#ifndef CAIRO_SKIA_H -#define CAIRO_SKIA_H - -#include "cairo.h" - -#if CAIRO_HAS_SKIA_SURFACE - -CAIRO_BEGIN_DECLS - -cairo_public cairo_surface_t * -cairo_skia_surface_create (cairo_format_t format, - int width, - int height); - -cairo_public cairo_surface_t * -cairo_skia_surface_create_for_data (unsigned char *data, - cairo_format_t format, - int width, - int height, - int stride); - -CAIRO_END_DECLS - -#else - -# error Cairo was not compiled with support for the Skia backend - -#endif - -#endif diff --git a/src/cairo.h b/src/cairo.h index e60ee8cde..3492bdc6b 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -2366,7 +2366,6 @@ cairo_surface_status (cairo_surface_t *surface); * @CAIRO_SURFACE_TYPE_DRM: The surface is of type Direct Render Manager, since 1.10 * @CAIRO_SURFACE_TYPE_TEE: The surface is of type 'tee' (a multiplexing surface), since 1.10 * @CAIRO_SURFACE_TYPE_XML: The surface is of type XML (for debugging), since 1.10 - * @CAIRO_SURFACE_TYPE_SKIA: The surface is of type Skia, since 1.10 * @CAIRO_SURFACE_TYPE_SUBSURFACE: The surface is a subsurface created with * cairo_surface_create_for_rectangle(), since 1.10 * @CAIRO_SURFACE_TYPE_COGL: This surface is of type Cogl, since 1.12 diff --git a/src/skia/cairo-skia-context.cpp b/src/skia/cairo-skia-context.cpp deleted file mode 100644 index f1326fdb0..000000000 --- a/src/skia/cairo-skia-context.cpp +++ /dev/null @@ -1,1781 +0,0 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2002 University of Southern California - * Copyright © 2005 Red Hat, Inc. - * Copyright © 2010 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is University of Southern - * California. - * - * Contributor(s): - * Carl D. Worth - * Chris Wilson - */ - -#include "cairoint.h" - -#include "cairo-private.h" -#include "cairo-error-private.h" -#include "cairo-arc-private.h" -#include "cairo-backend-private.h" -#include "cairo-default-context-private.h" -#include "cairo-freed-pool-private.h" -#include "cairo-gstate-private.h" -#include "cairo-image-surface-inline.h" -#include "cairo-path-private.h" -#include "cairo-pattern-private.h" -#include "cairo-skia-private.h" -#include "cairo-surface-backend-private.h" - -#include -#include -#include -#include -#include - -#if !defined(INFINITY) -#define INFINITY HUGE_VAL -#endif - -#if (CAIRO_FIXED_BITS == 32) && (CAIRO_FIXED_FRAC_BITS == 16) && defined(SK_SCALAR_IS_FIXED) -# define CAIRO_FIXED_TO_SK_SCALAR(x) (x) -#elif defined(SK_SCALAR_IS_FIXED) -/* This can be done better, but this will do for now */ -# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) -#else -# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) -#endif - -#define UNSUPPORTED - - -static freed_pool_t context_pool; - -static void -_cairo_skia_context_destroy (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->path->reset (); - cr->paint->reset (); - - delete cr->canvas; - - cairo_surface_destroy (&cr->target->image.base); - cairo_surface_destroy (&cr->original->image.base); - - if (cr->source != NULL) { - if (cr->source_image != NULL) { - _cairo_surface_release_source_image (cr->source, cr->source_image, cr->source_extra); - cr->source_image = NULL; - } - cairo_surface_destroy (cr->source); - cr->source = NULL; - } - - _cairo_fini (&cr->base); - - _freed_pool_put (&context_pool, cr); -} - -static cairo_surface_t * -_cairo_skia_context_get_original_target (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return &cr->original->image.base; -} - -static cairo_surface_t * -_cairo_skia_context_get_current_target (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return &cr->target->image.base; -} - -static cairo_status_t -_cairo_skia_context_save (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->canvas->save (); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_restore (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->canvas->restore (); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_push_group (void *abstract_cr, cairo_content_t content) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_surface_t *group_surface; - cairo_status_t status; - int width, height; - - //clip = _cairo_gstate_get_clip (cr->gstate); - width = cr->target->image.width; - height = cr->target->image.height; - group_surface = cr->target->image.base.backend->create_similar (&cr->target->image.base, - content, width, height); - -#if 0 - /* Set device offsets on the new surface so that logically it appears at - * the same location on the parent surface -- when we pop_group this, - * the source pattern will get fixed up for the appropriate target surface - * device offsets, so we want to set our own surface offsets from /that/, - * and not from the device origin. */ - cairo_surface_set_device_offset (group_surface, - parent_surface->device_transform.x0 - extents.x, - parent_surface->device_transform.y0 - extents.y); - - /* If we have a current path, we need to adjust it to compensate for - * the device offset just applied. */ - _cairo_path_fixed_transform (cr->path, - &group_surface->device_transform); -#endif - - status = _cairo_skia_context_save (cr); - if (unlikely (status)) { - cairo_surface_destroy (group_surface); - return status; - } - - cairo_surface_destroy (&cr->target->image.base); - cr->target = (cairo_skia_surface_t *) group_surface; - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_pattern_t * -_cairo_skia_context_pop_group (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_surface_t *group_surface; - cairo_pattern_t *group_pattern; - cairo_status_t status; - - group_surface = cairo_surface_reference (&cr->target->image.base); - - status = _cairo_skia_context_restore (cr); - if (unlikely (status)) { - group_pattern = _cairo_pattern_create_in_error (status); - goto done; - } - - group_pattern = cairo_pattern_create_for_surface (group_surface); - status = group_pattern->status; - if (unlikely (status)) - goto done; - -#if 0 - _cairo_gstate_get_matrix (cr->gstate, &group_matrix); - /* Transform by group_matrix centered around device_transform so that when - * we call _cairo_gstate_copy_transformed_pattern the result is a pattern - * with a matrix equivalent to the device_transform of group_surface. */ - if (_cairo_surface_has_device_transform (group_surface)) { - cairo_pattern_set_matrix (group_pattern, &group_surface->device_transform); - _cairo_pattern_transform (group_pattern, &group_matrix); - _cairo_pattern_transform (group_pattern, &group_surface->device_transform_inverse); - } else { - cairo_pattern_set_matrix (group_pattern, &group_matrix); - } - - /* If we have a current path, we need to adjust it to compensate for - * the device offset just removed. */ - _cairo_path_fixed_transform (cr->path, - &group_surface->device_transform_inverse); -#endif - -done: - cairo_surface_destroy (group_surface); - - return group_pattern; -} - -static inline cairo_surface_t * -surface_from_pattern (const cairo_pattern_t *pattern) -{ - return (reinterpret_cast (pattern))->surface; -} - -static inline bool -surface_to_sk_bitmap (cairo_surface_t *surface, SkBitmap& bitmap) -{ - cairo_image_surface_t *img = (cairo_image_surface_t *) surface; - SkBitmap::Config config; - SkColorType colorType; - bool opaque; - - if (unlikely (! format_to_sk_config (img->format, config, opaque))) - return false; - - bitmap.reset (); - bitmap.setAlphaType (opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); - colorType = SkBitmapConfigToColorType(config); - bitmap.setInfo (SkImageInfo::Make(img->width, img->height, colorType, kPremul_SkAlphaType), img->stride); - bitmap.setPixels (img->data); - - - return true; -} - -static inline SkMatrix -matrix_to_sk (const cairo_matrix_t& mat) -{ - SkMatrix skm; - - skm.reset (); - skm.set (SkMatrix::kMScaleX, SkFloatToScalar (mat.xx)); - skm.set (SkMatrix::kMSkewX, SkFloatToScalar (mat.xy)); - skm.set (SkMatrix::kMTransX, SkFloatToScalar (mat.x0)); - skm.set (SkMatrix::kMSkewY, SkFloatToScalar (mat.yx)); - skm.set (SkMatrix::kMScaleY, SkFloatToScalar (mat.yy)); - skm.set (SkMatrix::kMTransY, SkFloatToScalar (mat.y0)); - - /* - skm[6] = SkFloatToScalar (0.0); - skm[7] = SkFloatToScalar (0.0); - skm[8] = SkFloatToScalar (1.0); -- this isn't right, it wants a magic value in there that it'll set itself. It wants Sk_Fract1 (2.30), not Sk_Scalar1 - */ - - return skm; -} - -static inline SkMatrix -matrix_inverse_to_sk (const cairo_matrix_t& mat) -{ - cairo_matrix_t inv = mat; - cairo_status_t status = cairo_matrix_invert (&inv); - assert (status == CAIRO_STATUS_SUCCESS); - return matrix_to_sk (inv); -} - -static SkShader::TileMode -extend_to_sk (cairo_extend_t extend) -{ - static const SkShader::TileMode modeMap[] = { - SkShader::kClamp_TileMode, // NONE behaves like PAD, because no one wants NONE - SkShader::kRepeat_TileMode, - SkShader::kMirror_TileMode, - SkShader::kClamp_TileMode - }; - - return modeMap[extend]; -} - -static inline SkColor -color_to_sk (const cairo_color_t& c) -{ - /* Need unpremultiplied 1-byte values */ - return SkColorSetARGB ((U8CPU) (c.alpha * 255), - (U8CPU) (c.red * 255), - (U8CPU) (c.green * 255), - (U8CPU) (c.blue * 255)); -} - -static inline SkColor -color_stop_to_sk (const cairo_color_stop_t& c) -{ - /* Need unpremultiplied 1-byte values */ - return SkColorSetARGB ((U8CPU) (c.alpha * 255), - (U8CPU) (c.red * 255), - (U8CPU) (c.green * 255), - (U8CPU) (c.blue * 255)); -} - -static SkShader* -source_to_sk_shader (cairo_skia_context_t *cr, - const cairo_pattern_t *pattern) -{ - SkShader *shader = NULL; - - if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; - return new SkColorShader (color_to_sk (solid->color)); - } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { - cairo_surface_t *surface = surface_from_pattern (pattern); - - cr->source = cairo_surface_reference (surface); - - if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - - if (! _cairo_matrix_is_identity (&pattern->matrix)) - { - SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); - shader = SkShader::CreateBitmapShader (*esurf->bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend), - &localMatrix); - } else { - shader = SkShader::CreateBitmapShader (*esurf->bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend)); - } - } else { - SkBitmap bitmap; - - if (! _cairo_surface_is_image (surface)) { - cairo_status_t status; - - status = _cairo_surface_acquire_source_image (surface, - &cr->source_image, - &cr->source_extra); - if (status) - return NULL; - - surface = &cr->source_image->base; - } - - if (unlikely (! surface_to_sk_bitmap (surface, bitmap))) - return NULL; - - if (! _cairo_matrix_is_identity (&pattern->matrix)) - { - SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); - shader = SkShader::CreateBitmapShader (bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend), - &localMatrix); - } else { - shader = SkShader::CreateBitmapShader (bitmap, - extend_to_sk (pattern->extend), - extend_to_sk (pattern->extend)); - } - } - } else if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR - /* || pattern->type == CAIRO_PATTERN_TYPE_RADIAL */) - { - cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; - SkColor colors_stack[10]; - SkScalar pos_stack[10]; - SkColor *colors = colors_stack; - SkScalar *pos = pos_stack; - - if (gradient->n_stops > 10) { - colors = new SkColor[gradient->n_stops]; - pos = new SkScalar[gradient->n_stops]; - } - - for (unsigned int i = 0; i < gradient->n_stops; i++) { - pos[i] = CAIRO_FIXED_TO_SK_SCALAR (gradient->stops[i].offset); - colors[i] = color_stop_to_sk (gradient->stops[i].color); - } - - if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { - cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; - SkPoint points[2]; - - points[0].set (SkFloatToScalar (linear->pd1.x), - SkFloatToScalar (linear->pd1.y)); - points[1].set (SkFloatToScalar (linear->pd2.x), - SkFloatToScalar (linear->pd2.y)); - - if(! _cairo_matrix_is_identity (&pattern->matrix)) - { - SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); - shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, - extend_to_sk (pattern->extend), - 0, &localMatrix); - } else { - shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, - extend_to_sk (pattern->extend)); - } - } else { - // XXX todo -- implement real radial shaders in Skia - } - - if (gradient->n_stops > 10) { - delete [] colors; - delete [] pos; - } - } - - return shader; -} - -static inline bool -pattern_filter_to_sk (const cairo_pattern_t *pattern) -{ - switch (pattern->filter) { - case CAIRO_FILTER_GOOD: - case CAIRO_FILTER_BEST: - case CAIRO_FILTER_BILINEAR: - case CAIRO_FILTER_GAUSSIAN: - return true; - default: - case CAIRO_FILTER_FAST: - case CAIRO_FILTER_NEAREST: - return false; - } -} - -static inline bool -pattern_to_sk_color (const cairo_pattern_t *pattern, SkColor& color) -{ - if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) - return false; - - color = color_to_sk (((cairo_solid_pattern_t *) pattern)->color); - return true; -} - -static cairo_status_t -_cairo_skia_context_set_source (void *abstract_cr, - cairo_pattern_t *source) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkColor color; - - if (cr->source != NULL) { - if (cr->source_image != NULL) { - _cairo_surface_release_source_image (cr->source, cr->source_image, cr->source_extra); - cr->source_image = NULL; - } - cairo_surface_destroy (cr->source); - cr->source = NULL; - } - - if (pattern_to_sk_color (source, color)) { - cr->paint->setColor (color); - } else { - SkShader *shader = source_to_sk_shader (cr, source); - bool fLevel = pattern_filter_to_sk (source); - if (shader == NULL) { - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; - } - - cr->paint->setShader (shader); - shader->unref (); - - cr->paint->setFilterLevel (fLevel ? - (SkPaint::kLow_FilterLevel) : (SkPaint::kNone_FilterLevel)); - } - - /* XXX change notification */ - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_source_rgba (void *abstract_cr, double red, double green, double blue, double alpha) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* Need unpremultiplied 1-byte values */ - cr->paint->setARGB ((U8CPU) (alpha * 255), - (U8CPU) (red * 255), - (U8CPU) (green * 255), - (U8CPU) (blue * 255)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_source_surface (void *abstract_cr, - cairo_surface_t *surface, - double x, - double y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_pattern_t *pattern; - cairo_matrix_t matrix; - cairo_status_t status; - - if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; - SkShader *shader; - - shader = SkShader::CreateBitmapShader (*esurf->bitmap, - SkShader::kClamp_TileMode, /* XXX */ - SkShader::kClamp_TileMode); - - cr->paint->setShader (shader); - shader->unref (); - - cr->paint->setFilterLevel (true ? - (SkPaint::kLow_FilterLevel) : (SkPaint::kNone_FilterLevel)); - - return CAIRO_STATUS_SUCCESS; - } - - pattern = cairo_pattern_create_for_surface (surface); - if (unlikely (pattern->status)) - return pattern->status; - - cairo_matrix_init_translate (&matrix, -x, -y); - cairo_pattern_set_matrix (pattern, &matrix); - - status = _cairo_skia_context_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - - return status; -} - -static cairo_pattern_t * -_cairo_skia_context_get_source (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return NULL; -} - -static cairo_status_t -_cairo_skia_context_set_tolerance (void *abstract_cr, - double tolerance) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX ignored */ - return CAIRO_STATUS_SUCCESS; -} - -static inline SkXfermode::Mode -operator_to_sk (cairo_operator_t op) -{ - static const SkXfermode::Mode modeMap[] = { - SkXfermode::kClear_Mode, - - SkXfermode::kSrc_Mode, - SkXfermode::kSrcOver_Mode, - SkXfermode::kSrcIn_Mode, - SkXfermode::kSrcOut_Mode, - SkXfermode::kSrcATop_Mode, - - SkXfermode::kDst_Mode, - SkXfermode::kDstOver_Mode, - SkXfermode::kDstIn_Mode, - SkXfermode::kDstOut_Mode, - SkXfermode::kDstATop_Mode, - - SkXfermode::kXor_Mode, - SkXfermode::kPlus_Mode, // XXX Add? - SkXfermode::kPlus_Mode, // XXX SATURATE - - SkXfermode::kPlus_Mode, - SkXfermode::kMultiply_Mode, - SkXfermode::kScreen_Mode, - SkXfermode::kOverlay_Mode, - SkXfermode::kDarken_Mode, - SkXfermode::kLighten_Mode, - SkXfermode::kColorDodge_Mode, - SkXfermode::kColorBurn_Mode, - SkXfermode::kHardLight_Mode, - SkXfermode::kSoftLight_Mode, - SkXfermode::kDifference_Mode, - SkXfermode::kExclusion_Mode, - - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_HUE - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_SATURATION, - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_COLOR, - SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_LUMINOSITY - }; - - return modeMap[op]; -} - -static cairo_status_t -_cairo_skia_context_set_operator (void *abstract_cr, cairo_operator_t op) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setXfermodeMode (operator_to_sk (op)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_opacity (void *abstract_cr, double opacity) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX */ - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_antialias (void *abstract_cr, cairo_antialias_t antialias) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setAntiAlias (antialias != CAIRO_ANTIALIAS_NONE); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_fill_rule (void *abstract_cr, - cairo_fill_rule_t fill_rule) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->path->setFillType (fill_rule == CAIRO_FILL_RULE_WINDING ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_line_width (void *abstract_cr, - double line_width) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setStrokeWidth (SkFloatToScalar (line_width)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_line_cap (void *abstract_cr, - cairo_line_cap_t line_cap) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - static const SkPaint::Cap map[] = { - SkPaint::kButt_Cap, - SkPaint::kRound_Cap, - SkPaint::kSquare_Cap - }; - cr->paint->setStrokeCap (map[line_cap]); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_line_join (void *abstract_cr, - cairo_line_join_t line_join) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - static const SkPaint::Join map[] = { - SkPaint::kMiter_Join, - SkPaint::kRound_Join, - SkPaint::kBevel_Join - }; - cr->paint->setStrokeJoin (map[line_join]); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_dash (void *abstract_cr, - const double *dashes, - int num_dashes, - double offset) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkScalar intervals_static[20]; - SkScalar *intervals = intervals_static; - - if (num_dashes == 0) { - cr->paint->setPathEffect (NULL); - return CAIRO_STATUS_SUCCESS; - } - - int loop = 0; - if ((num_dashes & 1) != 0) { - loop = 1; - num_dashes <<= 1; - } - - if (num_dashes > 20) - intervals = new SkScalar[num_dashes]; - - int i = 0; - do { - for (int j = 0; i < num_dashes; j++) - intervals[i++] = SkFloatToScalar (dashes[j]); - } while (loop--); - - SkDashPathEffect *dash = SkDashPathEffect::Create (intervals, num_dashes, SkFloatToScalar (offset)); - - cr->paint->setPathEffect (dash); - dash->unref (); - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_miter_limit (void *abstract_cr, double limit) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setStrokeMiter (SkFloatToScalar (limit)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_antialias_t -_cairo_skia_context_get_antialias (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return cr->paint->isAntiAlias () ? CAIRO_ANTIALIAS_DEFAULT : CAIRO_ANTIALIAS_NONE; -} - -static void -_cairo_skia_context_get_dash (void *abstract_cr, - double *dashes, - int *num_dashes, - double *offset) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - *num_dashes = 0; - /* XXX */ -} - -static cairo_fill_rule_t -_cairo_skia_context_get_fill_rule (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkPath::FillType ft; - - ft = cr->path->getFillType (); - if (ft == SkPath::kWinding_FillType) - return CAIRO_FILL_RULE_WINDING; - if (ft == SkPath::kEvenOdd_FillType) - return CAIRO_FILL_RULE_EVEN_ODD;; - - UNSUPPORTED; - return CAIRO_FILL_RULE_WINDING; -} - -static double -_cairo_skia_context_get_line_width (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return /* ScalarToFloat */ cr->paint->getStrokeWidth (); -} - -static cairo_line_cap_t -_cairo_skia_context_get_line_cap (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - static const cairo_line_cap_t map[] = { - CAIRO_LINE_CAP_BUTT, - CAIRO_LINE_CAP_ROUND, - CAIRO_LINE_CAP_SQUARE - }; - return map[cr->paint->getStrokeCap ()]; -} - -static cairo_line_join_t -_cairo_skia_context_get_line_join (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - static const cairo_line_join_t map[] = { - CAIRO_LINE_JOIN_MITER, - CAIRO_LINE_JOIN_ROUND, - CAIRO_LINE_JOIN_BEVEL - }; - return map[cr->paint->getStrokeJoin ()]; -} - -static double -_cairo_skia_context_get_miter_limit (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return /* SkScalarToFloat */ cr->paint->getStrokeMiter (); -} - -static cairo_operator_t -_cairo_skia_context_get_operator (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - //cr->paint->getXfermode (); - return CAIRO_OPERATOR_OVER; -} - -static double -_cairo_skia_context_get_opacity (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return 1.; -} - -static double -_cairo_skia_context_get_tolerance (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX */ - return CAIRO_GSTATE_TOLERANCE_DEFAULT; -} - - -/* Current tranformation matrix */ - -static cairo_status_t -_cairo_skia_context_translate (void *abstract_cr, - double tx, - double ty) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_translate (&cr->matrix, tx, ty); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_scale (void *abstract_cr, - double sx, - double sy) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_scale (&cr->matrix, sx, sy); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rotate (void *abstract_cr, - double theta) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_rotate (&cr->matrix, theta); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_transform (void *abstract_cr, - const cairo_matrix_t *matrix) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_multiply (&cr->matrix, &cr->matrix, matrix); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_matrix (void *abstract_cr, - const cairo_matrix_t *matrix) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->matrix = *matrix; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_identity_matrix (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_init_identity (&cr->matrix); - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_context_get_matrix (void *abstract_cr, - cairo_matrix_t *matrix) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - *matrix = cr->matrix; -} - -static void -_cairo_skia_context_user_to_device (void *abstract_cr, - double *x, - double *y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_transform_point (&cr->matrix, x, y); -} - -static void -_cairo_skia_context_user_to_device_distance (void *abstract_cr, - double *dx, - double *dy) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cairo_matrix_transform_distance (&cr->matrix, dx, dy); -} - -static void -_cairo_skia_context_device_to_user (void *abstract_cr, - double *x, - double *y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_matrix_t inverse; - cairo_status_t status; - - inverse = cr->matrix; - status = cairo_matrix_invert (&inverse); - assert (CAIRO_STATUS_SUCCESS == status); - - cairo_matrix_transform_point (&inverse, x, y); -} - -static void -_cairo_skia_context_device_to_user_distance (void *abstract_cr, - double *dx, - double *dy) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_matrix_t inverse; - cairo_status_t status; - - inverse = cr->matrix; - status = cairo_matrix_invert (&inverse); - assert (CAIRO_STATUS_SUCCESS == status); - - cairo_matrix_transform_distance (&inverse, dx, dy); -} - -/* Path constructor */ - -static cairo_status_t -_cairo_skia_context_new_path (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->path->reset (); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_new_sub_path (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->path->rMoveTo (0, 0); /* XXX */ - return CAIRO_STATUS_SUCCESS; -} - -static void -user_to_device_point (cairo_skia_context_t *cr, double *x, double *y) -{ - cairo_matrix_transform_point (&cr->matrix, x, y); - cairo_matrix_transform_point (&cr->target->image.base.device_transform, x, y); -} - -static void -user_to_device_distance (cairo_skia_context_t *cr, double *dx, double *dy) -{ - cairo_matrix_transform_distance (&cr->matrix, dx, dy); - cairo_matrix_transform_distance (&cr->target->image.base.device_transform, dx, dy); -} - -static cairo_status_t -_cairo_skia_context_move_to (void *abstract_cr, double x, double y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_point (cr, &x, &y); - cr->path->moveTo (SkFloatToScalar (x), SkFloatToScalar (y)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_line_to (void *abstract_cr, double x, double y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_point (cr, &x, &y); - cr->path->lineTo (SkFloatToScalar (x), SkFloatToScalar (y)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_curve_to (void *abstract_cr, - double x1, double y1, - double x2, double y2, - double x3, double y3) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_point (cr, &x1, &y1); - user_to_device_point (cr, &x2, &y2); - user_to_device_point (cr, &x3, &y3); - cr->path->cubicTo (SkFloatToScalar (x1), SkFloatToScalar (y1), - SkFloatToScalar (x2), SkFloatToScalar (y2), - SkFloatToScalar (x3), SkFloatToScalar (y3)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_arc_to (void *abstract_cr, - double x1, double y1, - double x2, double y2, - double radius) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - -#if 0 - user_to_device_point (cr, &x1, &y1); - user_to_device_point (cr, &x2, &y2); - user_to_device_distance (cr, &radius, &radius); -#endif - - cr->path->arcTo (SkFloatToScalar (x1), SkFloatToScalar (y1), - SkFloatToScalar (x2), SkFloatToScalar (y2), - SkFloatToScalar (radius)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rel_move_to (void *abstract_cr, double dx, double dy) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_distance (cr, &dx, &dy); - cr->path->rMoveTo (SkFloatToScalar (dx), SkFloatToScalar (dy)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rel_line_to (void *abstract_cr, double dx, double dy) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_distance (cr, &dx, &dy); - cr->path->rLineTo (SkFloatToScalar (dx), SkFloatToScalar (dy)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rel_curve_to (void *abstract_cr, - double dx1, double dy1, - double dx2, double dy2, - double dx3, double dy3) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - user_to_device_distance (cr, &dx1, &dy1); - user_to_device_distance (cr, &dx2, &dy2); - user_to_device_distance (cr, &dx3, &dy3); - cr->path->rCubicTo (SkFloatToScalar (dx1), SkFloatToScalar (dy1), - SkFloatToScalar (dx2), SkFloatToScalar (dy2), - SkFloatToScalar (dx3), SkFloatToScalar (dy3)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rel_arc_to (void *abstract_cr, - double dx1, double dy1, - double dx2, double dy2, - double radius) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - -#if 0 - user_to_device_point (cr, &x1, &y1); - user_to_device_point (cr, &x2, &y2); - user_to_device_distance (cr, &radius, &radius); -#endif - - cr->path->arcTo (SkFloatToScalar (dx1), SkFloatToScalar (dy1), - SkFloatToScalar (dx2), SkFloatToScalar (dy2), - SkFloatToScalar (radius)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_close_path (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->path->close (); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_rectangle (void *abstract_cr, - double x, double y, - double width, double height) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - double x1, y1, x2, y2; - - /* XXX assume no rotation! */ - x1 = x, y1 = y; - user_to_device_point (cr, &x1, &y1); - - x2 = x + width, y2 = y + height; - user_to_device_point (cr, &x2, &y2); - - cr->path->addRect (SkFloatToScalar (x1), SkFloatToScalar (y1), - SkFloatToScalar (x2), SkFloatToScalar (y2)); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_arc (void *abstract_cr, - double xc, double yc, double radius, - double angle1, double angle2, - cairo_bool_t forward) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_status_t status; - - /* XXX cr->path->arc() */ - - /* Do nothing, successfully, if radius is <= 0 */ - if (radius <= 0.0) { - status = _cairo_skia_context_line_to (cr, xc, yc); - if (unlikely (status)) - return status; - - status = _cairo_skia_context_line_to (cr, xc, yc); - if (unlikely (status)) - return status; - - return CAIRO_STATUS_SUCCESS; - } - - status = _cairo_skia_context_line_to (cr, - xc + radius * cos (angle1), - yc + radius * sin (angle1)); - - if (unlikely (status)) - return status; - - if (forward) - _cairo_arc_path (&cr->base, xc, yc, radius, angle1, angle2); - else - _cairo_arc_path_negative (&cr->base, xc, yc, radius, angle1, angle2); - - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_context_path_extents (void *abstract_cr, - double *x1, - double *y1, - double *x2, - double *y2) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkRect rect; - - rect = cr->path->getBounds (); - - UNSUPPORTED; - /* XXX transform SkScalar rect to user */ -} - -static cairo_bool_t -_cairo_skia_context_has_current_point (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return TRUE; -} - -static cairo_bool_t -_cairo_skia_context_get_current_point (void *abstract_cr, - double *x, - double *y) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkPoint pt; - - cr->path->getLastPt (&pt); - //*x = SkScalarToFloat (pt.x); - //*y = SkScalarToFloat (pt.y); - //_cairo_gstate_backend_to_user (cr->gstate, x, y); - - return TRUE; -} - -static cairo_path_t * -_cairo_skia_context_copy_path (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX iterate */ - UNSUPPORTED; - return NULL; -} - -static cairo_path_t * -_cairo_skia_context_copy_path_flat (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX iterate and decompose */ - UNSUPPORTED; - return NULL; -} - -static cairo_status_t -_cairo_skia_context_append_path (void *abstract_cr, - const cairo_path_t *path) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - // return _cairo_path_append_to_context (path, cr); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_stroke_to_path (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setStyle (SkPaint::kStroke_Style); - cr->paint->getFillPath (*cr->path, cr->path); - return CAIRO_STATUS_SUCCESS; -} - - -static cairo_status_t -_cairo_skia_context_paint (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - -#if 0 - if (cr->source != NULL) { - SkBitmap bitmap; - SkMatrix bitmapMatrix; - - if (cr->source->type == CAIRO_SURFACE_TYPE_SKIA) { - cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) cr->source->type; - - bitmap = *esurf->bitmap; - } else { - surface_to_sk_bitmap (&cr->source_image->base, bitmap); - } - - // XXX pattern->matrix, pattern->filter, pattern->extend - cr->canvas->drawBitmapMatrix (bitmap, bitmapMatrix, cr->paint); - } else { - cr->canvas->drawPaint (*cr->paint); - } -#else - cr->canvas->drawPaint (*cr->paint); -#endif - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_paint_with_alpha (void *abstract_cr, - double alpha) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_status_t status; - - if (CAIRO_ALPHA_IS_OPAQUE (alpha)) - return _cairo_skia_context_paint (cr); - - cr->paint->setAlpha(SkScalarRoundToInt(255*alpha)); - status = _cairo_skia_context_paint (cr); - cr->paint->setAlpha(255); - - return status; -} - -static cairo_status_t -_cairo_skia_context_mask (void *abstract_cr, - cairo_pattern_t *mask) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX */ - //UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_stroke_preserve (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setStyle (SkPaint::kStroke_Style); - - /* XXX pen transformation? */ - //assert (_cairo_matrix_is_identity (&cr->matrix)); - cr->canvas->drawPath (*cr->path, *cr->paint); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_stroke (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_status_t status; - - status = _cairo_skia_context_stroke_preserve (cr); - if (unlikely (status)) - return status; - - return _cairo_skia_context_new_path (cr); -} - -static cairo_status_t -_cairo_skia_context_in_stroke (void *abstract_cr, - double x, double y, - cairo_bool_t *inside) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_stroke_extents (void *abstract_cr, - double *x1, double *y1, double *x2, double *y2) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_fill_preserve (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->paint->setStyle (SkPaint::kFill_Style); - cr->canvas->drawPath (*cr->path, *cr->paint); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_fill (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_status_t status; - - status = _cairo_skia_context_fill_preserve (cr); - if (unlikely (status)) - return status; - - return _cairo_skia_context_new_path (cr); -} - -static cairo_status_t -_cairo_skia_context_in_fill (void *abstract_cr, - double x, double y, - cairo_bool_t *inside) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_fill_extents (void *abstract_cr, - double *x1, double *y1, double *x2, double *y2) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_clip_preserve (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - cr->canvas->clipPath (*cr->path); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_clip (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - cairo_status_t status; - - status = _cairo_skia_context_clip_preserve (cr); - if (unlikely (status)) - return status; - - return _cairo_skia_context_new_path (cr); -} - -static cairo_status_t -_cairo_skia_context_in_clip (void *abstract_cr, - double x, double y, - cairo_bool_t *inside) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_reset_clip (void *abstract_cr) -{ - cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - SkRegion rgn(SkIRect::MakeWH (cr->target->bitmap->width (), - cr->target->bitmap->height ())); - - cr->canvas->setClipRegion(rgn); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_clip_extents (void *abstract_cr, - double *x1, double *y1, - double *x2, double *y2) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_rectangle_list_t * -_cairo_skia_context_copy_clip_rectangle_list (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return NULL; -} - -static cairo_status_t -_cairo_skia_context_copy_page (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_show_page (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_font_face (void *abstract_cr, - cairo_font_face_t *font_face) -{ - // cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - //return _cairo_gstate_set_font_face (cr->gstate, font_face); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_font_face_t * -_cairo_skia_context_get_font_face (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return NULL; -} - -static cairo_status_t -_cairo_skia_context_font_extents (void *abstract_cr, - cairo_font_extents_t *extents) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_font_size (void *abstract_cr, - double size) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_set_font_matrix (void *abstract_cr, - const cairo_matrix_t *matrix) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_context_get_font_matrix (void *abstract_cr, - cairo_matrix_t *matrix) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; -} - -static cairo_status_t -_cairo_skia_context_set_font_options (void *abstract_cr, - const cairo_font_options_t *options) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_context_get_font_options (void *abstract_cr, - cairo_font_options_t *options) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; -} - -static cairo_status_t -_cairo_skia_context_set_scaled_font (void *abstract_cr, - cairo_scaled_font_t *scaled_font) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_scaled_font_t * -_cairo_skia_context_get_scaled_font (void *abstract_cr) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return _cairo_scaled_font_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); -} - -static cairo_status_t -_cairo_skia_context_glyphs (void *abstract_cr, - const cairo_glyph_t *glyphs, - int num_glyphs, - cairo_glyph_text_info_t *info) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - /* XXX */ - //UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_glyph_path (void *abstract_cr, - const cairo_glyph_t *glyphs, - int num_glyphs) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static cairo_status_t -_cairo_skia_context_glyph_extents (void *abstract_cr, - const cairo_glyph_t *glyphs, - int num_glyphs, - cairo_text_extents_t *extents) -{ - //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; - - UNSUPPORTED; - return CAIRO_STATUS_SUCCESS; -} - -static const cairo_backend_t _cairo_skia_context_backend = { - CAIRO_TYPE_SKIA, - _cairo_skia_context_destroy, - - _cairo_skia_context_get_original_target, - _cairo_skia_context_get_current_target, - - _cairo_skia_context_save, - _cairo_skia_context_restore, - - _cairo_skia_context_push_group, - _cairo_skia_context_pop_group, - - _cairo_skia_context_set_source_rgba, - _cairo_skia_context_set_source_surface, - _cairo_skia_context_set_source, - _cairo_skia_context_get_source, - - _cairo_skia_context_set_antialias, - _cairo_skia_context_set_dash, - _cairo_skia_context_set_fill_rule, - _cairo_skia_context_set_line_cap, - _cairo_skia_context_set_line_join, - _cairo_skia_context_set_line_width, - _cairo_skia_context_set_miter_limit, - _cairo_skia_context_set_opacity, - _cairo_skia_context_set_operator, - _cairo_skia_context_set_tolerance, - _cairo_skia_context_get_antialias, - _cairo_skia_context_get_dash, - _cairo_skia_context_get_fill_rule, - _cairo_skia_context_get_line_cap, - _cairo_skia_context_get_line_join, - _cairo_skia_context_get_line_width, - _cairo_skia_context_get_miter_limit, - _cairo_skia_context_get_opacity, - _cairo_skia_context_get_operator, - _cairo_skia_context_get_tolerance, - - _cairo_skia_context_translate, - _cairo_skia_context_scale, - _cairo_skia_context_rotate, - _cairo_skia_context_transform, - _cairo_skia_context_set_matrix, - _cairo_skia_context_set_identity_matrix, - _cairo_skia_context_get_matrix, - _cairo_skia_context_user_to_device, - _cairo_skia_context_user_to_device_distance, - _cairo_skia_context_device_to_user, - _cairo_skia_context_device_to_user_distance, - _cairo_skia_context_user_to_device, /* XXX backend */ - _cairo_skia_context_user_to_device_distance, /* XXX backend */ - _cairo_skia_context_device_to_user, /* XXX backend */ - _cairo_skia_context_device_to_user_distance, /* XXX backend */ - - _cairo_skia_context_new_path, - _cairo_skia_context_new_sub_path, - _cairo_skia_context_move_to, - _cairo_skia_context_rel_move_to, - _cairo_skia_context_line_to, - _cairo_skia_context_rel_line_to, - _cairo_skia_context_curve_to, - _cairo_skia_context_rel_curve_to, - _cairo_skia_context_arc_to, - _cairo_skia_context_rel_arc_to, - _cairo_skia_context_close_path, - _cairo_skia_context_arc, - _cairo_skia_context_rectangle, - _cairo_skia_context_path_extents, - _cairo_skia_context_has_current_point, - _cairo_skia_context_get_current_point, - _cairo_skia_context_copy_path, - _cairo_skia_context_copy_path_flat, - _cairo_skia_context_append_path, - - _cairo_skia_stroke_to_path, - - _cairo_skia_context_clip, - _cairo_skia_context_clip_preserve, - _cairo_skia_context_in_clip, - _cairo_skia_context_clip_extents, - _cairo_skia_context_reset_clip, - _cairo_skia_context_copy_clip_rectangle_list, - - _cairo_skia_context_paint, - _cairo_skia_context_paint_with_alpha, - _cairo_skia_context_mask, - - _cairo_skia_context_stroke, - _cairo_skia_context_stroke_preserve, - _cairo_skia_context_in_stroke, - _cairo_skia_context_stroke_extents, - - _cairo_skia_context_fill, - _cairo_skia_context_fill_preserve, - _cairo_skia_context_in_fill, - _cairo_skia_context_fill_extents, - - _cairo_skia_context_set_font_face, - _cairo_skia_context_get_font_face, - _cairo_skia_context_set_font_size, - _cairo_skia_context_set_font_matrix, - _cairo_skia_context_get_font_matrix, - _cairo_skia_context_set_font_options, - _cairo_skia_context_get_font_options, - _cairo_skia_context_set_scaled_font, - _cairo_skia_context_get_scaled_font, - _cairo_skia_context_font_extents, - - _cairo_skia_context_glyphs, - _cairo_skia_context_glyph_path, - _cairo_skia_context_glyph_extents, - - _cairo_skia_context_copy_page, - _cairo_skia_context_show_page, -}; - -cairo_t * -_cairo_skia_context_create (void *target) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) target; - cairo_skia_context_t *cr; - - cr = (cairo_skia_context_t *) _freed_pool_get (&context_pool); - if (unlikely (cr == NULL)) { - cr = new cairo_skia_context_t; - if (unlikely (cr == NULL)) - return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - - cr->path = new SkPath; - cr->paint = new SkPaint; - } - - _cairo_init (&cr->base, &_cairo_skia_context_backend); - - cr->source = NULL; - cr->source_image = NULL; - - cr->paint->setStrokeWidth (SkFloatToScalar (2.0)); - - cr->target = (cairo_skia_surface_t *) cairo_surface_reference ((cairo_surface_t *) target); - cr->original = (cairo_skia_surface_t *) cairo_surface_reference ((cairo_surface_t *) target); - cr->canvas = new SkCanvas (*surface->bitmap); - cr->canvas->save (); - - cairo_matrix_init_identity (&cr->matrix); - - return &cr->base; -} - -#if 0 -void -_cairo_skia_context_set_SkPaint (cairo_t *cr, SkPaint paint) -{ - *cr->paint = paint; -} - -void -_cairo_skia_context_set_SkPath (cairo_t *cr, SkPath path) -{ - *cr->path = path; -} -#endif diff --git a/src/skia/cairo-skia-private.h b/src/skia/cairo-skia-private.h deleted file mode 100644 index f538b486b..000000000 --- a/src/skia/cairo-skia-private.h +++ /dev/null @@ -1,127 +0,0 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2005 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Red Hat, Inc. - * - * Contributor(s): - * Carl D. Worth - */ - -#ifndef CAIRO_SKIA_CONTEXT_PRIVATE_H -#define CAIRO_SKIA_CONTEXT_PRIVATE_H - -#include "cairo-private.h" -#include "cairo-image-surface-private.h" - -#include -#include -#include -#include - -/** - * cairo_skia_context_t: - * - * A #cairo_skia_context_t includes handles to Skia's canvas, - * paint, and path objects along with the Cairo source surfaces - * and matrix, and the original and target #cairo_skia_surface_t - * objects. - * - * Since: 1.10 - **/ -typedef struct _cairo_skia_context cairo_skia_context_t; - -/** - * cairo_skia_surface_t: - * - * A #cairo_skia_surface_t is a container for the underlying - * #SkBitmap and the corresponding Cairo image surface. - * - * Since: 1.10 - **/ -typedef struct _cairo_skia_surface cairo_skia_surface_t; - -struct _cairo_skia_context { - cairo_t base; - - cairo_skia_surface_t *original; - cairo_skia_surface_t *target; - - cairo_matrix_t matrix; - - SkCanvas *canvas; - SkPaint *paint; - SkPath *path; - - cairo_surface_t *source; - cairo_image_surface_t *source_image; - void *source_extra; -}; - -struct _cairo_skia_surface { - cairo_image_surface_t image; - - SkBitmap *bitmap; -}; - -static inline bool -format_to_sk_config (cairo_format_t format, - SkBitmap::Config& config, - bool& opaque) -{ - opaque = false; - - switch (format) { - case CAIRO_FORMAT_ARGB32: - config = SkBitmap::kARGB_8888_Config; - break; - case CAIRO_FORMAT_RGB24: - config = SkBitmap::kARGB_8888_Config; - opaque = true; - break; - case CAIRO_FORMAT_RGB16_565: - config = SkBitmap::kRGB_565_Config; - opaque = true; - break; - case CAIRO_FORMAT_A8: - config = SkBitmap::kA8_Config; - break; - case CAIRO_FORMAT_RGB30: - case CAIRO_FORMAT_INVALID: - case CAIRO_FORMAT_A1: - default: - return false; - } - - return true; -} - -cairo_private cairo_t * -_cairo_skia_context_create (void *target); - -#endif /* CAIRO_SKIA_CONTEXT_PRIVATE_H */ diff --git a/src/skia/cairo-skia-surface.cpp b/src/skia/cairo-skia-surface.cpp deleted file mode 100644 index a9b6086dd..000000000 --- a/src/skia/cairo-skia-surface.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2007 Mozilla Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Mozilla Corporation. - * - * Contributor(s): - * Vladimir Vukicevic - */ - -#include "cairoint.h" - -#include "cairo-skia.h" -#include "cairo-skia-private.h" - -#include "cairo-composite-rectangles-private.h" -#include "cairo-error-private.h" -#include "cairo-surface-backend-private.h" -#include "cairo-surface-fallback-private.h" - -static cairo_skia_surface_t * -_cairo_skia_surface_create_internal (SkBitmap::Config config, - bool opaque, - unsigned char *data, - int width, - int height, - int stride); - -static cairo_surface_t * -_cairo_skia_surface_create_similar (void *asurface, - cairo_content_t content, - int width, - int height) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - SkBitmap::Config config; - bool opaque; - - if (content == surface->image.base.content) - { - config = surface->bitmap->config (); - opaque = surface->bitmap->isOpaque (); - } - else if (! format_to_sk_config (_cairo_format_from_content (content), - config, opaque)) - { - return NULL; - } - - return &_cairo_skia_surface_create_internal (config, opaque, - NULL, - width, height, - 0)->image.base; -} - -static cairo_status_t -_cairo_skia_surface_finish (void *asurface) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - cairo_surface_finish (&surface->image.base); - delete surface->bitmap; - - return CAIRO_STATUS_SUCCESS; -} - -static cairo_image_surface_t * -_cairo_skia_surface_map_to_image (void *asurface, - const cairo_rectangle_int_t *extents) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - surface->bitmap->lockPixels (); - return _cairo_image_surface_map_to_image (&surface->image, extents); -} - -static cairo_int_status_t -_cairo_skia_surface_unmap_image (void *asurface, - cairo_image_surface_t *image) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - cairo_int_status_t status; - - status = _cairo_image_surface_unmap_image (&surface->image, image); - surface->bitmap->unlockPixels (); - - return status; -} - -static cairo_status_t -_cairo_skia_surface_acquire_source_image (void *asurface, - cairo_image_surface_t **image_out, - void **image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - surface->bitmap->lockPixels (); - - *image_out = &surface->image; - *image_extra = NULL; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_skia_surface_release_source_image (void *asurface, - cairo_image_surface_t *image, - void *image_extra) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - - surface->bitmap->unlockPixels (); -} - -static cairo_bool_t -_cairo_skia_surface_get_extents (void *asurface, - cairo_rectangle_int_t *extents) -{ - cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; - extents->x = extents->y = 0; - extents->width = surface->image.width; - extents->height = surface->image.height; - return TRUE; -} - -static void -_cairo_skia_surface_get_font_options (void *abstract_surface, - cairo_font_options_t *options) -{ - _cairo_font_options_init_default (options); - - cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); - _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_ON); -} - -static const struct _cairo_surface_backend -cairo_skia_surface_backend = { - CAIRO_SURFACE_TYPE_SKIA, - _cairo_skia_surface_finish, - - _cairo_skia_context_create, - - _cairo_skia_surface_create_similar, - NULL, //_cairo_skia_surface_create_similar_image, - _cairo_skia_surface_map_to_image, - _cairo_skia_surface_unmap_image, - - _cairo_surface_default_source, - _cairo_skia_surface_acquire_source_image, - _cairo_skia_surface_release_source_image, - NULL, /* snapshot */ - - NULL, /* copy_page */ - NULL, /* show_page */ - - _cairo_skia_surface_get_extents, - _cairo_skia_surface_get_font_options, - - NULL, /* flush */ - NULL, /* mark_dirty_rectangle */ - - /* XXX native surface functions? */ - _cairo_surface_fallback_paint, - _cairo_surface_fallback_mask, - _cairo_surface_fallback_stroke, - _cairo_surface_fallback_fill, - NULL, /* fill/stroke */ - _cairo_surface_fallback_glyphs -}; - -/* - * Surface constructors - */ - -static inline pixman_format_code_t -sk_config_to_pixman_format_code (SkBitmap::Config config, - bool opaque) -{ - switch (config) { - case SkBitmap::kARGB_8888_Config: - return opaque ? PIXMAN_x8r8g8b8 : PIXMAN_a8r8g8b8; - - case SkBitmap::kA8_Config: - return PIXMAN_a8; - case SkBitmap::kRGB_565_Config: - return PIXMAN_r5g6b5; - case SkBitmap::kARGB_4444_Config: - return PIXMAN_a4r4g4b4; - - case SkBitmap::kNo_Config: - case SkBitmap::kIndex8_Config: - default: - ASSERT_NOT_REACHED; - return (pixman_format_code_t) -1; - } -} - -static cairo_skia_surface_t * -_cairo_skia_surface_create_internal (SkBitmap::Config config, - bool opaque, - unsigned char *data, - int width, - int height, - int stride) -{ - cairo_skia_surface_t *surface; - pixman_image_t *pixman_image; - pixman_format_code_t pixman_format; - SkColorType colorType; - - surface = (cairo_skia_surface_t *) _cairo_malloc (sizeof (cairo_skia_surface_t)); - if (unlikely (surface == NULL)) - return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - - pixman_format = sk_config_to_pixman_format_code (config, opaque); - pixman_image = pixman_image_create_bits (pixman_format, - width, height, - (uint32_t *) data, stride); - if (unlikely (pixman_image == NULL)) { - free (surface); - return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); - } - - _cairo_surface_init (&surface->image.base, - &cairo_skia_surface_backend, - NULL, /* device */ - _cairo_content_from_pixman_format (pixman_format)); - - _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); - - surface->bitmap = new SkBitmap; - colorType = SkBitmapConfigToColorType(config); - surface->bitmap->setAlphaType (opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); - surface->bitmap->setInfo (SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType), surface->image.stride); - surface->bitmap->setPixels (surface->image.data); - - surface->image.base.is_clear = data == NULL; - - return surface; -} - -cairo_surface_t * -cairo_skia_surface_create (cairo_format_t format, - int width, - int height) -{ - SkBitmap::Config config; - bool opaque; - - if (! CAIRO_FORMAT_VALID (format) || - ! format_to_sk_config (format, config, opaque)) - { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - - return &_cairo_skia_surface_create_internal (config, opaque, NULL, width, height, 0)->image.base; -} - -cairo_surface_t * -cairo_skia_surface_create_for_data (unsigned char *data, - cairo_format_t format, - int width, - int height, - int stride) -{ - SkBitmap::Config config; - bool opaque; - - if (! CAIRO_FORMAT_VALID (format) || - ! format_to_sk_config (format, config, opaque)) - { - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); - } - - return &_cairo_skia_surface_create_internal (config, opaque, data, width, height, stride)->image.base; -} - -/*** - -Todo: - -*** Skia: - -- mask() - -*** Sk: - -High: -- antialiased clipping? - -Medium: -- implement clip path reset (to avoid restore/save) -- implement complex radial patterns (2 centers and 2 radii) - -Low: -- implement EXTEND_NONE - -***/ -- cgit v1.2.3