diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2010-12-16 19:07:45 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2010-12-16 19:07:45 +0000 |
commit | 29e5054dd07c97c2195c5f64bf67aaa6b5afa204 (patch) | |
tree | bdd024a5cce23ce7f26151fe09b6e4a0d5f8ede4 /src | |
parent | 31e623003472d98d8623b72b8535220c400c4058 (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.cpp | 13 | ||||
-rw-r--r-- | src/core/SkBlitter_ARGB32.cpp | 8 | ||||
-rw-r--r-- | src/core/SkCoreBlitters.h | 3 | ||||
-rw-r--r-- | src/effects/SkColorFilters.cpp | 8 |
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; }; ////////////////////////////////////////////////////////////////////////////// |