#include "SkUtils.h"
#include "SkXfermode.h"
-#if 0
-
-#define SK_SORT_TEMPLATE_TYPE int
-#define SK_SORT_TEMPLATE_NAME sort_int
-#define SK_SORT_TEMPLATE_CMP(a, b) ((a) - (b))
-#include "SkSortTemplate.h"
-
-#define SK_SORT_TEMPLATE_TYPE int*
-#define SK_SORT_TEMPLATE_NAME sort_intptr
-#define SK_SORT_TEMPLATE_CMP(a, b) (*(a) - *(b))
-#include "SkSortTemplate.h"
-
-static void test_sort()
-{
- int array[] = { 4, 3, 7, 5, 2, 5, 1, 2, 9, 6, 7, 4, 5, 3, 1, 0 };
- int* ptr[SK_ARRAY_COUNT(array)];
- int i, N = SK_ARRAY_COUNT(array) - 1;
-
- for (i = 0; i < N; i++)
- printf(" %d", array[i]);
- printf("\n");
-
- for (i = 0; i < N; i++)
- ptr[i] = &array[i];
- sort_intptr(ptr, N);
- for (i = 0; i < N; i++)
- printf(" %d", *ptr[i]);
- printf("\n");
-
- sort_int(array, N);
- for (i = 0; i < N; i++)
- printf(" %d", array[i]);
- printf("\n");
-
-}
-#endif
-
-#define SPEED_TESTx
-
#define typesizeline(type) { #type , sizeof(type) }
-
#ifdef BUILD_EMBOSS_TABLE
extern void SkEmbossMask_BuildTable();
#endif
extern void SkRadialGradient_BuildTable();
#endif
-#define BIG_LOOP_COUNT 1000000
-#define TEXT_LOOP_COUNT 1000
-
-#ifdef SPEED_TEST
-static int test_s64(int i)
-{
- Sk64 a, b, c;
-
- c.set(0);
- a.set(i);
- b.setMul(i, i);
- a.add(b);
- a.add(c);
- return c.getFixed();
-}
-
-static int test_native_64(int i)
-{
- int16_t a, b, c;
-
- c = 0;
- a = i;
- b = (int64_t)i * i;
- a += b;
- a += c;
- return (int)(c >> 16);
-}
-
-static void test_drawText(SkBitmap::Config config, SkColor color)
-{
- SkBitmap bm;
-
- bm.setConfig(config, 320, 240);
- bm.allocPixels();
-
- SkCanvas canvas(bm);
- SkPaint paint;
-
- paint.setAntiAlias(true);
- paint.setTextSize(SkIntToScalar(12));
- paint.setColor(color);
-
- SkScalar x = SkIntToScalar(20);
- SkScalar y = SkIntToScalar(100);
- const char* text = "Hamburgefons";
- size_t len = strlen(text);
-
- // draw once to populate the cache
- canvas.drawText(text, len, x, y, paint);
-
- SkMSec now = SkTime::GetMSecs();
- for (int i = 0; i < TEXT_LOOP_COUNT; i++)
- canvas.drawText(text, len, x, y, paint);
- printf("----------- Config: %d, Color=%x, CPS = %g\n", config, color,
- len * TEXT_LOOP_COUNT * 1000.0 / (SkTime::GetMSecs() - now));
-}
-
-#endif
-
void SkGraphics::Init() {
SkGlobals::Init();
}
#endif
-
- if (false) // test asm fixmul
- {
- int j;
- SkMSec now = SkTime::GetMSecs();
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkFixedMul_portable(0x8000, 0x150000);
- }
- SkMSec now2 = SkTime::GetMSecs();
- printf("-------- SkFixedMul_portable = %d\n", now2 - now);
-
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkFixedMul(0x8000, 0x150000);
- }
- printf("-------- SkFixedMul = %d\n", SkTime::GetMSecs() - now2);
-
- SkRandom rand;
- for (j = 0; j < 10000; j++) {
- SkFixed a = rand.nextS() >> 8;
- SkFixed b = rand.nextS() >> 8;
- SkFixed c1 = SkFixedMul_portable(a, b);
- SkFixed c2 = SkFixedMul(a, b);
- if (SkAbs32(c1 - c2) > 1)
- printf("------ FixMul disagreement: (%x %x) slow=%x fast=%x\n", a, b, c1, c2);
- }
- }
-
- if (false) // test asm fractmul
- {
- int j;
- SkMSec now = SkTime::GetMSecs();
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkFractMul_portable(0x800000, 0x1500000);
- }
- SkMSec now2 = SkTime::GetMSecs();
- printf("-------- SkFractMul_portable = %d\n", now2 - now);
-
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkFractMul(0x800000, 0x1500000);
- }
- printf("-------- SkFractMul = %d\n", SkTime::GetMSecs() - now2);
-
- SkRandom rand;
- for (j = 0; j < 10000; j++) {
- SkFixed a = rand.nextS() >> 1;
- SkFixed b = rand.nextS() >> 1;
- SkFixed c1 = SkFractMul_portable(a, b);
- SkFixed c2 = SkFractMul(a, b);
- if (SkAbs32(c1 - c2) > 1)
- printf("------ FractMul disagreement: (%x %x) slow=%x fast=%x\n", a, b, c1, c2);
- }
- }
-
- if (false) // test asm clz
- {
- int j;
- SkMSec now = SkTime::GetMSecs();
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkCLZ_portable(now);
- }
- SkMSec now2 = SkTime::GetMSecs();
- printf("-------- SkCLZ_portable = %d\n", now2 - now);
-
- for (j = 0; j < BIG_LOOP_COUNT; j++) {
- (void)SkCLZ(now);
- }
- printf("-------- SkCLZ = %d\n", SkTime::GetMSecs() - now2);
-
- SkRandom rand;
- for (j = 0; j < 10000; j++) {
- uint32_t a = rand.nextU();
- int c1 = SkCLZ_portable(a);
- int c2 = SkCLZ(a);
- if (c1 != c2)
- printf("------ CLZ disagreement: (%x) slow=%x fast=%x\n", a, c1, c2);
- }
- }
-
-#ifdef SPEED_TEST
- if (false) {
- int i;
- int (*proc)(int);
-
- static const struct {
- int (*proc)(int);
- const char* name;
- } gList[] = {
- { test_s64, "Sk64" },
- { test_native_64, "native" }
- };
-
- for (size_t j = 0; j < SK_ARRAY_COUNT(gList); j++) {
- SkMSec now = SkTime::GetMSecs();
- proc = gList[j].proc;
- for (i = 0; i < BIG_LOOP_COUNT; i++) {
- proc(i);
- }
- printf("-------- %s = %d\n", gList[j].name, SkTime::GetMSecs() - now);
- }
- }
-#endif
-
- if (false) {
- size_t i, size = 480;
- char* buffer = (char*)sk_malloc_throw(size);
- uint16_t* buffer16 = (uint16_t*)buffer;
- uint32_t* buffer32 = (uint32_t*)buffer;
-
- SkMSec now = SkTime::GetMSecs();
- for (i = 0; i < 100000; i++) {
- sk_memset16(buffer16, (uint16_t)i, size >> 1);
- }
- SkMSec now2 = SkTime::GetMSecs();
- for (i = 0; i < 100000; i++) {
- sk_memset16_portable(buffer16, (uint16_t)i, size >> 1);
- }
- SkMSec now3 = SkTime::GetMSecs();
- printf("----------- memset16: native %d, portable %d\n", now2 - now, now3 - now2);
-
- now = SkTime::GetMSecs();
- for (i = 0; i < 100000; i++) {
- sk_memset32(buffer32, i, size >> 2);
- }
- now2 = SkTime::GetMSecs();
- for (i = 0; i < 100000; i++) {
- sk_memset32_portable(buffer32, i, size >> 2);
- }
- now3 = SkTime::GetMSecs();
- printf("----------- memset32: native %d, portable %d\n", now2 - now, now3 - now2);
-
- sk_free(buffer);
- }
-
-#ifdef SPEED_TEST
- if (false) {
- test_drawText(SkBitmap::kARGB_8888_Config, SK_ColorBLACK);
- test_drawText(SkBitmap::kARGB_8888_Config, SK_ColorRED);
- test_drawText(SkBitmap::kRGB_565_Config, SK_ColorBLACK);
- test_drawText(SkBitmap::kRGB_565_Config, SK_ColorRED);
- }
-#endif
-
-// if (true) {
-// test_sort();
-// }
}
-////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
#include "SkGlyphCache.h"
#include "SkStroke.h"
#include "SkThread.h"
-#ifdef SK_DEBUG
-// #define TRACK_MISSING_CHARS
-#endif
-
#define ComputeBWRowBytes(width) (((unsigned)(width) + 7) >> 3)
static const uint8_t* gBlackGammaTable;
const size_t size = this->rowBytes() * fHeight;
switch (fMaskFormat) {
- case SkMask::kHorizontalLCD_Format:
- return SkAlign4(size) + sizeof(uint32_t) * ((fWidth + 2) * fHeight);
- case SkMask::kVerticalLCD_Format:
- return SkAlign4(size) + sizeof(uint32_t) * (fWidth * (fHeight + 2));
- case SkMask::k3D_Format:
- return 3 * size;
- default:
- return size;
+ case SkMask::kHorizontalLCD_Format:
+ return SkAlign4(size) + sizeof(uint32_t) * ((fWidth + 2) * fHeight);
+ case SkMask::kVerticalLCD_Format:
+ return SkAlign4(size) + sizeof(uint32_t) * (fWidth * (fHeight + 2));
+ case SkMask::k3D_Format:
+ return 3 * size;
+ default:
+ return size;
}
}
#ifdef DUMP_REC
desc->assertChecksum();
- SkDebugf("SkScalarContext checksum %x count %d length %d\n", desc->getChecksum(), desc->getCount(), desc->getLength());
+ SkDebugf("SkScalarContext checksum %x count %d length %d\n",
+ desc->getChecksum(), desc->getCount(), desc->getLength());
SkDebugf(" textsize %g prescale %g preskew %g post [%g %g %g %g]\n",
rec->fTextSize, rec->fPreScaleX, rec->fPreSkewX, rec->fPost2x2[0][0],
rec->fPost2x2[0][1], rec->fPost2x2[1][0], rec->fPost2x2[1][1]);
SkDebugf(" frame %g miter %g hints %d framefill %d format %d join %d\n",
rec->fFrameWidth, rec->fMiterLimit, rec->fHints, rec->fFrameAndFill,
rec->fMaskFormat, rec->fStrokeJoin);
- SkDebugf(" pathEffect %x maskFilter %x\n", desc->findEntry(kPathEffect_SkDescriptorTag, NULL),
+ SkDebugf(" pathEffect %x maskFilter %x\n",
+ desc->findEntry(kPathEffect_SkDescriptorTag, NULL),
desc->findEntry(kMaskFilter_SkDescriptorTag, NULL));
#endif
draw.drawPath(devPath, paint);
}
- if (lcdMode)
+ if (lcdMode) {
glyph->expandA8ToLCD();
+ }
} else {
this->getGlyphContext(*glyph)->generateImage(*glyph);
}
(fRec.fFlags & (kGammaForBlack_Flag | kGammaForWhite_Flag)) != 0)
{
const uint8_t* table = (fRec.fFlags & kGammaForBlack_Flag) ? gBlackGammaTable : gWhiteGammaTable;
- if (NULL != table)
- {
+ if (NULL != table) {
uint8_t* dst = (uint8_t*)origGlyph.fImage;
unsigned rowBytes = origGlyph.rowBytes();
- for (int y = origGlyph.fHeight - 1; y >= 0; --y)
- {
- for (int x = origGlyph.fWidth - 1; x >= 0; --x)
+ for (int y = origGlyph.fHeight - 1; y >= 0; --y) {
+ for (int x = origGlyph.fWidth - 1; x >= 0; --x) {
dst[x] = table[dst[x]];
+ }
dst += rowBytes;
}
}
}
}
-void SkScalerContext::getPath(const SkGlyph& glyph, SkPath* path)
-{
+void SkScalerContext::getPath(const SkGlyph& glyph, SkPath* path) {
this->internalGetPath(glyph, NULL, path, NULL);
}
-void SkScalerContext::getFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my)
-{
+void SkScalerContext::getFontMetrics(SkPaint::FontMetrics* mx,
+ SkPaint::FontMetrics* my) {
this->generateFontMetrics(mx, my);
}
return 0;
}
-///////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
-void SkScalerContext::internalGetPath(const SkGlyph& glyph, SkPath* fillPath, SkPath* devPath, SkMatrix* fillToDevMatrix)
-{
+void SkScalerContext::internalGetPath(const SkGlyph& glyph, SkPath* fillPath,
+ SkPath* devPath, SkMatrix* fillToDevMatrix) {
SkPath path;
this->getGlyphContext(glyph)->generatePath(glyph, &path);
- if (fRec.fFrameWidth > 0 || fPathEffect != NULL)
- {
+ if (fRec.fFrameWidth > 0 || fPathEffect != NULL) {
// need the path in user-space, with only the point-size applied
// so that our stroking and effects will operate the same way they
// would if the user had extracted the path themself, and then
SkScalar width = fRec.fFrameWidth;
- if (fPathEffect)
- {
+ if (fPathEffect) {
SkPath effectPath;
- if (fPathEffect->filterPath(&effectPath, localPath, &width))
+ if (fPathEffect->filterPath(&effectPath, localPath, &width)) {
localPath.swap(effectPath);
+ }
}
- if (width > 0)
- {
+ if (width > 0) {
SkStroke stroker;
SkPath outline;
}
// now return stuff to the caller
- if (fillToDevMatrix)
+ if (fillToDevMatrix) {
*fillToDevMatrix = matrix;
-
- if (devPath)
+ }
+ if (devPath) {
localPath.transform(matrix, devPath);
-
- if (fillPath)
+ }
+ if (fillPath) {
fillPath->swap(localPath);
- }
- else // nothing tricky to do
- {
- if (fillToDevMatrix)
+ }
+ } else { // nothing tricky to do
+ if (fillToDevMatrix) {
fillToDevMatrix->reset();
-
- if (devPath)
- {
- if (fillPath == NULL)
+ }
+ if (devPath) {
+ if (fillPath == NULL) {
devPath->swap(path);
- else
+ } else {
*devPath = path;
+ }
}
- if (fillPath)
+ if (fillPath) {
fillPath->swap(path);
+ }
}
- if (devPath)
+ if (devPath) {
devPath->updateBoundsCache();
- if (fillPath)
+ }
+ if (fillPath) {
fillPath->updateBoundsCache();
+ }
}
-void SkScalerContext::Rec::getMatrixFrom2x2(SkMatrix* dst) const
-{
+void SkScalerContext::Rec::getMatrixFrom2x2(SkMatrix* dst) const {
dst->reset();
dst->setScaleX(fPost2x2[0][0]);
dst->setSkewX( fPost2x2[0][1]);
dst->setScaleY(fPost2x2[1][1]);
}
-void SkScalerContext::Rec::getLocalMatrix(SkMatrix* m) const
-{
+void SkScalerContext::Rec::getLocalMatrix(SkMatrix* m) const {
m->setScale(SkScalarMul(fTextSize, fPreScaleX), fTextSize);
- if (fPreSkewX)
+ if (fPreSkewX) {
m->postSkew(fPreSkewX, 0);
+ }
}
-void SkScalerContext::Rec::getSingleMatrix(SkMatrix* m) const
-{
+void SkScalerContext::Rec::getSingleMatrix(SkMatrix* m) const {
this->getLocalMatrix(m);
// now concat the device matrix
- {
- SkMatrix deviceMatrix;
- this->getMatrixFrom2x2(&deviceMatrix);
- m->postConcat(deviceMatrix);
- }
+ SkMatrix deviceMatrix;
+ this->getMatrixFrom2x2(&deviceMatrix);
+ m->postConcat(deviceMatrix);
}
///////////////////////////////////////////////////////////////////////////////
extern SkScalerContext* SkCreateColorScalerContext(const SkDescriptor* desc);
-SkScalerContext* SkScalerContext::Create(const SkDescriptor* desc)
-{
+SkScalerContext* SkScalerContext::Create(const SkDescriptor* desc) {
SkScalerContext* c = NULL; //SkCreateColorScalerContext(desc);
if (NULL == c) {
c = SkFontHost::CreateScalerContext(desc);