diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-09-14 17:48:42 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-09-14 17:52:39 -0700 |
commit | 8d54ec8249add0942e5cc989d1cb1b4d9a9aba2e (patch) | |
tree | c342ee14c7aa79e7a5bcc531355eee64260ef522 /src/fb.c | |
parent | 7e999e37a5cf65e466091f4d8eeb36a6cea20f52 (diff) |
fb: implement a tiling fragmenter
Diffstat (limited to 'src/fb.c')
-rw-r--r-- | src/fb.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -342,3 +342,37 @@ int fb_fragment_divide_single(const fb_fragment_t *fragment, unsigned n_fragment return 1; } + + +int fb_fragment_tile_single(const fb_fragment_t *fragment, unsigned tile_size, unsigned num, fb_fragment_t *res_fragment) +{ + unsigned w = fragment->width / tile_size, h = fragment->height / tile_size; + unsigned pitch = (fragment->width * 4) + fragment->stride; + unsigned x, y, xoff, yoff; + + if (w * tile_size < fragment->width) + w++; + + if (h * tile_size < fragment->height) + h++; + + y = num / w; + if (y >= h) + return 0; + + x = num - (y * w); + + xoff = x * tile_size; + yoff = y * tile_size; + + res_fragment->buf = (void *)fragment->buf + (yoff * pitch) + (xoff * 4); + res_fragment->x = fragment->x + xoff; + res_fragment->y = fragment->y + yoff; + res_fragment->width = MIN(fragment->width - xoff, tile_size); + res_fragment->height = MIN(fragment->height - yoff, tile_size); + res_fragment->frame_width = fragment->frame_width; + res_fragment->frame_height = fragment->frame_height; + res_fragment->stride = fragment->stride + ((fragment->width - res_fragment->width) * 4); + + return 1; +} |