/*************************************************************************** * Copyright (c) 2024 Microsoft Corporation * * This program and the accompanying materials are made available under the * terms of the MIT License which is available at * https://opensource.org/licenses/MIT. * * SPDX-License-Identifier: MIT **************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** GUIX Component */ /** */ /** Display Management (Display) */ /** */ /**************************************************************************/ #define _COLOR_FORMAT_ 1555xrgb #define PIXEL_LOC USHORT #define REDVAL(_c) (GX_UBYTE)(((_c) >> 10) & 0x1f) #define GREENVAL(_c) (GX_UBYTE)(((_c) >> 5) & 0x1f) #define BLUEVAL(_c) (GX_UBYTE)(((_c)) & 0x1f) #define ASSEMBLECOLOR(_r, _g, _b) \ ((((_r) & 0x7c) << 10) | \ (((_g) & 0x3e) << 5) | \ (((_b) & 0x1f))) #define GX_SOURCE_CODE /* Include necessary system files. */ #include "gx_api.h" #include "gx_display.h" /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_1555xrgb_pixel_blend PORTABLE C */ /* 6.1 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ /* Pixel blend function for 1555xrgb color format. */ /* */ /* INPUT */ /* */ /* context Drawing context */ /* x X coordinate */ /* y Y coordinate */ /* color Color of line to write */ /* alpha Alpha value */ /* */ /* OUTPUT */ /* */ /* None */ /* */ /* CALLS */ /* */ /* REDVAL Extract the red component */ /* GREENVAL Extract the green component */ /* BLUEVAL Extract the blue component */ /* ASSEMBLECOLOR Assemble color components */ /* */ /* CALLED BY */ /* */ /* GUIX Internal Code */ /* */ /* RELEASE HISTORY */ /* */ /* DATE NAME DESCRIPTION */ /* */ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ /* */ /**************************************************************************/ VOID _gx_display_driver_1555xrgb_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha) { GX_UBYTE fred, fgreen, fblue; GX_UBYTE bred, bgreen, bblue; GX_UBYTE balpha; USHORT bcolor; USHORT *put; /* Is the pixel non-transparent? */ if (alpha > 0) { /* calculate address of pixel */ put = (USHORT *)context -> gx_draw_context_memory; put += context -> gx_draw_context_pitch * y; put += x; /* No need to blend if alpha value is 255. */ if (alpha == 255) { *put = (USHORT)fcolor; return; } /* split foreground into red, green, and blue components */ fred = REDVAL(fcolor); fgreen = GREENVAL(fcolor); fblue = BLUEVAL(fcolor); /* read background color */ bcolor = *put; /* split background color into red, green, and blue components */ bred = REDVAL(bcolor); bgreen = GREENVAL(bcolor); bblue = BLUEVAL(bcolor); /* background alpha is inverse of foreground alpha */ balpha = (GX_UBYTE)(256 - alpha); /* blend foreground and background, each color channel */ fred = (GX_UBYTE)(((bred * balpha) + (fred * alpha)) >> 8); fgreen = (GX_UBYTE)(((bgreen * balpha) + (fgreen * alpha)) >> 8); fblue = (GX_UBYTE)(((bblue * balpha) + (fblue * alpha)) >> 8); /* re-assemble into 16-bit color and write it out */ *put = (USHORT)ASSEMBLECOLOR(fred, fgreen, fblue); } }