Go to the documentation of this file.
31 #define INIT_ALPHAS_SD(S,D) INIT_ALPHAS_CUSTOM(*(S+3) / 255.0, *(D+3) / 255.0)
38 #define INIT_ALPHAS_SDA(S,D,A) INIT_ALPHAS_CUSTOM(*(S+3) * A / 255.0, *(D+3) / 255.0)
45 #define INIT_ALPHAS_SDM(S,D,M) INIT_ALPHAS_CUSTOM(*(S+3) * *M / 65025.0, *(D+3) / 255.0) M++;
53 #define INIT_ALPHAS_SDMA(S,D,M,A) INIT_ALPHAS_CUSTOM(*(S+3) * *M * A / 65025.0, *(D+3) / 255.0) M++;
58 #define INIT_ALPHAS_CUSTOM(SA,DA) double sa = SA; double da = DA; double sac = 1 - sa; double ra = sa + da * sac;
63 #define WRITE_ALPHA(S,D,RA) *D = RA * 255 + 0.5; S++; D++;
73 #define BLEND(SV,SA,DV,DA,SAC,RA) BLEND_ALPHA_ASSOCIATIVE(SV, SA, DV, DA, SAC, RA)
78 #define BLEND_ALPHA_ASSOCIATIVE(SV,SA,DV,DA,SAC,RA) ((SV * SA + DV * DA * SAC) / RA + 0.5)
85 #define FOREACH(D, AREAEND, ROWEND, BODY, INCREMENT) \
86 while (D < AREAEND) { \
87 while (D < ROWEND) { \
96 #define AREA_INCREMENT_SD(S,D,DROWEND,DBYTEWIDTH,SBYTEOFFSET,DBYTEOFFSET) S += SBYTEOFFSET; D += DBYTEOFFSET; DROWEND += DBYTEWIDTH;
101 #define AREA_INCREMENT_SDM(S,D,M,DROWEND,DBYTEWIDTH,SBYTEOFFSET,DBYTEOFFSET,MBYTEOFFSET) S += SBYTEOFFSET; D += DBYTEOFFSET; M += MBYTEOFFSET; DROWEND += DBYTEWIDTH;
106 #define AREA_INCREMENT_CDM(D,M,DROWEND,DBYTEWIDTH,DBYTEOFFSET,MBYTEOFFSET) D += DBYTEOFFSET; M += MBYTEOFFSET; DROWEND += DBYTEWIDTH;
111 #define AREA_INCREMENT_CD(D,DROWEND,DBYTEWIDTH,DBYTEOFFSET) D += DBYTEOFFSET; DROWEND += DBYTEWIDTH;
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) \
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) \
145 #define ADD_ONECH_SD(S, D) *D = (*S / 255.0 + *D / 255.0 * (1 - *S / 255.0)) * 255 + 0.5; S++; D++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
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++;
260 #define BLEND_CHANNEL_NORMAL(S,SA,D,DA,SAC,RA) *D = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
265 #define BLEND_ARGB_NORMAL(S,SA,D,DA,SAC,RA) BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_NORMAL)
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)
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)
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)
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)
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;\
295 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
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; \
299 BLEND_ARGB_SPC_BEHIND(S, sa, D, da, dac, ra)
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; \
303 BLEND_ARGB_SPC_BEHIND_CDM(C, sa, D, da, dac, ra, clrbpp)
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)
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++;
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++;
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++;
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++;
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++;
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++;
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)
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)
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)
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)
358 #define BLEND_CHANNEL_DARKER_COLOR(S,SA,D,DA,SAC,RA) *(D) = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
361 #define BLEND_ARGB_DARKER_COLOR(S,SA,D,DA,SAC,RA) \
362 if ( (*(D) + *(D + 1) + *(D + 2)) <= (*(S) + *(S + 1) + *(S + 2)) ) { \
364 WRITE_ALPHA(S, D, RA) \
366 BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_DARKER_COLOR) \
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)) ) { \
372 WRITE_ALPHA(C, D, RA) \
374 BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_DARKER_COLOR) \
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)
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)
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)
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)
407 #define BLEND_CHANNEL_LIGHTER_COLOR(S,SA,D,DA,SAC,RA) *(D) = BLEND(*S,SA,*D,DA,SAC,RA); S++; D++;
409 #define BLEND_ARGB_LIGHTER_COLOR(S,SA,D,DA,SAC,RA) \
410 if ( (*(D) + *(D + 1) + *(D + 2)) > (*(S) + *(S + 1) + *(S + 2)) ) { \
412 WRITE_ALPHA(S, D, RA) \
414 BLEND_ARGB_PIXEL(S, SA, D, DA, SAC, RA, BLEND_CHANNEL_LIGHTER_COLOR) \
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)) ) { \
420 WRITE_ALPHA(C, D, RA) \
422 BLEND_ARGB_PIXEL_CLR(C, SA, D, DA, SAC, RA, CBPP, BLEND_CHANNEL_LIGHTER_COLOR) \
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)
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)
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)
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)))\
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)
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)\
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)
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)\
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)
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)
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)
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)
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)
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)
516 #define NORM_RGB_TO_NORM_HSV(R, G, B, H, S, V) \
518 double cHigh, cLow, cRng; int max;\
520 if (R > B) { cHigh = R; max = 1; } else { cHigh = B; max = 3; }\
521 cLow = (G < B) ? G : B;\
523 if (G > B) { cHigh = G; max = 2; } else { cHigh = B; max = 3; }\
524 cLow = (R < B) ? R : B;\
526 cRng = cHigh - cLow;\
528 if (cHigh <= 0) { S = 0; H = 0;} else {\
530 R = (cHigh - R) / cRng; G = (cHigh - G) / cRng; B = (cHigh - B) / cRng;\
532 case 1: H = B - G; break;\
533 case 2: H = R - B + 2; break;\
534 case 3: H = G - R + 4; break;\
536 H = (H < 0) ? H + 6 : H; H /= 6;\
541 #define NORM_HSV_TO_NORM_RGB(R, G, B, H, S, V) \
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;\
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;\
560 #define NORM_RGB_TO_NORM_HLS(R, G, B, H, L, S) \
562 double cHigh, cLow, cRng; int max;\
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;\
569 cRng = cHigh - cLow;\
570 L = (cHigh + cLow) / 2;\
571 if ((L == 0) || (L == 1)) {\
573 } else if (L <= 0.5) {\
576 S = 0.5 * cRng / (1 - L);\
578 R = (cHigh - R) / cRng; G = (cHigh - G) / cRng; B = (cHigh - B) / cRng;\
580 case 1: H = B - G; break;\
581 case 2: H = R - B + 2; break;\
582 case 3: H = G - R + 4; break;\
584 H = (H < 0) ? H + 6 : H; H /= 6;\
588 #define NORM_HLS_TO_NORM_RGB(R, G, B, H, L, S) \
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;\
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;\
612 #define NORM_RGB_TO_NORM_HCY(R, G, B, H, C, Y) \
614 double M, m; int max;\
616 if (R > B) { M = R; max = 1; } else { M = B; max = 3; }\
617 m = (G < B) ? G : B;\
619 if (G > B) { M = G; max = 2; } else { M = B; max = 3; }\
620 m = (R < B) ? R : B;\
623 Y = 0.30 * R + 0.59 * G + 0.11 * B;\
624 if (C <= 0) {H = 0;} else {\
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;\
630 H = (H < 0) ? H + 6 : H; H /= 6;\
635 #define NORM_HCY_TO_NORM_RGB_NO_CLAMP(R, G, B, H, C, Y) \
638 double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
639 double X = C * (1 - (tmp < 0 ? -tmp : tmp));\
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;\
649 double m = Y - (0.30 * R + 0.59 * G + 0.11 * B);\
650 R += m; G += m; B += m;\
654 #define NORM_HCY_TO_NORM_RGB_Y_CLAMP(R, G, B, H, C, Y) \
657 double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
658 double X = C * (1 - (tmp < 0 ? -tmp : tmp));\
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;\
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;\
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;\
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;\
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;\
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;\
687 R += m; G += m; B += m;\
691 #define NORM_HCY_TO_NORM_RGB_C_CLAMP(R, G, B, H, C, Y) \
694 double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
695 double k = (1 - (tmp < 0 ? -tmp : tmp));\
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);\
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);\
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);\
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);\
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);\
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);\
731 R += m; G += m; B += m;\
735 #define NORM_HCY_TO_NORM_RGB(R, G, B, H, C, Y) \
738 double tmp = ((H / 2.0) - (int)(H / 2.0)) * 2 - 1.0;\
739 double k = (1 - (tmp < 0 ? -tmp : tmp));\
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;\
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;\
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;\
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;\
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;\
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;\
781 R += m; G += m; B += m;\
787 #define BLEND_ALPHA_ASSOCIATIVE_NORMALIZED(S,SA,D,DA,SAC,RA) ((S * SA + D * DA * SAC) / RA)
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) \
809 #define BLEND_ARGB_HUE_CDM(C,SA,D,DA,SAC,RA,CBPP) \
810 BLEND_ARGB_HUE(C,SA,D,DA,SAC,RA) \
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) \
834 #define BLEND_ARGB_SATURATION_CDM(C,SA,D,DA,SAC,RA,CBPP) \
835 BLEND_ARGB_SATURATION(C,SA,D,DA,SAC,RA) \
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) \
859 #define BLEND_ARGB_COLOR_CDM(C,SA,D,DA,SAC,RA,CBPP) \
860 BLEND_ARGB_COLOR(C,SA,D,DA,SAC,RA) \
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) \
884 #define BLEND_ARGB_LUMINOSITY_CDM(C,SA,D,DA,SAC,RA,CBPP) \
885 BLEND_ARGB_LUMINOSITY(C,SA,D,DA,SAC,RA) \