aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-10-02 19:11:02 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-10-02 19:11:02 +0000
commitea16cfa037bca933f6930a487b42f3c0faab9fe4 (patch)
treee0823c5309fc22be32007e73c1d6ba15a5784de8 /src
parent261ae4df7282f5dd39937748b0da7e822b66a083 (diff)
cache expanded rawcolor16
add special blitv for opaque16, as this is called a lot on short segments so any startup overhead makes a difference git-svn-id: http://skia.googlecode.com/svn/trunk@376 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBlitter_RGB16.cpp72
1 files changed, 36 insertions, 36 deletions
diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp
index af738d4d5d..0112c9ab5c 100644
--- a/src/core/SkBlitter_RGB16.cpp
+++ b/src/core/SkBlitter_RGB16.cpp
@@ -63,6 +63,7 @@ public:
protected:
SkPMColor fSrcColor32;
+ uint32_t fExpandedRaw16;
unsigned fScale;
uint16_t fColor16; // already scaled by fScale
uint16_t fRawColor16; // unscaled
@@ -80,6 +81,7 @@ public:
SkRGB16_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint);
virtual void blitH(int x, int y, int width);
virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
+ virtual void blitV(int x, int y, int height, SkAlpha alpha);
virtual void blitRect(int x, int y, int width, int height);
virtual void blitMask(const SkMask&, const SkIRect&);
@@ -288,6 +290,7 @@ void SkRGB16_Opaque_Blitter::blitAntiH(int x, int y,
const int16_t* SK_RESTRICT runs) SK_RESTRICT {
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y);
uint16_t srcColor = fRawColor16;
+ uint32_t srcExpanded = fExpandedRaw16;
int ditherInt = Bool2Int(fDoDither);
uint16_t ditherColor = fRawDither16;
// if we have no dithering, this will always fail
@@ -315,7 +318,7 @@ void SkRGB16_Opaque_Blitter::blitAntiH(int x, int y,
} else {
// TODO: respect fDoDither
unsigned scale5 = SkAlpha255To256(aa) >> 3;
- uint32_t src32 = SkExpand_rgb_16(srcColor) * scale5;
+ uint32_t src32 = srcExpanded * scale5;
scale5 = 32 - scale5; // now we can use it on the device
int n = count;
do {
@@ -371,12 +374,12 @@ void SkRGB16_Opaque_Blitter::blitMask(const SkMask& SK_RESTRICT mask,
int height = clip.height();
unsigned deviceRB = fDevice.rowBytes() - (width << 1);
unsigned maskRB = mask.fRowBytes - width;
- uint32_t color32 = SkExpand_rgb_16(fRawColor16);
+ uint32_t expanded32 = fExpandedRaw16;
do {
int w = width;
do {
- *device = blend_compact(color32, SkExpand_rgb_16(*device),
+ *device = blend_compact(expanded32, SkExpand_rgb_16(*device),
SkAlpha255To256(*alpha++) >> 3);
device += 1;
} while (--w != 0);
@@ -385,6 +388,21 @@ void SkRGB16_Opaque_Blitter::blitMask(const SkMask& SK_RESTRICT mask,
} while (--height != 0);
}
+void SkRGB16_Opaque_Blitter::blitV(int x, int y, int height, SkAlpha alpha) {
+ uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y);
+ unsigned deviceRB = fDevice.rowBytes();
+
+ // TODO: respect fDoDither
+ unsigned scale5 = SkAlpha255To256(alpha) >> 3;
+ uint32_t src32 = fExpandedRaw16 * scale5;
+ scale5 = 32 - scale5;
+ do {
+ uint32_t dst32 = SkExpand_rgb_16(*device) * scale5;
+ *device = SkCompact_rgb_16((src32 + dst32) >> 5);
+ device = (uint16_t*)((char*)device + deviceRB);
+ } while (--height != 0);
+}
+
void SkRGB16_Opaque_Blitter::blitRect(int x, int y, int width, int height) {
SkASSERT(x + width <= fDevice.width() && y + height <= fDevice.height());
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y);
@@ -427,7 +445,9 @@ SkRGB16_Blitter::SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint)
if ((fDoDither = paint.isDither()) != false) {
fRawDither16 = SkDitherPack888ToRGB16(r, g, b);
}
-
+
+ fExpandedRaw16 = SkExpand_rgb_16(fRawColor16);
+
fColor16 = SkPackRGB16( SkAlphaMul(r, fScale) >> (8 - SK_R16_BITS),
SkAlphaMul(g, fScale) >> (8 - SK_G16_BITS),
SkAlphaMul(b, fScale) >> (8 - SK_B16_BITS));
@@ -472,7 +492,7 @@ void SkRGB16_Blitter::blitAntiH(int x, int y,
const SkAlpha* SK_RESTRICT antialias,
const int16_t* SK_RESTRICT runs) SK_RESTRICT {
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y);
- uint16_t srcColor = fRawColor16;
+ uint32_t srcExpanded = fExpandedRaw16;
unsigned scale = fScale;
// TODO: respect fDoDither
@@ -488,7 +508,7 @@ void SkRGB16_Blitter::blitAntiH(int x, int y,
antialias += count;
if (aa) {
unsigned scale5 = SkAlpha255To256(aa) * scale >> (8 + 3);
- uint32_t src32 = SkExpand_rgb_16(srcColor) * scale5;
+ uint32_t src32 = srcExpanded * scale5;
scale5 = 32 - scale5;
do {
uint32_t dst32 = SkExpand_rgb_16(*device) * scale5;
@@ -532,7 +552,7 @@ void SkRGB16_Blitter::blitMask(const SkMask& SK_RESTRICT mask,
int height = clip.height();
unsigned deviceRB = fDevice.rowBytes() - (width << 1);
unsigned maskRB = mask.fRowBytes - width;
- uint32_t color32 = SkExpand_rgb_16(fRawColor16);
+ uint32_t color32 = fExpandedRaw16;
unsigned scale256 = fScale;
do {
@@ -551,37 +571,17 @@ void SkRGB16_Blitter::blitMask(const SkMask& SK_RESTRICT mask,
void SkRGB16_Blitter::blitV(int x, int y, int height, SkAlpha alpha) {
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y);
- uint16_t color16 = fRawColor16;
unsigned deviceRB = fDevice.rowBytes();
- if (alpha + fScale == (255 + 256)) {
- if (fDoDither) {
- uint16_t ditherColor = fRawDither16;
- if ((x ^ y) & 1) {
- SkTSwap(ditherColor, color16);
- }
- do {
- device[0] = color16;
- device = (uint16_t*)((char*)device + deviceRB);
- SkTSwap(ditherColor, color16);
- } while (--height != 0);
- } else {
- do {
- device[0] = color16;
- device = (uint16_t*)((char*)device + deviceRB);
- } while (--height != 0);
- }
- } else {
- // TODO: respect fDoDither
- unsigned scale5 = SkAlpha255To256(alpha) * fScale >> (8 + 3);
- uint32_t src32 = SkExpand_rgb_16(color16) * scale5;
- scale5 = 32 - scale5;
- do {
- uint32_t dst32 = SkExpand_rgb_16(*device) * scale5;
- *device = SkCompact_rgb_16((src32 + dst32) >> 5);
- device = (uint16_t*)((char*)device + deviceRB);
- } while (--height != 0);
- }
+ // TODO: respect fDoDither
+ unsigned scale5 = SkAlpha255To256(alpha) * fScale >> (8 + 3);
+ uint32_t src32 = fExpandedRaw16 * scale5;
+ scale5 = 32 - scale5;
+ do {
+ uint32_t dst32 = SkExpand_rgb_16(*device) * scale5;
+ *device = SkCompact_rgb_16((src32 + dst32) >> 5);
+ device = (uint16_t*)((char*)device + deviceRB);
+ } while (--height != 0);
}
void SkRGB16_Blitter::blitRect(int x, int y, int width, int height) {