OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCoreBlitters.h" | 8 #include "SkCoreBlitters.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkShader.h" | 10 #include "SkShader.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 } | 73 } |
74 } | 74 } |
75 } | 75 } |
76 device += count; | 76 device += count; |
77 runs += count; | 77 runs += count; |
78 antialias += count; | 78 antialias += count; |
79 x += count; | 79 x += count; |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
| 83 void blitLCDMask(const SkMask& mask, const SkIRect& clip) { |
| 84 auto proc = fState.getLCDProc(SkXfermode::kSrcIsSingle_LCDFlag); |
| 85 |
| 86 const int x = clip.fLeft; |
| 87 const int width = clip.width(); |
| 88 const int y = clip.fTop; |
| 89 const int height = clip.height(); |
| 90 |
| 91 typename State::DstType* device = State::WritableAddr(fDevice, x, y); |
| 92 const size_t dstRB = fDevice.rowBytes(); |
| 93 const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); |
| 94 const size_t maskRB = mask.fRowBytes; |
| 95 |
| 96 for (int i = 0; i < height; ++i) { |
| 97 proc(device, &fState.fPM4f, width, maskRow); |
| 98 device = (typename State::DstType*)((char*)device + dstRB); |
| 99 maskRow = (const uint16_t*)((const char*)maskRow + maskRB); |
| 100 } |
| 101 } |
| 102 |
83 void blitMask(const SkMask& mask, const SkIRect& clip) override { | 103 void blitMask(const SkMask& mask, const SkIRect& clip) override { |
84 // we only handle kA8 | 104 if (SkMask::kLCD16_Format == mask.fFormat) { |
| 105 this->blitLCDMask(mask, clip); |
| 106 return; |
| 107 } |
85 if (SkMask::kA8_Format != mask.fFormat) { | 108 if (SkMask::kA8_Format != mask.fFormat) { |
86 this->INHERITED::blitMask(mask, clip); | 109 this->INHERITED::blitMask(mask, clip); |
87 return; | 110 return; |
88 } | 111 } |
89 | 112 |
90 SkASSERT(mask.fBounds.contains(clip)); | 113 SkASSERT(mask.fBounds.contains(clip)); |
91 | 114 |
92 const int x = clip.fLeft; | 115 const int x = clip.fLeft; |
93 const int width = clip.width(); | 116 const int width = clip.width(); |
94 const int y = clip.fTop; | 117 const int y = clip.fTop; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 206 } |
184 } | 207 } |
185 } | 208 } |
186 device += count; | 209 device += count; |
187 runs += count; | 210 runs += count; |
188 antialias += count; | 211 antialias += count; |
189 x += count; | 212 x += count; |
190 } | 213 } |
191 } | 214 } |
192 | 215 |
| 216 void blitLCDMask(const SkMask& mask, const SkIRect& clip) { |
| 217 auto proc = fState.getLCDProc(0); |
| 218 |
| 219 const int x = clip.fLeft; |
| 220 const int width = clip.width(); |
| 221 int y = clip.fTop; |
| 222 |
| 223 typename State::DstType* device = State::WritableAddr(fDevice, x, y); |
| 224 const size_t deviceRB = fDevice.rowBytes(); |
| 225 const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); |
| 226 const size_t maskRB = mask.fRowBytes; |
| 227 |
| 228 if (fConstInY) { |
| 229 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); |
| 230 } |
| 231 for (; y < clip.fBottom; ++y) { |
| 232 if (!fConstInY) { |
| 233 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); |
| 234 } |
| 235 proc(device, fState.fBuffer, width, maskRow); |
| 236 device = (typename State::DstType*)((char*)device + deviceRB); |
| 237 maskRow = (const uint16_t*)((const char*)maskRow + maskRB); |
| 238 } |
| 239 } |
| 240 |
193 void blitMask(const SkMask& mask, const SkIRect& clip) override { | 241 void blitMask(const SkMask& mask, const SkIRect& clip) override { |
194 // we only handle kA8 | 242 if (SkMask::kLCD16_Format == mask.fFormat) { |
| 243 this->blitLCDMask(mask, clip); |
| 244 return; |
| 245 } |
195 if (SkMask::kA8_Format != mask.fFormat) { | 246 if (SkMask::kA8_Format != mask.fFormat) { |
196 this->INHERITED::blitMask(mask, clip); | 247 this->INHERITED::blitMask(mask, clip); |
197 return; | 248 return; |
198 } | 249 } |
199 | 250 |
200 SkASSERT(mask.fBounds.contains(clip)); | 251 SkASSERT(mask.fBounds.contains(clip)); |
201 | 252 |
202 const int x = clip.fLeft; | 253 const int x = clip.fLeft; |
203 const int width = clip.width(); | 254 const int width = clip.width(); |
204 int y = clip.fTop; | 255 int y = clip.fTop; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 fBuffer = new SkPM4f[info.width()]; | 315 fBuffer = new SkPM4f[info.width()]; |
265 } else { | 316 } else { |
266 fPM4f = SkColor4f::FromColor(paint.getColor()).premul(); | 317 fPM4f = SkColor4f::FromColor(paint.getColor()).premul(); |
267 } | 318 } |
268 } | 319 } |
269 | 320 |
270 ~State32() { | 321 ~State32() { |
271 SkSafeUnref(fXfer); | 322 SkSafeUnref(fXfer); |
272 delete[] fBuffer; | 323 delete[] fBuffer; |
273 } | 324 } |
274 | 325 |
| 326 SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const { |
| 327 uint32_t flags = fFlags & 1; |
| 328 if (!(fFlags & SkXfermode::kDstIsSRGB_PM4fFlag)) { |
| 329 flags |= SkXfermode::kDstIsLinearInt_LCDFlag; |
| 330 } |
| 331 return SkXfermode::GetLCD32Proc(flags | oneOrManyFlag); |
| 332 } |
| 333 |
275 static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 334 static DstType* WritableAddr(const SkPixmap& device, int x, int y) { |
276 return device.writable_addr32(x, y); | 335 return device.writable_addr32(x, y); |
277 } | 336 } |
278 }; | 337 }; |
279 | 338 |
280 struct State64 : SkXfermode::U64State { | 339 struct State64 : SkXfermode::U64State { |
281 typedef uint64_t DstType; | 340 typedef uint64_t DstType; |
282 | 341 |
283 SkXfermode::U64Proc1 fProc1; | 342 SkXfermode::U64Proc1 fProc1; |
284 SkXfermode::U64ProcN fProcN; | 343 SkXfermode::U64ProcN fProcN; |
(...skipping 23 matching lines...) Expand all Loading... |
308 } else { | 367 } else { |
309 fPM4f = SkColor4f::FromColor(paint.getColor()).premul(); | 368 fPM4f = SkColor4f::FromColor(paint.getColor()).premul(); |
310 } | 369 } |
311 } | 370 } |
312 | 371 |
313 ~State64() { | 372 ~State64() { |
314 SkSafeUnref(fXfer); | 373 SkSafeUnref(fXfer); |
315 delete[] fBuffer; | 374 delete[] fBuffer; |
316 } | 375 } |
317 | 376 |
| 377 SkXfermode::LCD64Proc getLCDProc(uint32_t oneOrManyFlag) const { |
| 378 uint32_t flags = fFlags & 1; |
| 379 if (!(fFlags & SkXfermode::kDstIsFloat16_U64Flag)) { |
| 380 flags |= SkXfermode::kDstIsLinearInt_LCDFlag; |
| 381 } |
| 382 return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag); |
| 383 } |
| 384 |
318 static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 385 static DstType* WritableAddr(const SkPixmap& device, int x, int y) { |
319 return device.writable_addr64(x, y); | 386 return device.writable_addr64(x, y); |
320 } | 387 } |
321 }; | 388 }; |
322 | 389 |
323 template <typename State> SkBlitter* create(const SkPixmap& device, const SkPain
t& paint, | 390 template <typename State> SkBlitter* create(const SkPixmap& device, const SkPain
t& paint, |
324 SkShader::Context* shaderContext, | 391 SkShader::Context* shaderContext, |
325 SkTBlitterAllocator* allocator) { | 392 SkTBlitterAllocator* allocator) { |
326 SkASSERT(allocator != nullptr); | 393 SkASSERT(allocator != nullptr); |
327 | 394 |
(...skipping 12 matching lines...) Expand all Loading... |
340 SkShader::Context* shaderContext, | 407 SkShader::Context* shaderContext, |
341 SkTBlitterAllocator* allocator) { | 408 SkTBlitterAllocator* allocator) { |
342 return create<State32>(device, paint, shaderContext, allocator); | 409 return create<State32>(device, paint, shaderContext, allocator); |
343 } | 410 } |
344 | 411 |
345 SkBlitter* SkBlitter_ARGB64_Create(const SkPixmap& device, const SkPaint& paint, | 412 SkBlitter* SkBlitter_ARGB64_Create(const SkPixmap& device, const SkPaint& paint, |
346 SkShader::Context* shaderContext, | 413 SkShader::Context* shaderContext, |
347 SkTBlitterAllocator* allocator) { | 414 SkTBlitterAllocator* allocator) { |
348 return create<State64>(device, paint, shaderContext, allocator); | 415 return create<State64>(device, paint, shaderContext, allocator); |
349 } | 416 } |
OLD | NEW |