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

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

Issue 1156713004: remove bitmaps entirely from sprite blits (as source) (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 7 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/SkSpriteBlitterTemplate.h ('k') | src/core/SkSpriteBlitter_RGB16.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"
11 #include "SkBlitRow.h" 11 #include "SkBlitRow.h"
12 #include "SkColorFilter.h" 12 #include "SkColorFilter.h"
13 #include "SkColorPriv.h" 13 #include "SkColorPriv.h"
14 #include "SkTemplates.h" 14 #include "SkTemplates.h"
15 #include "SkUtils.h" 15 #include "SkUtils.h"
16 #include "SkXfermode.h" 16 #include "SkXfermode.h"
17 17
18 /////////////////////////////////////////////////////////////////////////////// 18 ///////////////////////////////////////////////////////////////////////////////
19 19
20 class Sprite_D32_S32 : public SkSpriteBlitter { 20 class Sprite_D32_S32 : public SkSpriteBlitter {
21 public: 21 public:
22 Sprite_D32_S32(const SkBitmap& src, U8CPU alpha) : INHERITED(src) { 22 Sprite_D32_S32(const SkPixmap& src, U8CPU alpha) : INHERITED(src) {
23 SkASSERT(src.colorType() == kN32_SkColorType); 23 SkASSERT(src.colorType() == kN32_SkColorType);
24 24
25 unsigned flags32 = 0; 25 unsigned flags32 = 0;
26 if (255 != alpha) { 26 if (255 != alpha) {
27 flags32 |= SkBlitRow::kGlobalAlpha_Flag32; 27 flags32 |= SkBlitRow::kGlobalAlpha_Flag32;
28 } 28 }
29 if (!src.isOpaque()) { 29 if (!src.isOpaque()) {
30 flags32 |= SkBlitRow::kSrcPixelAlpha_Flag32; 30 flags32 |= SkBlitRow::kSrcPixelAlpha_Flag32;
31 } 31 }
32 32
33 fProc32 = SkBlitRow::Factory32(flags32); 33 fProc32 = SkBlitRow::Factory32(flags32);
34 fAlpha = alpha; 34 fAlpha = alpha;
35 } 35 }
36 36
37 void blitRect(int x, int y, int width, int height) override { 37 void blitRect(int x, int y, int width, int height) override {
38 SkASSERT(width > 0 && height > 0); 38 SkASSERT(width > 0 && height > 0);
39 uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y); 39 uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y);
40 const uint32_t* SK_RESTRICT src = fSource->addr32(x - fLeft, y - fTop); 40 const uint32_t* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop);
41 size_t dstRB = fDevice->rowBytes(); 41 size_t dstRB = fDevice->rowBytes();
42 size_t srcRB = fSource->rowBytes(); 42 size_t srcRB = fSource.rowBytes();
43 SkBlitRow::Proc32 proc = fProc32; 43 SkBlitRow::Proc32 proc = fProc32;
44 U8CPU alpha = fAlpha; 44 U8CPU alpha = fAlpha;
45 45
46 do { 46 do {
47 proc(dst, src, width, alpha); 47 proc(dst, src, width, alpha);
48 dst = (uint32_t* SK_RESTRICT)((char*)dst + dstRB); 48 dst = (uint32_t* SK_RESTRICT)((char*)dst + dstRB);
49 src = (const uint32_t* SK_RESTRICT)((const char*)src + srcRB); 49 src = (const uint32_t* SK_RESTRICT)((const char*)src + srcRB);
50 } while (--height != 0); 50 } while (--height != 0);
51 } 51 }
52 52
53 private: 53 private:
54 SkBlitRow::Proc32 fProc32; 54 SkBlitRow::Proc32 fProc32;
55 U8CPU fAlpha; 55 U8CPU fAlpha;
56 56
57 typedef SkSpriteBlitter INHERITED; 57 typedef SkSpriteBlitter INHERITED;
58 }; 58 };
59 59
60 /////////////////////////////////////////////////////////////////////////////// 60 ///////////////////////////////////////////////////////////////////////////////
61 61
62 class Sprite_D32_XferFilter : public SkSpriteBlitter { 62 class Sprite_D32_XferFilter : public SkSpriteBlitter {
63 public: 63 public:
64 Sprite_D32_XferFilter(const SkBitmap& source, const SkPaint& paint) 64 Sprite_D32_XferFilter(const SkPixmap& source, const SkPaint& paint) : SkSpri teBlitter(source) {
65 : SkSpriteBlitter(source) {
66 fColorFilter = paint.getColorFilter(); 65 fColorFilter = paint.getColorFilter();
67 SkSafeRef(fColorFilter); 66 SkSafeRef(fColorFilter);
68 67
69 fXfermode = paint.getXfermode(); 68 fXfermode = paint.getXfermode();
70 SkSafeRef(fXfermode); 69 SkSafeRef(fXfermode);
71 70
72 fBufferSize = 0; 71 fBufferSize = 0;
73 fBuffer = NULL; 72 fBuffer = NULL;
74 73
75 unsigned flags32 = 0; 74 unsigned flags32 = 0;
76 if (255 != paint.getAlpha()) { 75 if (255 != paint.getAlpha()) {
77 flags32 |= SkBlitRow::kGlobalAlpha_Flag32; 76 flags32 |= SkBlitRow::kGlobalAlpha_Flag32;
78 } 77 }
79 if (!source.isOpaque()) { 78 if (!source.isOpaque()) {
80 flags32 |= SkBlitRow::kSrcPixelAlpha_Flag32; 79 flags32 |= SkBlitRow::kSrcPixelAlpha_Flag32;
81 } 80 }
82 81
83 fProc32 = SkBlitRow::Factory32(flags32); 82 fProc32 = SkBlitRow::Factory32(flags32);
84 fAlpha = paint.getAlpha(); 83 fAlpha = paint.getAlpha();
85 } 84 }
86 85
87 virtual ~Sprite_D32_XferFilter() { 86 virtual ~Sprite_D32_XferFilter() {
88 delete[] fBuffer; 87 delete[] fBuffer;
89 SkSafeUnref(fXfermode); 88 SkSafeUnref(fXfermode);
90 SkSafeUnref(fColorFilter); 89 SkSafeUnref(fColorFilter);
91 } 90 }
92 91
93 bool setup(const SkBitmap& device, int left, int top, const SkPaint& paint) override { 92 void setup(const SkBitmap& device, int left, int top, const SkPaint& paint) override {
94 if (!this->INHERITED::setup(device, left, top, paint)) { 93 this->INHERITED::setup(device, left, top, paint);
95 return false;
96 }
97 94
98 int width = device.width(); 95 int width = device.width();
99 if (width > fBufferSize) { 96 if (width > fBufferSize) {
100 fBufferSize = width; 97 fBufferSize = width;
101 delete[] fBuffer; 98 delete[] fBuffer;
102 fBuffer = new SkPMColor[width]; 99 fBuffer = new SkPMColor[width];
103 } 100 }
104 return true;
105 } 101 }
106 102
107 protected: 103 protected:
108 SkColorFilter* fColorFilter; 104 SkColorFilter* fColorFilter;
109 SkXfermode* fXfermode; 105 SkXfermode* fXfermode;
110 int fBufferSize; 106 int fBufferSize;
111 SkPMColor* fBuffer; 107 SkPMColor* fBuffer;
112 SkBlitRow::Proc32 fProc32; 108 SkBlitRow::Proc32 fProc32;
113 U8CPU fAlpha; 109 U8CPU fAlpha;
114 110
115 private: 111 private:
116 typedef SkSpriteBlitter INHERITED; 112 typedef SkSpriteBlitter INHERITED;
117 }; 113 };
118 114
119 /////////////////////////////////////////////////////////////////////////////// 115 ///////////////////////////////////////////////////////////////////////////////
120 116
121 class Sprite_D32_S32A_XferFilter : public Sprite_D32_XferFilter { 117 class Sprite_D32_S32A_XferFilter : public Sprite_D32_XferFilter {
122 public: 118 public:
123 Sprite_D32_S32A_XferFilter(const SkBitmap& source, const SkPaint& paint) 119 Sprite_D32_S32A_XferFilter(const SkPixmap& source, const SkPaint& paint)
124 : Sprite_D32_XferFilter(source, paint) {} 120 : Sprite_D32_XferFilter(source, paint) {}
125 121
126 void blitRect(int x, int y, int width, int height) override { 122 void blitRect(int x, int y, int width, int height) override {
127 SkASSERT(width > 0 && height > 0); 123 SkASSERT(width > 0 && height > 0);
128 uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y); 124 uint32_t* SK_RESTRICT dst = fDevice->getAddr32(x, y);
129 const uint32_t* SK_RESTRICT src = fSource->addr32(x - fLeft, y - fTop); 125 const uint32_t* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop);
130 size_t dstRB = fDevice->rowBytes(); 126 size_t dstRB = fDevice->rowBytes();
131 size_t srcRB = fSource->rowBytes(); 127 size_t srcRB = fSource.rowBytes();
132 SkColorFilter* colorFilter = fColorFilter; 128 SkColorFilter* colorFilter = fColorFilter;
133 SkXfermode* xfermode = fXfermode; 129 SkXfermode* xfermode = fXfermode;
134 130
135 do { 131 do {
136 const SkPMColor* tmp = src; 132 const SkPMColor* tmp = src;
137 133
138 if (colorFilter) { 134 if (colorFilter) {
139 colorFilter->filterSpan(src, width, fBuffer); 135 colorFilter->filterSpan(src, width, fBuffer);
140 tmp = fBuffer; 136 tmp = fBuffer;
141 } 137 }
(...skipping 17 matching lines...) Expand all
159 const SkPMColor16* SK_RESTRICT src, int count) { 155 const SkPMColor16* SK_RESTRICT src, int count) {
160 SkASSERT(count > 0); 156 SkASSERT(count > 0);
161 157
162 do { 158 do {
163 *dst++ = SkPixel4444ToPixel32(*src++); 159 *dst++ = SkPixel4444ToPixel32(*src++);
164 } while (--count != 0); 160 } while (--count != 0);
165 } 161 }
166 162
167 class Sprite_D32_S4444_XferFilter : public Sprite_D32_XferFilter { 163 class Sprite_D32_S4444_XferFilter : public Sprite_D32_XferFilter {
168 public: 164 public:
169 Sprite_D32_S4444_XferFilter(const SkBitmap& source, const SkPaint& paint) 165 Sprite_D32_S4444_XferFilter(const SkPixmap& source, const SkPaint& paint)
170 : Sprite_D32_XferFilter(source, paint) {} 166 : Sprite_D32_XferFilter(source, paint) {}
171 167
172 void blitRect(int x, int y, int width, int height) override { 168 void blitRect(int x, int y, int width, int height) override {
173 SkASSERT(width > 0 && height > 0); 169 SkASSERT(width > 0 && height > 0);
174 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y); 170 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
175 const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop ); 171 const SkPMColor16* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop) ;
176 size_t dstRB = fDevice->rowBytes(); 172 size_t dstRB = fDevice->rowBytes();
177 size_t srcRB = fSource->rowBytes(); 173 size_t srcRB = fSource.rowBytes();
178 SkPMColor* SK_RESTRICT buffer = fBuffer; 174 SkPMColor* SK_RESTRICT buffer = fBuffer;
179 SkColorFilter* colorFilter = fColorFilter; 175 SkColorFilter* colorFilter = fColorFilter;
180 SkXfermode* xfermode = fXfermode; 176 SkXfermode* xfermode = fXfermode;
181 177
182 do { 178 do {
183 fillbuffer(buffer, src, width); 179 fillbuffer(buffer, src, width);
184 180
185 if (colorFilter) { 181 if (colorFilter) {
186 colorFilter->filterSpan(buffer, width, buffer); 182 colorFilter->filterSpan(buffer, width, buffer);
187 } 183 }
(...skipping 18 matching lines...) Expand all
206 const SkPMColor16* SK_RESTRICT src, int count) { 202 const SkPMColor16* SK_RESTRICT src, int count) {
207 do { 203 do {
208 *dst = SkPixel4444ToPixel32(*src); 204 *dst = SkPixel4444ToPixel32(*src);
209 src += 1; 205 src += 1;
210 dst += 1; 206 dst += 1;
211 } while (--count != 0); 207 } while (--count != 0);
212 } 208 }
213 209
214 class Sprite_D32_S4444_Opaque : public SkSpriteBlitter { 210 class Sprite_D32_S4444_Opaque : public SkSpriteBlitter {
215 public: 211 public:
216 Sprite_D32_S4444_Opaque(const SkBitmap& source) : SkSpriteBlitter(source) {} 212 Sprite_D32_S4444_Opaque(const SkPixmap& source) : SkSpriteBlitter(source) {}
217 213
218 void blitRect(int x, int y, int width, int height) override { 214 void blitRect(int x, int y, int width, int height) override {
219 SkASSERT(width > 0 && height > 0); 215 SkASSERT(width > 0 && height > 0);
220 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y); 216 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
221 const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop ); 217 const SkPMColor16* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop) ;
222 size_t dstRB = fDevice->rowBytes(); 218 size_t dstRB = fDevice->rowBytes();
223 size_t srcRB = fSource->rowBytes(); 219 size_t srcRB = fSource.rowBytes();
224 220
225 do { 221 do {
226 src_row(dst, src, width); 222 src_row(dst, src, width);
227 dst = (SkPMColor* SK_RESTRICT)((char*)dst + dstRB); 223 dst = (SkPMColor* SK_RESTRICT)((char*)dst + dstRB);
228 src = (const SkPMColor16* SK_RESTRICT)((const char*)src + srcRB); 224 src = (const SkPMColor16* SK_RESTRICT)((const char*)src + srcRB);
229 } while (--height != 0); 225 } while (--height != 0);
230 } 226 }
231 }; 227 };
232 228
233 static void srcover_row(SkPMColor* SK_RESTRICT dst, 229 static void srcover_row(SkPMColor* SK_RESTRICT dst,
234 const SkPMColor16* SK_RESTRICT src, int count) { 230 const SkPMColor16* SK_RESTRICT src, int count) {
235 do { 231 do {
236 *dst = SkPMSrcOver(SkPixel4444ToPixel32(*src), *dst); 232 *dst = SkPMSrcOver(SkPixel4444ToPixel32(*src), *dst);
237 src += 1; 233 src += 1;
238 dst += 1; 234 dst += 1;
239 } while (--count != 0); 235 } while (--count != 0);
240 } 236 }
241 237
242 class Sprite_D32_S4444 : public SkSpriteBlitter { 238 class Sprite_D32_S4444 : public SkSpriteBlitter {
243 public: 239 public:
244 Sprite_D32_S4444(const SkBitmap& source) : SkSpriteBlitter(source) {} 240 Sprite_D32_S4444(const SkPixmap& source) : SkSpriteBlitter(source) {}
245 241
246 void blitRect(int x, int y, int width, int height) override { 242 void blitRect(int x, int y, int width, int height) override {
247 SkASSERT(width > 0 && height > 0); 243 SkASSERT(width > 0 && height > 0);
248 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y); 244 SkPMColor* SK_RESTRICT dst = fDevice->getAddr32(x, y);
249 const SkPMColor16* SK_RESTRICT src = fSource->addr16(x - fLeft, y - fTop ); 245 const SkPMColor16* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop) ;
250 size_t dstRB = fDevice->rowBytes(); 246 size_t dstRB = fDevice->rowBytes();
251 size_t srcRB = fSource->rowBytes(); 247 size_t srcRB = fSource.rowBytes();
252 248
253 do { 249 do {
254 srcover_row(dst, src, width); 250 srcover_row(dst, src, width);
255 dst = (SkPMColor* SK_RESTRICT)((char*)dst + dstRB); 251 dst = (SkPMColor* SK_RESTRICT)((char*)dst + dstRB);
256 src = (const SkPMColor16* SK_RESTRICT)((const char*)src + srcRB); 252 src = (const SkPMColor16* SK_RESTRICT)((const char*)src + srcRB);
257 } while (--height != 0); 253 } while (--height != 0);
258 } 254 }
259 }; 255 };
260 256
261 /////////////////////////////////////////////////////////////////////////////// 257 ///////////////////////////////////////////////////////////////////////////////
262 258
263 SkSpriteBlitter* SkSpriteBlitter::ChooseD32(const SkBitmap& source, const SkPain t& paint, 259 SkSpriteBlitter* SkSpriteBlitter::ChooseD32(const SkPixmap& source, const SkPain t& paint,
264 SkTBlitterAllocator* allocator) { 260 SkTBlitterAllocator* allocator) {
265 SkASSERT(allocator != NULL); 261 SkASSERT(allocator != NULL);
266 262
267 if (paint.getMaskFilter() != NULL) { 263 if (paint.getMaskFilter() != NULL) {
268 return NULL; 264 return NULL;
269 } 265 }
270 266
271 U8CPU alpha = paint.getAlpha(); 267 U8CPU alpha = paint.getAlpha();
272 SkXfermode* xfermode = paint.getXfermode(); 268 SkXfermode* xfermode = paint.getXfermode();
273 SkColorFilter* filter = paint.getColorFilter(); 269 SkColorFilter* filter = paint.getColorFilter();
(...skipping 21 matching lines...) Expand all
295 } else { 291 } else {
296 // this can handle alpha, but not xfermode or filter 292 // this can handle alpha, but not xfermode or filter
297 blitter = allocator->createT<Sprite_D32_S32>(source, alpha); 293 blitter = allocator->createT<Sprite_D32_S32>(source, alpha);
298 } 294 }
299 break; 295 break;
300 default: 296 default:
301 break; 297 break;
302 } 298 }
303 return blitter; 299 return blitter;
304 } 300 }
OLDNEW
« no previous file with comments | « src/core/SkSpriteBlitterTemplate.h ('k') | src/core/SkSpriteBlitter_RGB16.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698