From: TangoCash Date: Sat, 4 Jun 2016 18:22:11 +0000 (+0200) Subject: rework centering images X-Git-Url: https://git.webhop.me/?a=commitdiff_plain;h=f4268702773ab018037b8773dfb086403a1e48b3;p=lcd4linux.git rework centering images --- diff --git a/drv_generic_graphic.c b/drv_generic_graphic.c index c56d032..2fc7cee 100644 --- a/drv_generic_graphic.c +++ b/drv_generic_graphic.c @@ -631,35 +631,15 @@ int drv_generic_graphic_image_draw(WIDGET * W) int center = P2N(&Image->center); if (center) { - int area_height = (Image->oldheight > Image->height) ? Image->oldheight : Image->height; - if (center > area_height) - area_height = center; - // set layout framebuffer to a fixed size - drv_generic_graphic_resizeFB(row + area_height, LCOLS); - // flush area - drv_generic_graphic_blit(row, 0, area_height, LCOLS); - // fill it black or transparent - for (y = 0; y < area_height; y++) - { - for (x = 0; x < LCOLS; x++) - { - int i = (row + y ) * LCOLS + LCOLS + x; - drv_generic_graphic_FB[layer][i] = (Driver == "SamsungSPF") ? BG_COL : NO_COL; - } - } - // align image in the area if (width < LCOLS) col = (LCOLS / 2) - (width / 2); else col = 1; - row += (area_height - height) / 2; - } - else - { - /* maybe grow layout framebuffer */ - drv_generic_graphic_resizeFB(row + height, col + width); } + /* maybe grow layout framebuffer */ + drv_generic_graphic_resizeFB(row + height, col + width); + /* render image */ visible = P2N(&Image->visible); for (y = 0; y < height; y++) diff --git a/widget_image.c b/widget_image.c index 8b1b532..2f374f7 100644 --- a/widget_image.c +++ b/widget_image.c @@ -63,6 +63,7 @@ #include "widget.h" #include "widget_image.h" #include "rgb.h" +#include "drv_generic.h" #ifdef WITH_DMALLOC #include @@ -74,7 +75,7 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image) int x, y; int inverted; gdImagePtr gdImage; - int scale,_width,_height; + int scale,_width,_height, center; /* clear bitmap */ if (Image->bitmap) @@ -130,6 +131,7 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image) _width = P2N(&Image->_width); _height = P2N(&Image->_height); scale = P2N(&Image->scale); + center = P2N(&Image->center); if (((_width > 0) || (_height > 0)) && (scale == 100)) { @@ -183,6 +185,23 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image) Image->gdImage = scaled_image; } + if (center) + { + gdImage = Image->gdImage; + gdImagePtr center_image; + int ox = gdImageSX(gdImage); + int oy = gdImageSY(gdImage); + int cx = (DCOLS/2) - (ox/2); + int cy = (oy < Image->oldheight) ? Image->oldheight : oy; + center_image = gdImageCreateTrueColor(DCOLS,cy); + gdImageSaveAlpha(center_image, 1); + gdImageFill(center_image, 0, 0, gdImageColorAllocateAlpha(center_image, 0, 0, 0, 127)); + gdImageCopyResized(center_image,Image->gdImage,cx,0,0,0,ox,oy,ox,oy); + gdImageDestroy(Image->gdImage); + Image->gdImage = center_image; + } + + /* maybe resize bitmap */ gdImage = Image->gdImage; if (gdImage->sx > Image->width || P2N(&Image->center))