OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "../../../include/fxge/fx_ge.h" | 5 #include "../../../include/fxge/fx_ge.h" |
6 //#define _SKIA_SUPPORT_ | 6 //#define _SKIA_SUPPORT_ |
7 #if defined(_SKIA_SUPPORT_) | 7 #if defined(_SKIA_SUPPORT_) |
8 #include "../../../include/fxcodec/fx_codec.h" | 8 #include "../../../include/fxcodec/fx_codec.h" |
9 #include "SkBlitter.h" | 9 #include "SkBlitter.h" |
10 #include "fx_skia_blitter_new.h" | 10 #include "fx_skia_blitter_new.h" |
11 // We use our own renderer here to make it simple | 11 // We use our own renderer here to make it simple |
12 void CFX_SkiaRenderer::blitAntiH(int x, int y, const SkAlpha antialias[]
, const int16_t runs[]) | 12 void CFX_SkiaRenderer::blitAntiH(int x, |
13 { | 13 int y, |
14 FXSYS_assert(m_Alpha); | 14 const SkAlpha antialias[], |
15 if (m_pOriDevice == NULL && composite_span == NULL) return; | 15 const int16_t runs[]) { |
16 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) return; | 16 FXSYS_assert(m_Alpha); |
17 while (1) | 17 if (m_pOriDevice == NULL && composite_span == NULL) |
18 { | 18 return; |
19 int width = runs[0]; | 19 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) |
20 SkASSERT(width >= 0); | 20 return; |
21 if (width <= 0) | 21 while (1) { |
22 return; | 22 int width = runs[0]; |
23 unsigned aa = antialias[0]; | 23 SkASSERT(width >= 0); |
24 if (aa) | 24 if (width <= 0) |
25 (this->*composite_span)(m_pDestScan, m_pOriScan,
0, x, width, y, aa, m_ClipBox.top, m_ClipBox.left, m_ClipBox.right, m_pClipScan
, m_pDestExtraAlphaScan); | 25 return; |
26 runs += width; | 26 unsigned aa = antialias[0]; |
27 antialias += width; | 27 if (aa) |
28 x += width; | 28 (this->*composite_span)(m_pDestScan, |
29 } | 29 m_pOriScan, |
30 } | 30 0, |
31 | 31 x, |
32 void CFX_SkiaRenderer::blitH(int x, int y, int width) | 32 width, |
33 { | 33 y, |
34 FXSYS_assert(m_Alpha && width); | 34 aa, |
35 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) return; | 35 m_ClipBox.top, |
36 (this->*composite_span)(m_pDestScan, m_pOriScan, 0, x, width, y,
255, m_ClipBox.top, m_ClipBox.left, m_ClipBox.right, m_pClipScan, m_pDestExtraA
lphaScan); | 36 m_ClipBox.left, |
37 } | 37 m_ClipBox.right, |
38 | 38 m_pClipScan, |
39 void CFX_SkiaRenderer::blitV(int x, int y, int height, SkAlpha alpha) | 39 m_pDestExtraAlphaScan); |
40 { | 40 runs += width; |
41 FXSYS_assert(m_Alpha && alpha); | 41 antialias += width; |
42 if (alpha == 255) { | 42 x += width; |
43 this->blitRect(x, y, 1, height); | 43 } |
44 } else { | 44 } |
45 int16_t runs[2]; | 45 |
46 runs[0] = 1; | 46 void CFX_SkiaRenderer::blitH(int x, int y, int width) { |
47 runs[1] = 0; | 47 FXSYS_assert(m_Alpha && width); |
48 while (--height >= 0) { | 48 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) |
49 if (y >= m_ClipBox.bottom) | 49 return; |
50 return; | 50 (this->*composite_span)(m_pDestScan, |
51 this->blitAntiH(x, y ++, &alpha, runs); | 51 m_pOriScan, |
52 } | 52 0, |
53 } | 53 x, |
54 } | 54 width, |
55 void CFX_SkiaRenderer::blitRect(int x, int y, int width, int height) | 55 y, |
56 { | 56 255, |
57 FXSYS_assert(m_Alpha && width); | 57 m_ClipBox.top, |
58 while (--height >= 0){ | 58 m_ClipBox.left, |
59 if (y >= m_ClipBox.bottom) | 59 m_ClipBox.right, |
60 return; | 60 m_pClipScan, |
61 blitH(x, y ++, width); | 61 m_pDestExtraAlphaScan); |
62 } | 62 } |
63 } | 63 |
64 | 64 void CFX_SkiaRenderer::blitV(int x, int y, int height, SkAlpha alpha) { |
65 void CFX_SkiaRenderer::blitAntiRect(int x, int y, int width, int height, | 65 FXSYS_assert(m_Alpha && alpha); |
66 SkAlpha leftAlpha, SkAlpha rightAlpha) | 66 if (alpha == 255) { |
67 { | 67 this->blitRect(x, y, 1, height); |
68 blitV(x++, y, height, leftAlpha); | 68 } else { |
69 if (width > 0) { | 69 int16_t runs[2]; |
70 blitRect(x, y, width, height); | 70 runs[0] = 1; |
71 x += width; | 71 runs[1] = 0; |
72 } | 72 while (--height >= 0) { |
73 blitV(x, y, height, rightAlpha); | 73 if (y >= m_ClipBox.bottom) |
74 } | 74 return; |
75 /*----------------------------------------------------------------------
-----------------------------*/ | 75 this->blitAntiH(x, y++, &alpha, runs); |
76 void CFX_SkiaRenderer::CompositeSpan1bpp_0(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 76 } |
77 int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 77 } |
78 int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 78 } |
79 FX_LPBYTE dest_extra_alpha_scan) | 79 void CFX_SkiaRenderer::blitRect(int x, int y, int width, int height) { |
80 { | 80 FXSYS_assert(m_Alpha && width); |
81 ASSERT(!m_bRgbByteOrder); | 81 while (--height >= 0) { |
82 ASSERT(!m_pDevice->IsCmykImage()); | 82 if (y >= m_ClipBox.bottom) |
83 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft/8; | 83 return; |
84 int col_start = span_left < clip_left ? clip_left - span_left :
0; | 84 blitH(x, y++, width); |
85 int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 85 } |
86 if (col_end < col_start) return; // do nothing. | 86 } |
87 dest_scan += col_start/8; | 87 |
88 | 88 void CFX_SkiaRenderer::blitAntiRect(int x, |
89 int index = 0; | 89 int y, |
90 if (m_pDevice->GetPalette() == NULL) | 90 int width, |
91 index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0; | 91 int height, |
92 else { | 92 SkAlpha leftAlpha, |
93 for (int i = 0; i < 2; i ++) | 93 SkAlpha rightAlpha) { |
94 if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) ==
m_Color) | 94 blitV(x++, y, height, leftAlpha); |
95 index = i; | 95 if (width > 0) { |
96 } | 96 blitRect(x, y, width, height); |
97 FX_LPBYTE dest_scan1 = dest_scan; | 97 x += width; |
98 int src_alpha = m_Alpha * cover_scan / 255; | 98 } |
99 for (int col = col_start; col < col_end; col ++) { | 99 blitV(x, y, height, rightAlpha); |
100 if (src_alpha) { | 100 } |
101 if (!index) | 101 /*------------------------------------------------------------------------------
---------------------*/ |
102 *dest_scan1 &= ~(1 << (7 - (col+span_lef
t)%8)); | 102 void CFX_SkiaRenderer::CompositeSpan1bpp_0(FX_LPBYTE dest_scan, |
103 else | 103 FX_LPBYTE ori_scan, |
104 *dest_scan1|= 1 << (7 - (col+span_left)%
8); | 104 int Bpp, |
105 } | 105 int span_left, |
106 dest_scan1 = dest_scan+(span_left%8+col-col_start+1)/8; | 106 int span_len, |
107 } | 107 int span_top, |
108 } | 108 FX_BYTE cover_scan, |
109 void CFX_SkiaRenderer::CompositeSpan1bpp_4(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 109 int clip_top, |
110 int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 110 int clip_left, |
111 int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 111 int clip_right, |
112 FX_LPBYTE dest_extra_alpha_scan) | 112 FX_LPBYTE clip_scan, |
113 { | 113 FX_LPBYTE dest_extra_alpha_scan) { |
114 ASSERT(!m_bRgbByteOrder); | 114 ASSERT(!m_bRgbByteOrder); |
115 ASSERT(!m_pDevice->IsCmykImage()); | 115 ASSERT(!m_pDevice->IsCmykImage()); |
116 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft/8; | 116 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left / 8; |
117 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 117 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
118 int col_start = span_left < clip_left ? clip_left - span_left :
0; | 118 int col_end = |
119 int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 119 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
120 if (col_end < col_start) return; // do nothing. | 120 if (col_end < col_start) |
121 dest_scan += col_start/8; | 121 return; // do nothing. |
122 | 122 dest_scan += col_start / 8; |
123 int index = 0; | 123 |
124 if (m_pDevice->GetPalette() == NULL) | 124 int index = 0; |
125 index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0; | 125 if (m_pDevice->GetPalette() == NULL) |
126 else { | 126 index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0; |
127 for (int i = 0; i < 2; i ++) | 127 else { |
128 if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) ==
m_Color) | 128 for (int i = 0; i < 2; i++) |
129 index = i; | 129 if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) |
130 } | 130 index = i; |
131 FX_LPBYTE dest_scan1 = dest_scan; | 131 } |
132 int src_alpha = m_Alpha * cover_scan / 255; | 132 FX_LPBYTE dest_scan1 = dest_scan; |
133 for (int col = col_start; col < col_end; col ++) { | 133 int src_alpha = m_Alpha * cover_scan / 255; |
134 int src_alpha1 = src_alpha * clip_scan[col] / 255; | 134 for (int col = col_start; col < col_end; col++) { |
135 if (src_alpha1) { | 135 if (src_alpha) { |
136 if (!index) | 136 if (!index) |
137 *dest_scan1 &= ~(1 << (7 - (col+span_lef
t)%8)); | 137 *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); |
138 else | 138 else |
139 *dest_scan1|= 1 << (7 - (col+span_left)%
8); | 139 *dest_scan1 |= 1 << (7 - (col + span_left) % 8); |
140 } | 140 } |
141 dest_scan1 = dest_scan+(span_left%8+col-col_start+1)/8; | 141 dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; |
142 } | 142 } |
143 } | 143 } |
144 /*----------------------------------------------------------------------
-------------------------------*/ | 144 void CFX_SkiaRenderer::CompositeSpan1bpp_4(FX_LPBYTE dest_scan, |
145 void CFX_SkiaRenderer::CompositeSpanGray_2(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 145 FX_LPBYTE ori_scan, |
146 int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 146 int Bpp, |
147 int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 147 int span_left, |
148 FX_LPBYTE dest_extra_alpha_scan) | 148 int span_len, |
149 { | 149 int span_top, |
150 ASSERT(!m_pDevice->IsCmykImage()); | 150 FX_BYTE cover_scan, |
151 ASSERT(!m_bRgbByteOrder); | 151 int clip_top, |
152 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft; | 152 int clip_left, |
153 int col_start = span_left < clip_left ? clip_left - span_left :
0; | 153 int clip_right, |
154 int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 154 FX_LPBYTE clip_scan, |
155 if (col_end < col_start) return; // do nothing. | 155 FX_LPBYTE dest_extra_alpha_scan) { |
156 dest_scan += col_start; | 156 ASSERT(!m_bRgbByteOrder); |
157 if (cover_scan == 255 && m_Alpha == 255) { | 157 ASSERT(!m_pDevice->IsCmykImage()); |
158 FXSYS_memset32(dest_scan, FXARGB_MAKE(m_Gray, m_Gray, m_
Gray, m_Gray), col_end - col_start); | 158 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left / 8; |
159 return; | 159 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
160 } | 160 clip_left + span_left; |
161 int src_alpha = m_Alpha * cover_scan / 255; | 161 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
162 for (int col = col_start; col < col_end; col ++) { | 162 int col_end = |
163 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_a
lpha); | 163 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
164 dest_scan++; | 164 if (col_end < col_start) |
165 } | 165 return; // do nothing. |
166 } | 166 dest_scan += col_start / 8; |
167 void CFX_SkiaRenderer::CompositeSpanGray_3(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 167 |
168 int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 168 int index = 0; |
169 int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 169 if (m_pDevice->GetPalette() == NULL) |
170 FX_LPBYTE dest_extra_alpha_scan) | 170 index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0; |
171 { | 171 else { |
172 ASSERT(!m_pDevice->IsCmykImage()); | 172 for (int i = 0; i < 2; i++) |
173 ASSERT(!m_bRgbByteOrder); | 173 if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) |
174 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft; | 174 index = i; |
175 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span
_left; | 175 } |
176 int col_start = span_left < clip_left ? clip_left - span_left :
0; | 176 FX_LPBYTE dest_scan1 = dest_scan; |
177 int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 177 int src_alpha = m_Alpha * cover_scan / 255; |
178 if (col_end < col_start) return; // do nothing. | 178 for (int col = col_start; col < col_end; col++) { |
179 dest_scan += col_start; | 179 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
180 ori_scan += col_start; | 180 if (src_alpha1) { |
181 if (m_Alpha == 255 && cover_scan == 255) { | 181 if (!index) |
182 FXSYS_memset32(dest_scan, FXARGB_MAKE(m_Gray, m_Gray, m_
Gray, m_Gray), col_end - col_start); | 182 *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); |
183 } else { | 183 else |
184 int src_alpha = m_Alpha; | 184 *dest_scan1 |= 1 << (7 - (col + span_left) % 8); |
| 185 } |
| 186 dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; |
| 187 } |
| 188 } |
| 189 /*------------------------------------------------------------------------------
-----------------------*/ |
| 190 void CFX_SkiaRenderer::CompositeSpanGray_2(FX_LPBYTE dest_scan, |
| 191 FX_LPBYTE ori_scan, |
| 192 int Bpp, |
| 193 int span_left, |
| 194 int span_len, |
| 195 int span_top, |
| 196 FX_BYTE cover_scan, |
| 197 int clip_top, |
| 198 int clip_left, |
| 199 int clip_right, |
| 200 FX_LPBYTE clip_scan, |
| 201 FX_LPBYTE dest_extra_alpha_scan) { |
| 202 ASSERT(!m_pDevice->IsCmykImage()); |
| 203 ASSERT(!m_bRgbByteOrder); |
| 204 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left; |
| 205 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 206 int col_end = |
| 207 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 208 if (col_end < col_start) |
| 209 return; // do nothing. |
| 210 dest_scan += col_start; |
| 211 if (cover_scan == 255 && m_Alpha == 255) { |
| 212 FXSYS_memset32(dest_scan, |
| 213 FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), |
| 214 col_end - col_start); |
| 215 return; |
| 216 } |
| 217 int src_alpha = m_Alpha * cover_scan / 255; |
| 218 for (int col = col_start; col < col_end; col++) { |
| 219 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); |
| 220 dest_scan++; |
| 221 } |
| 222 } |
| 223 void CFX_SkiaRenderer::CompositeSpanGray_3(FX_LPBYTE dest_scan, |
| 224 FX_LPBYTE ori_scan, |
| 225 int Bpp, |
| 226 int span_left, |
| 227 int span_len, |
| 228 int span_top, |
| 229 FX_BYTE cover_scan, |
| 230 int clip_top, |
| 231 int clip_left, |
| 232 int clip_right, |
| 233 FX_LPBYTE clip_scan, |
| 234 FX_LPBYTE dest_extra_alpha_scan) { |
| 235 ASSERT(!m_pDevice->IsCmykImage()); |
| 236 ASSERT(!m_bRgbByteOrder); |
| 237 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left; |
| 238 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left; |
| 239 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 240 int col_end = |
| 241 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 242 if (col_end < col_start) |
| 243 return; // do nothing. |
| 244 dest_scan += col_start; |
| 245 ori_scan += col_start; |
| 246 if (m_Alpha == 255 && cover_scan == 255) { |
| 247 FXSYS_memset32(dest_scan, |
| 248 FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), |
| 249 col_end - col_start); |
| 250 } else { |
| 251 int src_alpha = m_Alpha; |
185 #if 1 | 252 #if 1 |
186 » » » for (int col = col_start; col < col_end; col ++) { | 253 for (int col = col_start; col < col_end; col++) { |
187 » » » » int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray
, src_alpha); | 254 int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
188 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray,
cover_scan); | 255 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan); |
189 » » » » dest_scan ++; | 256 dest_scan++; |
190 » » » } | 257 } |
191 #else | 258 #else |
192 » » » if (m_bFullCover) { | 259 if (m_bFullCover) { |
193 » » » » if (src_alpha == 255) { | 260 if (src_alpha == 255) { |
194 » » » » » FXSYS_memset(dest_scan, FXARGB_MAKE(m_Gr
ay, m_Gray, m_Gray, m_Gray), col_end - col_start); | 261 FXSYS_memset(dest_scan, |
195 » » » » » return; | 262 FXARGB_MAKE(m_Gray, m_Gray, m_Gray, m_Gray), |
196 » » » » } | 263 col_end - col_start); |
197 » » » » for (int col = col_start; col < col_end; col ++) | 264 return; |
198 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan
++, m_Gray, src_alpha); | 265 } |
199 » » » } else { | 266 for (int col = col_start; col < col_end; col++) |
200 » » » » for (int col = col_start; col < col_end; col ++)
{ | 267 *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
201 » » » » » int gray = FXDIB_ALPHA_MERGE(*ori_scan++
, m_Gray, src_alpha); | 268 } else { |
202 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, gray, cover_scan); | 269 for (int col = col_start; col < col_end; col++) { |
203 » » » » » dest_scan++; | 270 int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
204 » » » » } | 271 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan); |
205 » » » } | 272 dest_scan++; |
| 273 } |
| 274 } |
206 #endif | 275 #endif |
207 » » } | 276 } |
208 » } | 277 } |
209 | 278 |
210 » void CFX_SkiaRenderer::CompositeSpanGray_6(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 279 void CFX_SkiaRenderer::CompositeSpanGray_6(FX_LPBYTE dest_scan, |
211 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 280 FX_LPBYTE ori_scan, |
212 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 281 int Bpp, |
213 » » » FX_LPBYTE dest_extra_alpha_scan) | 282 int span_left, |
214 » { | 283 int span_len, |
215 » » ASSERT(!m_bRgbByteOrder); | 284 int span_top, |
216 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft; | 285 FX_BYTE cover_scan, |
217 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 286 int clip_top, |
218 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 287 int clip_left, |
219 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 288 int clip_right, |
220 » » if (col_end < col_start) return; // do nothing. | 289 FX_LPBYTE clip_scan, |
221 » » dest_scan += col_start; | 290 FX_LPBYTE dest_extra_alpha_scan) { |
222 » » int src_alpha = m_Alpha * cover_scan / 255; | 291 ASSERT(!m_bRgbByteOrder); |
223 » » for (int col = col_start; col < col_end; col ++) { | 292 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left; |
224 » » » int src_alpha1 = src_alpha * clip_scan[col] / 255; | 293 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
225 » » » if (!src_alpha1) { | 294 clip_left + span_left; |
226 » » » » dest_scan ++; | 295 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
227 » » » » continue; | 296 int col_end = |
228 » » » } | 297 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
229 » » » if (src_alpha1 == 255) | 298 if (col_end < col_start) |
230 » » » » *dest_scan++ = m_Gray; | 299 return; // do nothing. |
231 » » » else { | 300 dest_scan += col_start; |
232 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gra
y, src_alpha1); | 301 int src_alpha = m_Alpha * cover_scan / 255; |
233 » » » » dest_scan ++; | 302 for (int col = col_start; col < col_end; col++) { |
234 » » » } | 303 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
235 » » }» | 304 if (!src_alpha1) { |
236 » } | 305 dest_scan++; |
237 | 306 continue; |
238 » void CFX_SkiaRenderer::CompositeSpanGray_7(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 307 } |
239 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 308 if (src_alpha1 == 255) |
240 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 309 *dest_scan++ = m_Gray; |
241 » » » FX_LPBYTE dest_extra_alpha_scan) | 310 else { |
242 » { | 311 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha1); |
243 » » ASSERT(!m_pDevice->IsCmykImage()); | 312 dest_scan++; |
244 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft; | 313 } |
245 » » ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span
_left; | 314 } |
246 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 315 } |
247 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 316 |
248 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 317 void CFX_SkiaRenderer::CompositeSpanGray_7(FX_LPBYTE dest_scan, |
249 » » if (col_end < col_start) return; // do nothing. | 318 FX_LPBYTE ori_scan, |
250 » » dest_scan += col_start; | 319 int Bpp, |
251 » » ori_scan += col_start; | 320 int span_left, |
| 321 int span_len, |
| 322 int span_top, |
| 323 FX_BYTE cover_scan, |
| 324 int clip_top, |
| 325 int clip_left, |
| 326 int clip_right, |
| 327 FX_LPBYTE clip_scan, |
| 328 FX_LPBYTE dest_extra_alpha_scan) { |
| 329 ASSERT(!m_pDevice->IsCmykImage()); |
| 330 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left; |
| 331 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left; |
| 332 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 333 clip_left + span_left; |
| 334 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 335 int col_end = |
| 336 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 337 if (col_end < col_start) |
| 338 return; // do nothing. |
| 339 dest_scan += col_start; |
| 340 ori_scan += col_start; |
252 #if 1 | 341 #if 1 |
253 » » for (int col = col_start; col < col_end; col ++) { | 342 for (int col = col_start; col < col_end; col++) { |
254 » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 343 int src_alpha = m_Alpha * clip_scan[col] / 255; |
255 » » » if (src_alpha == 255 && cover_scan == 255) { | 344 if (src_alpha == 255 && cover_scan == 255) { |
256 » » » » *dest_scan++ = m_Gray; | 345 *dest_scan++ = m_Gray; |
257 » » » » ori_scan++; | 346 ori_scan++; |
258 » » » » continue; | 347 continue; |
259 » » » } | 348 } |
260 » » » int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_al
pha); | 349 int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
261 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_s
can); | 350 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan); |
262 » » » dest_scan++; | 351 dest_scan++; |
263 » » } | 352 } |
264 | 353 |
265 #else | 354 #else |
266 » » if (m_bFullCover) { | 355 if (m_bFullCover) { |
267 » » » for (int col = col_start; col < col_end; col ++) { | 356 for (int col = col_start; col < col_end; col++) { |
268 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 357 int src_alpha = m_Alpha * clip_scan[col] / 255; |
269 » » » » if (!src_alpha) { | 358 if (!src_alpha) { |
270 » » » » » dest_scan++; | 359 dest_scan++; |
271 » » » » » ori_scan++; | 360 ori_scan++; |
272 » » » » » continue; | 361 continue; |
273 » » » » } | 362 } |
274 » » » » if (src_alpha == 255){ | 363 if (src_alpha == 255) { |
275 » » » » » *dest_scan++ = m_Gray; | 364 *dest_scan++ = m_Gray; |
276 » » » » » ori_scan++; | 365 ori_scan++; |
277 » » » » » continue; | 366 continue; |
278 » » » » } | 367 } |
279 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Gray, src_alpha); | 368 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
280 » » » } | 369 } |
281 » » } else { | 370 } else { |
282 » » » for (int col = col_start; col < col_end; col ++) { | 371 for (int col = col_start; col < col_end; col++) { |
283 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 372 int src_alpha = m_Alpha * clip_scan[col] / 255; |
284 » » » » if (src_alpha == 255 && cover_scan == 255) { | 373 if (src_alpha == 255 && cover_scan == 255) { |
285 » » » » » *dest_scan++ = m_Gray; | 374 *dest_scan++ = m_Gray; |
286 » » » » » ori_scan++; | 375 ori_scan++; |
287 » » » » » continue; | 376 continue; |
288 » » » » } | 377 } |
289 » » » » int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray
, src_alpha); | 378 int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); |
290 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray,
cover_scan); | 379 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan); |
291 » » » » dest_scan++; | 380 dest_scan++; |
292 » » » } | 381 } |
293 » » } | 382 } |
294 #endif | 383 #endif |
295 » } | 384 } |
296 » /*----------------------------------------------------------------------
----------------------------*/ | 385 /*------------------------------------------------------------------------------
--------------------*/ |
297 | 386 |
298 » void CFX_SkiaRenderer::CompositeSpanARGB_2(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 387 void CFX_SkiaRenderer::CompositeSpanARGB_2(FX_LPBYTE dest_scan, |
299 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 388 FX_LPBYTE ori_scan, |
300 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 389 int Bpp, |
301 » » » FX_LPBYTE dest_extra_alpha_scan) | 390 int span_left, |
302 » { | 391 int span_len, |
303 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 392 int span_top, |
304 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 393 FX_BYTE cover_scan, |
305 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 394 int clip_top, |
306 » » if (col_end < col_start) return; // do nothing. | 395 int clip_left, |
307 » » dest_scan += col_start<<2; | 396 int clip_right, |
308 » » if (m_Alpha == 255 && cover_scan == 255) { | 397 FX_LPBYTE clip_scan, |
309 » » » FXSYS_memset32(dest_scan, m_Color, (col_end - col_start)
<<2); | 398 FX_LPBYTE dest_extra_alpha_scan) { |
310 » » » return; | 399 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
311 » » } | 400 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
312 » » int src_alpha; | 401 int col_end = |
| 402 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 403 if (col_end < col_start) |
| 404 return; // do nothing. |
| 405 dest_scan += col_start << 2; |
| 406 if (m_Alpha == 255 && cover_scan == 255) { |
| 407 FXSYS_memset32(dest_scan, m_Color, (col_end - col_start) << 2); |
| 408 return; |
| 409 } |
| 410 int src_alpha; |
313 #if 0 | 411 #if 0 |
314 if (m_bFullCover) { | 412 if (m_bFullCover) { |
315 if (m_Alpha == 255) { | 413 if (m_Alpha == 255) { |
316 FXSYS_memset32(dest_scan, m_Color, (col_end - co
l_start)<<2); | 414 FXSYS_memset32(dest_scan, m_Color, (col_end - co
l_start)<<2); |
317 return; | 415 return; |
318 } | 416 } |
319 } | 417 } |
320 » » else | 418 » » else |
321 #endif | 419 #endif |
322 » » » src_alpha = m_Alpha * cover_scan / 255; | 420 src_alpha = m_Alpha * cover_scan / 255; |
323 » » for (int col = col_start; col < col_end; col ++) { | 421 for (int col = col_start; col < col_end; col++) { |
324 » » » // Dest format: Argb | 422 // Dest format: Argb |
325 » » » // calculate destination alpha (it's union of source and
dest alpha) | 423 // calculate destination alpha (it's union of source and dest alpha) |
326 » » » if (dest_scan[3] == 0) { | 424 if (dest_scan[3] == 0) { |
327 » » » » dest_scan[3] = src_alpha; | 425 dest_scan[3] = src_alpha; |
328 » » » » *dest_scan++ = m_Blue; | 426 *dest_scan++ = m_Blue; |
329 » » » » *dest_scan++ = m_Green; | 427 *dest_scan++ = m_Green; |
330 » » » » *dest_scan = m_Red; | 428 *dest_scan = m_Red; |
331 » » » » dest_scan += 2; | 429 dest_scan += 2; |
332 » » » » continue; | 430 continue; |
333 » » » } | 431 } |
334 » » » FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_sca
n[3] * src_alpha / 255; | 432 FX_BYTE dest_alpha = |
335 » » » dest_scan[3] = dest_alpha; | 433 dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; |
336 » » » int alpha_ratio = src_alpha*255/dest_alpha; | 434 dest_scan[3] = dest_alpha; |
337 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha
_ratio); | 435 int alpha_ratio = src_alpha * 255 / dest_alpha; |
338 » » » dest_scan ++; | 436 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
339 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alph
a_ratio); | 437 dest_scan++; |
340 » » » dest_scan ++; | 438 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
341 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_
ratio); | 439 dest_scan++; |
342 » » » dest_scan += 2; | 440 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
343 » » } | 441 dest_scan += 2; |
344 » } | 442 } |
| 443 } |
345 | 444 |
346 » void CFX_SkiaRenderer::CompositeSpanARGB_3(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 445 void CFX_SkiaRenderer::CompositeSpanARGB_3(FX_LPBYTE dest_scan, |
347 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 446 FX_LPBYTE ori_scan, |
348 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 447 int Bpp, |
349 » » » FX_LPBYTE dest_extra_alpha_scan) | 448 int span_left, |
350 » { | 449 int span_len, |
351 » » ASSERT(!m_pDevice->IsCmykImage()); | 450 int span_top, |
352 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 451 FX_BYTE cover_scan, |
353 » » //ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (s
pan_left<<2); | 452 int clip_top, |
354 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 453 int clip_left, |
355 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 454 int clip_right, |
356 » » if (col_end < col_start) return; // do nothing. | 455 FX_LPBYTE clip_scan, |
357 » » dest_scan += col_start << 2; | 456 FX_LPBYTE dest_extra_alpha_scan) { |
358 » » //ori_scan += col_start << 2; | 457 ASSERT(!m_pDevice->IsCmykImage()); |
| 458 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
| 459 // ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2); |
| 460 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 461 int col_end = |
| 462 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 463 if (col_end < col_start) |
| 464 return; // do nothing. |
| 465 dest_scan += col_start << 2; |
| 466 // ori_scan += col_start << 2; |
359 | 467 |
360 » » if (m_Alpha == 255 && cover_scan == 255){ | 468 if (m_Alpha == 255 && cover_scan == 255) { |
361 » » » FXSYS_memset32(dest_scan, m_Color, (col_end - col_start)
<<2); | 469 FXSYS_memset32(dest_scan, m_Color, (col_end - col_start) << 2); |
362 » » » return; | 470 return; |
363 » » }» » | 471 } |
364 » » if (cover_scan == 255) { | 472 if (cover_scan == 255) { |
365 » » » int dst_color = (0x00ffffff&m_Color)|(m_Alpha<<24); | 473 int dst_color = (0x00ffffff & m_Color) | (m_Alpha << 24); |
366 » » » FXSYS_memset32(dest_scan, dst_color, (col_end - col_star
t)<<2); | 474 FXSYS_memset32(dest_scan, dst_color, (col_end - col_start) << 2); |
367 » » » return; | 475 return; |
368 » » } | 476 } |
369 » » // Do not need origin bitmap, because of merge in pure transpare
nt background | 477 // Do not need origin bitmap, because of merge in pure transparent background |
370 » » int src_alpha_covered = m_Alpha * cover_scan / 255; | 478 int src_alpha_covered = m_Alpha * cover_scan / 255; |
371 » » for (int col = col_start; col < col_end; col ++) | 479 for (int col = col_start; col < col_end; col++) { |
372 » » { | 480 // shortcut |
373 » » » // shortcut | 481 if (dest_scan[3] == 0) { |
374 » » » if (dest_scan[3] == 0) { | 482 dest_scan[3] = src_alpha_covered; |
375 » » » » dest_scan[3] = src_alpha_covered; | 483 *dest_scan++ = m_Blue; |
376 » » » » *dest_scan ++ = m_Blue; | 484 *dest_scan++ = m_Green; |
377 » » » » *dest_scan ++ = m_Green; | 485 *dest_scan = m_Red; |
378 » » » » *dest_scan = m_Red; | 486 dest_scan += 2; |
379 » » » » dest_scan += 2; | 487 continue; |
380 » » » » continue; | 488 } |
381 » » » } | 489 // We should do alpha transition and color transition |
382 » » » // We should do alpha transition and color transition | 490 // alpha fg color fg |
383 » » » // alpha fg color fg | 491 // alpha bg color bg |
384 » » » // alpha bg color bg | 492 // alpha cover color cover |
385 » » » // alpha cover color cover | 493 dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], m_Alpha, cover_scan); |
386 » » » dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], m_Alpha,
cover_scan); | 494 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover_scan); |
387 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover
_scan); | 495 dest_scan++; |
388 » » » dest_scan ++; | 496 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover_scan); |
389 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cove
r_scan); | 497 dest_scan++; |
390 » » » dest_scan ++; | 498 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_scan); |
391 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_
scan); | 499 dest_scan += 2; |
392 » » » dest_scan += 2; | 500 } |
393 » » } | 501 } |
394 » } | 502 void CFX_SkiaRenderer::CompositeSpanARGB_6(FX_LPBYTE dest_scan, |
395 » void CFX_SkiaRenderer::CompositeSpanARGB_6(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 503 FX_LPBYTE ori_scan, |
396 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 504 int Bpp, |
397 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 505 int span_left, |
398 » » » FX_LPBYTE dest_extra_alpha_scan) | 506 int span_len, |
399 » { | 507 int span_top, |
400 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 508 FX_BYTE cover_scan, |
401 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 509 int clip_top, |
402 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 510 int clip_left, |
403 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 511 int clip_right, |
404 » » if (col_end < col_start) return; // do nothing. | 512 FX_LPBYTE clip_scan, |
405 » » dest_scan += col_start << 2; | 513 FX_LPBYTE dest_extra_alpha_scan) { |
| 514 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
| 515 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 516 clip_left + span_left; |
| 517 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 518 int col_end = |
| 519 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 520 if (col_end < col_start) |
| 521 return; // do nothing. |
| 522 dest_scan += col_start << 2; |
406 #if 1 | 523 #if 1 |
407 » » int src_alpha = m_Alpha * cover_scan / 255; | 524 int src_alpha = m_Alpha * cover_scan / 255; |
408 » » for (int col = col_start; col < col_end; col ++) { | 525 for (int col = col_start; col < col_end; col++) { |
409 » » » int src_alpha1 = src_alpha* clip_scan[col] / 255; | 526 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
410 » » » if (!src_alpha1) { | 527 if (!src_alpha1) { |
411 » » » » dest_scan += 4; | 528 dest_scan += 4; |
412 » » » » continue; | 529 continue; |
413 » » » } | 530 } |
414 » » » if (src_alpha1 == 255) { | 531 if (src_alpha1 == 255) { |
415 » » » » *(FX_DWORD*)dest_scan = m_Color; | 532 *(FX_DWORD*)dest_scan = m_Color; |
416 » » » » dest_scan += 4; | 533 dest_scan += 4; |
417 » » » } else { | 534 } else { |
418 » » » » // Dest format: Argb | 535 // Dest format: Argb |
419 » » » » // calculate destination alpha (it's union of so
urce and dest alpha) | 536 // calculate destination alpha (it's union of source and dest alpha) |
420 » » » » if (dest_scan[3] == 0) { | 537 if (dest_scan[3] == 0) { |
421 » » » » » dest_scan[3] = src_alpha1; | 538 dest_scan[3] = src_alpha1; |
422 » » » » » *dest_scan++ = m_Blue; | 539 *dest_scan++ = m_Blue; |
423 » » » » » *dest_scan++ = m_Green; | 540 *dest_scan++ = m_Green; |
424 » » » » » *dest_scan = m_Red; | 541 *dest_scan = m_Red; |
425 » » » » » dest_scan += 2; | 542 dest_scan += 2; |
426 » » » » » continue; | 543 continue; |
427 » » » » } | 544 } |
428 » » » » FX_BYTE dest_alpha = dest_scan[3] + src_alpha1 -
dest_scan[3] * src_alpha1 / 255; | 545 FX_BYTE dest_alpha = |
429 » » » » dest_scan[3] = dest_alpha; | 546 dest_scan[3] + src_alpha1 - dest_scan[3] * src_alpha1 / 255; |
430 » » » » int alpha_ratio = src_alpha1*255/dest_alpha; | 547 dest_scan[3] = dest_alpha; |
431 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, alpha_ratio); | 548 int alpha_ratio = src_alpha1 * 255 / dest_alpha; |
432 » » » » dest_scan ++; | 549 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
433 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, alpha_ratio); | 550 dest_scan++; |
434 » » » » dest_scan ++; | 551 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
435 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, alpha_ratio); | 552 dest_scan++; |
436 » » » » dest_scan += 2; | 553 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
437 » » » } | 554 dest_scan += 2; |
438 » » } | 555 } |
| 556 } |
439 #else | 557 #else |
440 » » if (m_bFullCover) { | 558 if (m_bFullCover) { |
441 » » » for (int col = col_start; col < col_end; col ++) { | 559 for (int col = col_start; col < col_end; col++) { |
442 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 560 int src_alpha = m_Alpha * clip_scan[col] / 255; |
443 » » » » if (!src_alpha) { | 561 if (!src_alpha) { |
444 » » » » » dest_scan += 4; | 562 dest_scan += 4; |
445 » » » » » continue; | 563 continue; |
446 » » » » } | 564 } |
447 » » » » if (src_alpha == 255){ | 565 if (src_alpha == 255) { |
448 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 566 *(FX_DWORD*)dest_scan = m_Color; |
449 » » » » » dest_scan += 4; | 567 dest_scan += 4; |
450 » » » » » continue; | 568 continue; |
451 » » » » } else { | 569 } else { |
452 » » » » » // Dest format: Argb | 570 // Dest format: Argb |
453 » » » » » // calculate destination alpha (it's uni
on of source and dest alpha) | 571 // calculate destination alpha (it's union of source and dest alpha) |
454 » » » » » if (dest_scan[3] == 0) { | 572 if (dest_scan[3] == 0) { |
455 » » » » » » dest_scan[3] = src_alpha; | 573 dest_scan[3] = src_alpha; |
456 » » » » » » *dest_scan++ = m_Blue; | 574 *dest_scan++ = m_Blue; |
457 » » » » » » *dest_scan++ = m_Green; | 575 *dest_scan++ = m_Green; |
458 » » » » » » *dest_scan = m_Red; | 576 *dest_scan = m_Red; |
459 » » » » » » dest_scan += 2; | 577 dest_scan += 2; |
460 » » » » » » continue; | 578 continue; |
461 » » » » » } | 579 } |
462 » » » » » FX_BYTE dest_alpha = dest_scan[3] + src_
alpha - dest_scan[3] * src_alpha / 255; | 580 FX_BYTE dest_alpha = |
463 » » » » » dest_scan[3] = dest_alpha; | 581 dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; |
464 » » » » » int alpha_ratio = src_alpha*255/dest_alp
ha; | 582 dest_scan[3] = dest_alpha; |
465 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, alpha_ratio); | 583 int alpha_ratio = src_alpha * 255 / dest_alpha; |
466 » » » » » dest_scan ++; | 584 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
467 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, alpha_ratio); | 585 dest_scan++; |
468 » » » » » dest_scan ++; | 586 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
469 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, alpha_ratio); | 587 dest_scan++; |
470 » » » » » dest_scan += 2; | 588 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
471 » » » » } | 589 dest_scan += 2; |
472 » » » } | 590 } |
473 » » } else { | 591 } |
474 » » » int src_alpha = m_Alpha * cover_scan / 255; | 592 } else { |
475 » » » for (int col = col_start; col < col_end; col ++) { | 593 int src_alpha = m_Alpha * cover_scan / 255; |
476 » » » » int src_alpha1 = src_alpha* clip_scan[col] / 255
; | 594 for (int col = col_start; col < col_end; col++) { |
477 » » » » if (!src_alpha1) { | 595 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
478 » » » » » dest_scan += 4; | 596 if (!src_alpha1) { |
479 » » » » » continue; | 597 dest_scan += 4; |
480 » » » » } | 598 continue; |
481 » » » » if (src_alpha1 == 255) { | 599 } |
482 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 600 if (src_alpha1 == 255) { |
483 » » » » » dest_scan += 4; | 601 *(FX_DWORD*)dest_scan = m_Color; |
484 » » » » } else { | 602 dest_scan += 4; |
485 » » » » » // Dest format: Argb | 603 } else { |
486 » » » » » // calculate destination alpha (it's uni
on of source and dest alpha) | 604 // Dest format: Argb |
487 » » » » » if (dest_scan[3] == 0) { | 605 // calculate destination alpha (it's union of source and dest alpha) |
488 » » » » » » dest_scan[3] = src_alpha1; | 606 if (dest_scan[3] == 0) { |
489 » » » » » » *dest_scan++ = m_Blue; | 607 dest_scan[3] = src_alpha1; |
490 » » » » » » *dest_scan++ = m_Green; | 608 *dest_scan++ = m_Blue; |
491 » » » » » » *dest_scan = m_Red; | 609 *dest_scan++ = m_Green; |
492 » » » » » » dest_scan += 2; | 610 *dest_scan = m_Red; |
493 » » » » » » continue; | 611 dest_scan += 2; |
494 » » » » » } | 612 continue; |
495 » » » » » FX_BYTE dest_alpha = dest_scan[3] + src_
alpha1 - dest_scan[3] * src_alpha1 / 255; | 613 } |
496 » » » » » dest_scan[3] = dest_alpha; | 614 FX_BYTE dest_alpha = |
497 » » » » » int alpha_ratio = src_alpha1*255/dest_al
pha; | 615 dest_scan[3] + src_alpha1 - dest_scan[3] * src_alpha1 / 255; |
498 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, alpha_ratio); | 616 dest_scan[3] = dest_alpha; |
499 » » » » » dest_scan ++; | 617 int alpha_ratio = src_alpha1 * 255 / dest_alpha; |
500 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, alpha_ratio); | 618 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
501 » » » » » dest_scan ++; | 619 dest_scan++; |
502 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, alpha_ratio); | 620 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
503 » » » » » dest_scan += 2; | 621 dest_scan++; |
504 » » » » } | 622 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
505 » » » } | 623 dest_scan += 2; |
506 » » } | 624 } |
| 625 } |
| 626 } |
507 #endif | 627 #endif |
508 » } | 628 } |
509 | 629 |
510 » void CFX_SkiaRenderer::CompositeSpanARGB_7(FX_LPBYTE dest_scan, FX_LPBYT
E ori_scan,int Bpp, | 630 void CFX_SkiaRenderer::CompositeSpanARGB_7(FX_LPBYTE dest_scan, |
511 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 631 FX_LPBYTE ori_scan, |
512 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 632 int Bpp, |
513 » » » FX_LPBYTE dest_extra_alpha_scan) | 633 int span_left, |
514 » { | 634 int span_len, |
515 » » ASSERT(!m_pDevice->IsCmykImage()); | 635 int span_top, |
516 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 636 FX_BYTE cover_scan, |
517 » » //ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (s
pan_left<<2); | 637 int clip_top, |
518 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 638 int clip_left, |
519 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 639 int clip_right, |
520 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 640 FX_LPBYTE clip_scan, |
521 » » if (col_end < col_start) return; // do nothing. | 641 FX_LPBYTE dest_extra_alpha_scan) { |
522 » » dest_scan += col_start << 2; | 642 ASSERT(!m_pDevice->IsCmykImage()); |
523 » » //ori_scan += col_start << 2; | 643 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
524 » » // Do not need origin bitmap, because of merge in pure transpare
nt background | 644 // ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left<<2); |
525 » » for (int col = col_start; col < col_end; col ++) | 645 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
526 » » { | 646 clip_left + span_left; |
527 » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 647 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
528 » » » int src_alpha_covered = src_alpha * cover_scan / 255; | 648 int col_end = |
529 » » » // shortcut | 649 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
530 » » » if (src_alpha_covered == 0){ | 650 if (col_end < col_start) |
531 » » » » dest_scan += 4; | 651 return; // do nothing. |
532 » » » » continue; | 652 dest_scan += col_start << 2; |
533 » » » } | 653 // ori_scan += col_start << 2; |
534 » » » // shortcut | 654 // Do not need origin bitmap, because of merge in pure transparent background |
535 » » » if (cover_scan == 255 || dest_scan[3] == 0) | 655 for (int col = col_start; col < col_end; col++) { |
536 » » » { | 656 int src_alpha = m_Alpha * clip_scan[col] / 255; |
537 » » » » // origin alpha always zero, just get src alpha | 657 int src_alpha_covered = src_alpha * cover_scan / 255; |
538 » » » » dest_scan[3] = src_alpha_covered; | 658 // shortcut |
539 » » » » *dest_scan ++ = m_Blue; | 659 if (src_alpha_covered == 0) { |
540 » » » » *dest_scan ++ = m_Green; | 660 dest_scan += 4; |
541 » » » » *dest_scan = m_Red; | 661 continue; |
542 » » » » dest_scan += 2; | 662 } |
543 » » » » continue; | 663 // shortcut |
544 » » » } | 664 if (cover_scan == 255 || dest_scan[3] == 0) { |
545 » » » // We should do alpha transition and color transition | 665 // origin alpha always zero, just get src alpha |
546 » » » // alpha fg color fg | 666 dest_scan[3] = src_alpha_covered; |
547 » » » // alpha bg color bg | 667 *dest_scan++ = m_Blue; |
548 » » » // alpha cover color cover | 668 *dest_scan++ = m_Green; |
549 » » » dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha
, cover_scan); | 669 *dest_scan = m_Red; |
550 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover
_scan); | 670 dest_scan += 2; |
551 » » » dest_scan ++; | 671 continue; |
552 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cove
r_scan); | 672 } |
553 » » » dest_scan ++; | 673 // We should do alpha transition and color transition |
554 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_
scan); | 674 // alpha fg color fg |
555 » » » dest_scan += 2; | 675 // alpha bg color bg |
556 » » } | 676 // alpha cover color cover |
557 » } | 677 dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover_scan); |
558 » | 678 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover_scan); |
559 » /*----------------------------------------------------------------------
-------------------------------------*/ | 679 dest_scan++; |
560 » void CFX_SkiaRenderer::CompositeSpanRGB32_2(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 680 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover_scan); |
561 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 681 dest_scan++; |
562 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 682 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover_scan); |
563 » » » FX_LPBYTE dest_extra_alpha_scan) | 683 dest_scan += 2; |
564 » { | 684 } |
565 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 685 } |
566 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 686 |
567 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 687 /*------------------------------------------------------------------------------
-----------------------------*/ |
568 » » if (col_end < col_start) return; // do nothing. | 688 void CFX_SkiaRenderer::CompositeSpanRGB32_2(FX_LPBYTE dest_scan, |
569 » » dest_scan += (col_start << 2); | 689 FX_LPBYTE ori_scan, |
570 » » if (m_Alpha == 255 && cover_scan == 255) { | 690 int Bpp, |
571 » » » FXSYS_memset32(dest_scan, m_Color, (col_end - col_start)
<<2); | 691 int span_left, |
572 » » » return; | 692 int span_len, |
573 » » } | 693 int span_top, |
574 » » int src_alpha; | 694 FX_BYTE cover_scan, |
| 695 int clip_top, |
| 696 int clip_left, |
| 697 int clip_right, |
| 698 FX_LPBYTE clip_scan, |
| 699 FX_LPBYTE dest_extra_alpha_scan) { |
| 700 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
| 701 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 702 int col_end = |
| 703 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 704 if (col_end < col_start) |
| 705 return; // do nothing. |
| 706 dest_scan += (col_start << 2); |
| 707 if (m_Alpha == 255 && cover_scan == 255) { |
| 708 FXSYS_memset32(dest_scan, m_Color, (col_end - col_start) << 2); |
| 709 return; |
| 710 } |
| 711 int src_alpha; |
575 #if 0 | 712 #if 0 |
576 if (m_bFullCover) | 713 if (m_bFullCover) |
577 src_alpha = m_Alpha; | 714 src_alpha = m_Alpha; |
578 » » else | 715 » » else |
579 #endif | 716 #endif |
580 » » » src_alpha = m_Alpha * cover_scan / 255; | 717 src_alpha = m_Alpha * cover_scan / 255; |
581 » » for (int col = col_start; col < col_end; col ++) { | 718 for (int col = col_start; col < col_end; col++) { |
582 » » » // Dest format: Rgb32 | 719 // Dest format: Rgb32 |
583 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_a
lpha); | 720 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
584 » » » dest_scan ++; | 721 dest_scan++; |
585 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_
alpha); | 722 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
586 » » » dest_scan ++; | 723 dest_scan++; |
587 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_al
pha); | 724 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
588 » » » dest_scan += 2; | 725 dest_scan += 2; |
589 » » } | 726 } |
590 » } | 727 } |
591 » void CFX_SkiaRenderer::CompositeSpanRGB32_3(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 728 void CFX_SkiaRenderer::CompositeSpanRGB32_3(FX_LPBYTE dest_scan, |
592 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 729 FX_LPBYTE ori_scan, |
593 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 730 int Bpp, |
594 » » » FX_LPBYTE dest_extra_alpha_scan) | 731 int span_left, |
595 » { | 732 int span_len, |
596 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 733 int span_top, |
597 » » ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (spa
n_left<<2); | 734 FX_BYTE cover_scan, |
598 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 735 int clip_top, |
599 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 736 int clip_left, |
600 » » if (col_end < col_start) return; // do nothing. | 737 int clip_right, |
601 » » dest_scan += col_start << 2; | 738 FX_LPBYTE clip_scan, |
602 » » ori_scan += col_start << 2; | 739 FX_LPBYTE dest_extra_alpha_scan) { |
603 » » if (m_Alpha == 255 && cover_scan == 255) { | 740 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
604 » » » FXSYS_memset32(dest_scan, m_Color, (col_end - col_start)
<<2); | 741 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left << 2); |
605 » » » return; | 742 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
606 » » } | 743 int col_end = |
607 » » int src_alpha = m_Alpha; | 744 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
608 » » for (int col = col_start; col < col_end; col ++) { | 745 if (col_end < col_start) |
| 746 return; // do nothing. |
| 747 dest_scan += col_start << 2; |
| 748 ori_scan += col_start << 2; |
| 749 if (m_Alpha == 255 && cover_scan == 255) { |
| 750 FXSYS_memset32(dest_scan, m_Color, (col_end - col_start) << 2); |
| 751 return; |
| 752 } |
| 753 int src_alpha = m_Alpha; |
| 754 for (int col = col_start; col < col_end; col++) { |
609 #if 0 | 755 #if 0 |
610 if (m_bFullCover) { | 756 if (m_bFullCover) { |
611 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, src_alpha); | 757 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, src_alpha); |
612 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, src_alpha); | 758 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, src_alpha); |
613 *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red,
src_alpha); | 759 *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red,
src_alpha); |
614 dest_scan += 2; ori_scan += 2; | 760 dest_scan += 2; ori_scan += 2; |
615 continue; | 761 continue; |
616 } | 762 } |
617 #endif | 763 #endif |
618 » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha
); | 764 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
619 » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alph
a); | 765 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
620 » » » int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); | 766 int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); |
621 » » » ori_scan += 2; | 767 ori_scan += 2; |
622 » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_sca
n); | 768 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
623 » » » dest_scan ++; | 769 dest_scan++; |
624 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan
); | 770 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
625 » » » dest_scan ++; | 771 dest_scan++; |
626 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan
); | 772 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
627 » » » dest_scan += 2; | 773 dest_scan += 2; |
628 » » } | 774 } |
629 » } | 775 } |
630 » void CFX_SkiaRenderer::CompositeSpanRGB32_6(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 776 void CFX_SkiaRenderer::CompositeSpanRGB32_6(FX_LPBYTE dest_scan, |
631 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 777 FX_LPBYTE ori_scan, |
632 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 778 int Bpp, |
633 » » » FX_LPBYTE dest_extra_alpha_scan) | 779 int span_left, |
634 » { | 780 int span_len, |
635 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 781 int span_top, |
636 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 782 FX_BYTE cover_scan, |
637 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 783 int clip_top, |
638 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 784 int clip_left, |
639 » » if (col_end < col_start) return; // do nothing. | 785 int clip_right, |
640 » » dest_scan += col_start << 2; | 786 FX_LPBYTE clip_scan, |
| 787 FX_LPBYTE dest_extra_alpha_scan) { |
| 788 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
| 789 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 790 clip_left + span_left; |
| 791 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 792 int col_end = |
| 793 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 794 if (col_end < col_start) |
| 795 return; // do nothing. |
| 796 dest_scan += col_start << 2; |
641 #if 1 | 797 #if 1 |
642 » » int src_alpha = m_Alpha * cover_scan / 255; | 798 int src_alpha = m_Alpha * cover_scan / 255; |
643 » » for (int col = col_start; col < col_end; col ++) { | 799 for (int col = col_start; col < col_end; col++) { |
644 » » » int src_alpha1 = src_alpha * clip_scan[col] / 255; | 800 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
645 » » » if (!src_alpha1) { | 801 if (!src_alpha1) { |
646 » » » » dest_scan += 4; | 802 dest_scan += 4; |
647 » » » » continue; | 803 continue; |
648 » » » } | 804 } |
649 » » » if (src_alpha1 == 255) { | 805 if (src_alpha1 == 255) { |
650 » » » » *(FX_DWORD*)dest_scan = m_Color; | 806 *(FX_DWORD*)dest_scan = m_Color; |
651 » » » » dest_scan += 4; | 807 dest_scan += 4; |
652 » » » } else { | 808 } else { |
653 » » » » // Dest format: Rgb or Rgb32 | 809 // Dest format: Rgb or Rgb32 |
654 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, src_alpha1); | 810 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1); |
655 » » » » dest_scan ++; | 811 dest_scan++; |
656 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, src_alpha1); | 812 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1); |
657 » » » » dest_scan ++; | 813 dest_scan++; |
658 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, src_alpha1); | 814 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1); |
659 » » » » dest_scan += 2; | 815 dest_scan += 2; |
660 » » » }» » » » | 816 } |
661 » » } | 817 } |
662 #else | 818 #else |
663 » » if (m_bFullCover) { | 819 if (m_bFullCover) { |
664 » » » for (int col = col_start; col < col_end; col ++) { | 820 for (int col = col_start; col < col_end; col++) { |
665 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 821 int src_alpha = m_Alpha * clip_scan[col] / 255; |
666 » » » » if (!src_alpha) { | 822 if (!src_alpha) { |
667 » » » » » dest_scan += 4; | 823 dest_scan += 4; |
668 » » » » » continue; | 824 continue; |
669 » » » » } | 825 } |
670 » » » » if (src_alpha == 255) { | 826 if (src_alpha == 255) { |
671 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 827 *(FX_DWORD*)dest_scan = m_Color; |
672 » » » » » dest_scan += 4; | 828 dest_scan += 4; |
673 » » » » } else { | 829 } else { |
674 » » » » » // Dest format: Rgb or Rgb32 | 830 // Dest format: Rgb or Rgb32 |
675 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, src_alpha); | 831 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
676 » » » » » dest_scan ++; | 832 dest_scan++; |
677 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, src_alpha); | 833 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
678 » » » » » dest_scan ++; | 834 dest_scan++; |
679 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, src_alpha); | 835 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
680 » » » » » dest_scan += 2; | 836 dest_scan += 2; |
681 » » » » } | 837 } |
682 » » » } | 838 } |
683 » » } else { | 839 } else { |
684 » » » // Rgb32 | 840 // Rgb32 |
685 » » » int src_alpha = m_Alpha * cover_scan / 255; | 841 int src_alpha = m_Alpha * cover_scan / 255; |
686 » » » for (int col = col_start; col < col_end; col ++) { | 842 for (int col = col_start; col < col_end; col++) { |
687 » » » » int src_alpha1 = src_alpha * clip_scan[col] / 25
5; | 843 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
688 » » » » if (!src_alpha1) { | 844 if (!src_alpha1) { |
689 » » » » » dest_scan += 4; | 845 dest_scan += 4; |
690 » » » » » continue; | 846 continue; |
691 » » » » } | 847 } |
692 » » » » if (src_alpha1 == 255) { | 848 if (src_alpha1 == 255) { |
693 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 849 *(FX_DWORD*)dest_scan = m_Color; |
694 » » » » » dest_scan += 4; | 850 dest_scan += 4; |
695 » » » » } else { | 851 } else { |
696 » » » » » // Dest format: Rgb or Rgb32 | 852 // Dest format: Rgb or Rgb32 |
697 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, src_alpha1); | 853 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1); |
698 » » » » » dest_scan ++; | 854 dest_scan++; |
699 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, src_alpha1); | 855 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1); |
700 » » » » » dest_scan ++; | 856 dest_scan++; |
701 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, src_alpha1); | 857 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1); |
702 » » » » » dest_scan += 2; | 858 dest_scan += 2; |
703 » » » » }» » » » | 859 } |
704 » » » } | 860 } |
705 » » }» » » | 861 } |
706 #endif | 862 #endif |
707 » } | 863 } |
708 » void CFX_SkiaRenderer::CompositeSpanRGB32_7(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 864 void CFX_SkiaRenderer::CompositeSpanRGB32_7(FX_LPBYTE dest_scan, |
709 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 865 FX_LPBYTE ori_scan, |
710 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 866 int Bpp, |
711 » » » FX_LPBYTE dest_extra_alpha_scan) | 867 int span_left, |
712 » { | 868 int span_len, |
713 » » ASSERT(!m_pDevice->IsCmykImage()); | 869 int span_top, |
714 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_l
eft<<2); | 870 FX_BYTE cover_scan, |
715 » » ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (spa
n_left<<2); | 871 int clip_top, |
716 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 872 int clip_left, |
717 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 873 int clip_right, |
718 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 874 FX_LPBYTE clip_scan, |
719 » » if (col_end < col_start) return; // do nothing. | 875 FX_LPBYTE dest_extra_alpha_scan) { |
720 » » dest_scan += col_start << 2; | 876 ASSERT(!m_pDevice->IsCmykImage()); |
721 » » ori_scan += col_start << 2; | 877 dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + (span_left << 2); |
| 878 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + (span_left << 2); |
| 879 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 880 clip_left + span_left; |
| 881 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 882 int col_end = |
| 883 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 884 if (col_end < col_start) |
| 885 return; // do nothing. |
| 886 dest_scan += col_start << 2; |
| 887 ori_scan += col_start << 2; |
722 #if 1 | 888 #if 1 |
723 » » for (int col = col_start; col < col_end; col ++) { | 889 for (int col = col_start; col < col_end; col++) { |
724 » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 890 int src_alpha = m_Alpha * clip_scan[col] / 255; |
725 » » » if (src_alpha == 255 && cover_scan == 255) { | 891 if (src_alpha == 255 && cover_scan == 255) { |
726 » » » » *(FX_DWORD*)dest_scan = m_Color; | 892 *(FX_DWORD*)dest_scan = m_Color; |
727 » » » » dest_scan += 4; | 893 dest_scan += 4; |
728 » » » » ori_scan += 4; | 894 ori_scan += 4; |
729 » » » » continue; | 895 continue; |
730 » » » } | 896 } |
731 » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha
); | 897 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
732 » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alph
a); | 898 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
733 » » » int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); | 899 int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); |
734 » » » ori_scan += 2; | 900 ori_scan += 2; |
735 » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_sca
n); | 901 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
736 » » » dest_scan ++; | 902 dest_scan++; |
737 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan
); | 903 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
738 » » » dest_scan ++; | 904 dest_scan++; |
739 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan
); | 905 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
740 » » » dest_scan += 2; | 906 dest_scan += 2; |
741 » » } | 907 } |
742 #else | 908 #else |
743 » » if (m_bFullCover) { | 909 if (m_bFullCover) { |
744 » » » for (int col = col_start; col < col_end; col ++) { | 910 for (int col = col_start; col < col_end; col++) { |
745 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 911 int src_alpha = m_Alpha * clip_scan[col] / 255; |
746 » » » » if (!src_alpha) { | 912 if (!src_alpha) { |
747 » » » » » *(FX_DWORD*)dest_scan = *(FX_DWORD*)ori_
scan; | 913 *(FX_DWORD*)dest_scan = *(FX_DWORD*)ori_scan; |
748 » » » » » dest_scan += 4; | 914 dest_scan += 4; |
749 » » » » » ori_scan += 4; | 915 ori_scan += 4; |
750 » » » » » continue; | 916 continue; |
751 » » » » } | 917 } |
752 » » » » if (src_alpha == 255) { | 918 if (src_alpha == 255) { |
753 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 919 *(FX_DWORD*)dest_scan = m_Color; |
754 » » » » » dest_scan += 4; | 920 dest_scan += 4; |
755 » » » » » ori_scan += 4; | 921 ori_scan += 4; |
756 » » » » » continue; | 922 continue; |
757 » » » » } | 923 } |
758 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, src_alpha); | 924 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
759 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, src_alpha); | 925 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
760 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red,
src_alpha); | 926 *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); |
761 » » » » dest_scan += 2; ori_scan += 2; | 927 dest_scan += 2; |
762 » » » }» » » | 928 ori_scan += 2; |
763 » » } else { | 929 } |
764 » » » for (int col = col_start; col < col_end; col ++) { | 930 } else { |
765 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 931 for (int col = col_start; col < col_end; col++) { |
766 » » » » if (src_alpha == 255 && cover_scan == 255) { | 932 int src_alpha = m_Alpha * clip_scan[col] / 255; |
767 » » » » » *(FX_DWORD*)dest_scan = m_Color; | 933 if (src_alpha == 255 && cover_scan == 255) { |
768 » » » » » dest_scan += 4; | 934 *(FX_DWORD*)dest_scan = m_Color; |
769 » » » » » ori_scan += 4; | 935 dest_scan += 4; |
770 » » » » » continue; | 936 ori_scan += 4; |
771 » » » » } | 937 continue; |
772 » » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, s
rc_alpha); | 938 } |
773 » » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green,
src_alpha); | 939 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
774 » » » » int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_
alpha); | 940 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
775 » » » » ori_scan += 2; | 941 int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); |
776 » » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, c
over_scan); | 942 ori_scan += 2; |
777 » » » » dest_scan ++; | 943 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
778 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, co
ver_scan); | 944 dest_scan++; |
779 » » » » dest_scan ++; | 945 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
780 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, co
ver_scan); | 946 dest_scan++; |
781 » » » » dest_scan += 2; | 947 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
782 » » » } | 948 dest_scan += 2; |
783 » » } | 949 } |
784 #endif | 950 } |
785 » } | 951 #endif |
786 » /*----------------------------------------------------------------------
-------------------------------*/ | 952 } |
787 » void CFX_SkiaRenderer::CompositeSpanRGB24_2(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 953 /*------------------------------------------------------------------------------
-----------------------*/ |
788 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 954 void CFX_SkiaRenderer::CompositeSpanRGB24_2(FX_LPBYTE dest_scan, |
789 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 955 FX_LPBYTE ori_scan, |
790 » » » FX_LPBYTE dest_extra_alpha_scan) | 956 int Bpp, |
791 » { | 957 int span_left, |
792 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft + (span_left<<1); | 958 int span_len, |
793 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 959 int span_top, |
794 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 960 FX_BYTE cover_scan, |
795 » » if (col_end < col_start) return; // do nothing. | 961 int clip_top, |
796 » » dest_scan += (col_start<<1)+col_start; | 962 int clip_left, |
797 » » int src_alpha; | 963 int clip_right, |
| 964 FX_LPBYTE clip_scan, |
| 965 FX_LPBYTE dest_extra_alpha_scan) { |
| 966 dest_scan = |
| 967 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
| 968 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 969 int col_end = |
| 970 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 971 if (col_end < col_start) |
| 972 return; // do nothing. |
| 973 dest_scan += (col_start << 1) + col_start; |
| 974 int src_alpha; |
798 #if 0 | 975 #if 0 |
799 if (m_bFullCover) | 976 if (m_bFullCover) |
800 src_alpha = m_Alpha; | 977 src_alpha = m_Alpha; |
801 » » else | 978 » » else |
802 #endif | 979 #endif |
803 » » » src_alpha = m_Alpha * cover_scan / 255; | 980 src_alpha = m_Alpha * cover_scan / 255; |
804 » » if (src_alpha == 255) { | 981 if (src_alpha == 255) { |
805 » » » for (int col = col_start; col < col_end; col ++) { | 982 for (int col = col_start; col < col_end; col++) { |
806 » » » » *dest_scan++ = m_Blue; | 983 *dest_scan++ = m_Blue; |
807 » » » » *dest_scan++ = m_Green; | 984 *dest_scan++ = m_Green; |
808 » » » » *dest_scan++ = m_Red; | 985 *dest_scan++ = m_Red; |
809 » » » } | 986 } |
810 » » » return; | 987 return; |
811 » » } | 988 } |
812 » » for (int col = col_start; col < col_end; col ++) { | 989 for (int col = col_start; col < col_end; col++) { |
813 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_a
lpha); | 990 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
814 » » » dest_scan ++; | 991 dest_scan++; |
815 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_
alpha); | 992 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
816 » » » dest_scan ++; | 993 dest_scan++; |
817 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_al
pha); | 994 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
818 » » » dest_scan ++; | 995 dest_scan++; |
819 » » } | 996 } |
820 » } | 997 } |
821 » void CFX_SkiaRenderer::CompositeSpanRGB24_3(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 998 void CFX_SkiaRenderer::CompositeSpanRGB24_3(FX_LPBYTE dest_scan, |
822 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 999 FX_LPBYTE ori_scan, |
823 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1000 int Bpp, |
824 » » » FX_LPBYTE dest_extra_alpha_scan) | 1001 int span_left, |
825 » { | 1002 int span_len, |
826 » » ASSERT(!m_pDevice->IsCmykImage()); | 1003 int span_top, |
827 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft + (span_left<<1); | 1004 FX_BYTE cover_scan, |
828 » » ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span
_left + (span_left<<1); | 1005 int clip_top, |
829 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1006 int clip_left, |
830 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1007 int clip_right, |
831 » » if (col_end < col_start) return; // do nothing. | 1008 FX_LPBYTE clip_scan, |
832 » » dest_scan += (col_start<<1) + col_start; | 1009 FX_LPBYTE dest_extra_alpha_scan) { |
833 » » ori_scan += (col_start<<1) + col_start; | 1010 ASSERT(!m_pDevice->IsCmykImage()); |
834 » » if (m_Alpha == 255&&cover_scan == 255) { | 1011 dest_scan = |
835 » » » for (int col = col_start; col < col_end; col ++) { | 1012 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
836 » » » » *dest_scan ++ = m_Blue; | 1013 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left + |
837 » » » » *dest_scan ++ = m_Green; | 1014 (span_left << 1); |
838 » » » » *dest_scan ++ = m_Red; | 1015 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
839 » » » } | 1016 int col_end = |
840 » » » return; | 1017 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
841 » » } | 1018 if (col_end < col_start) |
842 » » for (int col = col_start; col < col_end; col ++) { | 1019 return; // do nothing. |
| 1020 dest_scan += (col_start << 1) + col_start; |
| 1021 ori_scan += (col_start << 1) + col_start; |
| 1022 if (m_Alpha == 255 && cover_scan == 255) { |
| 1023 for (int col = col_start; col < col_end; col++) { |
| 1024 *dest_scan++ = m_Blue; |
| 1025 *dest_scan++ = m_Green; |
| 1026 *dest_scan++ = m_Red; |
| 1027 } |
| 1028 return; |
| 1029 } |
| 1030 for (int col = col_start; col < col_end; col++) { |
843 #if 0 | 1031 #if 0 |
844 if (m_bFullCover) { | 1032 if (m_bFullCover) { |
845 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, m_Alpha); | 1033 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, m_Alpha); |
846 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, m_Alpha); | 1034 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, m_Alpha); |
847 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Red, m_Alpha); | 1035 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Red, m_Alpha); |
848 continue; | 1036 continue; |
849 } | 1037 } |
850 #endif | 1038 #endif |
851 » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha); | 1039 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha); |
852 » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha)
; | 1040 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha); |
853 » » » int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha); | 1041 int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha); |
854 » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_sca
n); | 1042 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
855 » » » dest_scan ++; | 1043 dest_scan++; |
856 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan
); | 1044 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
857 » » » dest_scan ++; | 1045 dest_scan++; |
858 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan
); | 1046 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
859 » » » dest_scan ++; | 1047 dest_scan++; |
860 » » } | 1048 } |
861 » } | 1049 } |
862 » void CFX_SkiaRenderer::CompositeSpanRGB24_6(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 1050 void CFX_SkiaRenderer::CompositeSpanRGB24_6(FX_LPBYTE dest_scan, |
863 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 1051 FX_LPBYTE ori_scan, |
864 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1052 int Bpp, |
865 » » » FX_LPBYTE dest_extra_alpha_scan) | 1053 int span_left, |
866 » { | 1054 int span_len, |
867 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft+(span_left<<1); | 1055 int span_top, |
868 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 1056 FX_BYTE cover_scan, |
869 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1057 int clip_top, |
870 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1058 int clip_left, |
871 » » if (col_end < col_start) return; // do nothing. | 1059 int clip_right, |
872 » » dest_scan += col_start + (col_start << 1); | 1060 FX_LPBYTE clip_scan, |
| 1061 FX_LPBYTE dest_extra_alpha_scan) { |
| 1062 dest_scan = |
| 1063 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
| 1064 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 1065 clip_left + span_left; |
| 1066 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 1067 int col_end = |
| 1068 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 1069 if (col_end < col_start) |
| 1070 return; // do nothing. |
| 1071 dest_scan += col_start + (col_start << 1); |
873 #if 1 | 1072 #if 1 |
874 » » int src_alpha = m_Alpha * cover_scan /255; | 1073 int src_alpha = m_Alpha * cover_scan / 255; |
875 » » for (int col = col_start; col < col_end; col ++) { | 1074 for (int col = col_start; col < col_end; col++) { |
876 » » » int src_alpha1 = src_alpha * clip_scan[col] / 255;» | 1075 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
877 » » » if (!src_alpha1) { | 1076 if (!src_alpha1) { |
878 » » » » dest_scan += 3; | 1077 dest_scan += 3; |
879 » » » » continue; | 1078 continue; |
880 » » » } | 1079 } |
881 » » » if (src_alpha1 == 255) { | 1080 if (src_alpha1 == 255) { |
882 » » » » *dest_scan++ = m_Blue; | 1081 *dest_scan++ = m_Blue; |
883 » » » » *dest_scan++ = m_Green; | 1082 *dest_scan++ = m_Green; |
884 » » » » *dest_scan++ = m_Red; | 1083 *dest_scan++ = m_Red; |
885 » » » } else { | 1084 } else { |
886 » » » » // Dest format: Rgb | 1085 // Dest format: Rgb |
887 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, src_alpha1); | 1086 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1); |
888 » » » » dest_scan ++; | 1087 dest_scan++; |
889 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, src_alpha1); | 1088 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1); |
890 » » » » dest_scan ++; | 1089 dest_scan++; |
891 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, src_alpha1); | 1090 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1); |
892 » » » » dest_scan ++; | 1091 dest_scan++; |
893 » » » } | 1092 } |
894 » » } | 1093 } |
895 #else | 1094 #else |
896 » » if (m_bFullCover) { | 1095 if (m_bFullCover) { |
897 » » » for (int col = col_start; col < col_end; col ++) { | 1096 for (int col = col_start; col < col_end; col++) { |
898 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255;» | 1097 int src_alpha = m_Alpha * clip_scan[col] / 255; |
899 » » » » if (!src_alpha) { | 1098 if (!src_alpha) { |
900 » » » » » dest_scan += 3; | 1099 dest_scan += 3; |
901 » » » » » continue; | 1100 continue; |
902 » » » » } | 1101 } |
903 » » » » if (src_alpha == 255) { | 1102 if (src_alpha == 255) { |
904 » » » » » *dest_scan++ = m_Blue; | 1103 *dest_scan++ = m_Blue; |
905 » » » » » *dest_scan++ = m_Green; | 1104 *dest_scan++ = m_Green; |
906 » » » » » *dest_scan++ = m_Red; | 1105 *dest_scan++ = m_Red; |
907 » » » » } else { | 1106 } else { |
908 » » » » » // Dest format: Rgb | 1107 // Dest format: Rgb |
909 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, src_alpha); | 1108 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
910 » » » » » dest_scan ++; | 1109 dest_scan++; |
911 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, src_alpha); | 1110 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
912 » » » » » dest_scan ++; | 1111 dest_scan++; |
913 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, src_alpha); | 1112 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
914 » » » » » dest_scan ++; | 1113 dest_scan++; |
915 » » » » } | 1114 } |
916 » » » } | 1115 } |
917 » » } else { | 1116 } else { |
918 » » » int src_alpha = m_Alpha * cover_scan /255; | 1117 int src_alpha = m_Alpha * cover_scan / 255; |
919 » » » for (int col = col_start; col < col_end; col ++) { | 1118 for (int col = col_start; col < col_end; col++) { |
920 » » » » int src_alpha1 = src_alpha * clip_scan[col] / 25
5;» | 1119 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
921 » » » » if (!src_alpha1) { | 1120 if (!src_alpha1) { |
922 » » » » » dest_scan += 3; | 1121 dest_scan += 3; |
923 » » » » » continue; | 1122 continue; |
924 » » » » } | 1123 } |
925 » » » » if (src_alpha1 == 255) { | 1124 if (src_alpha1 == 255) { |
926 » » » » » *dest_scan++ = m_Blue; | 1125 *dest_scan++ = m_Blue; |
927 » » » » » *dest_scan++ = m_Green; | 1126 *dest_scan++ = m_Green; |
928 » » » » » *dest_scan++ = m_Red; | 1127 *dest_scan++ = m_Red; |
929 » » » » } else { | 1128 } else { |
930 » » » » » // Dest format: Rgb | 1129 // Dest format: Rgb |
931 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, src_alpha1); | 1130 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha1); |
932 » » » » » dest_scan ++; | 1131 dest_scan++; |
933 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, src_alpha1); | 1132 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha1); |
934 » » » » » dest_scan ++; | 1133 dest_scan++; |
935 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, src_alpha1); | 1134 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha1); |
936 » » » » » dest_scan ++; | 1135 dest_scan++; |
937 » » » » } | 1136 } |
938 » » » } | 1137 } |
939 » » } | 1138 } |
940 #endif | 1139 #endif |
941 » } | 1140 } |
942 » void CFX_SkiaRenderer::CompositeSpanRGB24_7(FX_LPBYTE dest_scan, FX_LPBY
TE ori_scan,int Bpp, | 1141 void CFX_SkiaRenderer::CompositeSpanRGB24_7(FX_LPBYTE dest_scan, |
943 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 1142 FX_LPBYTE ori_scan, |
944 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1143 int Bpp, |
945 » » » FX_LPBYTE dest_extra_alpha_scan) | 1144 int span_left, |
946 » { | 1145 int span_len, |
947 » » ASSERT(!m_pDevice->IsCmykImage()); | 1146 int span_top, |
948 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft+(span_left<<1); | 1147 FX_BYTE cover_scan, |
949 » » ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span
_left+(span_left<<1); | 1148 int clip_top, |
950 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 1149 int clip_left, |
951 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1150 int clip_right, |
952 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1151 FX_LPBYTE clip_scan, |
953 » » if (col_end < col_start) return; // do nothing. | 1152 FX_LPBYTE dest_extra_alpha_scan) { |
954 » » dest_scan += col_start + (col_start<<1); | 1153 ASSERT(!m_pDevice->IsCmykImage()); |
955 » » ori_scan += col_start + (col_start<<1); | 1154 dest_scan = |
| 1155 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
| 1156 ori_scan = (FX_BYTE*)m_pOriDevice->GetScanline(span_top) + span_left + |
| 1157 (span_left << 1); |
| 1158 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 1159 clip_left + span_left; |
| 1160 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 1161 int col_end = |
| 1162 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 1163 if (col_end < col_start) |
| 1164 return; // do nothing. |
| 1165 dest_scan += col_start + (col_start << 1); |
| 1166 ori_scan += col_start + (col_start << 1); |
956 #if 1 | 1167 #if 1 |
957 » » for (int col = col_start; col < col_end; col ++) { | 1168 for (int col = col_start; col < col_end; col++) { |
958 » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 1169 int src_alpha = m_Alpha * clip_scan[col] / 255; |
959 » » » if (src_alpha == 255 && cover_scan == 255) { | 1170 if (src_alpha == 255 && cover_scan == 255) { |
960 » » » » *dest_scan++ = m_Blue; | 1171 *dest_scan++ = m_Blue; |
961 » » » » *dest_scan++ = m_Green; | 1172 *dest_scan++ = m_Green; |
962 » » » » *dest_scan++ = m_Red; | 1173 *dest_scan++ = m_Red; |
963 » » » » ori_scan += 3; | 1174 ori_scan += 3; |
964 » » » » continue; | 1175 continue; |
965 » » » } | 1176 } |
966 » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha
); | 1177 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
967 » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alph
a); | 1178 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
968 » » » int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha)
; | 1179 int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha); |
969 » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_sca
n); | 1180 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
970 » » » dest_scan ++; | 1181 dest_scan++; |
971 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan
); | 1182 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
972 » » » dest_scan ++; | 1183 dest_scan++; |
973 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan
); | 1184 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
974 » » » dest_scan ++; | 1185 dest_scan++; |
975 » » } | 1186 } |
976 #else | 1187 #else |
977 » » if (m_bFullCover) { | 1188 if (m_bFullCover) { |
978 » » » for (int col = col_start; col < col_end; col ++) { | 1189 for (int col = col_start; col < col_end; col++) { |
979 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 1190 int src_alpha = m_Alpha * clip_scan[col] / 255; |
980 » » » » if (!src_alpha){ | 1191 if (!src_alpha) { |
981 » » » » » *dest_scan++ = *ori_scan++; | 1192 *dest_scan++ = *ori_scan++; |
982 » » » » » *dest_scan++ = *ori_scan++; | 1193 *dest_scan++ = *ori_scan++; |
983 » » » » » *dest_scan++ = *ori_scan++; | 1194 *dest_scan++ = *ori_scan++; |
984 » » » » » continue; | 1195 continue; |
985 » » » » } | 1196 } |
986 » » » » if (src_alpha == 255){ | 1197 if (src_alpha == 255) { |
987 » » » » » *dest_scan++ = m_Blue; | 1198 *dest_scan++ = m_Blue; |
988 » » » » » *dest_scan++ = m_Green; | 1199 *dest_scan++ = m_Green; |
989 » » » » » *dest_scan++ = m_Red; | 1200 *dest_scan++ = m_Red; |
990 » » » » » ori_scan += 3; | 1201 ori_scan += 3; |
991 » » » » » continue; | 1202 continue; |
992 » » » » } | 1203 } |
993 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Blue, src_alpha); | 1204 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
994 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Green, src_alpha); | 1205 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
995 » » » » *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_
Red, src_alpha); | 1206 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha); |
996 » » » } | 1207 } |
997 » » } else { | 1208 } else { |
998 » » » for (int col = col_start; col < col_end; col ++) { | 1209 for (int col = col_start; col < col_end; col++) { |
999 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 1210 int src_alpha = m_Alpha * clip_scan[col] / 255; |
1000 » » » » if (src_alpha == 255 && cover_scan == 255) { | 1211 if (src_alpha == 255 && cover_scan == 255) { |
1001 » » » » » *dest_scan++ = m_Blue; | 1212 *dest_scan++ = m_Blue; |
1002 » » » » » *dest_scan++ = m_Green; | 1213 *dest_scan++ = m_Green; |
1003 » » » » » *dest_scan++ = m_Red; | 1214 *dest_scan++ = m_Red; |
1004 » » » » » ori_scan += 3; | 1215 ori_scan += 3; |
1005 » » » » » continue; | 1216 continue; |
1006 » » » » } | 1217 } |
1007 » » » » int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, s
rc_alpha); | 1218 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
1008 » » » » int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green,
src_alpha); | 1219 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
1009 » » » » int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, sr
c_alpha); | 1220 int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha); |
1010 » » » » *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, c
over_scan); | 1221 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
1011 » » » » dest_scan ++; | 1222 dest_scan++; |
1012 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, co
ver_scan); | 1223 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
1013 » » » » dest_scan ++; | 1224 dest_scan++; |
1014 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, co
ver_scan); | 1225 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
1015 » » » » dest_scan ++; | 1226 dest_scan++; |
1016 » » » } | 1227 } |
1017 » » } | 1228 } |
1018 #endif | 1229 #endif |
1019 » } | 1230 } |
1020 » void CFX_SkiaRenderer::CompositeSpanRGB24_10(FX_LPBYTE dest_scan, FX_LPB
YTE ori_scan,int Bpp, | 1231 void CFX_SkiaRenderer::CompositeSpanRGB24_10(FX_LPBYTE dest_scan, |
1021 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 1232 FX_LPBYTE ori_scan, |
1022 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1233 int Bpp, |
1023 » » » FX_LPBYTE dest_extra_alpha_scan) | 1234 int span_left, |
1024 » { | 1235 int span_len, |
1025 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft+(span_left<<1); | 1236 int span_top, |
1026 » » dest_extra_alpha_scan = (FX_BYTE*)m_pDevice->m_pAlphaMask->GetS
canline(span_top)+span_left; | 1237 FX_BYTE cover_scan, |
1027 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1238 int clip_top, |
1028 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1239 int clip_left, |
1029 » » if (col_end < col_start) return; // do nothing. | 1240 int clip_right, |
1030 » » dest_scan += col_start+(col_start<<1); | 1241 FX_LPBYTE clip_scan, |
| 1242 FX_LPBYTE dest_extra_alpha_scan) { |
| 1243 dest_scan = |
| 1244 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
| 1245 dest_extra_alpha_scan = |
| 1246 (FX_BYTE*)m_pDevice->m_pAlphaMask->GetScanline(span_top) + span_left; |
| 1247 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 1248 int col_end = |
| 1249 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 1250 if (col_end < col_start) |
| 1251 return; // do nothing. |
| 1252 dest_scan += col_start + (col_start << 1); |
1031 #if 1 | 1253 #if 1 |
1032 » » if (m_Alpha == 255 && cover_scan == 255) { | 1254 if (m_Alpha == 255 && cover_scan == 255) { |
1033 » » » for (int col = col_start; col < col_end; col ++) { | 1255 for (int col = col_start; col < col_end; col++) { |
1034 » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1256 *dest_scan++ = (FX_BYTE)m_Blue; |
1035 » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1257 *dest_scan++ = (FX_BYTE)m_Green; |
1036 » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1258 *dest_scan++ = (FX_BYTE)m_Red; |
1037 » » » » *dest_extra_alpha_scan++ = 255; | 1259 *dest_extra_alpha_scan++ = 255; |
1038 » » » } | 1260 } |
1039 » » » return; | 1261 return; |
1040 » » } | 1262 } |
1041 » » int src_alpha = m_Alpha * cover_scan / 255; | 1263 int src_alpha = m_Alpha * cover_scan / 255; |
1042 » » for (int col = col_start; col < col_end; col ++) { | 1264 for (int col = col_start; col < col_end; col++) { |
1043 » » » // Dest format: Rgba | 1265 // Dest format: Rgba |
1044 » » » // calculate destination alpha (it's union of source and
dest alpha) | 1266 // calculate destination alpha (it's union of source and dest alpha) |
1045 » » » FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alph
a - | 1267 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - |
1046 » » » » » » » » (*dest_extra_alp
ha_scan) * src_alpha / 255; | 1268 (*dest_extra_alpha_scan) * src_alpha / 255; |
1047 » » » *dest_extra_alpha_scan++ = dest_alpha; | 1269 *dest_extra_alpha_scan++ = dest_alpha; |
1048 » » » int alpha_ratio = src_alpha*255/dest_alpha; | 1270 int alpha_ratio = src_alpha * 255 / dest_alpha; |
1049 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha
_ratio); | 1271 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1050 » » » dest_scan ++; | 1272 dest_scan++; |
1051 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alph
a_ratio); | 1273 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1052 » » » dest_scan ++; | 1274 dest_scan++; |
1053 » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_
ratio); | 1275 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1054 » » » dest_scan ++;» » » | 1276 dest_scan++; |
1055 » » } | 1277 } |
1056 #else | 1278 #else |
1057 » » if (m_bFullCover) { | 1279 if (m_bFullCover) { |
1058 » » » if (m_Alpha == 255) { | 1280 if (m_Alpha == 255) { |
1059 » » » » for (int col = col_start; col < col_end; col ++)
{ | 1281 for (int col = col_start; col < col_end; col++) { |
1060 » » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1282 *dest_scan++ = (FX_BYTE)m_Blue; |
1061 » » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1283 *dest_scan++ = (FX_BYTE)m_Green; |
1062 » » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1284 *dest_scan++ = (FX_BYTE)m_Red; |
1063 » » » » » *dest_extra_alpha_scan++ = 255; | 1285 *dest_extra_alpha_scan++ = 255; |
1064 » » » » } | 1286 } |
1065 » » » » return; | 1287 return; |
1066 » » » } | 1288 } |
1067 » » » for (int col = col_start; col < col_end; col ++) { | 1289 for (int col = col_start; col < col_end; col++) { |
1068 » » » » // Dest format: Rgba | 1290 // Dest format: Rgba |
1069 » » » » // calculate destination alpha (it's union of so
urce and dest alpha) | 1291 // calculate destination alpha (it's union of source and dest alpha) |
1070 » » » » FX_BYTE dest_alpha = (*dest_extra_alpha_scan) +
m_Alpha - | 1292 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + m_Alpha - |
1071 » » » » » » » » » (*dest_e
xtra_alpha_scan) * m_Alpha / 255; | 1293 (*dest_extra_alpha_scan) * m_Alpha / 255; |
1072 » » » » *dest_extra_alpha_scan++ = dest_alpha; | 1294 *dest_extra_alpha_scan++ = dest_alpha; |
1073 » » » » int alpha_ratio = m_Alpha*255/dest_alpha; | 1295 int alpha_ratio = m_Alpha * 255 / dest_alpha; |
1074 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, alpha_ratio); | 1296 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1075 » » » » dest_scan ++; | 1297 dest_scan++; |
1076 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, alpha_ratio); | 1298 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1077 » » » » dest_scan ++; | 1299 dest_scan++; |
1078 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, alpha_ratio); | 1300 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1079 » » » » dest_scan ++; | 1301 dest_scan++; |
1080 » » » } | 1302 } |
1081 » » } else { | 1303 } else { |
1082 » » » if (m_Alpha == 255 && cover_scan == 255) { | 1304 if (m_Alpha == 255 && cover_scan == 255) { |
1083 » » » » for (int col = col_start; col < col_end; col ++)
{ | 1305 for (int col = col_start; col < col_end; col++) { |
1084 » » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1306 *dest_scan++ = (FX_BYTE)m_Blue; |
1085 » » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1307 *dest_scan++ = (FX_BYTE)m_Green; |
1086 » » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1308 *dest_scan++ = (FX_BYTE)m_Red; |
1087 » » » » » *dest_extra_alpha_scan++ = 255; | 1309 *dest_extra_alpha_scan++ = 255; |
1088 » » » » } | 1310 } |
1089 » » » » return; | 1311 return; |
1090 » » » } | 1312 } |
1091 » » » int src_alpha = m_Alpha * cover_scan / 255; | 1313 int src_alpha = m_Alpha * cover_scan / 255; |
1092 » » » for (int col = col_start; col < col_end; col ++) { | 1314 for (int col = col_start; col < col_end; col++) { |
1093 » » » » // Dest format: Rgba | 1315 // Dest format: Rgba |
1094 » » » » // calculate destination alpha (it's union of so
urce and dest alpha) | 1316 // calculate destination alpha (it's union of source and dest alpha) |
1095 » » » » FX_BYTE dest_alpha = (*dest_extra_alpha_scan) +
src_alpha - | 1317 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - |
1096 » » » » » » » » » (*dest_e
xtra_alpha_scan) * src_alpha / 255; | 1318 (*dest_extra_alpha_scan) * src_alpha / 255; |
1097 » » » » *dest_extra_alpha_scan++ = dest_alpha; | 1319 *dest_extra_alpha_scan++ = dest_alpha; |
1098 » » » » int alpha_ratio = src_alpha*255/dest_alpha; | 1320 int alpha_ratio = src_alpha * 255 / dest_alpha; |
1099 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, alpha_ratio); | 1321 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1100 » » » » dest_scan ++; | 1322 dest_scan++; |
1101 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, alpha_ratio); | 1323 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1102 » » » » dest_scan ++; | 1324 dest_scan++; |
1103 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, alpha_ratio); | 1325 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1104 » » » » dest_scan ++;» » » | 1326 dest_scan++; |
1105 » » » } | 1327 } |
1106 » » } | 1328 } |
1107 #endif | 1329 #endif |
1108 » } | 1330 } |
1109 » void CFX_SkiaRenderer::CompositeSpanRGB24_14(FX_LPBYTE dest_scan, FX_LPB
YTE ori_scan,int Bpp, | 1331 void CFX_SkiaRenderer::CompositeSpanRGB24_14(FX_LPBYTE dest_scan, |
1110 » » » int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 1332 FX_LPBYTE ori_scan, |
1111 » » » int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1333 int Bpp, |
1112 » » » FX_LPBYTE dest_extra_alpha_scan) | 1334 int span_left, |
1113 » { | 1335 int span_len, |
1114 » » dest_scan = (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_le
ft+(span_left<<1); | 1336 int span_top, |
1115 » » dest_extra_alpha_scan = (FX_BYTE*)m_pDevice->m_pAlphaMask->GetS
canline(span_top)+span_left; | 1337 FX_BYTE cover_scan, |
1116 » » clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top-clip_top
) - clip_left + span_left; | 1338 int clip_top, |
1117 » » int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1339 int clip_left, |
1118 » » int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1340 int clip_right, |
1119 » » if (col_end < col_start) return; // do nothing. | 1341 FX_LPBYTE clip_scan, |
1120 » » dest_scan += col_start + (col_start << 1); | 1342 FX_LPBYTE dest_extra_alpha_scan) { |
| 1343 dest_scan = |
| 1344 (FX_BYTE*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
| 1345 dest_extra_alpha_scan = |
| 1346 (FX_BYTE*)m_pDevice->m_pAlphaMask->GetScanline(span_top) + span_left; |
| 1347 clip_scan = (FX_BYTE*)m_pClipMask->GetScanline(span_top - clip_top) - |
| 1348 clip_left + span_left; |
| 1349 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
| 1350 int col_end = |
| 1351 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
| 1352 if (col_end < col_start) |
| 1353 return; // do nothing. |
| 1354 dest_scan += col_start + (col_start << 1); |
1121 #if 1 | 1355 #if 1 |
1122 » » int src_alpha = m_Alpha * cover_scan / 255; | 1356 int src_alpha = m_Alpha * cover_scan / 255; |
1123 » » for (int col = col_start; col < col_end; col ++) { | 1357 for (int col = col_start; col < col_end; col++) { |
1124 » » » int src_alpha1 = src_alpha * clip_scan[col] / 255; | 1358 int src_alpha1 = src_alpha * clip_scan[col] / 255; |
1125 » » » if (!src_alpha1) { | 1359 if (!src_alpha1) { |
1126 » » » » dest_extra_alpha_scan++; | 1360 dest_extra_alpha_scan++; |
1127 » » » » dest_scan += 3; | 1361 dest_scan += 3; |
1128 » » » » continue; | 1362 continue; |
1129 » » » }» » » » | 1363 } |
1130 » » » if (src_alpha1 == 255) { | 1364 if (src_alpha1 == 255) { |
1131 » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1365 *dest_scan++ = (FX_BYTE)m_Blue; |
1132 » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1366 *dest_scan++ = (FX_BYTE)m_Green; |
1133 » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1367 *dest_scan++ = (FX_BYTE)m_Red; |
1134 » » » » *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha; | 1368 *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha; |
1135 » » » } else { | 1369 } else { |
1136 » » » » // Dest format: Rgba | 1370 // Dest format: Rgba |
1137 » » » » // calculate destination alpha (it's union of so
urce and dest alpha) | 1371 // calculate destination alpha (it's union of source and dest alpha) |
1138 » » » » FX_BYTE dest_alpha = (*dest_extra_alpha_scan) +
src_alpha1 - | 1372 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha1 - |
1139 » » » » » » » » » (*dest_e
xtra_alpha_scan) * src_alpha1 / 255; | 1373 (*dest_extra_alpha_scan) * src_alpha1 / 255; |
1140 » » » » *dest_extra_alpha_scan++ = dest_alpha; | 1374 *dest_extra_alpha_scan++ = dest_alpha; |
1141 » » » » int alpha_ratio = src_alpha1*255/dest_alpha; | 1375 int alpha_ratio = src_alpha1 * 255 / dest_alpha; |
1142 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blu
e, alpha_ratio); | 1376 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1143 » » » » dest_scan ++; | 1377 dest_scan++; |
1144 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gre
en, alpha_ratio); | 1378 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1145 » » » » dest_scan ++; | 1379 dest_scan++; |
1146 » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red
, alpha_ratio); | 1380 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1147 » » » » dest_scan ++; | 1381 dest_scan++; |
1148 » » » } | 1382 } |
1149 » » } | 1383 } |
1150 #else | 1384 #else |
1151 » » if (m_bFullCover) { | 1385 if (m_bFullCover) { |
1152 » » » for (int col = col_start; col < col_end; col ++) { | 1386 for (int col = col_start; col < col_end; col++) { |
1153 » » » » int src_alpha = m_Alpha * clip_scan[col] / 255; | 1387 int src_alpha = m_Alpha * clip_scan[col] / 255; |
1154 » » » » if (!src_alpha) { | 1388 if (!src_alpha) { |
1155 » » » » » dest_extra_alpha_scan++; | 1389 dest_extra_alpha_scan++; |
1156 » » » » » dest_scan += 3; | 1390 dest_scan += 3; |
1157 » » » » » continue; | 1391 continue; |
1158 » » » » } | 1392 } |
1159 » » » » if (src_alpha == 255) { | 1393 if (src_alpha == 255) { |
1160 » » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1394 *dest_scan++ = (FX_BYTE)m_Blue; |
1161 » » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1395 *dest_scan++ = (FX_BYTE)m_Green; |
1162 » » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1396 *dest_scan++ = (FX_BYTE)m_Red; |
1163 » » » » » *dest_extra_alpha_scan++ = (FX_BYTE)m_Al
pha; | 1397 *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha; |
1164 » » » » } else { | 1398 } else { |
1165 » » » » » // Dest format: Rgba | 1399 // Dest format: Rgba |
1166 » » » » » // calculate destination alpha (it's uni
on of source and dest alpha) | 1400 // calculate destination alpha (it's union of source and dest alpha) |
1167 » » » » » FX_BYTE dest_alpha = (*dest_extra_alpha_
scan) + src_alpha - | 1401 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - |
1168 » » » » » » » » » »
(*dest_extra_alpha_scan) * src_alpha / 255; | 1402 (*dest_extra_alpha_scan) * src_alpha / 255; |
1169 » » » » » *dest_extra_alpha_scan++ = dest_alpha; | 1403 *dest_extra_alpha_scan++ = dest_alpha; |
1170 » » » » » int alpha_ratio = src_alpha*255/dest_alp
ha; | 1404 int alpha_ratio = src_alpha * 255 / dest_alpha; |
1171 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, alpha_ratio); | 1405 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1172 » » » » » dest_scan ++; | 1406 dest_scan++; |
1173 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, alpha_ratio); | 1407 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1174 » » » » » dest_scan ++; | 1408 dest_scan++; |
1175 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, alpha_ratio); | 1409 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1176 » » » » » dest_scan ++; | 1410 dest_scan++; |
1177 » » » » } | 1411 } |
1178 » » » } | 1412 } |
1179 » » } else { | 1413 } else { |
1180 » » » int src_alpha = m_Alpha * cover_scan / 255; | 1414 int src_alpha = m_Alpha * cover_scan / 255; |
1181 » » » for (int col = col_start; col < col_end; col ++) { | 1415 for (int col = col_start; col < col_end; col++) { |
1182 » » » » int src_alpha1 = m_Alpha * cover_scan * clip_sca
n[col] / 255; | 1416 int src_alpha1 = m_Alpha * cover_scan * clip_scan[col] / 255; |
1183 » » » » if (!src_alpha1) { | 1417 if (!src_alpha1) { |
1184 » » » » » dest_extra_alpha_scan++; | 1418 dest_extra_alpha_scan++; |
1185 » » » » » dest_scan += 3; | 1419 dest_scan += 3; |
1186 » » » » » continue; | 1420 continue; |
1187 » » » » }» » » » | 1421 } |
1188 » » » » if (src_alpha1 == 255) { | 1422 if (src_alpha1 == 255) { |
1189 » » » » » *dest_scan++ = (FX_BYTE)m_Blue; | 1423 *dest_scan++ = (FX_BYTE)m_Blue; |
1190 » » » » » *dest_scan++ = (FX_BYTE)m_Green; | 1424 *dest_scan++ = (FX_BYTE)m_Green; |
1191 » » » » » *dest_scan++ = (FX_BYTE)m_Red; | 1425 *dest_scan++ = (FX_BYTE)m_Red; |
1192 » » » » » *dest_extra_alpha_scan++ = (FX_BYTE)m_Al
pha; | 1426 *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha; |
1193 » » » » } else { | 1427 } else { |
1194 » » » » » // Dest format: Rgba | 1428 // Dest format: Rgba |
1195 » » » » » // calculate destination alpha (it's uni
on of source and dest alpha) | 1429 // calculate destination alpha (it's union of source and dest alpha) |
1196 » » » » » FX_BYTE dest_alpha = (*dest_extra_alpha_
scan) + src_alpha1 - | 1430 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha1 - |
1197 » » » » » » » » » »
(*dest_extra_alpha_scan) * src_alpha1 / 255; | 1431 (*dest_extra_alpha_scan) * src_alpha1 / 255; |
1198 » » » » » *dest_extra_alpha_scan++ = dest_alpha; | 1432 *dest_extra_alpha_scan++ = dest_alpha; |
1199 » » » » » int alpha_ratio = src_alpha1*255/dest_al
pha; | 1433 int alpha_ratio = src_alpha1 * 255 / dest_alpha; |
1200 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Blue, alpha_ratio); | 1434 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1201 » » » » » dest_scan ++; | 1435 dest_scan++; |
1202 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Green, alpha_ratio); | 1436 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1203 » » » » » dest_scan ++; | 1437 dest_scan++; |
1204 » » » » » *dest_scan = FXDIB_ALPHA_MERGE(*dest_sca
n, m_Red, alpha_ratio); | 1438 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1205 » » » » » dest_scan ++; | 1439 dest_scan++; |
1206 » » » » } | 1440 } |
1207 » » » } | 1441 } |
1208 » » } | 1442 } |
1209 #endif | 1443 #endif |
1210 } | 1444 } |
1211 /*----------------------------------------------------------------------
-------------------------------*/ | 1445 /*------------------------------------------------------------------------------
-----------------------*/ |
1212 | 1446 |
1213 // A general alpha merge function (with clipping mask). Cmyka/Cmyk devic
e. | 1447 // A general alpha merge function (with clipping mask). Cmyka/Cmyk device. |
1214 void CFX_SkiaRenderer::CompositeSpanCMYK(FX_LPBYTE dest_scan, FX_LPBYTE
ori_scan,int Bpp, | 1448 void CFX_SkiaRenderer::CompositeSpanCMYK(FX_LPBYTE dest_scan, |
1215 int span_left, int span_len, int span_top, FX_BYTE cover
_scan, | 1449 FX_LPBYTE ori_scan, |
1216 int clip_top, int clip_left, int clip_right, FX_LPBYTE c
lip_scan, | 1450 int Bpp, |
1217 FX_LPBYTE dest_extra_alpha_scan) | 1451 int span_left, |
1218 { | 1452 int span_len, |
1219 ASSERT(!m_bRgbByteOrder); | 1453 int span_top, |
1220 // Cmyk(a) | 1454 FX_BYTE cover_scan, |
1221 int col_start = span_left < clip_left ? clip_left - span_left :
0; | 1455 int clip_top, |
1222 int col_end = (span_left + span_len) < clip_right ? span_len : (
clip_right - span_left); | 1456 int clip_left, |
1223 if (col_end < col_start) return; // do nothing. | 1457 int clip_right, |
1224 dest_scan += col_start * 4; | 1458 FX_LPBYTE clip_scan, |
1225 Bpp; // for avoid compile warning. | 1459 FX_LPBYTE dest_extra_alpha_scan) { |
1226 | 1460 ASSERT(!m_bRgbByteOrder); |
1227 if (dest_extra_alpha_scan) { | 1461 // Cmyk(a) |
1228 // CMYKa | 1462 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
1229 for (int col = col_start; col < col_end; col ++) { | 1463 int col_end = |
1230 int src_alpha; | 1464 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
1231 if (m_bFullCover) { | 1465 if (col_end < col_start) |
1232 if (clip_scan) | 1466 return; // do nothing. |
1233 src_alpha = m_Alpha * clip_scan[
col] / 255; | 1467 dest_scan += col_start * 4; |
1234 else | 1468 Bpp; // for avoid compile warning. |
1235 src_alpha = m_Alpha; | 1469 |
1236 } else { | 1470 if (dest_extra_alpha_scan) { |
1237 if (clip_scan) | 1471 // CMYKa |
1238 src_alpha = m_Alpha * cover_scan
* clip_scan[col] / 255 / 255; | 1472 for (int col = col_start; col < col_end; col++) { |
1239 else | 1473 int src_alpha; |
1240 src_alpha = m_Alpha * cover_scan
/ 255; | 1474 if (m_bFullCover) { |
1241 } | 1475 if (clip_scan) |
1242 | 1476 src_alpha = m_Alpha * clip_scan[col] / 255; |
1243 if (src_alpha) { | 1477 else |
1244 if (src_alpha == 255) { | 1478 src_alpha = m_Alpha; |
1245 *(FX_CMYK*)dest_scan = m_Color; | 1479 } else { |
1246 *dest_extra_alpha_scan = (FX_BYT
E)m_Alpha; | 1480 if (clip_scan) |
1247 } else { | 1481 src_alpha = m_Alpha * cover_scan * clip_scan[col] / 255 / 255; |
1248 // Dest format: Cmyka | 1482 else |
1249 // calculate destination alpha (
it's union of source and dest alpha) | 1483 src_alpha = m_Alpha * cover_scan / 255; |
1250 FX_BYTE dest_alpha = (*dest_extr
a_alpha_scan) + src_alpha - | 1484 } |
1251 (*dest_extra_alpha_scan)
* src_alpha / 255; | 1485 |
1252 *dest_extra_alpha_scan++ = dest_
alpha; | 1486 if (src_alpha) { |
1253 int alpha_ratio = src_alpha*255/
dest_alpha; | 1487 if (src_alpha == 255) { |
1254 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Red, alpha_ratio); | 1488 *(FX_CMYK*)dest_scan = m_Color; |
1255 dest_scan ++; | 1489 *dest_extra_alpha_scan = (FX_BYTE)m_Alpha; |
1256 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Green, alpha_ratio); | 1490 } else { |
1257 dest_scan ++; | 1491 // Dest format: Cmyka |
1258 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Blue, alpha_ratio); | 1492 // calculate destination alpha (it's union of source and dest alpha) |
1259 dest_scan ++; | 1493 FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha - |
1260 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Gray, alpha_ratio); | 1494 (*dest_extra_alpha_scan) * src_alpha / 255; |
1261 dest_scan ++; | 1495 *dest_extra_alpha_scan++ = dest_alpha; |
1262 continue; | 1496 int alpha_ratio = src_alpha * 255 / dest_alpha; |
1263 } | 1497 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); |
1264 } | 1498 dest_scan++; |
1265 dest_extra_alpha_scan++; | 1499 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); |
1266 dest_scan += 4; | 1500 dest_scan++; |
1267 } | 1501 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); |
1268 } else { | 1502 dest_scan++; |
1269 // CMYK | 1503 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio); |
1270 for (int col = col_start; col < col_end; col ++) { | 1504 dest_scan++; |
1271 int src_alpha; | 1505 continue; |
1272 if (clip_scan) | 1506 } |
1273 src_alpha = m_Alpha * cover_scan * clip_
scan[col] / 255 / 255; | 1507 } |
1274 else | 1508 dest_extra_alpha_scan++; |
1275 src_alpha = m_Alpha * cover_scan / 255; | 1509 dest_scan += 4; |
1276 | 1510 } |
1277 if (src_alpha) { | 1511 } else { |
1278 if (src_alpha == 255) { | 1512 // CMYK |
1279 *(FX_CMYK*)dest_scan = m_Color; | 1513 for (int col = col_start; col < col_end; col++) { |
1280 } else { | 1514 int src_alpha; |
1281 // Dest format: cmyk | 1515 if (clip_scan) |
1282 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Red, src_alpha); | 1516 src_alpha = m_Alpha * cover_scan * clip_scan[col] / 255 / 255; |
1283 dest_scan ++; | 1517 else |
1284 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Green, src_alpha); | 1518 src_alpha = m_Alpha * cover_scan / 255; |
1285 dest_scan ++; | 1519 |
1286 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Blue, src_alpha); | 1520 if (src_alpha) { |
1287 dest_scan ++; | 1521 if (src_alpha == 255) { |
1288 *dest_scan = FXDIB_ALPHA_MERGE(*
dest_scan, m_Gray, src_alpha); | 1522 *(FX_CMYK*)dest_scan = m_Color; |
1289 dest_scan ++; | 1523 } else { |
1290 continue; | 1524 // Dest format: cmyk |
1291 } | 1525 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
1292 } | 1526 dest_scan++; |
1293 dest_scan += 4; | 1527 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
1294 } | 1528 dest_scan++; |
1295 } | 1529 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
1296 } | 1530 dest_scan++; |
1297 | 1531 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); |
1298 | 1532 dest_scan++; |
1299 | 1533 continue; |
1300 //-------------------------------------------------------------------- | 1534 } |
1301 FX_BOOL CFX_SkiaRenderer::Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOri
Device, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL
bRgbByteOrder, | 1535 } |
1302 int alpha_flag, void* pIccTransform) //The alpha flag must be fi
ll_flag if exist. | 1536 dest_scan += 4; |
1303 { | 1537 } |
1304 m_pDevice = pDevice; | 1538 } |
1305 m_pClipRgn = pClipRgn; | 1539 } |
1306 m_bRgbByteOrder = bRgbByteOrder; | 1540 |
1307 m_pOriDevice = pOriDevice; | 1541 //-------------------------------------------------------------------- |
1308 m_pDestScan = NULL; | 1542 FX_BOOL CFX_SkiaRenderer::Init( |
1309 m_pDestExtraAlphaScan = NULL; | 1543 CFX_DIBitmap* pDevice, |
1310 m_pOriScan = NULL; | 1544 CFX_DIBitmap* pOriDevice, |
1311 m_pClipScan = NULL; | 1545 const CFX_ClipRgn* pClipRgn, |
1312 composite_span = NULL; | 1546 FX_DWORD color, |
1313 if (m_pClipRgn) | 1547 FX_BOOL bFullCover, |
1314 m_ClipBox = m_pClipRgn->GetBox(); | 1548 FX_BOOL bRgbByteOrder, |
1315 else { | 1549 int alpha_flag, |
1316 m_ClipBox.left = m_ClipBox.top = 0; | 1550 void* pIccTransform) // The alpha flag must be fill_flag if exist. |
1317 m_ClipBox.right = m_pDevice->GetWidth(); | 1551 { |
1318 m_ClipBox.bottom = m_pDevice->GetHeight(); | 1552 m_pDevice = pDevice; |
1319 } | 1553 m_pClipRgn = pClipRgn; |
1320 m_pClipMask = NULL; | 1554 m_bRgbByteOrder = bRgbByteOrder; |
1321 if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) | 1555 m_pOriDevice = pOriDevice; |
1322 { | 1556 m_pDestScan = NULL; |
1323 m_pClipMask = m_pClipRgn->GetMask(); | 1557 m_pDestExtraAlphaScan = NULL; |
1324 m_pClipScan = m_pClipMask->GetBuffer(); | 1558 m_pOriScan = NULL; |
1325 } | 1559 m_pClipScan = NULL; |
1326 if (m_pDevice->m_pAlphaMask) | 1560 composite_span = NULL; |
1327 m_pDestExtraAlphaScan = m_pDevice->m_pAlphaMask->GetBuff
er(); | 1561 if (m_pClipRgn) |
1328 if (m_pOriDevice) | 1562 m_ClipBox = m_pClipRgn->GetBox(); |
1329 m_pOriScan = m_pOriDevice->GetBuffer(); | 1563 else { |
1330 m_pDestScan = m_pDevice->GetBuffer(); | 1564 m_ClipBox.left = m_ClipBox.top = 0; |
1331 | 1565 m_ClipBox.right = m_pDevice->GetWidth(); |
1332 m_bFullCover = bFullCover; | 1566 m_ClipBox.bottom = m_pDevice->GetHeight(); |
1333 | 1567 } |
1334 FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag); | 1568 m_pClipMask = NULL; |
1335 FX_BOOL bDeviceCMYK = pDevice->IsCmykImage(); | 1569 if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { |
1336 | 1570 m_pClipMask = m_pClipRgn->GetMask(); |
1337 m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARG
B_A(color); | 1571 m_pClipScan = m_pClipMask->GetBuffer(); |
1338 | 1572 } |
1339 ICodec_IccModule* pIccModule = NULL; | 1573 if (m_pDevice->m_pAlphaMask) |
1340 // No lcms engine, we skip the transform | 1574 m_pDestExtraAlphaScan = m_pDevice->m_pAlphaMask->GetBuffer(); |
1341 if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get
()->GetCodecModule()->GetIccModule()) | 1575 if (m_pOriDevice) |
1342 pIccTransform = NULL; | 1576 m_pOriScan = m_pOriDevice->GetBuffer(); |
1343 else | 1577 m_pDestScan = m_pDevice->GetBuffer(); |
1344 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetI
ccModule(); | 1578 |
1345 | 1579 m_bFullCover = bFullCover; |
1346 if (m_pDevice->GetBPP() == 8) { // Gray(a) device | 1580 |
1347 ASSERT(!m_bRgbByteOrder); | 1581 FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag); |
1348 if (m_pDevice->IsAlphaMask()) { | 1582 FX_BOOL bDeviceCMYK = pDevice->IsCmykImage(); |
1349 //Alpha Mask | 1583 |
1350 m_Gray = 255; | 1584 m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); |
1351 } else { | 1585 |
1352 //Gray(a) device | 1586 ICodec_IccModule* pIccModule = NULL; |
1353 if (pIccTransform) { | 1587 // No lcms engine, we skip the transform |
1354 FX_BYTE gray; | 1588 if (!CFX_GEModule::Get()->GetCodecModule() || |
1355 color = bObjectCMYK ? FXCMYK_TODIB(color
) : FXARGB_TODIB(color); | 1589 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) |
1356 pIccModule->TranslateScanline(pIccTransf
orm, &gray, (FX_LPCBYTE)&color, 1); | 1590 pIccTransform = NULL; |
1357 m_Gray = gray; | 1591 else |
1358 } else { | 1592 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); |
1359 if (bObjectCMYK) { | 1593 |
1360 FX_BYTE r, g, b; | 1594 if (m_pDevice->GetBPP() == 8) { // Gray(a) device |
1361 AdobeCMYK_to_sRGB1(FXSYS_GetCVal
ue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color
), | 1595 ASSERT(!m_bRgbByteOrder); |
1362 r, g, b); | 1596 if (m_pDevice->IsAlphaMask()) { |
1363 m_Gray = FXRGB2GRAY(r, g, b); | 1597 // Alpha Mask |
1364 } else { | 1598 m_Gray = 255; |
1365 m_Gray = FXRGB2GRAY(FXARGB_R(col
or), FXARGB_G(color), FXARGB_B(color)); | 1599 } else { |
1366 } | 1600 // Gray(a) device |
1367 } | 1601 if (pIccTransform) { |
1368 } | 1602 FX_BYTE gray; |
1369 } else { | 1603 color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); |
1370 if (bDeviceCMYK) { // Cmyk(a) Device | 1604 pIccModule->TranslateScanline( |
1371 ASSERT(!m_bRgbByteOrder); | 1605 pIccTransform, &gray, (FX_LPCBYTE)&color, 1); |
1372 //TODO... opt for cmyk | 1606 m_Gray = gray; |
1373 composite_span = &CFX_SkiaRenderer::CompositeSpa
nCMYK; | 1607 } else { |
1374 if (bObjectCMYK) { | 1608 if (bObjectCMYK) { |
1375 m_Color = FXCMYK_TODIB(color); | 1609 FX_BYTE r, g, b; |
1376 if (pIccTransform) | 1610 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), |
1377 pIccModule->TranslateScanline(pI
ccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1); | 1611 FXSYS_GetMValue(color), |
1378 } else { // Object RGB | 1612 FXSYS_GetYValue(color), |
1379 if (!pIccTransform) | 1613 FXSYS_GetKValue(color), |
1380 return FALSE; | 1614 r, |
1381 color = FXARGB_TODIB(color); | 1615 g, |
1382 pIccModule->TranslateScanline(pIccTransf
orm, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1); | 1616 b); |
1383 } | 1617 m_Gray = FXRGB2GRAY(r, g, b); |
1384 m_Red = ((FX_LPBYTE)&m_Color)[0]; | 1618 } else { |
1385 m_Green = ((FX_LPBYTE)&m_Color)[1]; | 1619 m_Gray = |
1386 m_Blue = ((FX_LPBYTE)&m_Color)[2]; | 1620 FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); |
1387 m_Gray = ((FX_LPBYTE)&m_Color)[3]; | 1621 } |
1388 return TRUE; | 1622 } |
1389 } else { | 1623 } |
1390 if (pIccTransform) { | 1624 } else { |
1391 color = bObjectCMYK ? FXCMYK_TODIB(color
) : FXARGB_TODIB(color); | 1625 if (bDeviceCMYK) { // Cmyk(a) Device |
1392 pIccModule->TranslateScanline(pIccTransf
orm, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1); | 1626 ASSERT(!m_bRgbByteOrder); |
1393 ((FX_LPBYTE)&m_Color)[3] = m_Alpha; | 1627 // TODO... opt for cmyk |
1394 m_Red = ((FX_LPBYTE)&m_Color)[2]; | 1628 composite_span = &CFX_SkiaRenderer::CompositeSpanCMYK; |
1395 m_Green = ((FX_LPBYTE)&m_Color)[1]; | 1629 if (bObjectCMYK) { |
1396 m_Blue = ((FX_LPBYTE)&m_Color)[0]; | 1630 m_Color = FXCMYK_TODIB(color); |
1397 // Need Johnson to improvement it. | 1631 if (pIccTransform) |
1398 if (m_bRgbByteOrder) { | 1632 pIccModule->TranslateScanline( |
1399 // swap | 1633 pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1); |
1400 m_Red = ((FX_LPBYTE)&m_Color)[0]
; | 1634 } else { // Object RGB |
1401 m_Blue = ((FX_LPBYTE)&m_Color)[2
]; | 1635 if (!pIccTransform) |
1402 m_Color = FXARGB_TODIB(m_Color); | 1636 return FALSE; |
1403 m_Color = FXARGB_TOBGRORDERDIB(m
_Color); | 1637 color = FXARGB_TODIB(color); |
1404 } | 1638 pIccModule->TranslateScanline( |
1405 } else { | 1639 pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1); |
1406 if (bObjectCMYK) { | 1640 } |
1407 FX_BYTE r, g, b; | 1641 m_Red = ((FX_LPBYTE)&m_Color)[0]; |
1408 AdobeCMYK_to_sRGB1(FXSYS_GetCVal
ue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color
), | 1642 m_Green = ((FX_LPBYTE)&m_Color)[1]; |
1409 r, g, b); | 1643 m_Blue = ((FX_LPBYTE)&m_Color)[2]; |
1410 m_Color = FXARGB_MAKE(m_Alpha, r
, g, b); | 1644 m_Gray = ((FX_LPBYTE)&m_Color)[3]; |
1411 if (m_bRgbByteOrder){ | 1645 return TRUE; |
1412 m_Color = FXARGB_TOBGROR
DERDIB(m_Color); | 1646 } else { |
1413 m_Red = b; m_Green = g;
m_Blue = r;// | 1647 if (pIccTransform) { |
1414 }else { | 1648 color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); |
1415 m_Color = FXARGB_TODIB(m
_Color); | 1649 pIccModule->TranslateScanline( |
1416 m_Red = r; m_Green = g;
m_Blue = b;// | 1650 pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1); |
1417 } | 1651 ((FX_LPBYTE)&m_Color)[3] = m_Alpha; |
1418 } else { | 1652 m_Red = ((FX_LPBYTE)&m_Color)[2]; |
1419 if (m_bRgbByteOrder){ | 1653 m_Green = ((FX_LPBYTE)&m_Color)[1]; |
1420 m_Color = FXARGB_TOBGROR
DERDIB(color); | 1654 m_Blue = ((FX_LPBYTE)&m_Color)[0]; |
1421 ArgbDecode(color, m_Alph
a, m_Blue, m_Green, m_Red); // | 1655 // Need Johnson to improvement it. |
1422 }else { | 1656 if (m_bRgbByteOrder) { |
1423 m_Color = FXARGB_TODIB(c
olor); | 1657 // swap |
1424 ArgbDecode(color, m_Alph
a, m_Red, m_Green, m_Blue); | 1658 m_Red = ((FX_LPBYTE)&m_Color)[0]; |
1425 }
| 1659 m_Blue = ((FX_LPBYTE)&m_Color)[2]; |
1426 } | 1660 m_Color = FXARGB_TODIB(m_Color); |
1427 } | 1661 m_Color = FXARGB_TOBGRORDERDIB(m_Color); |
1428 } | 1662 } |
1429 } | 1663 } else { |
1430 // Get palette transparency selector | 1664 if (bObjectCMYK) { |
1431 m_ProcessFilter = (m_pOriDevice? 1 : 0) /* has Ori Device flag *
/ | 1665 FX_BYTE r, g, b; |
1432 + (m_pDevice->GetBPP() >= 8 ? 2
: 0) /* bpp flag */ | 1666 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), |
1433 + (m_pClipMask? 4 : 0)
/* has clip region flag */ | 1667 FXSYS_GetMValue(color), |
1434 + (m_pDevice->m_pAlphaMask? 8 :
0); /* has Alpha Mask chanel flag */ | 1668 FXSYS_GetYValue(color), |
1435 switch(m_ProcessFilter) { | 1669 FXSYS_GetKValue(color), |
1436 case 0: | 1670 r, |
1437 composite_span = &CFX_SkiaRenderer::CompositeSpa
n1bpp_0; | 1671 g, |
1438 break; | 1672 b); |
1439 case 2: | 1673 m_Color = FXARGB_MAKE(m_Alpha, r, g, b); |
1440 { | 1674 if (m_bRgbByteOrder) { |
1441 if (m_pDevice->GetBPP() == 8) | 1675 m_Color = FXARGB_TOBGRORDERDIB(m_Color); |
1442 composite_span = &CFX_SkiaRender
er::CompositeSpanGray_2; | 1676 m_Red = b; |
1443 else if (m_pDevice->GetBPP() == 24) | 1677 m_Green = g; |
1444 composite_span = &CFX_SkiaRender
er::CompositeSpanRGB24_2; | 1678 m_Blue = r; // |
1445 else | 1679 } else { |
1446 composite_span = m_pDevice->HasA
lpha()?&CFX_SkiaRenderer::CompositeSpanARGB_2 : &CFX_SkiaRenderer::CompositeSpan
RGB32_2; | 1680 m_Color = FXARGB_TODIB(m_Color); |
1447 } | 1681 m_Red = r; |
1448 break; | 1682 m_Green = g; |
1449 case 3: | 1683 m_Blue = b; // |
1450 { | 1684 } |
1451 if (m_pDevice->GetBPP() == 8) | 1685 } else { |
1452 composite_span = &CFX_SkiaRender
er::CompositeSpanGray_3; | 1686 if (m_bRgbByteOrder) { |
1453 else if (m_pDevice->GetBPP() == 24) | 1687 m_Color = FXARGB_TOBGRORDERDIB(color); |
1454 composite_span = &CFX_SkiaRender
er::CompositeSpanRGB24_3; | 1688 ArgbDecode(color, m_Alpha, m_Blue, m_Green, m_Red); // |
1455 else | 1689 } else { |
1456 composite_span = m_pDevice->HasA
lpha()?&CFX_SkiaRenderer::CompositeSpanARGB_3 : &CFX_SkiaRenderer::CompositeSpan
RGB32_3; | 1690 m_Color = FXARGB_TODIB(color); |
1457 } | 1691 ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue); |
1458 break; | 1692 } |
1459 case 4: | 1693 } |
1460 composite_span = &CFX_SkiaRenderer::CompositeSpa
n1bpp_4; | 1694 } |
1461 break; | 1695 } |
1462 case 6: | 1696 } |
1463 { | 1697 // Get palette transparency selector |
1464 if (m_pDevice->GetBPP() == 8) | 1698 m_ProcessFilter = |
1465 composite_span = &CFX_SkiaRender
er::CompositeSpanGray_6; | 1699 (m_pOriDevice ? 1 : 0) /* has Ori Device flag */ |
1466 else if (m_pDevice->GetBPP() == 24) | 1700 + (m_pDevice->GetBPP() >= 8 ? 2 : 0) /* bpp flag */ |
1467 composite_span = &CFX_SkiaRender
er::CompositeSpanRGB24_6; | 1701 + (m_pClipMask ? 4 : 0) /* has clip region flag */ |
1468 else | 1702 + (m_pDevice->m_pAlphaMask ? 8 : 0); /* has Alpha Mask chanel flag */ |
1469 composite_span = m_pDevice->HasA
lpha()?&CFX_SkiaRenderer::CompositeSpanARGB_6 : &CFX_SkiaRenderer::CompositeSpan
RGB32_6; | 1703 switch (m_ProcessFilter) { |
1470 } | 1704 case 0: |
1471 break; | 1705 composite_span = &CFX_SkiaRenderer::CompositeSpan1bpp_0; |
1472 case 7: | 1706 break; |
1473 { | 1707 case 2: { |
1474 if (m_pDevice->GetBPP() == 8) | 1708 if (m_pDevice->GetBPP() == 8) |
1475 composite_span = &CFX_SkiaRender
er::CompositeSpanGray_7; | 1709 composite_span = &CFX_SkiaRenderer::CompositeSpanGray_2; |
1476 else if (m_pDevice->GetBPP() == 24) | 1710 else if (m_pDevice->GetBPP() == 24) |
1477 composite_span = &CFX_SkiaRender
er::CompositeSpanRGB24_7; | 1711 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_2; |
1478 else | 1712 else |
1479 composite_span = m_pDevice->HasA
lpha()?&CFX_SkiaRenderer::CompositeSpanARGB_7 : &CFX_SkiaRenderer::CompositeSpan
RGB32_7; | 1713 composite_span = m_pDevice->HasAlpha() |
1480 } | 1714 ? &CFX_SkiaRenderer::CompositeSpanARGB_2 |
1481 break; | 1715 : &CFX_SkiaRenderer::CompositeSpanRGB32_2; |
1482 case 1: | 1716 } break; |
1483 case 5: | 1717 case 3: { |
1484 case 8: | 1718 if (m_pDevice->GetBPP() == 8) |
1485 case 9: | 1719 composite_span = &CFX_SkiaRenderer::CompositeSpanGray_3; |
1486 case 11: | 1720 else if (m_pDevice->GetBPP() == 24) |
1487 case 12: | 1721 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_3; |
1488 case 13: | 1722 else |
1489 case 15: | 1723 composite_span = m_pDevice->HasAlpha() |
1490 //TODO... | 1724 ? &CFX_SkiaRenderer::CompositeSpanARGB_3 |
1491 break; | 1725 : &CFX_SkiaRenderer::CompositeSpanRGB32_3; |
1492 case 10: | 1726 } break; |
1493 composite_span = &CFX_SkiaRenderer::CompositeSpa
nRGB24_10; | 1727 case 4: |
1494 break; | 1728 composite_span = &CFX_SkiaRenderer::CompositeSpan1bpp_4; |
1495 case 14: | 1729 break; |
1496 composite_span = &CFX_SkiaRenderer::CompositeSpa
nRGB24_14; | 1730 case 6: { |
1497 break; | 1731 if (m_pDevice->GetBPP() == 8) |
1498 } | 1732 composite_span = &CFX_SkiaRenderer::CompositeSpanGray_6; |
1499 if (composite_span == NULL) | 1733 else if (m_pDevice->GetBPP() == 24) |
1500 return FALSE; | 1734 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_6; |
1501 return TRUE; | 1735 else |
1502 } | 1736 composite_span = m_pDevice->HasAlpha() |
1503 | 1737 ? &CFX_SkiaRenderer::CompositeSpanARGB_6 |
1504 /*----------------------------------------------------------------------
------------------------------*/ | 1738 : &CFX_SkiaRenderer::CompositeSpanRGB32_6; |
1505 void CFX_SkiaA8Renderer::blitAntiH(int x, int y, const SkAlpha antialias
[], const int16_t runs[]) | 1739 } break; |
1506 { | 1740 case 7: { |
1507 FXSYS_assert(m_pDevice); | 1741 if (m_pDevice->GetBPP() == 8) |
1508 int dst_y = y - m_Top; | 1742 composite_span = &CFX_SkiaRenderer::CompositeSpanGray_7; |
1509 if (dst_y < 0 || dst_y >= m_pDevice->GetHeight()) | 1743 else if (m_pDevice->GetBPP() == 24) |
1510 return; | 1744 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_7; |
1511 | 1745 else |
1512 FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPit
ch() * dst_y; | 1746 composite_span = m_pDevice->HasAlpha() |
1513 FX_LPBYTE dest_pos = dest_scan; | 1747 ? &CFX_SkiaRenderer::CompositeSpanARGB_7 |
1514 while (1) | 1748 : &CFX_SkiaRenderer::CompositeSpanRGB32_7; |
1515 { | 1749 } break; |
1516 if (x >= m_dstWidth) | 1750 case 1: |
1517 return; | 1751 case 5: |
1518 int width = runs[0]; | 1752 case 8: |
1519 SkASSERT(width >= 0); | 1753 case 9: |
1520 if (width <= 0) | 1754 case 11: |
1521 return; | 1755 case 12: |
1522 unsigned aa = antialias[0]; | 1756 case 13: |
1523 if (aa) { | 1757 case 15: |
1524 int col_start = x < m_Left ? 0 : x - m_Left; | 1758 // TODO... |
1525 int col_end = x + width; | 1759 break; |
1526 col_end = col_end < m_dstWidth ? col_end - m_Lef
t: m_pDevice->GetWidth(); | 1760 case 10: |
1527 int result = col_end - col_start; | 1761 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_10; |
1528 if (result > 0) { | 1762 break; |
1529 dest_pos = dest_scan + col_start; | 1763 case 14: |
1530 if (result >= 4) | 1764 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_14; |
1531 FXSYS_memset32(dest_pos, FXARGB_
MAKE(aa, aa, aa, aa),result); | 1765 break; |
1532 else | 1766 } |
1533 FXSYS_memset(dest_pos,aa,result)
; | 1767 if (composite_span == NULL) |
1534 } | 1768 return FALSE; |
1535 } | 1769 return TRUE; |
1536 runs += width; | 1770 } |
1537 antialias += width; | 1771 |
1538 x += width; | 1772 /*------------------------------------------------------------------------------
----------------------*/ |
1539 } | 1773 void CFX_SkiaA8Renderer::blitAntiH(int x, |
1540 } | 1774 int y, |
1541 void CFX_SkiaA8Renderer::blitH(int x, int y, int width) | 1775 const SkAlpha antialias[], |
1542 { | 1776 const int16_t runs[]) { |
1543 FXSYS_assert(m_pDevice); | 1777 FXSYS_assert(m_pDevice); |
1544 int dst_y = y - m_Top; | 1778 int dst_y = y - m_Top; |
1545 if (dst_y < 0 || dst_y >= m_pDevice->GetHeight()) | 1779 if (dst_y < 0 || dst_y >= m_pDevice->GetHeight()) |
1546 return; | 1780 return; |
1547 if (x >= m_dstWidth) | 1781 |
1548 return; | 1782 FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * dst_y; |
1549 FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPit
ch() * dst_y; | 1783 FX_LPBYTE dest_pos = dest_scan; |
1550 int col_start = x < m_Left ? 0 : x - m_Left; | 1784 while (1) { |
1551 int col_end = x + width; | 1785 if (x >= m_dstWidth) |
1552 col_end = col_end < m_dstWidth ? col_end - m_Left: m_pDevice->Ge
tWidth(); | 1786 return; |
1553 int result = col_end - col_start; | 1787 int width = runs[0]; |
1554 if (result > 0) { | 1788 SkASSERT(width >= 0); |
1555 FX_BYTE* dest_pos = dest_scan + col_start; | 1789 if (width <= 0) |
1556 if (result >= 4) | 1790 return; |
1557 FXSYS_memset32(dest_pos, 0xffffffff,result); | 1791 unsigned aa = antialias[0]; |
1558 else | 1792 if (aa) { |
1559 FXSYS_memset(dest_pos,255,result); | 1793 int col_start = x < m_Left ? 0 : x - m_Left; |
1560 } | 1794 int col_end = x + width; |
1561 } | 1795 col_end = col_end < m_dstWidth ? col_end - m_Left : m_pDevice->GetWidth(); |
1562 void CFX_SkiaA8Renderer::blitV(int x, int y, int height, SkAlpha alpha) | 1796 int result = col_end - col_start; |
1563 { | 1797 if (result > 0) { |
1564 FXSYS_assert(alpha); | 1798 dest_pos = dest_scan + col_start; |
1565 if (alpha == 255) { | 1799 if (result >= 4) |
1566 this->blitRect(x, y, 1, height); | 1800 FXSYS_memset32(dest_pos, FXARGB_MAKE(aa, aa, aa, aa), result); |
1567 } else { | 1801 else |
1568 int16_t runs[2]; | 1802 FXSYS_memset(dest_pos, aa, result); |
1569 runs[0] = 1; | 1803 } |
1570 runs[1] = 0; | 1804 } |
1571 while (--height >= 0) { | 1805 runs += width; |
1572 if (y >= m_dstHeight) | 1806 antialias += width; |
1573 return; | 1807 x += width; |
1574 this->blitAntiH(x, y ++, &alpha, runs); | 1808 } |
1575 } | 1809 } |
1576 } | 1810 void CFX_SkiaA8Renderer::blitH(int x, int y, int width) { |
1577 } | 1811 FXSYS_assert(m_pDevice); |
1578 void CFX_SkiaA8Renderer::blitRect(int x, int y, int width, int height) | 1812 int dst_y = y - m_Top; |
1579 { | 1813 if (dst_y < 0 || dst_y >= m_pDevice->GetHeight()) |
1580 FXSYS_assert(m_pDevice); | 1814 return; |
1581 while (--height >= 0) { | 1815 if (x >= m_dstWidth) |
1582 if (y >= m_dstHeight) | 1816 return; |
1583 return; | 1817 FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * dst_y; |
1584 blitH(x , y ++, width); | 1818 int col_start = x < m_Left ? 0 : x - m_Left; |
1585 } | 1819 int col_end = x + width; |
1586 } | 1820 col_end = col_end < m_dstWidth ? col_end - m_Left : m_pDevice->GetWidth(); |
1587 | 1821 int result = col_end - col_start; |
1588 void CFX_SkiaA8Renderer::blitAntiRect(int x, int y, int width, int heigh
t, | 1822 if (result > 0) { |
1589 SkAlpha leftAlpha, SkAlpha rightAlpha) | 1823 FX_BYTE* dest_pos = dest_scan + col_start; |
1590 { | 1824 if (result >= 4) |
1591 blitV(x++, y, height, leftAlpha); | 1825 FXSYS_memset32(dest_pos, 0xffffffff, result); |
1592 if (width > 0) { | 1826 else |
1593 blitRect(x, y, width, height); | 1827 FXSYS_memset(dest_pos, 255, result); |
1594 x += width; | 1828 } |
1595 } | 1829 } |
1596 blitV(x, y, height, rightAlpha); | 1830 void CFX_SkiaA8Renderer::blitV(int x, int y, int height, SkAlpha alpha) { |
1597 } | 1831 FXSYS_assert(alpha); |
1598 | 1832 if (alpha == 255) { |
1599 FX_BOOL CFX_SkiaA8Renderer::Init(CFX_DIBitmap* pDevice, int Left, int To
p) | 1833 this->blitRect(x, y, 1, height); |
1600 { | 1834 } else { |
1601 m_pDevice = pDevice; | 1835 int16_t runs[2]; |
1602 m_Left = Left; | 1836 runs[0] = 1; |
1603 m_Top = Top; | 1837 runs[1] = 0; |
1604 if (pDevice){ | 1838 while (--height >= 0) { |
1605 m_dstWidth = m_Left + pDevice->GetWidth(); | 1839 if (y >= m_dstHeight) |
1606 m_dstHeight = m_Top + pDevice->GetHeight(); | 1840 return; |
1607 } | 1841 this->blitAntiH(x, y++, &alpha, runs); |
1608 return TRUE; | 1842 } |
1609 } | 1843 } |
| 1844 } |
| 1845 void CFX_SkiaA8Renderer::blitRect(int x, int y, int width, int height) { |
| 1846 FXSYS_assert(m_pDevice); |
| 1847 while (--height >= 0) { |
| 1848 if (y >= m_dstHeight) |
| 1849 return; |
| 1850 blitH(x, y++, width); |
| 1851 } |
| 1852 } |
| 1853 |
| 1854 void CFX_SkiaA8Renderer::blitAntiRect(int x, |
| 1855 int y, |
| 1856 int width, |
| 1857 int height, |
| 1858 SkAlpha leftAlpha, |
| 1859 SkAlpha rightAlpha) { |
| 1860 blitV(x++, y, height, leftAlpha); |
| 1861 if (width > 0) { |
| 1862 blitRect(x, y, width, height); |
| 1863 x += width; |
| 1864 } |
| 1865 blitV(x, y, height, rightAlpha); |
| 1866 } |
| 1867 |
| 1868 FX_BOOL CFX_SkiaA8Renderer::Init(CFX_DIBitmap* pDevice, int Left, int Top) { |
| 1869 m_pDevice = pDevice; |
| 1870 m_Left = Left; |
| 1871 m_Top = Top; |
| 1872 if (pDevice) { |
| 1873 m_dstWidth = m_Left + pDevice->GetWidth(); |
| 1874 m_dstHeight = m_Top + pDevice->GetHeight(); |
| 1875 } |
| 1876 return TRUE; |
| 1877 } |
1610 #endif | 1878 #endif |
OLD | NEW |