OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkSpriteBlitter.h" | 10 #include "SkSpriteBlitter.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 | 45 |
46 /////////////////////////////////////////////////////////////////////////////// | 46 /////////////////////////////////////////////////////////////////////////////// |
47 | 47 |
48 class Sprite_D16_S16_Opaque : public SkSpriteBlitter { | 48 class Sprite_D16_S16_Opaque : public SkSpriteBlitter { |
49 public: | 49 public: |
50 Sprite_D16_S16_Opaque(const SkPixmap& source) : SkSpriteBlitter(source) {} | 50 Sprite_D16_S16_Opaque(const SkPixmap& source) : SkSpriteBlitter(source) {} |
51 | 51 |
52 // overrides | 52 // overrides |
53 void blitRect(int x, int y, int width, int height) override { | 53 void blitRect(int x, int y, int width, int height) override { |
54 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y); | 54 uint16_t* SK_RESTRICT dst = fDst.writable_addr16(x, y); |
55 const uint16_t* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop); | 55 const uint16_t* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop); |
56 size_t dstRB = fDevice->rowBytes(); | 56 size_t dstRB = fDst.rowBytes(); |
57 size_t srcRB = fSource.rowBytes(); | 57 size_t srcRB = fSource.rowBytes(); |
58 | 58 |
59 while (--height >= 0) { | 59 while (--height >= 0) { |
60 memcpy(dst, src, width << 1); | 60 memcpy(dst, src, width << 1); |
61 dst = (uint16_t*)((char*)dst + dstRB); | 61 dst = (uint16_t*)((char*)dst + dstRB); |
62 src = (const uint16_t*)((const char*)src + srcRB); | 62 src = (const uint16_t*)((const char*)src + srcRB); |
63 } | 63 } |
64 } | 64 } |
65 }; | 65 }; |
66 | 66 |
67 #define D16_S16_Blend_Pixel(dst, sc, scale) \ | 67 #define D16_S16_Blend_Pixel(dst, sc, scale) \ |
68 do { \ | 68 do { \ |
69 uint16_t dc = *dst; \ | 69 uint16_t dc = *dst; \ |
70 *dst = SkBlendRGB16(sc, dc, scale); \ | 70 *dst = SkBlendRGB16(sc, dc, scale); \ |
71 } while (0) | 71 } while (0) |
72 | 72 |
73 #define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend | 73 #define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend |
74 #define SkSPRITE_ARGS , uint8_t alpha | 74 #define SkSPRITE_ARGS , uint8_t alpha |
75 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 75 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
76 #define SkSPRITE_INIT fSrcAlpha = alpha; | 76 #define SkSPRITE_INIT fSrcAlpha = alpha; |
77 #define SkSPRITE_DST_TYPE uint16_t | 77 #define SkSPRITE_DST_TYPE uint16_t |
78 #define SkSPRITE_SRC_TYPE uint16_t | 78 #define SkSPRITE_SRC_TYPE uint16_t |
79 #define SkSPRITE_DST_GETADDR getAddr16 | 79 #define SkSPRITE_DST_GETADDR writable_addr16 |
80 #define SkSPRITE_SRC_GETADDR addr16 | 80 #define SkSPRITE_SRC_GETADDR addr16 |
81 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlph
a); | 81 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlph
a); |
82 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale) | 82 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale) |
83 #define SkSPRITE_NEXT_ROW | 83 #define SkSPRITE_NEXT_ROW |
84 #define SkSPRITE_POSTAMBLE(srcBM) | 84 #define SkSPRITE_POSTAMBLE(srcBM) |
85 #include "SkSpriteBlitterTemplate.h" | 85 #include "SkSpriteBlitterTemplate.h" |
86 | 86 |
87 /////////////////////////////////////////////////////////////////////////////// | 87 /////////////////////////////////////////////////////////////////////////////// |
88 | 88 |
89 #define D16_S4444_Opaque(dst, sc) \ | 89 #define D16_S4444_Opaque(dst, sc) \ |
90 do { \ | 90 do { \ |
91 uint16_t dc = *dst; \ | 91 uint16_t dc = *dst; \ |
92 *dst = SkSrcOver4444To16(sc, dc); \ | 92 *dst = SkSrcOver4444To16(sc, dc); \ |
93 } while (0) | 93 } while (0) |
94 | 94 |
95 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque | 95 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque |
96 #define SkSPRITE_ARGS | 96 #define SkSPRITE_ARGS |
97 #define SkSPRITE_FIELDS | 97 #define SkSPRITE_FIELDS |
98 #define SkSPRITE_INIT | 98 #define SkSPRITE_INIT |
99 #define SkSPRITE_DST_TYPE uint16_t | 99 #define SkSPRITE_DST_TYPE uint16_t |
100 #define SkSPRITE_SRC_TYPE SkPMColor16 | 100 #define SkSPRITE_SRC_TYPE SkPMColor16 |
101 #define SkSPRITE_DST_GETADDR getAddr16 | 101 #define SkSPRITE_DST_GETADDR writable_addr16 |
102 #define SkSPRITE_SRC_GETADDR addr16 | 102 #define SkSPRITE_SRC_GETADDR addr16 |
103 #define SkSPRITE_PREAMBLE(srcBM, x, y) | 103 #define SkSPRITE_PREAMBLE(srcBM, x, y) |
104 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src) | 104 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src) |
105 #define SkSPRITE_NEXT_ROW | 105 #define SkSPRITE_NEXT_ROW |
106 #define SkSPRITE_POSTAMBLE(srcBM) | 106 #define SkSPRITE_POSTAMBLE(srcBM) |
107 #include "SkSpriteBlitterTemplate.h" | 107 #include "SkSpriteBlitterTemplate.h" |
108 | 108 |
109 #define D16_S4444_Blend(dst, sc, scale16) \ | 109 #define D16_S4444_Blend(dst, sc, scale16) \ |
110 do { \ | 110 do { \ |
111 uint16_t dc = *dst; \ | 111 uint16_t dc = *dst; \ |
112 *dst = SkBlend4444To16(sc, dc, scale16); \ | 112 *dst = SkBlend4444To16(sc, dc, scale16); \ |
113 } while (0) | 113 } while (0) |
114 | 114 |
115 | 115 |
116 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend | 116 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend |
117 #define SkSPRITE_ARGS , uint8_t alpha | 117 #define SkSPRITE_ARGS , uint8_t alpha |
118 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 118 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
119 #define SkSPRITE_INIT fSrcAlpha = alpha; | 119 #define SkSPRITE_INIT fSrcAlpha = alpha; |
120 #define SkSPRITE_DST_TYPE uint16_t | 120 #define SkSPRITE_DST_TYPE uint16_t |
121 #define SkSPRITE_SRC_TYPE uint16_t | 121 #define SkSPRITE_SRC_TYPE uint16_t |
122 #define SkSPRITE_DST_GETADDR getAddr16 | 122 #define SkSPRITE_DST_GETADDR writable_addr16 |
123 #define SkSPRITE_SRC_GETADDR addr16 | 123 #define SkSPRITE_SRC_GETADDR addr16 |
124 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha)
; | 124 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha)
; |
125 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale) | 125 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale) |
126 #define SkSPRITE_NEXT_ROW | 126 #define SkSPRITE_NEXT_ROW |
127 #define SkSPRITE_POSTAMBLE(srcBM) | 127 #define SkSPRITE_POSTAMBLE(srcBM) |
128 #include "SkSpriteBlitterTemplate.h" | 128 #include "SkSpriteBlitterTemplate.h" |
129 | 129 |
130 /////////////////////////////////////////////////////////////////////////////// | 130 /////////////////////////////////////////////////////////////////////////////// |
131 | 131 |
132 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque | 132 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque |
133 #define SkSPRITE_ARGS | 133 #define SkSPRITE_ARGS |
134 #define SkSPRITE_FIELDS | 134 #define SkSPRITE_FIELDS |
135 #define SkSPRITE_INIT | 135 #define SkSPRITE_INIT |
136 #define SkSPRITE_DST_TYPE uint16_t | 136 #define SkSPRITE_DST_TYPE uint16_t |
137 #define SkSPRITE_SRC_TYPE uint8_t | 137 #define SkSPRITE_SRC_TYPE uint8_t |
138 #define SkSPRITE_DST_GETADDR getAddr16 | 138 #define SkSPRITE_DST_GETADDR writable_addr16 |
139 #define SkSPRITE_SRC_GETADDR addr8 | 139 #define SkSPRITE_SRC_GETADDR addr8 |
140 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors() | 140 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors() |
141 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[sr
c]) | 141 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[sr
c]) |
142 #define SkSPRITE_NEXT_ROW | 142 #define SkSPRITE_NEXT_ROW |
143 #define SkSPRITE_POSTAMBLE(srcBM) | 143 #define SkSPRITE_POSTAMBLE(srcBM) |
144 #include "SkSpriteBlitterTemplate.h" | 144 #include "SkSpriteBlitterTemplate.h" |
145 | 145 |
146 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend | 146 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend |
147 #define SkSPRITE_ARGS , uint8_t alpha | 147 #define SkSPRITE_ARGS , uint8_t alpha |
148 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 148 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
149 #define SkSPRITE_INIT fSrcAlpha = alpha; | 149 #define SkSPRITE_INIT fSrcAlpha = alpha; |
150 #define SkSPRITE_DST_TYPE uint16_t | 150 #define SkSPRITE_DST_TYPE uint16_t |
151 #define SkSPRITE_SRC_TYPE uint8_t | 151 #define SkSPRITE_SRC_TYPE uint8_t |
152 #define SkSPRITE_DST_GETADDR getAddr16 | 152 #define SkSPRITE_DST_GETADDR writable_addr16 |
153 #define SkSPRITE_SRC_GETADDR addr8 | 153 #define SkSPRITE_SRC_GETADDR addr8 |
154 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); | 154 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); |
155 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src
], src_scale) | 155 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src
], src_scale) |
156 #define SkSPRITE_NEXT_ROW | 156 #define SkSPRITE_NEXT_ROW |
157 #define SkSPRITE_POSTAMBLE(srcBM) | 157 #define SkSPRITE_POSTAMBLE(srcBM) |
158 #include "SkSpriteBlitterTemplate.h" | 158 #include "SkSpriteBlitterTemplate.h" |
159 | 159 |
160 /////////////////////////////////////////////////////////////////////////////// | 160 /////////////////////////////////////////////////////////////////////////////// |
161 | 161 |
162 static intptr_t asint(const void* ptr) { | 162 static intptr_t asint(const void* ptr) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 220 } |
221 | 221 |
222 #define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable) | 222 #define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable) |
223 | 223 |
224 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque | 224 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque |
225 #define SkSPRITE_ARGS | 225 #define SkSPRITE_ARGS |
226 #define SkSPRITE_FIELDS | 226 #define SkSPRITE_FIELDS |
227 #define SkSPRITE_INIT | 227 #define SkSPRITE_INIT |
228 #define SkSPRITE_DST_TYPE uint16_t | 228 #define SkSPRITE_DST_TYPE uint16_t |
229 #define SkSPRITE_SRC_TYPE uint8_t | 229 #define SkSPRITE_SRC_TYPE uint8_t |
230 #define SkSPRITE_DST_GETADDR getAddr16 | 230 #define SkSPRITE_DST_GETADDR writable_addr16 |
231 #define SkSPRITE_SRC_GETADDR addr8 | 231 #define SkSPRITE_SRC_GETADDR addr8 |
232 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache() | 232 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache() |
233 #define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src] | 233 #define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src] |
234 #define SkSPRITE_NEXT_ROW | 234 #define SkSPRITE_NEXT_ROW |
235 #define SkSPRITE_POSTAMBLE(srcBM) | 235 #define SkSPRITE_POSTAMBLE(srcBM) |
236 #include "SkSpriteBlitterTemplate.h" | 236 #include "SkSpriteBlitterTemplate.h" |
237 | 237 |
238 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend | 238 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend |
239 #define SkSPRITE_ARGS , uint8_t alpha | 239 #define SkSPRITE_ARGS , uint8_t alpha |
240 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 240 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
241 #define SkSPRITE_INIT fSrcAlpha = alpha; | 241 #define SkSPRITE_INIT fSrcAlpha = alpha; |
242 #define SkSPRITE_DST_TYPE uint16_t | 242 #define SkSPRITE_DST_TYPE uint16_t |
243 #define SkSPRITE_SRC_TYPE uint8_t | 243 #define SkSPRITE_SRC_TYPE uint8_t |
244 #define SkSPRITE_DST_GETADDR getAddr16 | 244 #define SkSPRITE_DST_GETADDR writable_addr16 |
245 #define SkSPRITE_SRC_GETADDR addr8 | 245 #define SkSPRITE_SRC_GETADDR addr8 |
246 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); | 246 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); |
247 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src]
, src_scale) | 247 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src]
, src_scale) |
248 #define SkSPRITE_NEXT_ROW | 248 #define SkSPRITE_NEXT_ROW |
249 #define SkSPRITE_POSTAMBLE(srcBM) | 249 #define SkSPRITE_POSTAMBLE(srcBM) |
250 #include "SkSpriteBlitterTemplate.h" | 250 #include "SkSpriteBlitterTemplate.h" |
251 | 251 |
252 /////////////////////////////////////////////////////////////////////////////// | 252 /////////////////////////////////////////////////////////////////////////////// |
253 | 253 |
254 class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter { | 254 class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter { |
255 public: | 255 public: |
256 Sprite_D16_S32_BlitRowProc(const SkPixmap& source) : SkSpriteBlitter(source)
{} | 256 Sprite_D16_S32_BlitRowProc(const SkPixmap& source) : SkSpriteBlitter(source)
{} |
257 | 257 |
258 void setup(const SkBitmap& device, int left, int top, const SkPaint& paint)
override { | 258 void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) ove
rride { |
259 this->INHERITED::setup(device, left, top, paint); | 259 this->INHERITED::setup(dst, left, top, paint); |
260 | 260 |
261 unsigned flags = 0; | 261 unsigned flags = 0; |
262 | 262 |
263 if (paint.getAlpha() < 0xFF) { | 263 if (paint.getAlpha() < 0xFF) { |
264 flags |= SkBlitRow::kGlobalAlpha_Flag; | 264 flags |= SkBlitRow::kGlobalAlpha_Flag; |
265 } | 265 } |
266 if (!fSource.isOpaque()) { | 266 if (!fSource.isOpaque()) { |
267 flags |= SkBlitRow::kSrcPixelAlpha_Flag; | 267 flags |= SkBlitRow::kSrcPixelAlpha_Flag; |
268 } | 268 } |
269 if (paint.isDither()) { | 269 if (paint.isDither()) { |
270 flags |= SkBlitRow::kDither_Flag; | 270 flags |= SkBlitRow::kDither_Flag; |
271 } | 271 } |
272 fProc = SkBlitRow::Factory16(flags); | 272 fProc = SkBlitRow::Factory16(flags); |
273 } | 273 } |
274 | 274 |
275 void blitRect(int x, int y, int width, int height) override { | 275 void blitRect(int x, int y, int width, int height) override { |
276 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y); | 276 uint16_t* SK_RESTRICT dst = fDst.writable_addr16(x, y); |
277 const SkPMColor* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); | 277 const SkPMColor* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); |
278 size_t dstRB = fDevice->rowBytes(); | 278 size_t dstRB = fDst.rowBytes(); |
279 size_t srcRB = fSource.rowBytes(); | 279 size_t srcRB = fSource.rowBytes(); |
280 SkBlitRow::Proc16 proc = fProc; | 280 SkBlitRow::Proc16 proc = fProc; |
281 U8CPU alpha = fPaint->getAlpha(); | 281 U8CPU alpha = fPaint->getAlpha(); |
282 | 282 |
283 while (--height >= 0) { | 283 while (--height >= 0) { |
284 proc(dst, src, width, alpha, x, y); | 284 proc(dst, src, width, alpha, x, y); |
285 y += 1; | 285 y += 1; |
286 dst = (uint16_t* SK_RESTRICT)((char*)dst + dstRB); | 286 dst = (uint16_t* SK_RESTRICT)((char*)dst + dstRB); |
287 src = (const SkPMColor* SK_RESTRICT)((const char*)src + srcRB); | 287 src = (const SkPMColor* SK_RESTRICT)((const char*)src + srcRB); |
288 } | 288 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 } else { | 361 } else { |
362 blitter = allocator->createT<Sprite_D16_SIndex8A_Blend>(sour
ce, alpha); | 362 blitter = allocator->createT<Sprite_D16_SIndex8A_Blend>(sour
ce, alpha); |
363 } | 363 } |
364 } | 364 } |
365 break; | 365 break; |
366 default: | 366 default: |
367 break; | 367 break; |
368 } | 368 } |
369 return blitter; | 369 return blitter; |
370 } | 370 } |
OLD | NEW |