aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-12-16 19:07:45 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-12-16 19:07:45 +0000
commit29e5054dd07c97c2195c5f64bf67aaa6b5afa204 (patch)
treebdd024a5cce23ce7f26151fe09b6e4a0d5f8ede4 /src
parent31e623003472d98d8623b72b8535220c400c4058 (diff)
Fix perf regression in Color32.
The regression was due to the fact that we were calling PlatformColorProc() for every span (which in turns makes CPUID, a fairly expensive call). Since we draw a lot of rects, and rects have 1-pixel wide spans for the vertical segments, that's a lot of CPUID. Fixed by cacheing the result of PlatformColorProc(), as is done for the other platform-specific blitters. Review URL: http://codereview.appspot.com/3669042/ git-svn-id: http://skia.googlecode.com/svn/trunk@636 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBlitRow_D32.cpp13
-rw-r--r--src/core/SkBlitter_ARGB32.cpp8
-rw-r--r--src/core/SkCoreBlitters.h3
-rw-r--r--src/effects/SkColorFilters.cpp8
4 files changed, 18 insertions, 14 deletions
diff --git a/src/core/SkBlitRow_D32.cpp b/src/core/SkBlitRow_D32.cpp
index 1f154a486a..f1dcb309a1 100644
--- a/src/core/SkBlitRow_D32.cpp
+++ b/src/core/SkBlitRow_D32.cpp
@@ -86,18 +86,17 @@ SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) {
return proc;
}
-void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count,
- SkPMColor color) {
+SkBlitRow::Proc32 SkBlitRow::ColorProcFactory() {
SkBlitRow::ColorProc proc = PlatformColorProc();
if (NULL == proc) {
- Color32_BlitRow32(dst, src, count, color);
- return;
+ proc = Color32;
}
- proc(dst, src, count, color);
+ SkASSERT(proc);
+ return proc;
}
-void SkBlitRow::Color32_BlitRow32(SkPMColor dst[], const SkPMColor src[],
- int count, SkPMColor color) {
+void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[],
+ int count, SkPMColor color) {
if (count > 0) {
if (0 == color) {
if (src != dst) {
diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp
index 37bd0da684..905ab6b0b8 100644
--- a/src/core/SkBlitter_ARGB32.cpp
+++ b/src/core/SkBlitter_ARGB32.cpp
@@ -51,6 +51,7 @@ SkARGB32_Blitter::SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint)
fSrcB = SkAlphaMul(SkColorGetB(color), scale);
fPMColor = SkPackARGB32(fSrcA, fSrcR, fSrcG, fSrcB);
+ fColor32Proc = SkBlitRow::ColorProcFactory();
}
const SkBitmap* SkARGB32_Blitter::justAnOpaqueColor(uint32_t* value) {
@@ -69,7 +70,8 @@ const SkBitmap* SkARGB32_Blitter::justAnOpaqueColor(uint32_t* value) {
void SkARGB32_Blitter::blitH(int x, int y, int width) {
SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
- SkBlitRow::Color32(fDevice.getAddr32(x, y), width, fPMColor);
+ uint32_t* device = fDevice.getAddr32(x, y);
+ fColor32Proc(device, device, width, fPMColor);
}
void SkARGB32_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[],
@@ -94,7 +96,7 @@ void SkARGB32_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[],
sk_memset32(device, color, count);
} else {
uint32_t sc = SkAlphaMulQ(color, SkAlpha255To256(aa));
- SkBlitRow::Color32(device, count, sc);
+ fColor32Proc(device, device, count, sc);
}
}
runs += count;
@@ -286,7 +288,7 @@ void SkARGB32_Blitter::blitRect(int x, int y, int width, int height) {
size_t rowBytes = fDevice.rowBytes();
while (--height >= 0) {
- SkBlitRow::Color32(device, width, color);
+ fColor32Proc(device, device, width, color);
device = (uint32_t*)((char*)device + rowBytes);
}
}
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 6204b2c01b..32e80358de 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -101,7 +101,8 @@ public:
virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
protected:
- SkColor fPMColor;
+ SkColor fPMColor;
+ SkBlitRow::ColorProc fColor32Proc;
private:
unsigned fSrcA, fSrcR, fSrcG, fSrcB;
diff --git a/src/effects/SkColorFilters.cpp b/src/effects/SkColorFilters.cpp
index 733e1aea8e..a396d35383 100644
--- a/src/effects/SkColorFilters.cpp
+++ b/src/effects/SkColorFilters.cpp
@@ -75,7 +75,8 @@ private:
class SkSrcOver_XfermodeColorFilter : public Sk_XfermodeColorFilter {
public:
- SkSrcOver_XfermodeColorFilter(SkColor color) : INHERITED(color) {}
+ SkSrcOver_XfermodeColorFilter(SkColor color)
+ : INHERITED(color), fColor32Proc(SkBlitRow::ColorProcFactory()) {}
virtual uint32_t getFlags() {
if (SkGetPackedA32(fPMColor) == 0xFF) {
@@ -87,7 +88,7 @@ public:
virtual void filterSpan(const SkPMColor shader[], int count,
SkPMColor result[]) {
- SkBlitRow::Color32(result, shader, count, fPMColor);
+ fColor32Proc(result, shader, count, fPMColor);
}
virtual void filterSpan16(const uint16_t shader[], int count,
@@ -100,7 +101,7 @@ protected:
virtual Factory getFactory() { return CreateProc; }
SkSrcOver_XfermodeColorFilter(SkFlattenableReadBuffer& buffer)
- : INHERITED(buffer) {}
+ : INHERITED(buffer), fColor32Proc(SkBlitRow::ColorProcFactory()) {}
private:
static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
@@ -108,6 +109,7 @@ private:
}
typedef Sk_XfermodeColorFilter INHERITED;
+ SkBlitRow::ColorProc fColor32Proc;
};
//////////////////////////////////////////////////////////////////////////////