summaryrefslogtreecommitdiff
path: root/src/cairo-skia-surface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-skia-surface.cpp')
-rw-r--r--[-rwxr-xr-x]src/cairo-skia-surface.cpp49
1 files changed, 38 insertions, 11 deletions
diff --git a/src/cairo-skia-surface.cpp b/src/cairo-skia-surface.cpp
index bf6b14a5e..0282c2b51 100755..100644
--- a/src/cairo-skia-surface.cpp
+++ b/src/cairo-skia-surface.cpp
@@ -51,6 +51,27 @@
#include <SkGradientShader.h>
#include <SkDashPathEffect.h>
+/**
+ * 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)
@@ -64,13 +85,20 @@
# define CAIRO_INT_STATUS_SUCCESS ((cairo_int_status_t) CAIRO_STATUS_SUCCESS)
#endif
-#define CAIRO_MAYBE_UNSUPPORTED CAIRO_INT_STATUS_UNSUPPORTED
-//#define CAIRO_MAYBE_UNSUPPORTED _skia_unsupported ()
+#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
-static cairo_int_status_t _skia_unsupported () {
- printf ("unsupported!\n");
- return CAIRO_INT_STATUS_UNSUPPORTED;
-}
typedef struct cairo_skia_surface {
cairo_surface_t base;
@@ -542,8 +570,7 @@ _cairo_skia_surface_create_similar (void *asurface,
if (! format_to_sk_config (_cairo_format_from_content (content),
config, opaque))
{
- _skia_unsupported ();
- return NULL;
+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
}
return &_cairo_skia_surface_create_internal (config, opaque,
@@ -781,7 +808,7 @@ _cairo_skia_surface_paint (void *asurface,
shader = pattern_to_sk_shader (surface, source, &image, &image_extra);
if (!bitmap && !shader)
- return CAIRO_MAYBE_UNSUPPORTED;
+ return UNSUPPORTED("pattern to bitmap and shader conversion");
SkPaint paint;
paint.setFilterBitmap (pattern_filter_to_sk (source));
@@ -838,7 +865,7 @@ _cairo_skia_surface_stroke (void *asurface,
SkShader *shader = pattern_to_sk_shader (surface,
source, &image, &image_extra);
if (shader == NULL)
- return CAIRO_MAYBE_UNSUPPORTED;
+ return UNSUPPORTED("pattern to shader conversion");
paint.setShader (shader);
shader->unref ();
@@ -941,7 +968,7 @@ _cairo_skia_surface_fill (void *asurface,
SkShader *shader = pattern_to_sk_shader (surface,
source, &image, &image_extra);
if (shader == NULL)
- return CAIRO_MAYBE_UNSUPPORTED;
+ return UNSUPPORTED("pattern to shader conversion");
paint.setShader (shader);
shader->unref ();