diff options
-rw-r--r-- | src/core/SkBitmapProcState_matrix.h | 9 | ||||
-rw-r--r-- | src/core/SkBitmapProcState_sample.h | 54 | ||||
-rw-r--r-- | src/effects/SkGradientShader.cpp | 2 | ||||
-rw-r--r-- | src/ports/SkFontHost_linux.cpp | 5 | ||||
-rw-r--r-- | src/utils/SkDumpCanvas.cpp | 49 | ||||
-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 |