diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-31 19:18:02 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-31 19:18:02 +0000 |
commit | fa57ae7d1ec7404a654e0f32c09b698feec1b7fa (patch) | |
tree | 659128f2504b23724f3da4375956f386553d3e29 /src/core/SkAlphaRuns.cpp | |
parent | 9405e55c3727af71a58c831892038b57cc951bad (diff) |
remember previous x-offset when we re-enter the runs array. speeds up paths
with lots of x-transitions in a single scanline
git-svn-id: http://skia.googlecode.com/svn/trunk@1456 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkAlphaRuns.cpp')
-rw-r--r-- | src/core/SkAlphaRuns.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/core/SkAlphaRuns.cpp b/src/core/SkAlphaRuns.cpp index 4125b583fd..a5fc3c9f9f 100644 --- a/src/core/SkAlphaRuns.cpp +++ b/src/core/SkAlphaRuns.cpp @@ -16,10 +16,14 @@ */ #include "SkAntiRun.h" +#include "SkUtils.h" void SkAlphaRuns::reset(int width) { SkASSERT(width > 0); +#ifdef SK_DEBUG + sk_memset16((uint16_t*)fRuns, (uint16_t)(-42), width); +#endif fRuns[0] = SkToS16(width); fRuns[width] = 0; fAlpha[0] = 0; @@ -75,13 +79,17 @@ void SkAlphaRuns::Break(int16_t runs[], uint8_t alpha[], int x, int count) { } } -void SkAlphaRuns::add(int x, U8CPU startAlpha, int middleCount, U8CPU stopAlpha, - U8CPU maxValue) { +int SkAlphaRuns::add(int x, U8CPU startAlpha, int middleCount, U8CPU stopAlpha, + U8CPU maxValue, int offsetX) { SkASSERT(middleCount >= 0); SkASSERT(x >= 0 && x + (startAlpha != 0) + middleCount + (stopAlpha != 0) <= fWidth); - int16_t* runs = fRuns; - uint8_t* alpha = fAlpha; + SkASSERT(fRuns[offsetX] >= 0); + + int16_t* runs = fRuns + offsetX; + uint8_t* alpha = fAlpha + offsetX; + uint8_t* lastAlpha = alpha; + x -= offsetX; if (startAlpha) { SkAlphaRuns::Break(runs, alpha, x, 1); @@ -97,6 +105,7 @@ void SkAlphaRuns::add(int x, U8CPU startAlpha, int middleCount, U8CPU stopAlpha, runs += x + 1; alpha += x + 1; x = 0; + lastAlpha += x; // we don't want the +1 SkDEBUGCODE(this->validate();) } @@ -114,13 +123,18 @@ void SkAlphaRuns::add(int x, U8CPU startAlpha, int middleCount, U8CPU stopAlpha, middleCount -= n; } while (middleCount > 0); SkDEBUGCODE(this->validate();) + lastAlpha = alpha; } if (stopAlpha) { SkAlphaRuns::Break(runs, alpha, x, 1); - alpha[x] = SkToU8(alpha[x] + stopAlpha); + alpha += x; + alpha[0] = SkToU8(alpha[0] + stopAlpha); SkDEBUGCODE(this->validate();) + lastAlpha = alpha; } + + return lastAlpha - fAlpha; // new offsetX } #ifdef SK_DEBUG |