[cairo] [PATCH] skia: update the source to build with the latest skia
Bryce W. Harrington
b.harrington at samsung.com
Wed Jun 25 00:15:59 PDT 2014
LGTM, these changes only affect the skia backend (which currently is
completely broken to build for me without this patch), so I think this
is quite safe to apply to trunk. If no one has reservations, I can
merge this to trunk later this week.
Tested-by: Bryce Harrington <b.harrington at samsung.com>
Bryce
On Mon, Jun 23, 2014 at 02:14:36PM +0530, Ravi Nanjundappa wrote:
> This fixes several build related issues for the skia backend
> which is introduced due to skia source up-gradation.
>
> Signed-off-by: Ravi Nanjundappa <nravi.n at samsung.com>
> ---
> configure.ac | 12 ++++----
> src/skia/cairo-skia-context.cpp | 61 ++++++++++++++++++++++++++++++---------
> src/skia/cairo-skia-private.h | 4 +--
> src/skia/cairo-skia-surface.cpp | 9 ++----
> 4 files changed, 58 insertions(+), 28 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index fdcb2dc..04479ff 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -249,16 +249,16 @@ CAIRO_ENABLE_SURFACE_BACKEND(skia, Skia, no, [
> [directory to find compiled skia sources])],
> [skia_DIR="$withval"],
> [skia_DIR="`pwd`/../skia"])
> - AC_ARG_WITH([skia-bulid],
> - [AS_HELP_STRING([--with-skia-build=(Release|Debug)]
> + AC_ARG_WITH([skia-build-type],
> + [AS_HELP_STRING([--with-skia-build-type=(Release|Debug)]
> [build of skia to link with, default is Release])],
> - [skia_BUILD="$withval"],
> - [skia_BUILD="Release"])
> + [skia_BUILD_TYPE="$withval"],
> + [skia_BUILD_TYPE="Release"])
> skia_NONPKGCONFIG_CFLAGS="-I$skia_DIR/include/config -I$skia_DIR/include/core -I$skia_DIR/include/effects"
> - if test "x$skia_BUILD" = x"Release"; then
> + if test "x$skia_BUILD_TYPE" = "xRelease"; then
> skia_NONPKGCONFIG_CFLAGS="-DSK_RELEASE -DSK_CAN_USE_FLOAT $skia_NONPKGCONFIG_CFLAGS"
> fi
> - skia_NONPKGCONFIG_LIBS="--start-group $skia_DIR/out/$skia_BUILD/obj.target/gyp/libeffects.a $skia_DIR/out/$skia_BUILD/obj.target/gyp/libimages.a $skia_DIR/out/$skia_BUILD/obj.target/gyp/libutils.a $skia_DIR/out/$skia_BUILD/obj.target/gyp/libopts.a $skia_DIR/out/$skia_BUILD/obj.target/gyp/libcore.a -end-group"
> + skia_NONPKGCONFIG_LIBS="-L$skia_DIR/out/$skia_BUILD_TYPE/lib.target/ -lskia -lstdc++"
> AC_SUBST(skia_DIR)
> ])
>
> diff --git a/src/skia/cairo-skia-context.cpp b/src/skia/cairo-skia-context.cpp
> index bbe5507..c2d9fba 100644
> --- a/src/skia/cairo-skia-context.cpp
> +++ b/src/skia/cairo-skia-context.cpp
> @@ -53,6 +53,7 @@
> #include "cairo-skia-private.h"
> #include "cairo-surface-backend-private.h"
>
> +#include <SkPaint.h>
> #include <SkShader.h>
> #include <SkColorShader.h>
> #include <SkGradientShader.h>
> @@ -236,14 +237,15 @@ 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.setConfig (config, img->width, img->height, img->stride);
> - bitmap.setIsOpaque (opaque);
> + colorType = SkBitmapConfigToColorType(config);
> + bitmap.setInfo (SkImageInfo::Make(img->width, img->height, colorType, kPremul_SkAlphaType), img->stride);
> bitmap.setPixels (img->data);
>
> return true;
> @@ -330,9 +332,18 @@ source_to_sk_shader (cairo_skia_context_t *cr,
> if (surface->type == CAIRO_SURFACE_TYPE_SKIA) {
> cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface;
>
> - shader = SkShader::CreateBitmapShader (*esurf->bitmap,
> + 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;
>
> @@ -351,9 +362,18 @@ source_to_sk_shader (cairo_skia_context_t *cr,
> if (unlikely (! surface_to_sk_bitmap (surface, bitmap)))
> return NULL;
>
> - shader = SkShader::CreateBitmapShader (bitmap,
> - extend_to_sk (pattern->extend),
> - extend_to_sk (pattern->extend));
> + 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 */)
> @@ -382,8 +402,17 @@ source_to_sk_shader (cairo_skia_context_t *cr,
> SkFloatToScalar (linear->pd1.y));
> points[1].set (SkFloatToScalar (linear->pd2.x),
> SkFloatToScalar (linear->pd2.y));
> - shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops,
> +
> + 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
> }
> @@ -394,8 +423,8 @@ source_to_sk_shader (cairo_skia_context_t *cr,
> }
> }
>
> - if (shader && ! _cairo_matrix_is_identity (&pattern->matrix))
> - shader->setLocalMatrix (matrix_inverse_to_sk (pattern->matrix));
> + //if (shader && ! _cairo_matrix_is_identity (&pattern->matrix))
> + //shader->setLocalMatrix (matrix_inverse_to_sk (pattern->matrix));
>
> return shader;
> }
> @@ -446,6 +475,7 @@ _cairo_skia_context_set_source (void *abstract_cr,
> cr->paint->setColor (color);
> } else {
> SkShader *shader = source_to_sk_shader (cr, source);
> + SkPaint::FilterLevel fLevel = (SkPaint::FilterLevel) pattern_filter_to_sk (source);
> if (shader == NULL) {
> UNSUPPORTED;
> return CAIRO_STATUS_SUCCESS;
> @@ -454,7 +484,9 @@ _cairo_skia_context_set_source (void *abstract_cr,
> cr->paint->setShader (shader);
> shader->unref ();
>
> - cr->paint->setFilterBitmap (pattern_filter_to_sk (source));
> + cr->paint->setFilterLevel(fLevel ?
> + (SkPaint::kLow_FilterLevel) :
> + (SkPaint::kNone_FilterLevel));
> }
>
> /* XXX change notification */
> @@ -496,7 +528,10 @@ _cairo_skia_context_set_source_surface (void *abstract_cr,
> cr->paint->setShader (shader);
> shader->unref ();
>
> - cr->paint->setFilterBitmap (true);
> + cr->paint->setFilterLevel(true ?
> + (SkPaint::kLow_FilterLevel) :
> + (SkPaint::kNone_FilterLevel));
> +
>
> return CAIRO_STATUS_SUCCESS;
> }
> @@ -682,7 +717,7 @@ _cairo_skia_context_set_dash (void *abstract_cr,
> intervals[i++] = SkFloatToScalar (dashes[j]);
> } while (loop--);
>
> - SkDashPathEffect *dash = new SkDashPathEffect (intervals, num_dashes, SkFloatToScalar (offset));
> + SkDashPathEffect *dash = SkDashPathEffect::Create (intervals, num_dashes, SkFloatToScalar (offset));
>
> cr->paint->setPathEffect (dash);
> dash->unref ();
> @@ -1264,7 +1299,7 @@ _cairo_skia_context_paint_with_alpha (void *abstract_cr,
> if (CAIRO_ALPHA_IS_OPAQUE (alpha))
> return _cairo_skia_context_paint (cr);
>
> - cr->paint->setAlpha(SkScalarRound(255*alpha));
> + cr->paint->setAlpha(SkScalarRoundToInt(255*alpha));
> status = _cairo_skia_context_paint (cr);
> cr->paint->setAlpha(255);
>
> diff --git a/src/skia/cairo-skia-private.h b/src/skia/cairo-skia-private.h
> index de3897b..f538b48 100644
> --- a/src/skia/cairo-skia-private.h
> +++ b/src/skia/cairo-skia-private.h
> @@ -111,11 +111,9 @@ format_to_sk_config (cairo_format_t format,
> case CAIRO_FORMAT_A8:
> config = SkBitmap::kA8_Config;
> break;
> - case CAIRO_FORMAT_A1:
> - config = SkBitmap::kA1_Config;
> - break;
> case CAIRO_FORMAT_RGB30:
> case CAIRO_FORMAT_INVALID:
> + case CAIRO_FORMAT_A1:
> default:
> return false;
> }
> diff --git a/src/skia/cairo-skia-surface.cpp b/src/skia/cairo-skia-surface.cpp
> index bb785e1..682f3db 100644
> --- a/src/skia/cairo-skia-surface.cpp
> +++ b/src/skia/cairo-skia-surface.cpp
> @@ -207,9 +207,6 @@ sk_config_to_pixman_format_code (SkBitmap::Config config,
>
> case SkBitmap::kA8_Config:
> return PIXMAN_a8;
> -
> - case SkBitmap::kA1_Config:
> - return PIXMAN_a1;
> case SkBitmap::kRGB_565_Config:
> return PIXMAN_r5g6b5;
> case SkBitmap::kARGB_4444_Config:
> @@ -217,7 +214,6 @@ sk_config_to_pixman_format_code (SkBitmap::Config config,
>
> case SkBitmap::kNo_Config:
> case SkBitmap::kIndex8_Config:
> - case SkBitmap::kRLE_Index8_Config:
> case SkBitmap::kConfigCount:
> default:
> ASSERT_NOT_REACHED;
> @@ -236,6 +232,7 @@ _cairo_skia_surface_create_internal (SkBitmap::Config config,
> cairo_skia_surface_t *surface;
> pixman_image_t *pixman_image;
> pixman_format_code_t pixman_format;
> + SkColorType colorType;
>
> surface = (cairo_skia_surface_t *) malloc (sizeof (cairo_skia_surface_t));
> if (unlikely (surface == NULL))
> @@ -256,8 +253,8 @@ _cairo_skia_surface_create_internal (SkBitmap::Config config,
> _cairo_image_surface_init (&surface->image, pixman_image, pixman_format);
>
> surface->bitmap = new SkBitmap;
> - surface->bitmap->setConfig (config, width, height, surface->image.stride);
> - surface->bitmap->setIsOpaque (opaque);
> + colorType = SkBitmapConfigToColorType(config);
> + 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;
> --
> 1.7.9.5
>
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
More information about the cairo
mailing list