OLD | NEW |
1 #include "SkBlitMask.h" | 1 #include "SkBlitMask.h" |
2 #include "SkColor.h" | 2 #include "SkColor.h" |
3 #include "SkColorPriv.h" | 3 #include "SkColorPriv.h" |
4 | 4 |
5 static void D32_A8_Color(void* SK_RESTRICT dst, size_t dstRB, | 5 static void D32_A8_Color(void* SK_RESTRICT dst, size_t dstRB, |
6 const void* SK_RESTRICT maskPtr, size_t maskRB, | 6 const void* SK_RESTRICT maskPtr, size_t maskRB, |
7 SkColor color, int width, int height) { | 7 SkColor color, int width, int height) { |
8 SkPMColor pmc = SkPreMultiplyColor(color); | 8 SkPMColor pmc = SkPreMultiplyColor(color); |
9 size_t dstOffset = dstRB - (width << 2); | 9 size_t dstOffset = dstRB - (width << 2); |
10 size_t maskOffset = maskRB - width; | 10 size_t maskOffset = maskRB - width; |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 return D32_A8_Opaque; | 223 return D32_A8_Opaque; |
224 } else { | 224 } else { |
225 return D32_A8_Color; | 225 return D32_A8_Color; |
226 } | 226 } |
227 } | 227 } |
228 | 228 |
229 static SkBlitMask::ColorProc D32_LCD32_Factory(SkColor color) { | 229 static SkBlitMask::ColorProc D32_LCD32_Factory(SkColor color) { |
230 return (0xFF == SkColorGetA(color)) ? D32_LCD32_Opaque : D32_LCD32_Blend; | 230 return (0xFF == SkColorGetA(color)) ? D32_LCD32_Opaque : D32_LCD32_Blend; |
231 } | 231 } |
232 | 232 |
233 SkBlitMask::ColorProc SkBlitMask::ColorFactory(SkBitmap::Config config, | 233 SkBlitMask::ColorProc SkBlitMask::ColorFactory(SkColorType ct, |
234 SkMask::Format format, | 234 SkMask::Format format, |
235 SkColor color) { | 235 SkColor color) { |
236 ColorProc proc = PlatformColorProcs(config, format, color); | 236 ColorProc proc = PlatformColorProcs(ct, format, color); |
237 if (proc) { | 237 if (proc) { |
238 return proc; | 238 return proc; |
239 } | 239 } |
240 | 240 |
241 switch (config) { | 241 switch (ct) { |
242 case SkBitmap::kARGB_8888_Config: | 242 case kN32_SkColorType: |
243 switch (format) { | 243 switch (format) { |
244 case SkMask::kA8_Format: | 244 case SkMask::kA8_Format: |
245 return D32_A8_Factory(color); | 245 return D32_A8_Factory(color); |
246 case SkMask::kLCD16_Format: | 246 case SkMask::kLCD16_Format: |
247 return D32_LCD16_Proc; | 247 return D32_LCD16_Proc; |
248 case SkMask::kLCD32_Format: | 248 case SkMask::kLCD32_Format: |
249 return D32_LCD32_Factory(color); | 249 return D32_LCD32_Factory(color); |
250 default: | 250 default: |
251 break; | 251 break; |
252 } | 252 } |
253 break; | 253 break; |
254 default: | 254 default: |
255 break; | 255 break; |
256 } | 256 } |
257 return NULL; | 257 return NULL; |
258 } | 258 } |
259 | 259 |
260 bool SkBlitMask::BlitColor(const SkBitmap& device, const SkMask& mask, | 260 bool SkBlitMask::BlitColor(const SkBitmap& device, const SkMask& mask, |
261 const SkIRect& clip, SkColor color) { | 261 const SkIRect& clip, SkColor color) { |
262 ColorProc proc = ColorFactory(device.config(), mask.fFormat, color); | 262 ColorProc proc = ColorFactory(device.colorType(), mask.fFormat, color); |
263 if (proc) { | 263 if (proc) { |
264 int x = clip.fLeft; | 264 int x = clip.fLeft; |
265 int y = clip.fTop; | 265 int y = clip.fTop; |
266 proc(device.getAddr32(x, y), device.rowBytes(), mask.getAddr(x, y), | 266 proc(device.getAddr32(x, y), device.rowBytes(), mask.getAddr(x, y), |
267 mask.fRowBytes, color, clip.width(), clip.height()); | 267 mask.fRowBytes, color, clip.width(), clip.height()); |
268 return true; | 268 return true; |
269 } | 269 } |
270 return false; | 270 return false; |
271 } | 271 } |
272 | 272 |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 | 541 |
542 // LCD blitting is only supported if the dst is known/required | 542 // LCD blitting is only supported if the dst is known/required |
543 // to be opaque | 543 // to be opaque |
544 dst[i] = SkPackARGB32(0xFF, | 544 dst[i] = SkPackARGB32(0xFF, |
545 SkAlphaBlend(srcR, dstR, maskR), | 545 SkAlphaBlend(srcR, dstR, maskR), |
546 SkAlphaBlend(srcG, dstG, maskG), | 546 SkAlphaBlend(srcG, dstG, maskG), |
547 SkAlphaBlend(srcB, dstB, maskB)); | 547 SkAlphaBlend(srcB, dstB, maskB)); |
548 } | 548 } |
549 } | 549 } |
550 | 550 |
551 SkBlitMask::RowProc SkBlitMask::RowFactory(SkBitmap::Config config, | 551 SkBlitMask::RowProc SkBlitMask::RowFactory(SkColorType ct, |
552 SkMask::Format format, | 552 SkMask::Format format, |
553 RowFlags flags) { | 553 RowFlags flags) { |
554 // make this opt-in until chrome can rebaseline | 554 // make this opt-in until chrome can rebaseline |
555 RowProc proc = PlatformRowProcs(config, format, flags); | 555 RowProc proc = PlatformRowProcs(ct, format, flags); |
556 if (proc) { | 556 if (proc) { |
557 return proc; | 557 return proc; |
558 } | 558 } |
559 | 559 |
560 static const RowProc gProcs[] = { | 560 static const RowProc gProcs[] = { |
561 // need X coordinate to handle BW | 561 // need X coordinate to handle BW |
562 false ? (RowProc)BW_RowProc_Blend : NULL, // suppress unused warning | 562 false ? (RowProc)BW_RowProc_Blend : NULL, // suppress unused warning |
563 false ? (RowProc)BW_RowProc_Opaque : NULL, // suppress unused warning | 563 false ? (RowProc)BW_RowProc_Opaque : NULL, // suppress unused warning |
564 (RowProc)A8_RowProc_Blend, (RowProc)A8_RowProc_Opaque, | 564 (RowProc)A8_RowProc_Blend, (RowProc)A8_RowProc_Opaque, |
565 (RowProc)LCD16_RowProc_Blend, (RowProc)LCD16_RowProc_Opaque, | 565 (RowProc)LCD16_RowProc_Blend, (RowProc)LCD16_RowProc_Opaque, |
566 (RowProc)LCD32_RowProc_Blend, (RowProc)LCD32_RowProc_Opaque, | 566 (RowProc)LCD32_RowProc_Blend, (RowProc)LCD32_RowProc_Opaque, |
567 }; | 567 }; |
568 | 568 |
569 int index; | 569 int index; |
570 switch (config) { | 570 switch (ct) { |
571 case SkBitmap::kARGB_8888_Config: | 571 case kN32_SkColorType: |
572 switch (format) { | 572 switch (format) { |
573 case SkMask::kBW_Format: index = 0; break; | 573 case SkMask::kBW_Format: index = 0; break; |
574 case SkMask::kA8_Format: index = 2; break; | 574 case SkMask::kA8_Format: index = 2; break; |
575 case SkMask::kLCD16_Format: index = 4; break; | 575 case SkMask::kLCD16_Format: index = 4; break; |
576 case SkMask::kLCD32_Format: index = 6; break; | 576 case SkMask::kLCD32_Format: index = 6; break; |
577 default: | 577 default: |
578 return NULL; | 578 return NULL; |
579 } | 579 } |
580 if (flags & kSrcIsOpaque_RowFlag) { | 580 if (flags & kSrcIsOpaque_RowFlag) { |
581 index |= 1; | 581 index |= 1; |
582 } | 582 } |
583 SkASSERT((size_t)index < SK_ARRAY_COUNT(gProcs)); | 583 SkASSERT((size_t)index < SK_ARRAY_COUNT(gProcs)); |
584 return gProcs[index]; | 584 return gProcs[index]; |
585 default: | 585 default: |
586 break; | 586 break; |
587 } | 587 } |
588 return NULL; | 588 return NULL; |
589 } | 589 } |
OLD | NEW |