diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-10-10 16:48:26 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-05-27 09:19:22 -0400 |
commit | 65e12699c209212352b3b8552d286abd5fc43f63 (patch) | |
tree | df8a343789c9d58bccfea0f7dbfe48c047961d9d | |
parent | 2d881fad8e4f9d77a2068aa88243c003ce652860 (diff) |
Add new deferred traps image
-rw-r--r-- | src/fimage.c | 9 | ||||
-rw-r--r-- | src/fimage.h | 12 | ||||
-rw-r--r-- | src/fragment.c | 45 |
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); |