diff options
Diffstat (limited to 'src/til_fb.c')
-rw-r--r-- | src/til_fb.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/src/til_fb.c b/src/til_fb.c index 99bf4d3..536a6f2 100644 --- a/src/til_fb.c +++ b/src/til_fb.c @@ -575,11 +575,38 @@ int til_fb_fragment_slice_single(const til_fb_fragment_t *fragment, unsigned n_f unsigned slice = fragment->height / n_fragments; unsigned yoff = slice * number; + assert(fragment); + assert(res_fragment); + if (yoff >= fragment->height) return 0; + if (fragment->texture) { + assert(res_fragment->texture); + assert(fragment->frame_width == fragment->texture->frame_width); + assert(fragment->frame_height == fragment->texture->frame_height); + assert(fragment->width == fragment->texture->width); + assert(fragment->height == fragment->texture->height); + assert(fragment->x == fragment->texture->x); + assert(fragment->y == fragment->texture->y); + + *(res_fragment->texture) = (til_fb_fragment_t){ + .buf = fragment->texture->buf + yoff * fragment->texture->pitch, + .x = fragment->x, + .y = yoff, + .width = fragment->width, + .height = MIN(fragment->height - yoff, slice), + .frame_width = fragment->frame_width, + .frame_height = fragment->frame_height, + .stride = fragment->texture->stride, + .pitch = fragment->texture->pitch, + .cleared = fragment->texture->cleared, + }; + + } + *res_fragment = (til_fb_fragment_t){ - .texture = fragment->texture, + .texture = fragment->texture ? res_fragment->texture : NULL, .buf = fragment->buf + yoff * fragment->pitch, .x = fragment->x, .y = yoff, @@ -602,6 +629,9 @@ int til_fb_fragment_tile_single(const til_fb_fragment_t *fragment, unsigned tile unsigned w = fragment->width / tile_size, h = fragment->height / tile_size; unsigned x, y, xoff, yoff; + assert(fragment); + assert(res_fragment); + if (w * tile_size < fragment->width) w++; @@ -617,8 +647,32 @@ int til_fb_fragment_tile_single(const til_fb_fragment_t *fragment, unsigned tile xoff = x * tile_size; yoff = y * tile_size; + if (fragment->texture) { + assert(res_fragment->texture); + assert(fragment->frame_width == fragment->texture->frame_width); + assert(fragment->frame_height == fragment->texture->frame_height); + assert(fragment->width == fragment->texture->width); + assert(fragment->height == fragment->texture->height); + assert(fragment->x == fragment->texture->x); + assert(fragment->y == fragment->texture->y); + + *(res_fragment->texture) = (til_fb_fragment_t){ + .buf = fragment->texture->buf + (yoff * fragment->texture->pitch) + (xoff), + .x = fragment->x + xoff, + .y = fragment->y + yoff, + .width = MIN(fragment->width - xoff, tile_size), + .height = MIN(fragment->height - yoff, tile_size), + .frame_width = fragment->frame_width, + .frame_height = fragment->frame_height, + .stride = fragment->texture->stride + (fragment->width - MIN(fragment->width - xoff, tile_size)), + .pitch = fragment->texture->pitch, + .cleared = fragment->texture->cleared, + }; + + } + *res_fragment = (til_fb_fragment_t){ - .texture = fragment->texture, + .texture = fragment->texture ? res_fragment->texture : NULL, .buf = fragment->buf + (yoff * fragment->pitch) + (xoff), .x = fragment->x + xoff, .y = fragment->y + yoff, |