|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
bf231a2 |
From 0ec68d7f5695403eccac75025ba7f6f7ecf1814e Mon Sep 17 00:00:00 2001
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
From: Tom Hughes <tom@compton.nu>
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
Date: Sun, 19 May 2013 16:49:08 +0100
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
bf231a2 |
Subject: [PATCH 11/15] Avoid division by zero in color-burn mode
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
FIXME: re-work using latest math from http://www.w3.org/TR/SVGCompositing/
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
---
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
include/agg_pixfmt_rgba.h | 21 ++++++++++++++++++---
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
1 file changed, 18 insertions(+), 3 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
bf231a2 |
index 6c4bc37..5d6b511 100644
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
--- a/include/agg_pixfmt_rgba.h
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+++ b/include/agg_pixfmt_rgba.h
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
@@ -1027,6 +1027,21 @@ namespace agg
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
// Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
//
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
// Da' = Sa + Da - Sa.Da
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // http://www.w3.org/TR/SVGCompositing/
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // if Sca == 0 and Dca == Da
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // Dca' = Sa × Da + Sca × (1 - Da) + Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // = Sa × Da + Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // = Da = Dca
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // otherwise if Sca == 0
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // Dca' = Sca × (1 - Da) + Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // = Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // otherwise if Sca > 0
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // Dca' = Sa × Da - Sa × Da × min(1, (1 - Dca/Da) × Sa/Sca) + Sca × (1 - Da) + Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // = Sa × Da × (1 - min(1, (1 - Dca/Da) × Sa/Sca)) + Sca × (1 - Da) + Dca × (1 - Sa)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ // sa * da * (255 - std::min(255, (255 - p[0]/da)*(sa/(sc*sa)) +
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
static AGG_INLINE void blend_pix(value_type* p,
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
unsigned sr, unsigned sg, unsigned sb,
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
unsigned sa, unsigned cover)
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
@@ -1056,15 +1071,15 @@ namespace agg
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
p[Order::R] = (value_type)(((srda + drsa <= sada) ?
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
sr * d1a + dr * s1a :
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
- sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ (sr > 0 ? sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask : 0)) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
p[Order::G] = (value_type)(((sgda + dgsa <= sada) ?
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
sg * d1a + dg * s1a :
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
- sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ (sg > 0 ? sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask : 0)) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
p[Order::B] = (value_type)(((sbda + dbsa <= sada) ?
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
sb * d1a + db * s1a :
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
- sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
+ (sb > 0 ? sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask : 0)) >> base_shift);
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
}
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
--
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
1.8.1.4
|
|
![](https://seccdn.libravatar.org/avatar/dcfe7af74d8d03d1a0ebd18962b3b8f18e13cfb21df46c214faa00e234336c40?s=16&d=retro) |
599c4ed |
|