aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkAlphaRuns.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-31 19:18:02 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-31 19:18:02 +0000
commitfa57ae7d1ec7404a654e0f32c09b698feec1b7fa (patch)
tree659128f2504b23724f3da4375956f386553d3e29 /src/core/SkAlphaRuns.cpp
parent9405e55c3727af71a58c831892038b57cc951bad (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.cpp24
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