blob: 4d3f7ce8cf815cd7e8d6228b3cec2caaa0aa21d2 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SkCoreBlitters.h"
Cary Clarka4083c92017-09-15 11:59:23 -04009#include "SkColorData.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#include "SkShader.h"
Mike Reedd4706732016-11-15 16:44:34 -050011#include "SkXfermodePriv.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012
reed41e010c2015-06-09 12:16:53 -070013SkA8_Coverage_Blitter::SkA8_Coverage_Blitter(const SkPixmap& device,
reed@google.com126f7f52013-11-07 16:06:53 +000014 const SkPaint& paint) : SkRasterBlitter(device) {
halcanary96fcdcc2015-08-27 07:41:13 -070015 SkASSERT(nullptr == paint.getShader());
reed374772b2016-10-05 17:33:02 -070016 SkASSERT(paint.isSrcOver());
halcanary96fcdcc2015-08-27 07:41:13 -070017 SkASSERT(nullptr == paint.getColorFilter());
reed@google.com126f7f52013-11-07 16:06:53 +000018}
19
20void SkA8_Coverage_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[],
21 const int16_t runs[]) {
reed41e010c2015-06-09 12:16:53 -070022 uint8_t* device = fDevice.writable_addr8(x, y);
reed@google.com126f7f52013-11-07 16:06:53 +000023 SkDEBUGCODE(int totalCount = 0;)
skia.committer@gmail.comab7442c2013-11-08 07:01:56 +000024
reed@google.com126f7f52013-11-07 16:06:53 +000025 for (;;) {
26 int count = runs[0];
27 SkASSERT(count >= 0);
28 if (count == 0) {
29 return;
30 }
reed@google.comb95d9f52013-11-08 17:50:14 +000031 if (antialias[0]) {
reed@google.com126f7f52013-11-07 16:06:53 +000032 memset(device, antialias[0], count);
33 }
34 runs += count;
35 antialias += count;
36 device += count;
37
38 SkDEBUGCODE(totalCount += count;)
39 }
40 SkASSERT(fDevice.width() == totalCount);
41}
42
43void SkA8_Coverage_Blitter::blitH(int x, int y, int width) {
reed41e010c2015-06-09 12:16:53 -070044 memset(fDevice.writable_addr8(x, y), 0xFF, width);
reed@google.com126f7f52013-11-07 16:06:53 +000045}
46
47void SkA8_Coverage_Blitter::blitV(int x, int y, int height, SkAlpha alpha) {
reed@google.com126f7f52013-11-07 16:06:53 +000048 if (0 == alpha) {
49 return;
50 }
reed@google.comb95d9f52013-11-08 17:50:14 +000051
reed41e010c2015-06-09 12:16:53 -070052 uint8_t* dst = fDevice.writable_addr8(x, y);
reed@google.com126f7f52013-11-07 16:06:53 +000053 const size_t dstRB = fDevice.rowBytes();
54 while (--height >= 0) {
55 *dst = alpha;
56 dst += dstRB;
57 }
58}
59
60void SkA8_Coverage_Blitter::blitRect(int x, int y, int width, int height) {
reed41e010c2015-06-09 12:16:53 -070061 uint8_t* dst = fDevice.writable_addr8(x, y);
reed@google.com126f7f52013-11-07 16:06:53 +000062 const size_t dstRB = fDevice.rowBytes();
63 while (--height >= 0) {
64 memset(dst, 0xFF, width);
65 dst += dstRB;
66 }
67}
68
69void SkA8_Coverage_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) {
70 SkASSERT(SkMask::kA8_Format == mask.fFormat);
71
72 int x = clip.fLeft;
73 int y = clip.fTop;
74 int width = clip.width();
75 int height = clip.height();
76
reed41e010c2015-06-09 12:16:53 -070077 uint8_t* dst = fDevice.writable_addr8(x, y);
reed@google.com126f7f52013-11-07 16:06:53 +000078 const uint8_t* src = mask.getAddr8(x, y);
79 const size_t srcRB = mask.fRowBytes;
80 const size_t dstRB = fDevice.rowBytes();
skia.committer@gmail.comab7442c2013-11-08 07:01:56 +000081
reed@google.com126f7f52013-11-07 16:06:53 +000082 while (--height >= 0) {
83 memcpy(dst, src, width);
84 dst += dstRB;
85 src += srcRB;
86 }
87}
88
reed41e010c2015-06-09 12:16:53 -070089const SkPixmap* SkA8_Coverage_Blitter::justAnOpaqueColor(uint32_t*) {
halcanary96fcdcc2015-08-27 07:41:13 -070090 return nullptr;
reed@google.com126f7f52013-11-07 16:06:53 +000091}