summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-10-10 16:48:26 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-05-27 09:19:22 -0400
commit65e12699c209212352b3b8552d286abd5fc43f63 (patch)
treedf8a343789c9d58bccfea0f7dbfe48c047961d9d
parent2d881fad8e4f9d77a2068aa88243c003ce652860 (diff)
Add new deferred traps image
-rw-r--r--src/fimage.c9
-rw-r--r--src/fimage.h12
-rw-r--r--src/fragment.c45
3 files changed, 65 insertions, 1 deletions
diff --git a/src/fimage.c b/src/fimage.c
index 382925ba..ae4af9a8 100644
--- a/src/fimage.c
+++ b/src/fimage.c
@@ -129,6 +129,15 @@ fimage_new_traps (int width, int height, pixman_format_code_t format,
}
fimage_t *
+fimage_new_deferred (int width, int height,
+ resolve_trap_func_t resolve,
+ void *closure)
+{
+ return make_image (
+ fragment_new_deferred (width, height, resolve, closure));
+}
+
+fimage_t *
fimage_new_glyphs (int width, int height,
pixman_glyph_cache_t *cache,
int n_glyphs,
diff --git a/src/fimage.h b/src/fimage.h
index 9fd54a0d..8a5a19cf 100644
--- a/src/fimage.h
+++ b/src/fimage.h
@@ -3,6 +3,11 @@ typedef struct fragment_t fragment_t;
#define TRUE 1
#define FALSE 0
+typedef pixman_bool_t (* resolve_trap_func_t) (void *closure,
+ pixman_format_code_t *format,
+ int *n_traps,
+ pixman_trapezoid_t **traps);
+
fragment_t *fragment_new_blank (int width,
int height);
fragment_t *fragment_new_white (int width,
@@ -23,6 +28,10 @@ fragment_t *fragment_new_glyphs (int width,
fragment_t *fragment_new_image (int width,
int height,
pixman_image_t *image);
+fragment_t *fragment_new_deferred (int width,
+ int height,
+ resolve_trap_func_t resolve,
+ void * closure);
/* Does *not* take ownership of region */
fragment_t *fragment_new_region (pixman_region32_t *region);
fragment_t *fragment_copy (fragment_t *fragment);
@@ -66,6 +75,9 @@ fimage_t *fimage_new_glyphs (int width, int height,
fimage_t *fimage_new_traps (int width, int height,
pixman_format_code_t format,
int n_traps, pixman_trapezoid_t *traps);
+fimage_t *fimage_new_deferred (int width, int height,
+ resolve_trap_func_t resolve,
+ void *closure);
/* Takes ownership of the image */
fimage_t *fimage_new_image (int width, int height, pixman_image_t *image);
/* Makes a copy of the region; does not take ownership */
diff --git a/src/fragment.c b/src/fragment.c
index 978ea688..d746bea8 100644
--- a/src/fragment.c
+++ b/src/fragment.c
@@ -24,7 +24,8 @@ typedef enum
STATE_TRAPS,
STATE_GLYPHS,
STATE_IMAGE,
- STATE_COMPOSITE
+ STATE_COMPOSITE,
+ STATE_DEFERRED
} state_type_t;
typedef struct
@@ -55,6 +56,13 @@ typedef struct
pixman_image_t * image;
} state_image_t;
+typedef struct
+{
+ state_common_t common;
+ resolve_trap_func_t resolve;
+ void * closure;
+} state_deferred_t;
+
/* This state is interpreted as "copy @dest, then composite @source
* on top using @op as the operator".
*/
@@ -73,6 +81,7 @@ union state_t
state_glyphs_t glyphs;
state_image_t image;
state_composite_t composite;
+ state_deferred_t deferred;
};
struct fragment_t
@@ -112,6 +121,7 @@ state_unref (state_t *state)
{
case STATE_WHITE:
case STATE_BLANK:
+ case STATE_DEFERRED:
break;
case STATE_TRAPS:
free (state->traps.traps);
@@ -289,6 +299,22 @@ fragment_new_image (int width, int height,
}
fragment_t *
+fragment_new_deferred (int width,
+ int height,
+ resolve_trap_func_t resolve,
+ void *closure)
+{
+ fragment_t *fragment = fragment_alloc (width, height, STATE_DEFERRED);
+ if (fragment->broken)
+ return fragment;
+
+ fragment->state->deferred.resolve = resolve;
+ fragment->state->deferred.closure = closure;
+
+ return fragment;
+}
+
+fragment_t *
fragment_subtract (fragment_t *dest, fragment_t *other)
{
if (dest->broken || other->broken ||
@@ -467,6 +493,8 @@ state_apply (state_t *state, pixman_image_t *image,
pixman_glyph_t *glyphs;
int n_glyphs;
pixman_image_t *src, *mask;
+ pixman_trapezoid_t *traps;
+ int n_traps;
white_img = pixman_image_create_solid_fill (&white);
if (!white_img)
@@ -491,6 +519,17 @@ state_apply (state_t *state, pixman_image_t *image,
0, 0, 0, 0, state->traps.n_traps, state->traps.traps);
break;
+ case STATE_DEFERRED:
+ if (state->deferred.resolve (state->deferred.closure,
+ &mask_format,
+ &n_traps, &traps))
+ {
+ pixman_composite_trapezoids (
+ PIXMAN_OP_SRC, white_img, image, mask_format,
+ 0, 0, 0, 0, n_traps, traps);
+ }
+ break;
+
case STATE_GLYPHS:
glyph_cache = state->glyphs.cache;
n_glyphs = state->glyphs.n_glyphs;
@@ -620,6 +659,10 @@ print_state (state_t *state, int indent)
fprintf (stderr, "IMAGE (%p)\n", state->image.image);
break;
+ case STATE_DEFERRED:
+ fprintf (stderr, "DEFERRED\n");
+ break;
+
case STATE_COMPOSITE:
fprintf (stderr, "COMPOSITE op: %d\n", state->composite.op);
print_state (state->composite.source, indent + 1);