Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: src/core/SkSpriteBlitter_RGB16.cpp

Issue 1143173011: use pixmaps for dst in sprites -- NO BITMAPS (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add dox Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkSpriteBlitter_ARGB32.cpp ('k') | tests/BitmapTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/core/SkSpriteBlitter_ARGB32.cpp ('k') | tests/BitmapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698