static int png_renderer(struct screen *sc, struct surface *s, struct image *img) { void *buf; int width = s->width; int height = s->height; int startx = s->x; int starty = s->y; if (s->width < 0) width = img->width; if (s->height < 0) height = img->height; if (startx < 0) { startx = (sc->s.width - width) / 2; if (startx < 0) startx = 0; } if (starty < 0) { starty = (sc->s.height - height) / 2; if (starty < 0) starty = 0; } width = min(width, sc->s.width - startx); height = min(height, sc->s.height - starty); buf = gui_screen_render_buffer(sc); gu_rgba_blend(sc->info, img, buf, height, width, startx, starty, true); return img->height; }
static void cls(struct fbc_priv *priv) { void *buf = gui_screen_render_buffer(priv->sc); memset(buf, 0, priv->fb->line_length * priv->fb->yres); gu_screen_blit(priv->sc); }
static void fbtest_pattern_geometry(struct screen *sc, u32 color) { int i; const u8 r = (color >> 16) & 0xff; const u8 g = (color >> 8) & 0xff; const u8 b = (color >> 0) & 0xff; const u32 xres = sc->info->xres; const u32 yres = sc->info->yres; const u8 xcount = xres / gcd(xres, yres); const u8 ycount = yres / gcd(xres, yres); const struct { int x1, y1, x2, y2; } borders[] = { { 0, 0, xres - 1, 0 }, { xres - 1, 0, xres - 1, yres - 1 }, { 0, yres - 1, xres - 1, yres - 1 }, { 0, 0, 0, yres - 1 }, }; const int R1 = min(xres, yres) / 2; const int h = xres * xres + yres * yres; const int R2 = (int_sqrt(h) / 2 - R1) * 5 / 12; const struct { int x0, y0, radius; } circles[] = { { xres / 2, yres / 2, R1 - 1 }, { R2, R2, R2 - 1 }, { xres - R2, R2, R2 - 1 }, { xres - R2, yres - R2, R2 - 1 }, { R2, yres - R2, R2 - 1 } }; void *buf = gui_screen_render_buffer(sc); gu_memset_pixel(sc->info, buf, ~color, sc->s.width * sc->s.height); for (i = 0; i < ARRAY_SIZE(borders); i++) gu_draw_line(sc, borders[i].x1, borders[i].y1, borders[i].x2, borders[i].y2, r, g, b, 0xff, 10); for (i = 0; i < ARRAY_SIZE(circles); i++) gu_draw_circle(sc, circles[i].x0, circles[i].y0, circles[i].radius, r, g, b, 0xff); for (i = 1; i < ycount; i++) { const int y = (yres - 1) * i / ycount; gu_draw_line(sc, 0, y, xres - 1, y, r, g, b, 0xff, 0); } for (i = 1; i < xcount; i++) { const int x = (xres - 1) * i / xcount; gu_draw_line(sc, x, 0, x, yres - 1, r, g, b, 0xff, 0); } }