aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-01-13 13:26:44 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-01-13 13:26:44 +0000
commit0becfc5b7608ba67a4c98721cd61939e89ac5653 (patch)
tree8981e70043e79fa5dcfedb0833e36f4adcb4645f
parent2e86178f2bbfc866c627eb1fee926bd7969144f7 (diff)
add optimization for width==1 bitmaps in shader procs
odd warning fixes and cleanup git-svn-id: http://skia.googlecode.com/svn/trunk@63 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--src/core/SkBitmapProcState_matrix.h9
-rw-r--r--src/core/SkBitmapProcState_sample.h54
-rw-r--r--src/effects/SkGradientShader.cpp2
-rw-r--r--src/ports/SkFontHost_linux.cpp5
-rw-r--r--src/utils/SkDumpCanvas.cpp49
-rw-r--r--src/utils/SkOSFile.cpp (renamed from src/views/SkOSFile.cpp)0
6 files changed, 90 insertions, 29 deletions
diff --git a/src/core/SkBitmapProcState_matrix.h b/src/core/SkBitmapProcState_matrix.h
index f54f8b10fc..049d6d4d98 100644
--- a/src/core/SkBitmapProcState_matrix.h
+++ b/src/core/SkBitmapProcState_matrix.h
@@ -26,7 +26,6 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
// we store y, x, x, x, x, x
const unsigned maxX = s.fBitmap->width() - 1;
- const SkFixed dx = s.fInvSx;
SkFixed fx;
{
SkPoint pt;
@@ -37,6 +36,14 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
*xy++ = TILEY_PROCF(fx, maxY);
fx = SkScalarToFixed(pt.fX);
}
+
+ if (0 == maxX) {
+ // all of the following X values must be 0
+ memset(xy, 0, count * sizeof(uint16_t));
+ return;
+ }
+
+ const SkFixed dx = s.fInvSx;
#ifdef CHECK_FOR_DECAL
// test if we don't need to apply the tile proc
diff --git a/src/core/SkBitmapProcState_sample.h b/src/core/SkBitmapProcState_sample.h
index 122ccf8822..41a08eb04b 100644
--- a/src/core/SkBitmapProcState_sample.h
+++ b/src/core/SkBitmapProcState_sample.h
@@ -1,3 +1,4 @@
+#include "SkUtils.h"
#if DSTSIZE==32
#define DSTTYPE SkPMColor
@@ -7,6 +8,14 @@
#error "need DSTSIZE to be 32 or 16"
#endif
+#if (DSTSIZE == 32)
+ #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset32(ptr, value, n)
+#elif (DSTSIZE == 16)
+ #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset16(ptr, value, n)
+#else
+ #error "unsupported DSTSIZE
+#endif
+
static void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
const uint32_t* SK_RESTRICT xy,
int count, DSTTYPE* SK_RESTRICT colors) {
@@ -61,33 +70,39 @@ static void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s,
PREAMBLE(s);
#endif
const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels();
- int i;
+ // buffer is y32, x16, x16, x16, x16, x16
// bump srcAddr to the proper row, since we're told Y never changes
SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
srcAddr = (const SRCTYPE*)((const char*)srcAddr +
xy[0] * s.fBitmap->rowBytes());
- // buffer is y32, x16, x16, x16, x16, x16
- const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);
SRCTYPE src;
- for (i = (count >> 2); i > 0; --i) {
- SkASSERT(*xx < (unsigned)s.fBitmap->width());
- src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-
- SkASSERT(*xx < (unsigned)s.fBitmap->width());
- src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-
- SkASSERT(*xx < (unsigned)s.fBitmap->width());
- src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-
- SkASSERT(*xx < (unsigned)s.fBitmap->width());
- src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
- }
- for (i = (count & 3); i > 0; --i) {
- SkASSERT(*xx < (unsigned)s.fBitmap->width());
- src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+ if (1 == s.fBitmap->width()) {
+ src = srcAddr[0];
+ DSTTYPE dstValue = RETURNDST(src);
+ BITMAPPROC_MEMSET(colors, dstValue, count);
+ } else {
+ int i;
+ const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);
+ for (i = (count >> 2); i > 0; --i) {
+ SkASSERT(*xx < (unsigned)s.fBitmap->width());
+ src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+
+ SkASSERT(*xx < (unsigned)s.fBitmap->width());
+ src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+
+ SkASSERT(*xx < (unsigned)s.fBitmap->width());
+ src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+
+ SkASSERT(*xx < (unsigned)s.fBitmap->width());
+ src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+ }
+ for (i = (count & 3); i > 0; --i) {
+ SkASSERT(*xx < (unsigned)s.fBitmap->width());
+ src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+ }
}
#ifdef POSTAMBLE
@@ -205,3 +220,4 @@ static void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s,
#undef GET_FILTER_ROW
#undef GET_FILTER_ROW_PROC
#undef GET_FILTER_PROC
+#undef BITMAPPROC_MEMSET
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp
index a1674cb9e3..b0d91ee8c5 100644
--- a/src/effects/SkGradientShader.cpp
+++ b/src/effects/SkGradientShader.cpp
@@ -733,7 +733,7 @@ bool Linear_Gradient::asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
#ifdef TEST_GRADIENT_DITHER
static void dither_memset16(uint16_t dst[], uint16_t value, uint16_t other, int count)
{
- if ((unsigned)dst & 2)
+ if (reinterpret_cast<uintptr_t>(dst) & 2)
{
*dst++ = value;
count -= 1;
diff --git a/src/ports/SkFontHost_linux.cpp b/src/ports/SkFontHost_linux.cpp
index f75718d5d4..c00e22671b 100644
--- a/src/ports/SkFontHost_linux.cpp
+++ b/src/ports/SkFontHost_linux.cpp
@@ -592,6 +592,11 @@ SkTypeface* SkFontHost::CreateTypeface(SkStream* stream)
return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream));
}
+SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[])
+{
+ return SkFontHost::CreateTypeface(SkNEW_ARGS(SkMMAPStream, (path)));
+}
+
///////////////////////////////////////////////////////////////////////////////
size_t SkFontHost::ShouldPurgeFontCache(size_t sizeAllocatedSoFar)
diff --git a/src/utils/SkDumpCanvas.cpp b/src/utils/SkDumpCanvas.cpp
index fb203efa80..a0c85fe429 100644
--- a/src/utils/SkDumpCanvas.cpp
+++ b/src/utils/SkDumpCanvas.cpp
@@ -12,13 +12,41 @@
#include "SkMaskFilter.h"
static void toString(const SkRect& r, SkString* str) {
- str->printf("[(%g %g) %g %g]",
+ str->printf("[%g,%g %g:%g]",
SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
}
static void toString(const SkIRect& r, SkString* str) {
- str->printf("[(%d %d) %d %d]", r.fLeft, r.fTop, r.width(), r.height());
+ str->printf("[%d,%d %d:%d]", r.fLeft, r.fTop, r.width(), r.height());
+}
+
+static void dumpVerbs(const SkPath& path, SkString* str) {
+ SkPath::Iter iter(path, false);
+ SkPoint pts[4];
+ for (;;) {
+ switch (iter.next(pts)) {
+ case SkPath::kMove_Verb:
+ str->appendf(" M%g,%g", pts[0].fX, pts[0].fY);
+ break;
+ case SkPath::kLine_Verb:
+ str->appendf(" L%g,%g", pts[0].fX, pts[0].fY);
+ break;
+ case SkPath::kQuad_Verb:
+ str->appendf(" Q%g,%g,%g,%g", pts[1].fX, pts[1].fY,
+ pts[2].fX, pts[2].fY);
+ break;
+ case SkPath::kCubic_Verb:
+ str->appendf(" C%g,%g,%g,%g,%g,%g", pts[1].fX, pts[1].fY,
+ pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY);
+ break;
+ case SkPath::kClose_Verb:
+ str->appendf("X");
+ break;
+ case SkPath::kDone_Verb:
+ return;
+ }
+ }
}
static void toString(const SkPath& path, SkString* str) {
@@ -28,6 +56,11 @@ static void toString(const SkPath& path, SkString* str) {
SkRect bounds;
path.computeBounds(&bounds, SkPath::kFast_BoundsType);
toString(bounds, str);
+#if 1
+ SkString s;
+ dumpVerbs(path, &s);
+ str->append(s.c_str());
+#endif
str->append("]");
str->prepend("path:[");
}
@@ -244,7 +277,7 @@ void SkDumpCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
const SkPaint* paint) {
SkString str;
toString(bitmap, &str);
- this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s (%g %g))", str.c_str(),
+ this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s %g %g)", str.c_str(),
SkScalarToFloat(x), SkScalarToFloat(y));
}
@@ -279,7 +312,7 @@ void SkDumpCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
const SkPaint* paint) {
SkString str;
toString(bitmap, &str);
- this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s (%d %d))", str.c_str(),
+ this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s %d %d)", str.c_str(),
x, y);
}
@@ -287,7 +320,7 @@ void SkDumpCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, const SkPaint& paint) {
SkString str;
toString(text, byteLength, paint.getTextEncoding(), &str);
- this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] (%g %g))", str.c_str(),
+ this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] %g %g)", str.c_str(),
byteLength, SkScalarToFloat(x), SkScalarToFloat(y));
}
@@ -295,7 +328,7 @@ void SkDumpCanvas::drawPosText(const void* text, size_t byteLength,
const SkPoint pos[], const SkPaint& paint) {
SkString str;
toString(text, byteLength, paint.getTextEncoding(), &str);
- this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] (%g %g ...))",
+ this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] %g %g ...)",
str.c_str(), byteLength, SkScalarToFloat(pos[0].fX),
SkScalarToFloat(pos[0].fY));
}
@@ -305,7 +338,7 @@ void SkDumpCanvas::drawPosTextH(const void* text, size_t byteLength,
const SkPaint& paint) {
SkString str;
toString(text, byteLength, paint.getTextEncoding(), &str);
- this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] (%g %g ...))",
+ this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] %g %g ...)",
str.c_str(), byteLength, SkScalarToFloat(xpos[0]),
SkScalarToFloat(constY));
}
@@ -328,7 +361,7 @@ void SkDumpCanvas::drawVertices(VertexMode vmode, int vertexCount,
const SkColor colors[], SkXfermode* xmode,
const uint16_t indices[], int indexCount,
const SkPaint& paint) {
- this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] [%g %g ...]",
+ this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] %g %g ...)",
toString(vmode), vertexCount, SkScalarToFloat(vertices[0].fX),
SkScalarToFloat(vertices[0].fY));
}
diff --git a/src/views/SkOSFile.cpp b/src/utils/SkOSFile.cpp
index c8eeeea405..c8eeeea405 100644
--- a/src/views/SkOSFile.cpp
+++ b/src/utils/SkOSFile.cpp