App
Blender_blend_macro.hpp
Go to the documentation of this file.
1 
19 //*********************************************************************************************//
20 //*********************************************************************************************//
21 //*********************************************************************************************//
22 //****************************** OBECNÁ MAKRA *****************************************//
23 //*********************************************************************************************//
24 //*********************************************************************************************//
25 //*********************************************************************************************//
26 
31 #define INIT_ALPHAS_SD(S,D) INIT_ALPHAS_CUSTOM(*(S+3) / 255.0, *(D+3) / 255.0)
32 
38 #define INIT_ALPHAS_SDA(S,D,A) INIT_ALPHAS_CUSTOM(*(S+3) * A / 255.0, *(D+3) / 255.0)
39 
45 #define INIT_ALPHAS_SDM(S,D,M) INIT_ALPHAS_CUSTOM(*(S+3) * *M / 65025.0, *(D+3) / 255.0) M++;
46 
53 #define INIT_ALPHAS_SDMA(S,D,M,A) INIT_ALPHAS_CUSTOM(*(S+3) * *M * A / 65025.0, *(D+3) / 255.0) M++;
54 
58 #define INIT_ALPHAS_CUSTOM(SA,DA) double sa = SA; double da = DA; double sac = 1 - sa; double ra = sa + da * sac;
59 
63 #define WRITE_ALPHA(S,D,RA) *D = RA * 255 + 0.5; S++; D++;
64 
73 #define BLEND(SV,SA,DV,DA,SAC,RA) BLEND_ALPHA_ASSOCIATIVE(SV, SA, DV, DA, SAC, RA)
74 
78 #define BLEND_ALPHA_ASSOCIATIVE(SV,SA,DV,DA,SAC,RA) ((SV * SA + DV * DA * SAC) / RA + 0.5)
79 
85 #define FOREACH(D, AREAEND, ROWEND, BODY, INCREMENT) \
86 while (D < AREAEND) { \
87  while (D < ROWEND) { \
88  BODY \
89  } \
90  INCREMENT \
91 }
92 
96 #define AREA_INCREMENT_SD(S,D,DROWEND,DBYTEWIDTH,SBYTEOFFSET,DBYTEOFFSET) S += SBYTEOFFSET; D += DBYTEOFFSET; DROWEND += DBYTEWIDTH;
97 
101 #define AREA_INCREMENT_SDM(S,D,M,DROWEND,DBYTEWIDTH,SBYTEOFFSET,DBYTEOFFSET,MBYTEOFFSET) S += SBYTEOFFSET; D += DBYTEOFFSET; M += MBYTEOFFSET; DROWEND += DBYTEWIDTH;
102 
106 #define AREA_INCREMENT_CDM(D,M,DROWEND,DBYTEWIDTH,DBYTEOFFSET,MBYTEOFFSET) D += DBYTEOFFSET; M += MBYTEOFFSET; DROWEND += DBYTEWIDTH;
107 
111 #define AREA_INCREMENT_CD(D,DROWEND,DBYTEWIDTH,DBYTEOFFSET) D += DBYTEOFFSET; DROWEND += DBYTEWIDTH;
112 
113 
120 #define BLEND_ARGB_PIXEL(S,SA,D,DA,SAC,RA,MACRO) \
121 MACRO(S,SA,D,DA,SAC,RA) \
122 MACRO(S,SA,D,DA,SAC,RA) \
123 MACRO(S,SA,D,DA,SAC,RA) \
124 WRITE_ALPHA(S,D,RA)
125 
129 #define BLEND_ARGB_PIXEL_CLR(C,SA,D,DA,SAC,RA,CBPP,MACRO) \
130 BLEND_ARGB_PIXEL(C,SA,D,DA,SAC,RA,MACRO) \
131 C -= CBPP;
132 
133 //*********************************************************************************************//
134 //*********************************************************************************************//
135 //*********************************************************************************************//
136 //****************************** KONKRÉTNÍ MAKRA **************************************//
137 //*************************** (JENDOKANÁLOVÁ BITMAPA) **********************************//
138 //*********************************************************************************************//
139 //*********************************************************************************************//
140 
145 #define ADD_ONECH_SD(S, D) *D = (*S / 255.0 + *D / 255.0 * (1 - *S / 255.0)) * 255 + 0.5; S++; D++;
146 
151 #define ADD_ONECH_SDA(S, D, A) *D = (*S * (A) / 255.0 + *D / 255.0 * (1 - *S * (A) / 255.0)) * 255 + 0.5; S++; D++;
152 
157 #define ADD_ONECH_SDM(S, D, M) *D = (*S * *M / 65025.0 + *D / 255.0 * (1 - *S * *M / 65025.0)) * 255 + 0.5; S++; D++; M++;
158 
163 #define ADD_ONECH_SDMA(S, D, M, A) *D = (*S * *M * (A) / 65025.0 + *D / 255.0 * (1 - *S * *M * (A) / 65025.0)) * 255 + 0.5; S++; D++; M++;
164 
165 
171 #define REM_ONECH_SD(S, D) double sa = *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
172 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
173 
178 #define REM_ONECH_SDA(S, D, A) double sa = A * *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
179 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
180 
185 #define REM_ONECH_SDM(S, D, M) double sa = *M * *S / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
186 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
187 
192 #define REM_ONECH_SDMA(S, D, M, A) double sa = *M * *S * A / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
193 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
194 
195 
196 //*********************************************************************************************//
197 //*********************************************************************************************//
198 //*********************************************************************************************//
199 //****************************** KONKRÉTNÍ MAKRA **************************************//
200 //****************************** (ARGB BITMAPA) **************************************//
201 //*********************************************************************************************//
202 //*********************************************************************************************//
203 
204 //===================================================================================================================================================//
205 // ALPHA KANÁL
206 //===================================================================================================================================================//
207 
211 #define ADD_RGBA_SD(S, D) D += 3; *D = (*S / 255.0 + *D / 255.0 * (1 - *S / 255.0)) * 255 + 0.5; S++; D++;
212 
216 #define ADD_RGBA_SDA(S, D, A) D += 3; *D = (*S * (A) / 255.0 + *D / 255.0 * (1 - *S * (A) / 255.0)) * 255 + 0.5; S++; D++;
217 
221 #define ADD_RGBA_SDM(S, D, M) D += 3; *D = (*S * *M / 65025.0 + *D / 255.0 * (1 - *S * *M / 65025.0)) * 255 + 0.5; S++; D++; M++;
222 
226 #define ADD_RGBA_SDMA(S, D, M, A) D += 3; *D = (*S * *M * (A) / 65025.0 + *D / 255.0 * (1 - *S * *M * (A) / 65025.0)) * 255 + 0.5; S++; D++; M++;
227 
228 
232 #define REM_RGBA_SD(S, D) D += 3; double sa = *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
233 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
234 
238 #define REM_RGBA_SDA(S, D, A) D += 3; double sa = A * *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
239 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
240 
244 #define REM_RGBA_SDM(S, D, M) D += 3; double sa = *M * *S / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
245 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
246 
250 #define REM_RGBA_SDMA(S, D, M, A) D += 3; double sa = *M * *S * A / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
251 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
252 
253 //===================================================================================================================================================//
254 // NORMAL
255 //===================================================================================================================================================//
256 
260 #define BLEND_CHANNEL_NORMAL(S,SA,D,DA,SAC,RA) *D = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
261 
265 #define BLEND_ARGB_NORMAL(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_NORMAL)
266 
270 #define BLEND_ARGB_NORMAL_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_NORMAL)
271 
272 //===================================================================================================================================================//
273 // BRUSH-ONLY
274 //===================================================================================================================================================//
275 
276 // SD, SDA, SDM, SDMA, CDM, CD
277 
278 // DISSOLVE - Problém s náhodnými čísly, asi nepůjde tímto způsobem implementovat - obraz by "sněžil" při překreslování - pokaždé by se nahradili jiné pixely...
279 // jedno možné řešení je generování náhodného čísla z adresy v paměti - nežádoucí efekt nastane pouze při znovuotevření obrazu, ale jediné správné řešení je
280 // závislost na obrazových souřadnicích. Vyžaduje zbytečně velký zásah do procesu blendingu a výjimečné zpracování tohoto konkrétního módu.
281 
282 // BEHIND
283 #define BLEND_CHANNEL_SPC_BEHIND(S,SA,D,DA,DAC,RA) *D = BLEND(*D,DA,*S,SA,DAC,RA); S++; D++;
284 #define BLEND_ARGB_SPC_BEHIND(S,SA,D,DA,DAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, DAC, RA, BLEND_CHANNEL_SPC_BEHIND)
285 #define BLEND_ARGB_SPC_BEHIND_CDM(C,SA,D,DA,DAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, DAC, RA, CBPP, BLEND_CHANNEL_SPC_BEHIND)
286 
287 #define BLEND_COMPLEX_BEHIND_SD(S, D) double sa = *(S + 3) / 255.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da; \
288 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
289 
290 #define BLEND_COMPLEX_BEHIND_SDA(S, D, A) double sa = *(S + 3) * A / 255.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da; \
291 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
292 
293 #define BLEND_COMPLEX_BEHIND_SDM(S, D, M) double sa = *(S + 3) * *M / 65025.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da;\
294 M++;\
295 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
296 
297 #define BLEND_COMPLEX_BEHIND_SDMA(S, D, M, A) double sa = *(S + 3) * *M * A / 65025.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da; \
298 M++;\
299 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
300 
301 #define BLEND_COMPLEX_BEHIND_CDM(C, D, M) double sa = *(C + 3) * *M / 65025.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da; \
302 M++;\
303 BLEND_ARGB_SPC_BEHIND_CDM(C, sa, D, da, dac, ra, clrbpp)
304 
305 #define BLEND_COMPLEX_BEHIND_CD(C, D) double sa = *(C + 3) / 255.0; double da = *(D + 3) / 255.0; double dac = 1 - da; double ra = sa * dac + da; \
306 BLEND_ARGB_SPC_BEHIND_CDM(C, sa, D, da, dac, ra, clrbpp)
307 
308 
309 // CLEAR
310 #define BLEND_COMPLEX_CLEAR_SD(S, D) D += 3; S += 3; double sa = *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
311 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
312 
313 #define BLEND_COMPLEX_CLEAR_SDA(S, D, A) D += 3; S += 3; double sa = A * *S / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
314 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++;
315 
316 #define BLEND_COMPLEX_CLEAR_SDM(S, D, M) D += 3; S += 3; double sa = *M * *S / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
317 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
318 
319 #define BLEND_COMPLEX_CLEAR_SDMA(S, D, M, A) D += 3; S += 3; double sa = A * *M * *S / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
320 *D = (ra > 0) ? ra * 255 + 0.5 : 0; S++; D++; M++;
321 
322 #define BLEND_COMPLEX_CLEAR_CDM(C, D, M) D += 3; C += 3; double sa = *M * *C / 65025.0; double da = *D / 255.0; double ra = da - sa * da; \
323 *D = (ra > 0) ? ra * 255 + 0.5 : 0; C -= 3; D++; M++;
324 
325 #define BLEND_COMPLEX_CLEAR_CD(C, D) D += 3; C += 3; double sa = *C / 255.0; double da = *D / 255.0; double ra = da - sa * da; \
326 *D = (ra > 0) ? ra * 255 + 0.5 : 0; C -= 3; D++;
327 
328 
329 //===================================================================================================================================================//
330 // ZTMAVENÍ
331 //===================================================================================================================================================//
332 
333 #define BLEND_CHANNEL_DARKEN(S,SA,D,DA,SAC,RA) *(D) = BLEND((*S < *D ? *S : *D),SA,*(D),DA,SAC,RA); (S)++; (D)++;
334 #define BLEND_ARGB_DARKEN(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_DARKEN)
335 #define BLEND_ARGB_DARKEN_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_DARKEN)
336 
337 //===================================================================================================================================================//
338 
339 #define BLEND_CHANNEL_MULTIPLY(S,SA,D,DA,SAC,RA) *(D) = BLEND((*S * *D / 255.0),SA,*(D),DA,SAC,RA); (S)++; (D)++;
340 #define BLEND_ARGB_MULTIPLY(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_MULTIPLY)
341 #define BLEND_ARGB_MULTIPLY_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_MULTIPLY)
342 
343 //===================================================================================================================================================//
344 
345 // menší rovno by mělo eliminovat dělení nulou. Makra obsahovali optimalizaci - místo násobeni << 8
346 #define BLEND_CHANNEL_COLOR_BURN(S,SA,D,DA,SAC,RA) *(D) = BLEND( ((*S + *D) <= 255 ? 0 : (255 - ((255 - *D) * 255 ) / *S)) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
347 #define BLEND_ARGB_COLOR_BURN(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_COLOR_BURN)
348 #define BLEND_ARGB_COLOR_BURN_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_COLOR_BURN)
349 
350 //===================================================================================================================================================//
351 
352 #define BLEND_CHANNEL_LINEAR_BURN(S,SA,D,DA,SAC,RA) *(D) = BLEND( ((*S + *D < 255 ? 0 : *S + *D - 255) ),SA,*(D),DA,SAC,RA); (S)++; (D)++;
353 #define BLEND_ARGB_LINEAR_BURN(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LINEAR_BURN)
354 #define BLEND_ARGB_LINEAR_BURN_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LINEAR_BURN)
355 
356 //===================================================================================================================================================//
357 
358 #define BLEND_CHANNEL_DARKER_COLOR(S,SA,D,DA,SAC,RA) *(D) = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
359 // Pouzije se tmavsi, pokud je to D, nema vyznam cokoliv blendovat, v opacnem pripade probehne blending v normalnim modu.
360 // Pracuje celkem dobre, jen je mirne posunuta hranice.
361 #define BLEND_ARGB_DARKER_COLOR(S,SA,D,DA,SAC,RA) \
362  if ( (*(D) + *(D + 1) + *(D + 2)) <= (*(S) + *(S + 1) + *(S + 2)) ) { \
363  D += 3; S += 3; \
364  WRITE_ALPHA(S, D, RA) \
365  } else { \
366  BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_DARKER_COLOR) \
367  }
368 
369 #define BLEND_ARGB_DARKER_COLOR_CDM(C,SA,D,DA,SAC,RA,CBPP) \
370  if ( (*(D) + *(D + 1) + *(D + 2)) <= (*(C) + *(C + 1) + *(C + 2)) ) { \
371  D += 3; C += 3; \
372  WRITE_ALPHA(C, D, RA) \
373  } else { \
374  BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_DARKER_COLOR) \
375  }
376 
377 //===================================================================================================================================================//
378 // ZESVĚTLENÍ
379 //===================================================================================================================================================//
380 
381 #define BLEND_CHANNEL_LIGHTEN(S,SA,D,DA,SAC,RA) *(D) = BLEND((*S > *D ? *S : *D),SA,*(D),DA,SAC,RA); (S)++; (D)++;
382 #define BLEND_ARGB_LIGHTEN(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LIGHTEN)
383 #define BLEND_ARGB_LIGHTEN_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LIGHTEN)
384 
385 //===================================================================================================================================================//
386 
387 // Opet makra pouzivali optimalizaci na bitove posuny
388 #define BLEND_CHANNEL_SCREEN(S,SA,D,DA,SAC,RA) *(D) = BLEND( (255 - ((255 - *S) * (255 - *D)) / 255) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
389 #define BLEND_ARGB_SCREEN(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_SCREEN)
390 #define BLEND_ARGB_SCREEN_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_SCREEN)
391 
392 //===================================================================================================================================================//
393 
394 // Větší rovno by mělo eliminovat dělení nulou. Makra obsahovali optimalizaci - místo násobeni >> 8
395 #define BLEND_CHANNEL_COLOR_DODGE(S,SA,D,DA,SAC,RA) *(D) = BLEND( ((*S + *D) >= 255 ? 255 : (255 * *D) / (255 - *S)) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
396 #define BLEND_ARGB_COLOR_DODGE(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_COLOR_DODGE)
397 #define BLEND_ARGB_COLOR_DODGE_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_COLOR_DODGE)
398 
399 //===================================================================================================================================================//
400 
401 #define BLEND_CHANNEL_LINEAR_DODGE_ADD(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S + *D >= 255 ? 255 : *S + *D) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
402 #define BLEND_ARGB_LINEAR_DODGE_ADD(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LINEAR_DODGE_ADD)
403 #define BLEND_ARGB_LINEAR_DODGE_ADD_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LINEAR_DODGE_ADD)
404 
405 //===================================================================================================================================================//
406 
407 #define BLEND_CHANNEL_LIGHTER_COLOR(S,SA,D,DA,SAC,RA) *(D) = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
408 // Pracuje celkem dobre, jen je mirne posunuta hranice.
409 #define BLEND_ARGB_LIGHTER_COLOR(S,SA,D,DA,SAC,RA) \
410  if ( (*(D) + *(D + 1) + *(D + 2)) > (*(S) + *(S + 1) + *(S + 2)) ) { \
411  D += 3; S += 3; \
412  WRITE_ALPHA(S, D, RA) \
413  } else { \
414  BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LIGHTER_COLOR) \
415  }
416 
417 #define BLEND_ARGB_LIGHTER_COLOR_CDM(C,SA,D,DA,SAC,RA,CBPP) \
418  if ( (*(D) + *(D + 1) + *(D + 2)) > (*(C) + *(C + 1) + *(C + 2)) ) { \
419  D += 3; C += 3; \
420  WRITE_ALPHA(C, D, RA) \
421  } else { \
422  BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LIGHTER_COLOR) \
423  }
424 
425 //===================================================================================================================================================//
426 // KONTRAST
427 //===================================================================================================================================================//
428 
429 #define BLEND_CHANNEL_OVERLAY(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*D < 128 ? (2 * *S * *D) / 255 : (255 - (2 * (255 - *S) * (255 - *D)) / 255)) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
430 #define BLEND_ARGB_OVERLAY(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_OVERLAY)
431 #define BLEND_ARGB_OVERLAY_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_OVERLAY)
432 
433 //===================================================================================================================================================//
434 
435 // Photoshop dává mírně světlejší výsledek.. Může být zaokrouhlování, ale verze na androidu byla taky mírně světlejší a nezaokrouhlovala...
436 #define BLEND_CHANNEL_SOFT_LIGHT(S,SA,D,DA,SAC,RA) *(D) = BLEND( ((((255 - *D) * *S + (65025 - (255 - *S) * (255 - *D))) * *D) / 65025) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
437 #define BLEND_ARGB_SOFT_LIGHT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_SOFT_LIGHT)
438 #define BLEND_ARGB_SOFT_LIGHT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_SOFT_LIGHT)
439 
440 //===================================================================================================================================================//
441 
442 #define BLEND_CHANNEL_HARD_LIGHT(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S < 128 ? (2 * *S * *D) / 255 : (255 - (2 * (255 - *S) * (255 - *D)) / 255)) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
443 #define BLEND_ARGB_HARD_LIGHT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_HARD_LIGHT)
444 #define BLEND_ARGB_HARD_LIGHT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_HARD_LIGHT)
445 
446 //===================================================================================================================================================//
447 
448 #define BLEND_CHANNEL_VIVID_LIGHT(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S < 128 ? \
449  (2 * *S + *D <= 255 ? 0 : 255 - (255 * (255 - *D))/(2 * *S)) :\
450  (*D + 2 * *S >= 510 ? 255 : (255 * *D) / (2 * (255 - *S)))\
451  )\
452  ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
453 #define BLEND_ARGB_VIVID_LIGHT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_VIVID_LIGHT)
454 #define BLEND_ARGB_VIVID_LIGHT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_VIVID_LIGHT)
455 
456 //===================================================================================================================================================//
457 
458 #define BLEND_CHANNEL_LINEAR_LIGHT(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S < 128 ? \
459  (2 * *S + *D < 255 ? 0 : 2 * *S + *D - 255) :\
460  (2 * (*S - 128) + *D >= 255 ? 255 : 2 * (*S - 128) + *D)\
461  )\
462  ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
463 #define BLEND_ARGB_LINEAR_LIGHT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LINEAR_LIGHT)
464 #define BLEND_ARGB_LINEAR_LIGHT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LINEAR_LIGHT)
465 
466 //===================================================================================================================================================//
467 
468 #define BLEND_CHANNEL_PIN_LIGHT(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S < 128 ? \
469  (2 * *S < *D ? 2 * *S : *D) :\
470  (2 * (*S - 128) > *D ? 2 * (*S - 128) : *D)\
471  )\
472  ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
473 #define BLEND_ARGB_PIN_LIGHT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_PIN_LIGHT)
474 #define BLEND_ARGB_PIN_LIGHT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_PIN_LIGHT)
475 
476 //===================================================================================================================================================//
477 
478 #define BLEND_CHANNEL_HARD_MIX(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S > (255 - *D) ? 255 : 0) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
479 #define BLEND_ARGB_HARD_MIX(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_HARD_MIX)
480 #define BLEND_ARGB_HARD_MIX_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_HARD_MIX)
481 
482 //===================================================================================================================================================//
483 // POROVNANI
484 //===================================================================================================================================================//
485 
486 #define BLEND_CHANNEL_DIFFERENCE(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*D < *S ? *S - *D : *D - *S) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
487 #define BLEND_ARGB_DIFFERENCE(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_DIFFERENCE)
488 #define BLEND_ARGB_DIFFERENCE_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_DIFFERENCE)
489 
490 //===================================================================================================================================================//
491 
492 #define BLEND_CHANNEL_EXCLUSION(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*S + *D - (2 * *S * *D) / 255) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
493 #define BLEND_ARGB_EXCLUSION(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_EXCLUSION)
494 #define BLEND_ARGB_EXCLUSION_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_EXCLUSION)
495 
496 //===================================================================================================================================================//
497 
498 #define BLEND_CHANNEL_SUBTRACT(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*D < *S ? 0 : *D - *S) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
499 #define BLEND_ARGB_SUBTRACT(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_SUBTRACT)
500 #define BLEND_ARGB_SUBTRACT_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_SUBTRACT)
501 
502 //===================================================================================================================================================//
503 
504 // bude se spravne chovat pro 0/0 neurcity vyraz?
505 #define BLEND_CHANNEL_DIVIDE(S,SA,D,DA,SAC,RA) *(D) = BLEND( (*D >= *S ? 255 : (255 * *D) / *S) ,SA,*(D),DA,SAC,RA); (S)++; (D)++;
506 #define BLEND_ARGB_DIVIDE(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_DIVIDE)
507 #define BLEND_ARGB_DIVIDE_CDM(C,SA,D,DA,SAC,RA,CBPP) BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_DIVIDE)
508 
509 //===================================================================================================================================================//
510 // Komplexní módy
511 //===================================================================================================================================================//
512 
513 //===================================================================================================================================================//
514 
516 #define NORM_RGB_TO_NORM_HSV(R, G, B, H, S, V) \
517 {\
518  double cHigh, cLow, cRng; int max;\
519  if (R > G) {\
520  if (R > B) { cHigh = R; max = 1; } else { cHigh = B; max = 3; }\
521  cLow = (G < B) ? G : B;\
522  } else {\
523  if (G > B) { cHigh = G; max = 2; } else { cHigh = B; max = 3; }\
524  cLow = (R < B) ? R : B;\
525  }\
526  cRng = cHigh - cLow;\
527  V = cHigh;\
528  if (cHigh <= 0) { S = 0; H = 0;} else {\
529  S = cRng / cHigh;\
530  R = (cHigh - R) / cRng; G = (cHigh - G) / cRng; B = (cHigh - B) / cRng;\
531  switch (max) {\
532  case 1: H = B - G; break;\
533  case 2: H = R - B + 2; break;\
534  case 3: H = G - R + 4; break;\
535  }\
536  H = (H < 0) ? H + 6 : H; H /= 6;\
537  }\
538 }
539 
541 #define NORM_HSV_TO_NORM_RGB(R, G, B, H, S, V) \
542 {\
543  int c1; double c2, x, y, z;\
544  H *= 6; H = H - (int) (H / 6);\
545  c1 = H; c2 = H - c1;\
546  x = (1 - S) * V; y = (1 - (S * c2)) * V; z = (1 - S * (1 - c2)) * V;\
547  switch (c1) {\
548  case 0: R = V; G = z; B = x; break;\
549  case 1: R = y; G = V; B = x; break;\
550  case 2: R = x; G = V; B = z; break;\
551  case 3: R = x; G = y; B = V; break;\
552  case 4: R = z; G = x; B = V; break;\
553  case 5: R = V; G = x; B = y; break;\
554  }\
555 }
556 
557 //===================================================================================================================================================//
558 
560 #define NORM_RGB_TO_NORM_HLS(R, G, B, H, L, S) \
561 {\
562  double cHigh, cLow, cRng; int max;\
563  if (R > G) {\
564  if (R > B) { cHigh = R; max = 1; } else { cHigh = B; max = 3; }\
565  cLow = (G < B) ? G : B;\
566  } else { if (G > B) { cHigh = G; max = 2; } else { cHigh = B; max = 3; }\
567  cLow = (R < B) ? R : B;\
568  }\
569  cRng = cHigh - cLow;\
570  L = (cHigh + cLow) / 2;\
571  if ((L == 0) || (L == 1)) {\
572  S = 0;\
573  } else if (L <= 0.5) {\
574  S = 0.5 * cRng / L;\
575  } else {\
576  S = 0.5 * cRng / (1 - L);\
577  }\
578  R = (cHigh - R) / cRng; G = (cHigh - G) / cRng; B = (cHigh - B) / cRng;\
579  switch (max) {\
580  case 1: H = B - G; break;\
581  case 2: H = R - B + 2; break;\
582  case 3: H = G - R + 4; break;\
583  }\
584  H = (H < 0) ? H + 6 : H; H /= 6;\
585 }
586 
588 #define NORM_HLS_TO_NORM_RGB(R, G, B, H, L, S) \
589 {\
590  int c1; double c2, d, w, x, y, z;\
591  if (L == 0) { R = 0; G = 0; B = 0;} else \
592  if (L == 1) { R = 1; G = 1; B = 1;} else {\
593  H *= 6; H = (H) - (int) (H / 6);\
594  c1 = H; c2 = H - c1;\
595  d = (L <= 0.5) ? S * L : S * (1 - L);\
596  w = L + d; x = L - d; y = w - (w - x) * c2; z = x + (w - x) * c2;\
597  switch (c1) {\
598  case 0: R = w; G = z; B = x; break;\
599  case 1: R = y; G = w; B = x; break;\
600  case 2: R = x; G = w; B = z; break;\
601  case 3: R = x; G = y; B = w; break;\
602  case 4: R = z; G = x; B = w; break;\
603  case 5: R = w; G = x; B = y; break;\
604  } \
605  }\
606 }
607 
608 //===================================================================================================================================================//
609 
610 // Y = ... hodnoty jsou ruzne, dle bar. profilu...
612 #define NORM_RGB_TO_NORM_HCY(R, G, B, H, C, Y) \
613 {\
614  double M, m; int max;\
615  if (R > G) {\
616  if (R > B) { M = R; max = 1; } else { M = B; max = 3; }\
617  m = (G < B) ? G : B;\
618  } else {\
619  if (G > B) { M = G; max = 2; } else { M = B; max = 3; }\
620  m = (R < B) ? R : B;\
621  }\
622  C = M - m;\
623  Y = 0.30 * R + 0.59 * G + 0.11 * B;\
624  if (C <= 0) {H = 0;} else {\
625  switch (max) {\
626  case 1: H = (G - B) / C; break;\
627  case 2: H = (B - R) / C + 2; break;\
628  case 3: H = (R - G) / C + 4; break;\
629  }\
630  H = (H < 0) ? H + 6 : H; H /= 6;\
631  }\
632 }
633 
635 #define NORM_HCY_TO_NORM_RGB_NO_CLAMP(R, G, B, H, C, Y) \
636 {\
637  H *= 6; \
638  double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
639  double X = C * (1 - (tmp < 0 ? -tmp : tmp));\
640  int c1 = H;\
641  switch (c1) {\
642  case 0: R = C; G = X; B = 0; break;\
643  case 1: R = X; G = C; B = 0; break;\
644  case 2: R = 0; G = C; B = X; break;\
645  case 3: R = 0; G = X; B = C; break;\
646  case 4: R = X; G = 0; B = C; break;\
647  case 5: R = C; G = 0; B = X; break;\
648  }\
649  double m = Y - (0.30 * R + 0.59 * G + 0.11 * B);\
650  R += m; G += m; B += m;\
651 }
652 
654 #define NORM_HCY_TO_NORM_RGB_Y_CLAMP(R, G, B, H, C, Y) \
655 {\
656  H *= 6; \
657  double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
658  double X = C * (1 - (tmp < 0 ? -tmp : tmp));\
659  int c1 = H;\
660  double m;\
661  switch (c1) {\
662  case 0: R = C; G = X; B = 0;\
663  m = Y - (0.30 * R + 0.59 * G);\
664  m = (m < 0) ? 0 : (m <= (1 - R)) ? m : 1 - R;\
665  break;\
666  case 1: R = X; G = C; B = 0;\
667  m = Y - (0.30 * R + 0.59 * G);\
668  m = (m < 0) ? 0 : (m <= (1 - G)) ? m : 1 - G;\
669  break;\
670  case 2: R = 0; G = C; B = X;\
671  m = Y - (0.59 * G + 0.11 * B);\
672  m = (m < 0) ? 0 : (m <= (1 - G)) ? m : 1 - G;\
673  break;\
674  case 3: R = 0; G = X; B = C;\
675  m = Y - (0.59 * G + 0.11 * B);\
676  m = (m < 0) ? 0 : (m <= (1 - B)) ? m : 1 - B;\
677  break;\
678  case 4: R = X; G = 0; B = C;\
679  m = Y - (0.30 * R + 0.11 * B);\
680  m = (m < 0) ? 0 : (m <= (1 - B)) ? m : 1 - B;\
681  break;\
682  case 5: R = C; G = 0; B = X;\
683  m = Y - (0.30 * R + 0.11 * B);\
684  m = (m < 0) ? 0 : (m <= (1 - R)) ? m : 1 - R;\
685  break;\
686  }\
687  R += m; G += m; B += m;\
688 }
689 
691 #define NORM_HCY_TO_NORM_RGB_C_CLAMP(R, G, B, H, C, Y) \
692 {\
693  H *= 6; \
694  double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
695  double k = (1 - (tmp < 0 ? -tmp : tmp));\
696  int c1 = H;\
697  double m;\
698  double CMAX;\
699  switch (c1) {\
700  case 0: CMAX = Y / (0.3 + 0.59 * k);\
701  C = (C < CMAX) ? C : CMAX;\
702  R = C; G = C * k; B = 0;\
703  m = Y - (0.30 * R + 0.59 * G);\
704  break;\
705  case 1: CMAX = Y / (0.3 * k + 0.59);\
706  C = (C < CMAX) ? C : CMAX;\
707  R = C * k; G = C; B = 0;\
708  m = Y - (0.30 * R + 0.59 * G);\
709  break;\
710  case 2: CMAX = Y / (0.59 + 0.11 * k);\
711  C = (C < CMAX) ? C : CMAX;\
712  R = 0; G = C; B = C * k;\
713  m = Y - (0.59 * G + 0.11 * B);\
714  break;\
715  case 3: CMAX = Y / (0.59 * k + 0.11);\
716  C = (C < CMAX) ? C : CMAX;\
717  R = 0; G = C * k; B = C;\
718  m = Y - (0.59 * G + 0.11 * B);\
719  break;\
720  case 4: CMAX = Y / (0.3 * k + 0.11);\
721  C = (C < CMAX) ? C : CMAX;\
722  R = C * k; G = 0; B = C;\
723  m = Y - (0.30 * R + 0.11 * B);\
724  break;\
725  case 5: CMAX = Y / (0.3 + 0.11 * k);\
726  C = (C < CMAX) ? C : CMAX;\
727  R = C; G = 0; B = C * k;\
728  m = Y - (0.30 * R + 0.11 * B);\
729  break;\
730  }\
731  R += m; G += m; B += m;\
732 }
733 
735 #define NORM_HCY_TO_NORM_RGB(R, G, B, H, C, Y) \
736 {\
737  H *= 6; \
738  double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
739  double k = (1 - (tmp < 0 ? -tmp : tmp));\
740  int c1 = H;\
741  double m;\
742  double CMAX;\
743  switch (c1) {\
744  case 0: CMAX = Y / (0.3 + 0.59 * k);\
745  C = (C < CMAX) ? C : CMAX;\
746  R = C; G = C * k; B = 0;\
747  m = Y - (0.30 * R + 0.59 * G);\
748  m = (m < 0) ? 0 : (m <= (1 - R)) ? m : 1 - R;\
749  break;\
750  case 1: CMAX = Y / (0.3 * k + 0.59);\
751  C = (C < CMAX) ? C : CMAX;\
752  R = C * k; G = C; B = 0;\
753  m = Y - (0.30 * R + 0.59 * G);\
754  m = (m < 0) ? 0 : (m <= (1 - G)) ? m : 1 - G;\
755  break;\
756  case 2: CMAX = Y / (0.59 + 0.11 * k);\
757  C = (C < CMAX) ? C : CMAX;\
758  R = 0; G = C; B = C * k;\
759  m = Y - (0.59 * G + 0.11 * B);\
760  m = (m < 0) ? 0 : (m <= (1 - G)) ? m : 1 - G;\
761  break;\
762  case 3: CMAX = Y / (0.59 * k + 0.11);\
763  C = (C < CMAX) ? C : CMAX;\
764  R = 0; G = C * k; B = C;\
765  m = Y - (0.59 * G + 0.11 * B);\
766  m = (m < 0) ? 0 : (m <= (1 - B)) ? m : 1 - B;\
767  break;\
768  case 4: CMAX = Y / (0.3 * k + 0.11);\
769  C = (C < CMAX) ? C : CMAX;\
770  R = C * k; G = 0; B = C;\
771  m = Y - (0.30 * R + 0.11 * B);\
772  m = (m < 0) ? 0 : (m <= (1 - B)) ? m : 1 - B;\
773  break;\
774  case 5: CMAX = Y / (0.3 + 0.11 * k);\
775  C = (C < CMAX) ? C : CMAX;\
776  R = C; G = 0; B = C * k;\
777  m = Y - (0.30 * R + 0.11 * B);\
778  m = (m < 0) ? 0 : (m <= (1 - R)) ? m : 1 - R;\
779  break;\
780  }\
781  R += m; G += m; B += m;\
782 }
783 
784 //===================================================================================================================================================//
785 
787 #define BLEND_ALPHA_ASSOCIATIVE_NORMALIZED(S,SA,D,DA,SAC,RA) ((S * SA + D * DA * SAC) / RA)
788 
789 // HCY dle wiki - někde lepší než PS, jinde problém - zdrojem je nevhodný clamping
790 #define BLEND_ARGB_HUE(S,SA,D,DA,SAC,RA) \
791  double rs = *(S++) / 255.0;\
792  double gs = *(S++) / 255.0;\
793  double bs = *(S++) / 255.0;\
794  double rd = *(D) / 255.0;\
795  double gd = *(D + 1) / 255.0;\
796  double bd = *(D + 2) / 255.0;\
797  double hs, cs, ys, hd, cd, yd;\
798  NORM_RGB_TO_NORM_HCY(rs, gs, bs, hs, cs, ys) \
799  NORM_RGB_TO_NORM_HCY(rd, gd, bd, hd, cd, yd) \
800  NORM_HCY_TO_NORM_RGB(rs, gs, bs, hs, cd, yd)\
801  rd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (rs, SA, rd, DA, SAC, RA);\
802  gd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (gs, SA, gd, DA, SAC, RA);\
803  bd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (bs, SA, bd, DA, SAC, RA);\
804  *D = rd * 255 + 0.5; D++;\
805  *D = gd * 255 + 0.5; D++;\
806  *D = bd * 255 + 0.5; D++;\
807  WRITE_ALPHA(S, D, RA) \
808 
809 #define BLEND_ARGB_HUE_CDM(C,SA,D,DA,SAC,RA,CBPP) \
810  BLEND_ARGB_HUE(C,SA,D,DA,SAC,RA) \
811  C -= CBPP;
812 
813 //===================================================================================================================================================//
814 
815 #define BLEND_ARGB_SATURATION(S,SA,D,DA,SAC,RA) \
816  double rs = *(S++) / 255.0;\
817  double gs = *(S++) / 255.0;\
818  double bs = *(S++) / 255.0;\
819  double rd = *(D) / 255.0;\
820  double gd = *(D + 1) / 255.0;\
821  double bd = *(D + 2) / 255.0;\
822  double hs, cs, ys, hd, cd, yd;\
823  NORM_RGB_TO_NORM_HCY(rs, gs, bs, hs, cs, ys) \
824  NORM_RGB_TO_NORM_HCY(rd, gd, bd, hd, cd, yd) \
825  NORM_HCY_TO_NORM_RGB(rs, gs, bs, hd, cs, yd)\
826  rd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (rs, SA, rd, DA, SAC, RA);\
827  gd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (gs, SA, gd, DA, SAC, RA);\
828  bd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (bs, SA, bd, DA, SAC, RA);\
829  *D = rd * 255 + 0.5; D++;\
830  *D = gd * 255 + 0.5; D++;\
831  *D = bd * 255 + 0.5; D++;\
832  WRITE_ALPHA(S, D, RA) \
833 
834 #define BLEND_ARGB_SATURATION_CDM(C,SA,D,DA,SAC,RA,CBPP) \
835  BLEND_ARGB_SATURATION(C,SA,D,DA,SAC,RA) \
836  C -= CBPP;
837 
838 //===================================================================================================================================================//
839 
840 #define BLEND_ARGB_COLOR(S,SA,D,DA,SAC,RA) \
841  double rs = *(S++) / 255.0;\
842  double gs = *(S++) / 255.0;\
843  double bs = *(S++) / 255.0;\
844  double rd = *(D) / 255.0;\
845  double gd = *(D + 1) / 255.0;\
846  double bd = *(D + 2) / 255.0;\
847  double hs, cs, ys, hd, cd, yd;\
848  NORM_RGB_TO_NORM_HCY(rs, gs, bs, hs, cs, ys) \
849  NORM_RGB_TO_NORM_HCY(rd, gd, bd, hd, cd, yd) \
850  NORM_HCY_TO_NORM_RGB(rs, gs, bs, hs, cs, yd)\
851  rd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (rs, SA, rd, DA, SAC, RA);\
852  gd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (gs, SA, gd, DA, SAC, RA);\
853  bd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (bs, SA, bd, DA, SAC, RA);\
854  *D = rd * 255 + 0.5; D++;\
855  *D = gd * 255 + 0.5; D++;\
856  *D = bd * 255 + 0.5; D++;\
857  WRITE_ALPHA(S, D, RA) \
858 
859 #define BLEND_ARGB_COLOR_CDM(C,SA,D,DA,SAC,RA,CBPP) \
860  BLEND_ARGB_COLOR(C,SA,D,DA,SAC,RA) \
861  C -= CBPP;
862 
863 //===================================================================================================================================================//
864 
865 #define BLEND_ARGB_LUMINOSITY(S,SA,D,DA,SAC,RA) \
866  double rs = *(S++) / 255.0;\
867  double gs = *(S++) / 255.0;\
868  double bs = *(S++) / 255.0;\
869  double rd = *(D) / 255.0;\
870  double gd = *(D + 1) / 255.0;\
871  double bd = *(D + 2) / 255.0;\
872  double hs, cs, ys, hd, cd, yd;\
873  NORM_RGB_TO_NORM_HCY(rs, gs, bs, hs, cs, ys) \
874  NORM_RGB_TO_NORM_HCY(rd, gd, bd, hd, cd, yd) \
875  NORM_HCY_TO_NORM_RGB(rs, gs, bs, hd, cd, ys)\
876  rd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (rs, SA, rd, DA, SAC, RA);\
877  gd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (gs, SA, gd, DA, SAC, RA);\
878  bd = BLEND_ALPHA_ASSOCIATIVE_NORMALIZED (bs, SA, bd, DA, SAC, RA);\
879  *D = rd * 255 + 0.5; D++;\
880  *D = gd * 255 + 0.5; D++;\
881  *D = bd * 255 + 0.5; D++;\
882  WRITE_ALPHA(S, D, RA) \
883 
884 #define BLEND_ARGB_LUMINOSITY_CDM(C,SA,D,DA,SAC,RA,CBPP) \
885  BLEND_ARGB_LUMINOSITY(C,SA,D,DA,SAC,RA) \
886  C -= CBPP;
887 
888