blob: b64afe2ae98e037eefd73c8305d79866528ae74f [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#include "SkCoreBlitters.h"
11
12SkA1_Blitter::SkA1_Blitter(const SkBitmap& device, const SkPaint& paint)
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000013 : INHERITED(device) {
14 fSrcA = paint.getAlpha();
reed@android.com8a1c16f2008-12-17 15:59:43 +000015}
16
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000017void SkA1_Blitter::blitH(int x, int y, int width) {
18 SkASSERT(x >= 0 && y >= 0 &&
19 (unsigned)(x + width) <= (unsigned)fDevice.width());
reed@android.com8a1c16f2008-12-17 15:59:43 +000020
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000021 if (fSrcA <= 0x7F) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000022 return;
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000023 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000024 uint8_t* dst = fDevice.getAddr1(x, y);
25 int right = x + width;
26
27 int left_mask = 0xFF >> (x & 7);
28 int rite_mask = 0xFF << (8 - (right & 7));
29 int full_runs = (right >> 3) - ((x + 7) >> 3);
30
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000031 // check for empty right mask, so we don't read off the end
32 // (or go slower than we need to)
33 if (rite_mask == 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 SkASSERT(full_runs >= 0);
35 full_runs -= 1;
36 rite_mask = 0xFF;
37 }
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000038 if (left_mask == 0xFF) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 full_runs -= 1;
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000040 }
41 if (full_runs < 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000042 SkASSERT((left_mask & rite_mask) != 0);
43 *dst |= (left_mask & rite_mask);
mike@reedtribe.orgeadc8072011-04-09 19:28:43 +000044 } else {
reed@android.com8a1c16f2008-12-17 15:59:43 +000045 *dst++ |= left_mask;
46 memset(dst, 0xFF, full_runs);
47 dst += full_runs;
48 *dst |= rite_mask;
49 }
50}