SampleText.cpp revision 82065d667f64e232bcde2ad849756a6096fcbe6f
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk64.h"
58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h"
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkImageDecoder.h"
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkKernel33MaskFilter.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXfermode.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXMLParser.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const int gKernel[3][3] = {
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    { -1, -2, -1 }, { -2, 12, -2 }, { -1, -2, -1 }
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { 1, 2, 1 }, { 2, 64-12, 2 }, { 1, 2, 1 }
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const int gShift = 6;
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass ReduceNoise : public SkKernel33ProcMaskFilter {
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ReduceNoise(int percent256) : SkKernel33ProcMaskFilter(percent256) {}
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual uint8_t computeValue(uint8_t* const* srcRows)
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int c = srcRows[1][1];
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int min = 255, max = 0;
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int i = 0; i < 3; i++)
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int j = 0; j < 3; j++)
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                if (i != 1 || j != 1)
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    int v = srcRows[i][j];
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    if (max < v)
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        max = v;
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    if  (min > v)
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        min = v;
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (c > max) c = max;
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //    if (c < min) c = min;
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return c;
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual Factory getFactory() { return Create; }
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ReduceNoise(SkFlattenableReadBuffer& rb) : SkKernel33ProcMaskFilter(rb) {}
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkFlattenable* Create(SkFlattenableReadBuffer& rb)
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return new ReduceNoise(rb);
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass Darken : public SkKernel33ProcMaskFilter {
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Darken(int percent256) : SkKernel33ProcMaskFilter(percent256) {}
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual uint8_t computeValue(uint8_t* const* srcRows)
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int c = srcRows[1][1];
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        float f = c / 255.f;
6682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (c >= 0)
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            f = sqrtf(f);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            f *= f;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(f >= 0 && f <= 1);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return (int)(f * 255);
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual Factory getFactory() { return Create; }
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Darken(SkFlattenableReadBuffer& rb) : SkKernel33ProcMaskFilter(rb) {}
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkFlattenable* Create(SkFlattenableReadBuffer& rb)
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return new Darken(rb);
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkMaskFilter* makemf() { return new Darken(0x30); }
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#ifdef TEST_CLICKX
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_typefaceCache()
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
9344a6312cf6a6e8c7c58065f7f8b8d06decc5fd47reed@android.com#ifdef ANDROID
94069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com    SkTypeface* t0 = SkTypeface::CreateFromName("sans-serif",
95069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com                                                SkTypeface::kNormal);
96069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com    SkTypeface* t1 = SkTypeface::CreateFromName(NULL, SkTypeface::kNormal);
97069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com    SkTypeface* t2 = SkTypeface::CreateFromName("arial", SkTypeface::kNormal);
98069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com    SkTypeface* t3 = SkTypeface::CreateFromName("helvetica", SkTypeface::kItalic);
9982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(t0 == t1);
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(t0 == t2);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(t0 == t3);
103da342a891779e0839a645d6634a2f0100bf2c0d6reed@android.com#endif
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_breakText()
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint paint;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* text = "sdfkljAKLDFJKEWkldfjlk#$%&sdfs.dsj";
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size_t length = strlen(text);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar width = paint.measureText(text, length);
11282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar mm = 0;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar nn = 0;
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkScalar w = 0; w <= width; w += SK_Scalar1)
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar m;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t n = paint.breakText(text, length, w, &m,
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                    SkPaint::kBackward_TextBufferDirection);
12082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(n <= length);
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(m <= width);
12382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (n == 0)
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(m == 0);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // now assert that we're monotonic
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (n == nn)
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(m == mm);
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(n > nn);
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(m > mm);
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        nn = n;
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        mm = m;
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    nn = paint.breakText(text, length, width, &mm);
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(nn == length);
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(mm == width);
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkRandom gRand;
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPowerMode : public SkXfermode {
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPowerMode(SkScalar exponent) { this->init(exponent); }
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, const SkAlpha aa[]);
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&);
15582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides for SkFlattenable
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual Factory getFactory() { return Create; }
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void flatten(SkFlattenableWriteBuffer& b)
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //    this->INHERITED::flatten(b);  How can we know if this is legal????
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        b.write32(SkScalarToFixed(fExp));
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
16382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar fExp;          // user's value
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t fTable[256];    // cache
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void init(SkScalar exponent);
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPowerMode(SkFlattenableReadBuffer& b) : SkXfermode(b)
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // read the exponent
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->init(SkFixedToScalar(b.readS32()));
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkFlattenable* Create(SkFlattenableReadBuffer& b)
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return SkNEW_ARGS(SkPowerMode, (b));
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
17882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkXfermode INHERITED;
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkPowerMode::init(SkScalar e)
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fExp = e;
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    float ee = SkScalarToFloat(e);
18682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    printf("------ %g\n", ee);
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = 0; i < 256; i++)
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        float x = i / 255.f;
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %d %g", i, x);
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        x = powf(x, ee);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %g", x);
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int xx = SkScalarRound(SkFloatToScalar(x * 255));
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %d\n", xx);
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fTable[i] = SkToU8(xx);
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkPowerMode::xfer16(uint16_t dst[], const SkPMColor src[], int count, const SkAlpha aa[])
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = 0; i < count; i++)
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPMColor c = src[i];
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int r = SkGetPackedR32(c);
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int g = SkGetPackedG32(c);
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int b = SkGetPackedB32(c);
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r = fTable[r];
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        g = fTable[g];
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        b = fTable[b];
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dst[i] = SkPack888ToRGB16(r, g, b);
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const struct {
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fName;
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t    fFlags;
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool        fFlushCache;
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} gHints[] = {
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Linear", SkPaint::kLinearText_Flag,     false },
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Normal",   0,                           true },
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Subpixel", SkPaint::kSubpixelText_Flag, true }
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define REPEAT_COUNT    1
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
228f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #define REPEAT_COUNT    5
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int count_char_points(const SkPaint& paint, char c)
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPath  path;
23482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.getTextPath(&c, 1, 0, 0, &path);
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return path.getPoints(NULL, 0);
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int gOld, gNew, gCount;
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void dump(int c, int oldc, int newc)
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (oldc != newc)
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gOld += oldc;
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gNew += newc;
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gCount += 1;
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        printf("char %c: old = %3d, new = %3d, reduction %g%%\n", c, oldc, newc, 100. * (oldc - newc) / oldc);
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void tab(int n)
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    printf("[%d] ", n); return;
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(n >= 0);
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = 0; i < n; i++)
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        printf("    ");
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "badrects.cpp"
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void make_badrgn(SkRegion* rgn, int insetAmount)
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRect16    r, bounds;
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int         i;
26782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    rgn->setEmpty();
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bounds.setEmpty();
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (i = 0; i < SK_ARRAY_COUNT(badrects); i++)
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(badrects[i].width > 0 && badrects[i].height > 0);
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(badrects[i].x, badrects[i].y, badrects[i].x + badrects[i].width, badrects[i].y + badrects[i].height);
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.inset(insetAmount, insetAmount);
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        rgn->op(r, SkRegion::kUnion_Op);
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bounds.join(r);
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(bounds == rgn->getBounds());
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (i = 0; i < SK_ARRAY_COUNT(badrects); i++)
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
28482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        r.set(badrects[i].x, badrects[i].y, badrects[i].x + badrects[i].width, badrects[i].y + badrects[i].height);
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(rgn->contains(r));
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void draw_rgn(const SkRegion& rgn, SkCanvas* canvas, const SkPaint& paint)
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRect    r;
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRegion::Iterator  iter(rgn);
29482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (; !iter.done(); iter.next())
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(iter.rect());
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawRect(r, paint);
2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_break(SkCanvas* canvas, const char text[], size_t length,
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkScalar x, SkScalar y, const SkPaint& paint,
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkScalar clickX)
3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint linePaint;
30782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    linePaint.setAntiAlias(true);
30982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar measured;
31182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (paint.breakText(text, length, clickX - x, &measured, SkPaint::kForward_TextBufferDirection))
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        linePaint.setColor(SK_ColorRED);
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawLine(x, y, x + measured, y, linePaint);
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += paint.measureText(text, length);
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (paint.breakText(text, length, x - clickX, &measured, SkPaint::kBackward_TextBufferDirection))
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        linePaint.setColor(SK_ColorBLUE);
3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawLine(x - measured, y, x, y, linePaint);
3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_poly()
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const SkPoint dst[] = {
3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(2), SkIntToScalar(1),
3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(5), SkIntToScalar(1),
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(5), SkIntToScalar(3),
3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(2), SkIntToScalar(3)
3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
33482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const SkPoint src[] = {
3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(0), SkIntToScalar(0),
3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(1), SkIntToScalar(0),
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(1), SkIntToScalar(1),
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkIntToScalar(0), SkIntToScalar(1)
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
34182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMatrix matrix;
34382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (matrix.setPolyToPoly(src, dst, 4))
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPoint pt = { SK_Scalar1/2, SK_Scalar1/2 };
34782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        matrix.mapPoints(&pt, 1);
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        printf("---- x = %g y = %g\n", SkScalarToFloat(pt.fX), SkScalarToFloat(pt.fY));
3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        printf("---- setPolyToPoly failed\n");
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorShader.h"
3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void DrawTheText(SkCanvas* canvas, const char text[], size_t length,
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkScalar x, SkScalar y, const SkPaint& paint,
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkScalar clickX, SkMaskFilter* mf)
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint p(paint);
3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawText(text, length, x, y, paint);
3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPoint pts[1000];
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar xpos = x;
3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(length <= SK_ARRAY_COUNT(pts));
3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (size_t i = 0; i < length; i++)
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            pts[i].set(xpos, y), xpos += paint.getTextSize();
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawPosText(text, length, pts, paint);
3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    p.setSubpixelText(true);
3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += SkIntToScalar(180);
3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawText(text, length, x, y, p);
3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef TEST_CLICKX
3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    test_break(canvas, text, length, x, y, p, clickX);
3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
3848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (false)
3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkColorShader   shader;
3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setShader(&shader);
3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        x += SkIntToScalar(180);
3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawText(text, length, x, y, p);
3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setShader(NULL);
3918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (true)
3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //    p.setMaskFilter(mf);
3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setSubpixelText(false);
3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setLinearText(true);
3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        x += SkIntToScalar(180);
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawText(text, length, x, y, p);
4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass TextSpeedView : public SkView {
4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	TextSpeedView()
4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMF = makemf();
4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fHints = 0;
4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
4148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            static const char extra[] = { '.', ',', ':', ';', '!' };
4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint   paint, paint2;
4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
417069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com            paint2.setTypeface(SkTypeface::CreateFromName(NULL,
418069b827f8e4f8ca212548719db64983a69b8dc25reed@android.com                                                SkTypeface::kItalic))->unref();
4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 0; i < 26; i++)
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                ::dump('a' + i, count_char_points(paint, 'a' + i), count_char_points(paint2, 'a' + i));
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int j = 0; j < SK_ARRAY_COUNT(extra); j++)
4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                ::dump(extra[j], count_char_points(paint, extra[j]), count_char_points(paint2, extra[j]));
4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("--- ave reduction = %g%%\n", 100. * (gOld - gNew) / gOld);
4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
42782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (true)
4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPoint pts[] = { SkIntToScalar(20), 0, SkIntToScalar(256+20), 0 };
4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkColor colors[] = { SkColorSetARGB(0, 255, 255, 255), SkColorSetARGB(255, 255, 255, 255) };
4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fGradient = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
43482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClickX = 0;
4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
43782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        test_breakText();
4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        test_typefaceCache();
4396b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com//        test_poly();
4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
44182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~TextSpeedView()
4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fGradient->unref();
44582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        SkSafeUnref(fMF);
4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onQuery(SkEvent* evt)
4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SampleCode::TitleQ(*evt))
4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Text");
4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
45982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void drawBG(SkCanvas* canvas)
4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        canvas->drawColor(0xFFDDDDDD);
4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawColor(SK_ColorWHITE);
4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   //     canvas->drawColor(SK_ColorBLACK);
4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
46682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void make_textstrip(SkBitmap* bm)
4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bm->setConfig(SkBitmap::kRGB_565_Config, 200, 18);
4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bm->allocPixels();
4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bm->eraseColor(SK_ColorWHITE);
47282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkCanvas    canvas(*bm);
4748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint     paint;
4758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit";
47682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag
4788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                        | SkPaint::kDevKernText_Flag);
4798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setTextSize(SkIntToScalar(14));
4808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas.drawText(s, strlen(s), SkIntToScalar(8), SkIntToScalar(14), paint);
4818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
48282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand)
4848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
4858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (size_t i = 0; i < n; i++)
4868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480);
4878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
48882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onDraw(SkCanvas* canvas)
4908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
491cb34235f46b6259b612e72c416e850e26803250areed@android.com        inval(NULL);
4928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
4938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->translate(SkIntToScalar(480), 0);
4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->rotate(SkIntToScalar(90));
4968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
49782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->drawBG(canvas);
49982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
50382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setSubpixelText(true);
5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         //   p.setLinearText(true);
50782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar size = SkIntToScalar(6);
5098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkMSec   dur = 0;
5108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            const int LOOP = 16;
5118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            const int TIMES = 10;
51282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int times = 0; times < TIMES; times++)
5148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
5158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkMSec now = SkTime::GetMSecs();
5168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                for (int loop = 0; loop < LOOP; loop++)
5178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
5188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    p.setTextSize(size);
5198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    size += SK_Scalar1/5;
5208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    canvas->drawText("Hamburgefons", 12, SkIntToScalar(10), SkIntToScalar(50), p);
5218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
5228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                dur += SkTime::GetMSecs() - now;
5238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkGraphics::SetFontCacheUsed(0);
5248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
52582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("----- duration = %g\n", dur * 1.0 / TIMES);
5278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->inval(NULL);
5288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
5298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
53082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
5328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
5338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
5348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
5358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 6; i <= 36; i++)
5368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
5378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkRect r;
5388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkPaint::FontMetrics m;
5398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                p.setTextSize(SkIntToScalar(i));
5408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                p.getFontMetrics(&m);
5418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                int ascent = SkScalarRound(m.fAscent);
5428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                int descent = SkScalarRound(m.fDescent);
5438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                for (uint8_t c = ' '; c <= 127; c++)
5448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
5458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    p.getTextWidths(&c, 1, NULL, &r);
5468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    if (SkScalarRound(r.fTop) < ascent)
5478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        printf("PS %d --- %c [%d] top=%g, ascent=%g ymax=%g\n", i, c, c,
5488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                SkScalarToFloat(r.fTop), SkScalarToFloat(m.fAscent), SkScalarToFloat(m.fTop));
5498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    if (SkScalarRound(r.fBottom) > descent)
5508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        printf("PS %d --- %c [%d] bottom=%g, descent=%g ymin=%g\n", i, c, c,
5518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                SkScalarToFloat(r.fBottom), SkScalarToFloat(m.fDescent), SkScalarToFloat(m.fBottom));
5528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
5538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
5548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
55582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
5578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
5588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
5598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setShader(fGradient);
5608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_RELEASE
5628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkMSec now = SkTime::GetMSecs();
5638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 0; i < 100; i++)
5648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
5658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawPaint(p);
5668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_RELEASE
5678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("----- %d ms\n", SkTime::GetMSecs() - now);
5688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->inval(NULL);
5698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
5708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
5718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
57282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
5748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
5758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkBitmap    bm;
57682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            make_textstrip(&bm);
5788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->translate(0, SkIntToScalar(50));
5798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 0; i < 10; i++)
5808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
5818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                float gamma = 1 + i * 0.2f;
5828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkPowerMode mode(SkFloatToScalar(1 / gamma));
5838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkPaint     p;
5848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                p.setXfermode(&mode);
58582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->drawBitmap(bm, 0, SkIntToScalar(i) * bm.height(), &p);
5878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
5888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
5898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
59082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
5928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
5938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint paint;
59482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
5958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            paint.setAntiAlias(true);
5968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            paint.setDevKernText(true);
5978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkMSec now = SkTime::GetMSecs();
5988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 0; i < 1000000; i++)
5998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
6008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                paint.measureText("Hamburgefons", 15, NULL, NULL);
6018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
6028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("--------- measure %d\n", SkTime::GetMSecs() - now);
6038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->inval(NULL);
6048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
6058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
6068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
6088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
6098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRegion    rgn;
6108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPath      path;
6118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint     paint;
61282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //    make_badrgn(&rgn, -2);
61482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (false)
6168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            {
6178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                paint.setColor(SK_ColorBLUE);
6188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->drawIRect(rgn.getBounds(), paint);
6198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
6208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            paint.setColor(SK_ColorRED);
6218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            draw_rgn(rgn, canvas, paint);
62282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            rgn.getBoundaryPath(&path);
6248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            paint.setARGB(0x80, 0, 0, 0xFF);
6258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawPath(path, paint);
6268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
6278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
6288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
6308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
6318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r = { SkIntToScalar(50), SkIntToScalar(50), SkIntToScalar(300), SkIntToScalar(300) };
6328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
63382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setStyle(SkPaint::kStroke_Style);
6358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAlpha(0x80);
6368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setStrokeWidth(SkIntToScalar(20));
6378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawRect(r, p);
6388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
63982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
6418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
6428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
6438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r = { SkIntToScalar(100), SkIntToScalar(100), SkIntToScalar(104), SkIntToScalar(104) };
6448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         //   r.offset(SK_ScalarHalf, SK_ScalarHalf);
6458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setStyle(SkPaint::kStroke_Style);
6468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setStrokeWidth(SK_Scalar1*2);
6478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //    p.setAntiAliasOn(true);
6488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawRect(r, p);
6498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
6508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
65182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false)
6538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
6548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            Sk64    aa, bb;
6558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            int64_t a = (int64_t)6062080 * -30596;
6568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            int64_t b = (int64_t)4816896 * 57957;
6578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            aa.setMul(6062080, -30596);
6588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            bb.setMul(4816896, 57957);
6598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            a += b;
6618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            b = a >> 16;
6628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//            SkFixed c = aa.addGetFixed(bb);
66482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("%d %d\n", (int)a, a >> 32);
66682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkBitmap    bm;
6688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint     paint;
6698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar    scale = SkFloatToScalar(0.5625f);
6708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar    x = SkIntToScalar(100);
6718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar    y = SkIntToScalar(100);
67282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            //paint.setFilterType(SkPaint::kBilinear_FilterType);
67482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkImageDecoder::DecodeFile("/app_web_browser.png", &bm);
67682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com           // canvas->drawBitmap(bm, x, y, paint);
6788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            x += SkIntToScalar(100);
6798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->save();
6808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->translate(x, y);
6818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->scale(SkIntToScalar(2)/1, SkIntToScalar(2)/1);
6828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->translate(-x, -y);
6838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->drawBitmap(bm, x, y, &paint);
6848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->restore();
6858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            x += SkIntToScalar(100);
6868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->save();
6878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->translate(x, y);
6888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->scale(scale, scale);
6898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->translate(-x, -y);
6908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            //    canvas->drawBitmap(bm, x, y, paint);
6918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->restore();
6928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
6938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
69482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
6958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAutoCanvasRestore restore(canvas, false);
6968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
6978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
6988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20));
6998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com       //     canvas->saveLayer(&r, NULL, SkCanvas::kHasAlphaLayer_SaveFlag);
7008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
7018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint paint;
7038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
7048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int         index = fHints % SK_ARRAY_COUNT(gHints);
7058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        index = 1;
7068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        const char* style = gHints[index].fName;
70782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        canvas->translate(0, SkIntToScalar(50));
7098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  //      canvas->drawText(style, strlen(style), SkIntToScalar(20), SkIntToScalar(20), paint);
7118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
71204d86c6a6b8eb8631752b3680f1292fa0a2c7119reed@android.com        SkSafeUnref(paint.setTypeface(SkTypeface::CreateFromFile("/skimages/samplefont.ttf")));
7138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setAntiAlias(true);
7148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setFlags(paint.getFlags() | gHints[index].fFlags);
71582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkMSec now = 0;
7178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (REPEAT_COUNT > 1)
7188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            now = SkTime::GetMSecs();
7198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect clip;
7218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155));
72282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (0) {
7248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->clipRect(clip);
7258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
7268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (0) {
72882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com            SkPath clipPath;
7298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            clipPath.addOval(clip);
7308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->clipPath(clipPath);
7318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
7328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* text = "Hamburgefons";
7348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t length = strlen(text);
7358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef TEST_CLICKX
7378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
7388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
73982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setColor(SK_ColorGREEN);
7418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
7428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawLine(fClickX, 0, fClickX, SkIntToScalar(1000), p);
7438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
7448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
7458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int j = 0; j < REPEAT_COUNT; j++)
7478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
7488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkScalar y = SkIntToScalar(0);
7498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int i = 9; i <= 24; i++) {
7508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/);
7518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4; dx += SkIntToScalar(1) /* /4 */)
7528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                {
7538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    y += paint.getFontSpacing();
7548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX, fMF);
7558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
7568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
7578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (gHints[index].fFlushCache) {
758cb34235f46b6259b612e72c416e850e26803250areed@android.com//                SkGraphics::SetFontCacheUsed(0);
7598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
7608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
76182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (REPEAT_COUNT > 1)
7638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
7648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            printf("--------- FPS = %g\n", REPEAT_COUNT * 1000. / (SkTime::GetMSecs() - now));
7658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            this->inval(NULL);
7668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
7678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
76882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
76982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
7708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
7718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClickX = x;
7728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
7738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onFindClickHandler(x, y);
7748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
77582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
77682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    virtual bool onClick(Click* click)
7778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
7788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onClick(click);
7798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
78082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
7818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
7828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int fHints;
7838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar fClickX;
7848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMaskFilter* fMF;
7858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShader* fGradient;
7868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkView INHERITED;
7888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
7898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
7918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new TextSpeedView; }
7938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
7948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
795