From 7d970c739d44486d3382eed8acc4eecccecf3453 Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Thu, 22 Apr 2010 16:07:49 +0000 Subject: [PATCH] updates git-svn-id: http://skia.googlecode.com/svn/trunk@558 2bbb7eff-a529-9590-31e7-b0007b416f81 --- samplecode/SampleArc.cpp | 1 + samplecode/SampleEffects.cpp | 22 +++++++++++++ samplecode/SampleFontCache.cpp | 9 ++---- samplecode/SampleNinePatch.cpp | 56 +++++++++++++++++++++++++++++---- samplecode/SamplePicture.cpp | 66 +++++++++++++++++++++++++++++++++++++++ samplecode/SampleSkLayer.cpp | 24 ++++++++++++++- samplecode/SampleTypeface.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++ samplecode/SampleWarp.cpp | 3 +- 8 files changed, 237 insertions(+), 14 deletions(-) diff --git a/samplecode/SampleArc.cpp b/samplecode/SampleArc.cpp index ed62537..bba5f6f 100644 --- a/samplecode/SampleArc.cpp +++ b/samplecode/SampleArc.cpp @@ -130,6 +130,7 @@ protected: fSweep = SampleCode::GetAnimScalar(SkIntToScalar(360)/24, SkIntToScalar(360)); +// fSweep = SkFloatToScalar(359.99f); SkRect r; SkPaint paint; diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp index 94f0413..7b61911 100644 --- a/samplecode/SampleEffects.cpp +++ b/samplecode/SampleEffects.cpp @@ -8,6 +8,23 @@ #include "SkDiscretePathEffect.h" #include "SkGradientShader.h" +#include "SkEdgeClipper.h" + +static void test_edgeclipper() { + SkPoint pts[] = { + { -8.38822452e+21, -7.69721471e+19 }, + { 1.57645875e+23, 1.44634003e+21 }, + { 1.61519691e+23, 1.48208059e+21 }, + { 3.13963584e+23, 2.88057438e+21 } + }; + SkRect clip = { 0, 0, 300, 200 }; + + SkEdgeClipper clipper; + clipper.clipCubic(pts, clip); +} + +/////////// + //#define COLOR 0xFFFF8844 #define COLOR 0xFF888888 @@ -74,6 +91,11 @@ public: fPaint[i].setColor(COLOR); gPaintProcs[i](&fPaint[i]); } + + test_edgeclipper(); + SkColorMatrix cm; + cm.setRotate(SkColorMatrix::kG_Axis, 180); + cm.setIdentity(); } protected: diff --git a/samplecode/SampleFontCache.cpp b/samplecode/SampleFontCache.cpp index fb63f71..75645bd 100644 --- a/samplecode/SampleFontCache.cpp +++ b/samplecode/SampleFontCache.cpp @@ -89,17 +89,14 @@ public: gDone = false; for (int i = 0; i < N; i++) { - int status; - pthread_attr_t attr; + int status; - status = pthread_attr_init(&attr); - SkASSERT(0 == status); - status = pthread_create(&fMThreads[i], &attr, measure_proc, NULL); + status = pthread_create(&fMThreads[i], NULL, measure_proc, NULL); SkASSERT(0 == status); fBitmaps[i].setConfig(SkBitmap::kRGB_565_Config, 320, 240); fBitmaps[i].allocPixels(); - status = pthread_create(&fDThreads[i], &attr, draw_proc, &fBitmaps[i]); + status = pthread_create(&fDThreads[i], NULL, draw_proc, &fBitmaps[i]); SkASSERT(0 == status); } } diff --git a/samplecode/SampleNinePatch.cpp b/samplecode/SampleNinePatch.cpp index 941b3ff..99c337b 100644 --- a/samplecode/SampleNinePatch.cpp +++ b/samplecode/SampleNinePatch.cpp @@ -11,7 +11,7 @@ public: SkBitmap fBM; NinePatchView() { - SkImageDecoder::DecodeFile("/skimages/folder_background.9.png", &fBM); + SkImageDecoder::DecodeFile("/skimages/btn_default_normal_disable.9.png", &fBM); // trim off the edge guide-lines SkBitmap tmp; @@ -35,13 +35,44 @@ protected: } void drawBG(SkCanvas* canvas) { - canvas->drawColor(SK_ColorWHITE); + SkPaint p; + p.setDither(true); + p.setColor(0xFF909090); + canvas->drawPaint(p); } - + + static void test_rects(SkCanvas* canvas, const SkBitmap& bm, const SkPaint* paint) { + static const SkIRect src[] = { + { 0, 0, 18, 34 }, + { 18, 0, 19, 34 }, + { 19, 0, 36, 34 }, + { 0, 34, 18, 35 }, + { 18, 34, 19, 35 }, + { 19, 34, 36, 35 }, + { 0, 35, 18, 72 }, + { 18, 35, 19, 72 }, + { 19, 35, 36, 72 }, + }; + static const SkRect dst[] = { + { 0, 0, 18, 34 }, + { 18, 0, 283, 34 }, + { 283, 0, 300, 34 }, + { 0, 34, 18, 163 }, + { 18, 34, 283, 163 }, + { 283, 34, 300, 163 }, + { 0, 163, 18, 200 }, + { 18, 163, 283, 200 }, + { 283, 163, 300, 200 }, + }; + for (size_t i = 0; i < SK_ARRAY_COUNT(src); i++) { + canvas->drawBitmapRect(bm, &src[i], dst[i], paint); + } + } + virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); - canvas->scale(1.5f, 1.5f); + // canvas->scale(1.5f, 1.5f); canvas->drawBitmap(fBM, 0, 0); @@ -50,15 +81,28 @@ protected: int d = 25; margins.set(d, d, d, d); + margins.fLeft = fBM.width()/2 - 1; + margins.fTop = fBM.height()/2 - 1; + margins.fRight = fBM.width() - margins.fLeft - 1; + margins.fBottom = fBM.height() - margins.fTop - 1; + + // canvas->translate(fX/5, fY/5); + canvas->translate(0, 76); + dst.set(0, 0, SkIntToScalar(200), SkIntToScalar(200)); - dst.offset(fX, fY); - SkNinePatch::DrawNine(canvas, dst, fBM, margins); + SkPaint paint; + paint.setAntiAlias(false); + paint.setDither(true); + paint.setFilterBitmap(false); + // SkNinePatch::DrawNine(canvas, dst, fBM, margins, &paint); + test_rects(canvas, fBM, &paint); } virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { fX = x / 1.5f; fY = y / 1.5f; + fX = x; fY = y; this->inval(NULL); return this->INHERITED::onFindClickHandler(x, y); } diff --git a/samplecode/SamplePicture.cpp b/samplecode/SamplePicture.cpp index e232a50..6c018b7 100644 --- a/samplecode/SamplePicture.cpp +++ b/samplecode/SamplePicture.cpp @@ -14,6 +14,7 @@ #include "SkUtils.h" #include "SkColorPriv.h" #include "SkColorFilter.h" +#include "SkShape.h" #include "SkTime.h" #include "SkTypeface.h" #include "SkXfermode.h" @@ -21,6 +22,69 @@ #include "SkStream.h" #include "SkXMLParser.h" +class SignalShape : public SkShape { +public: + SignalShape() : fSignal(0) {} + + SkShape* setSignal(int n) { + fSignal = n; + return this; + } + +protected: + virtual void onDraw(SkCanvas* canvas) { + SkDebugf("---- sc %d\n", canvas->getSaveCount() - 1); + } + +private: + int fSignal; +}; + +static SkPMColor SignalProc(SkPMColor src, SkPMColor dst) { + return dst; +} + +/* Picture playback will skip blocks of draw calls that follow a clip() call + that returns empty, and jump down to the corresponding restore() call. + + This is a great preformance win for drawing very large/tall pictures with + a small visible window (think scrolling a long document). These tests make + sure that (a) we are performing the culling, and (b) we don't get confused + by nested save() calls, nor by calls to restoreToCount(). + */ +static void test_saveRestoreCulling() { + SkPaint signalPaint; + SignalShape signalShape; + + SkPicture pic; + SkRect r = SkRect::MakeWH(0, 0); + int n; + SkCanvas* canvas = pic.beginRecording(100, 100); + int startN = canvas->getSaveCount(); + SkDebugf("---- start sc %d\n", startN); + canvas->drawShape(signalShape.setSignal(1)); + canvas->save(); + canvas->drawShape(signalShape.setSignal(2)); + n = canvas->save(); + canvas->drawShape(signalShape.setSignal(3)); + canvas->save(); + canvas->clipRect(r); + canvas->drawShape(signalShape.setSignal(4)); + canvas->restoreToCount(n); + canvas->drawShape(signalShape.setSignal(5)); + canvas->restore(); + canvas->drawShape(signalShape.setSignal(6)); + SkASSERT(canvas->getSaveCount() == startN); + + SkBitmap bm; + bm.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); + bm.allocPixels(); + SkCanvas c(bm); + c.drawPicture(pic); +} + +/////////////////////////////////////////////////////////////////////////////// + #include "SkImageRef_GlobalPool.h" static SkBitmap load_bitmap() { @@ -73,6 +137,8 @@ public: // unref fPicture in our destructor, and it will in turn take care of // the other references to fSubPicture fSubPicture->unref(); + + test_saveRestoreCulling(); } virtual ~PictureView() { diff --git a/samplecode/SampleSkLayer.cpp b/samplecode/SampleSkLayer.cpp index 54efddf..11976e9 100644 --- a/samplecode/SampleSkLayer.cpp +++ b/samplecode/SampleSkLayer.cpp @@ -41,7 +41,20 @@ static void test_map(SkScalar x0, SkScalar y0, SkScalar z0, x1, y1, z1, dst.fData[0] == x1 && dst.fData[1] == y1 && dst.fData[2] == z1); } - + +static void test_33(const SkMatrix44& mat, + SkScalar x0, SkScalar x1, SkScalar x2, + SkScalar y0, SkScalar y1, SkScalar y2) { + SkMatrix dst = mat; + if (dst[0] != x0 || dst[1] != x1 || dst[2] != x2 || + dst[3] != y0 || dst[4] != y1 || dst[5] != y2) { + SkString str; + dst.toDumpString(&str); + SkDebugf("3x3: expected 3x3 [%g %g %g] [%g %g %g] bug got %s\n", + x0, x1, x2, y0, y1, y2, str.c_str()); + } +} + static void test44() { SkMatrix44 m0, m1, m2; @@ -78,6 +91,15 @@ static void test44() { test_map(1, 0, 0, m0, 7, 3, 4); test_map(0, 1, 0, m0, 2, 9, 4); test_map(0, 0, 1, m0, 2, 3, 11); + + SkMScalar deg = 45; + m0.setRotateDegreesAbout(0, 0, 1, deg); + test_map(1, 0, 0, m0, 0.707106769, -0.707106769, 0); + + m0.reset(); + test_33(m0, 1, 0, 0, 0, 1, 0); + m0.setTranslate(3, 4, 5); + test_33(m0, 1, 0, 3, 0, 1, 4); } /////////////////////////////////////////////////////////////////////////////// diff --git a/samplecode/SampleTypeface.cpp b/samplecode/SampleTypeface.cpp index 2fadb41..fa2f546 100644 --- a/samplecode/SampleTypeface.cpp +++ b/samplecode/SampleTypeface.cpp @@ -14,6 +14,36 @@ #include "SkColorFilter.h" #include "SkDither.h" +static int dither_4444(int x) { + return ((x << 1) - ((x >> 4 << 4) | (x >> 4))) >> 4; +} + +/** Ensure that the max of the original and dithered value (for alpha) is always + >= any other dithered value. We apply this "max" in colorpriv.h when we + predither down to 4444, to be sure that we stay in legal premultiplied form + */ +static void test_4444_dither() { + int buckets[16]; + sk_bzero(buckets, sizeof(buckets)); + + for (int a = 0; a <= 0xFF; a++) { + int da = dither_4444(a); + int maxa = SkMax32(a >> 4, da); + // SkDebugf("--- %02X %X\n", a, da); + buckets[da] += 1; + for (int c = 0; c <= a; c++) { + int dc = dither_4444(c); + if (maxa < dc) { + SkDebugf("------------ error a=%d da=%d c=%d dc=%d\n", a, da, + c, dc); + } + } + } + for (int i = 0; i < 16; i++) { + // SkDebugf("[%d] = %d\n", i, buckets[i]); + } +} + static const struct { const char* fName; SkTypeface::Style fStyle; @@ -34,6 +64,7 @@ class TypefaceView : public SkView { public: TypefaceView() { + test_4444_dither(); for (int i = 0; i < gFaceCount; i++) { fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName, gFaces[i].fStyle); @@ -84,6 +115,45 @@ protected: canvas->drawText(text, textLen, x, y, paint); y += dy; } + + SkRect r; + if (false) { + r.set(10, 10, 100, 100); + paint.setStyle(SkPaint::kStrokeAndFill_Style); + paint.setColor(SK_ColorBLUE); + paint.setStrokeWidth(1); + canvas->drawRect(r, paint); + paint.setStrokeWidth(0); + } + + if (false) { + r.set(294912.75f, 294912.75f, 884738.25f, 884738.25f); + canvas->scale(2.4414E-4f, 2.4414E-4f); + paint.setStyle(SkPaint::kFill_Style); + canvas->drawRect(r, paint); + } + + if (false) { + SkScalar rad = 90; + SkScalar angle = 210; + SkScalar cx = 150; + SkScalar cy = 105; + r.set(cx - rad, cy - rad, cx + rad, cy + rad); + SkPath path; + path.arcTo(r, angle, -(angle + 90), true); + path.close(); + + paint.setColor(SK_ColorRED); + canvas->drawRect(path.getBounds(), paint); + paint.setColor(SK_ColorBLUE); + canvas->drawPath(path, paint); + + paint.setColor(SK_ColorGREEN); + SkPoint pts[100]; + int count = path.getPoints(pts, 100); + paint.setStrokeWidth(5); + canvas->drawPoints(SkCanvas::kPoints_PointMode, count, pts, paint); + } } private: diff --git a/samplecode/SampleWarp.cpp b/samplecode/SampleWarp.cpp index 606144c..bf4ef0d 100644 --- a/samplecode/SampleWarp.cpp +++ b/samplecode/SampleWarp.cpp @@ -327,6 +327,7 @@ class WarpView : public SkView { public: WarpView() { SkBitmap bm; +// SkImageDecoder::DecodeFile("/skimages/marker.png", &bm); SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm); // SkImageDecoder::DecodeFile("/beach_shot.JPG", &bm); fBitmap = bm; @@ -387,7 +388,7 @@ protected: return orig; } - const SkScalar period = 20; + const SkScalar period = 10 + dragLength/4; const SkScalar mag = dragLength / 3; SkScalar d = length / (period); -- 2.7.4