OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
Blending.c
Go to the documentation of this file.
1
8#include <Uefi.h>
9
10#include <Protocol/GraphicsOutput.h>
11
12#include <Library/DebugLib.h>
13
14#include "OpenCanopy.h"
15#include "Blending.h"
16
17#define PIXEL_TO_UINT32(Pixel) \
18 ((UINT32) SIGNATURE_32 ((Pixel)->Blue, (Pixel)->Green, (Pixel)->Red, (Pixel)->Reserved))
19
20#define RGB_ALPHA_BLEND(Back, Front, InvFrontOpacity) \
21 ((Front) + RGB_APPLY_OPACITY (InvFrontOpacity, Back))
22
23STATIC
24VOID
26 IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel,
27 IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel
28 )
29{
30 UINT8 InvFrontOpacity;
31
32 InvFrontOpacity = (0xFF - FrontPixel->Reserved);
33
34 BackPixel->Blue = RGB_ALPHA_BLEND (
35 BackPixel->Blue,
36 FrontPixel->Blue,
37 InvFrontOpacity
38 );
39 BackPixel->Green = RGB_ALPHA_BLEND (
40 BackPixel->Green,
41 FrontPixel->Green,
42 InvFrontOpacity
43 );
44 BackPixel->Red = RGB_ALPHA_BLEND (
45 BackPixel->Red,
46 FrontPixel->Red,
47 InvFrontOpacity
48 );
49
50 if (BackPixel->Reserved != 0xFF) {
51 BackPixel->Reserved = RGB_ALPHA_BLEND (
52 BackPixel->Reserved,
53 FrontPixel->Reserved,
54 InvFrontOpacity
55 );
56 }
57}
58
59VOID
61 IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel,
62 IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel,
63 IN UINT8 Opacity
64 )
65{
66 EFI_GRAPHICS_OUTPUT_BLT_PIXEL OpacFrontPixel;
67
68 //
69 // FIXME: Optimise with SIMD or such.
70 // qt_blend_argb32_on_argb32 in QT
71 //
72 ASSERT (BackPixel != NULL);
73 ASSERT (FrontPixel != NULL);
74 ASSERT (Opacity > 0);
75 ASSERT (Opacity < 0xFF);
76
77 if (FrontPixel->Reserved == 0) {
78 return;
79 }
80
81 if (FrontPixel->Reserved == 0xFF) {
82 OpacFrontPixel.Reserved = Opacity;
83 } else {
84 OpacFrontPixel.Reserved = RGB_APPLY_OPACITY (FrontPixel->Reserved, Opacity);
85 if (OpacFrontPixel.Reserved == 0) {
86 return;
87 }
88 }
89
90 OpacFrontPixel.Blue = RGB_APPLY_OPACITY (FrontPixel->Blue, Opacity);
91 OpacFrontPixel.Green = RGB_APPLY_OPACITY (FrontPixel->Green, Opacity);
92 OpacFrontPixel.Red = RGB_APPLY_OPACITY (FrontPixel->Red, Opacity);
93
94 InternalBlendPixel (BackPixel, &OpacFrontPixel);
95}
96
97VOID
99 IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel,
100 IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel
101 )
102{
103 //
104 // FIXME: Optimise with SIMD or such.
105 // qt_blend_argb32_on_argb32 in QT
106 //
107 ASSERT (BackPixel != NULL);
108 ASSERT (FrontPixel != NULL);
109
110 if (FrontPixel->Reserved == 0) {
111 return;
112 }
113
114 if (FrontPixel->Reserved == 0xFF) {
115 BackPixel->Blue = FrontPixel->Blue;
116 BackPixel->Green = FrontPixel->Green;
117 BackPixel->Red = FrontPixel->Red;
118 BackPixel->Reserved = FrontPixel->Reserved;
119 return;
120 }
121
122 InternalBlendPixel (BackPixel, FrontPixel);
123}
124
125VOID
127 IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel,
128 IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel,
129 IN UINT8 Opacity
130 )
131{
132 if (Opacity == 0xFF) {
133 GuiBlendPixelSolid (BackPixel, FrontPixel);
134 } else {
135 GuiBlendPixelOpaque (BackPixel, FrontPixel, Opacity);
136 }
137}
STATIC VOID InternalBlendPixel(IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel, IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel)
Definition Blending.c:25
VOID GuiBlendPixelSolid(IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel, IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel)
Definition Blending.c:98
VOID GuiBlendPixel(IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel, IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel, IN UINT8 Opacity)
Definition Blending.c:126
VOID GuiBlendPixelOpaque(IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackPixel, IN CONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FrontPixel, IN UINT8 Opacity)
Definition Blending.c:60
#define RGB_ALPHA_BLEND(Back, Front, InvFrontOpacity)
Definition Blending.c:20
#define RGB_APPLY_OPACITY(Rgba, Opacity)
Definition Blending.h:11
#define ASSERT(x)
Definition coder.h:55