digiKam
Loading...
Searching...
No Matches
dcolorblend.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2006-03-01
7 * Description : DColor methods for blending
8 * Integer arithmetic inspired by DirectFB,
9 * src/gfx/generic/generic.c and src/display/idirectfbsurface.c
10 *
11 * SPDX-FileCopyrightText: 2006-2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
12 * SPDX-FileCopyrightText: 2000-2002 by convergence integrated media GmbH <curanz@convergence.de>
13 * SPDX-FileCopyrightText: 2002-2005 by Denis Oliver Kropp <dok at directfb dot org>
14 * SPDX-FileCopyrightText: 2002-2005 by Andreas Hundt <andi at fischlustig dot de>
15 * SPDX-FileCopyrightText: 2002-2005 by Sven Neumann <neo at directfb dot org>
16 * SPDX-FileCopyrightText: 2002-2005 by Ville Syrj <syrjala at sci dot fi>
17 * SPDX-FileCopyrightText: 2002-2005 by Claudio Ciccani <klan at users dot sf dot net>
18 *
19 * SPDX-License-Identifier: GPL-2.0-or-later
20 *
21 * ============================================================ */
22
23#pragma once
24
25namespace Digikam
26{
27
29{
30 if (sixteenBit())
31 {
33 }
34 else
35 {
37 }
38}
39
40inline void DColor::demultiply()
41{
42 if (sixteenBit())
43 {
46 }
47 else
48 {
51 }
52}
53
54inline void DColor::blendZero()
55{
56 setAlpha(0);
57 setRed(0);
58 setGreen(0);
59 setBlue(0);
60}
61
62inline void DColor::blendAlpha16(int alphaValue)
63{
64 uint Sa = alphaValue + 1;
65
66 setRed ((Sa * (uint)red()) >> 16);
67 setGreen((Sa * (uint)green()) >> 16);
68 setBlue ((Sa * (uint)blue()) >> 16);
69 setAlpha((Sa * (uint)alpha()) >> 16);
70}
71
72inline void DColor::blendAlpha8(int alphaValue)
73{
74 uint Sa = alphaValue + 1;
75
76 setRed ((Sa * red()) >> 8);
77 setGreen((Sa * green()) >> 8);
78 setBlue ((Sa * blue()) >> 8);
79 setAlpha((Sa * alpha()) >> 8);
80}
81
82inline void DColor::blendInvAlpha16(int alphaValue)
83{
84 uint Sa = 65536 - alphaValue;
85
86 setRed ((Sa * (uint)red()) >> 16);
87 setGreen((Sa * (uint)green()) >> 16);
88 setBlue ((Sa * (uint)blue()) >> 16);
89 setAlpha((Sa * (uint)alpha()) >> 16);
90}
91
92inline void DColor::blendInvAlpha8(int alphaValue)
93{
94 uint Sa = 256 - alphaValue;
95
96 setRed ((Sa * red()) >> 8);
97 setGreen((Sa * green()) >> 8);
98 setBlue ((Sa * blue()) >> 8);
99 setAlpha((Sa * alpha()) >> 8);
100}
101
102inline void DColor::premultiply16(int alphaValue)
103{
104 uint Da = alphaValue + 1;
105
106 setRed ((Da * (uint)red()) >> 16);
107 setGreen((Da * (uint)green()) >> 16);
108 setBlue ((Da * (uint)blue()) >> 16);
109}
110
111inline void DColor::premultiply8(int alphaValue)
112{
113 uint Da = alphaValue + 1;
114
115 setRed ((Da * red()) >> 8);
116 setGreen((Da * green()) >> 8);
117 setBlue ((Da * blue()) >> 8);
118}
119
120inline void DColor::demultiply16(int alphaValue)
121{
122 uint Da = alphaValue + 1;
123
124 setRed (((uint)red() << 16) / Da);
125 setGreen(((uint)green() << 16) / Da);
126 setBlue (((uint)blue() << 16) / Da);
127}
128
129inline void DColor::demultiply8(int alphaValue)
130{
131 uint Da = alphaValue + 1;
132
133 setRed ((red() << 8) / Da);
134 setGreen((green() << 8) / Da);
135 setBlue ((blue() << 8) / Da);
136}
137
138inline void DColor::blendAdd(const DColor& src)
139{
140 setRed (red() + src.red());
141 setGreen(green() + src.green());
142 setBlue (blue() + src.blue());
143 setAlpha(alpha() + src.alpha());
144}
145
147{
148 if (0xFFFF0000 & red())
149 {
150 setRed(65535);
151 }
152
153 if (0xFFFF0000 & green())
154 {
155 setGreen(65535);
156 }
157
158 if (0xFFFF0000 & blue())
159 {
160 setBlue(65535);
161 }
162
163 if (0xFFFF0000 & alpha())
164 {
165 setAlpha(65535);
166 }
167}
168
170{
171 if (0xFFFFFF00 & red())
172 {
173 setRed(255);
174 }
175
176 if (0xFFFFFF00 & green())
177 {
178 setGreen(255);
179 }
180
181 if (0xFFFFFF00 & blue())
182 {
183 setBlue(255);
184 }
185
186 if (0xFFFFFF00 & alpha())
187 {
188 setAlpha(255);
189 }
190}
191
192inline void DColor::multiply(float factor)
193{
194 setRed (lround(red() * factor));
195 setGreen(lround(green() * factor));
196 setBlue (lround(blue() * factor));
197 setAlpha(lround(alpha() * factor));
198}
199
200} // namespace Digikam
Definition dcolor.h:33
void demultiply16(int alpha)
Definition dcolorblend.h:120
int green() const
Definition dcolor.h:89
void setGreen(int green)
Definition dcolor.h:114
void setAlpha(int alpha)
Definition dcolor.h:124
void setRed(int red)
Definition dcolor.h:109
void premultiply16(int alpha)
Definition dcolorblend.h:102
void blendClamp8()
Definition dcolorblend.h:169
bool sixteenBit() const
Definition dcolor.h:104
void demultiply8(int alpha)
Definition dcolorblend.h:129
void blendInvAlpha8(int alpha)
Definition dcolorblend.h:92
void setBlue(int blue)
Definition dcolor.h:119
void blendAdd(const DColor &src)
Definition dcolorblend.h:138
void blendZero()
Definition dcolorblend.h:54
void blendInvAlpha16(int alpha)
Definition dcolorblend.h:82
void blendAlpha8(int alpha)
Definition dcolorblend.h:72
void demultiply()
Definition dcolorblend.h:40
int alpha() const
Definition dcolor.h:99
void blendAlpha16(int alpha)
Definition dcolorblend.h:62
void premultiply()
Definition dcolorblend.h:28
void multiply(float factor)
Definition dcolorblend.h:192
void blendClamp16()
Definition dcolorblend.h:146
void premultiply8(int alpha)
Definition dcolorblend.h:111
int blue() const
Definition dcolor.h:94
int red() const
Definition dcolor.h:84
Definition datefolderview.cpp:34