diff --git a/libraries/pico_graphics/pico_graphics_pen_rgb888.cpp b/libraries/pico_graphics/pico_graphics_pen_rgb888.cpp index 642557a46..ebfc707ff 100644 --- a/libraries/pico_graphics/pico_graphics_pen_rgb888.cpp +++ b/libraries/pico_graphics/pico_graphics_pen_rgb888.cpp @@ -38,19 +38,35 @@ namespace pimoroni { } bool PicoGraphics_PenRGB888::render_tile(const Tile *tile) { for(int y = 0; y < tile->h; y++) { - uint8_t *palpha = &tile->data[(y * tile->stride)]; - uint32_t *pdest = &((uint32_t *)frame_buffer)[tile->x + ((tile->y + y) * bounds.w)]; + uint8_t *p_alpha = &tile->data[(y * tile->stride)]; + uint32_t *p_dest = &((uint32_t *)frame_buffer)[tile->x + ((tile->y + y) * bounds.w)]; for(int x = 0; x < tile->w; x++) { - uint8_t alpha = *palpha; + uint16_t dest = *p_dest; + uint8_t alpha = *p_alpha; // TODO: Alpha blending - if(alpha == 0) { + if(alpha == 255) { + *p_dest = color; + }else if(alpha == 0) { } else { - *pdest = color; + // blend tha pixel + uint32_t sr = (color >> 16) & 0xff; + uint32_t sg = (color >> 8) & 0xff; + uint32_t sb = (color >> 0) & 0xff; + + uint32_t dr = (dest >> 16) & 0xff; + uint32_t dg = (dest >> 8) & 0xff; + uint32_t db = (dest >> 0) & 0xff; + + uint8_t r = ((sr * alpha) + (dr * (255 - alpha))) >> 8; + uint8_t g = ((sg * alpha) + (dg * (255 - alpha))) >> 8; + uint8_t b = ((sb * alpha) + (db * (255 - alpha))) >> 8; + + *p_dest = (r << 16) | (g << 8) | b; } - pdest++; - palpha++; + p_dest++; + p_alpha++; } }