Re: [PATCH] skia: update the source to build with the latest skia

"Bryce W. Harrington" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
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 <[email protected]>

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 <[email protected]>
> ---
>  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
> [email protected]
> http://lists.cairographics.org/mailman/listinfo/cairo
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.