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