1aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkCanvas.h"
269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com#include "SkCGUtils.h"
3aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkGraphics.h"
4aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkImageDecoder.h"
5aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkOSFile.h"
6aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkPaint.h"
7aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkPicture.h"
8aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkStream.h"
9aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#include "SkWindow.h"
10aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
11aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comstatic void make_filepath(SkString* path, const char* dir, const SkString& name) {
12aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    size_t len = strlen(dir);
13aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    path->set(dir);
14aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    if (len > 0 && dir[len - 1] != '/') {
15aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path->append("/");
16aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
17aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    path->append(name);
18aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com}
19aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
20aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comstatic SkPicture* LoadPicture(const char path[]) {
21aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkPicture* pic = NULL;
22aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
23aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkBitmap bm;
24aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    if (SkImageDecoder::DecodeFile(path, &bm)) {
25aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        bm.setImmutable();
26aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pic = SkNEW(SkPicture);
27aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkCanvas* can = pic->beginRecording(bm.width(), bm.height());
28aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        can->drawBitmap(bm, 0, 0, NULL);
29aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pic->endRecording();
30aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    } else {
31aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkFILEStream stream(path);
32aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        if (stream.isValid()) {
33aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            pic = SkNEW_ARGS(SkPicture,
34aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                             (&stream, NULL, &SkImageDecoder::DecodeStream));
35aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
36aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
37aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        if (false) { // re-record
38aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkPicture p2;
39aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            pic->draw(p2.beginRecording(pic->width(), pic->height()));
40aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            p2.endRecording();
41aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
42aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkString path2(path);
43aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            path2.append(".new.skp");
44aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkFILEWStream writer(path2.c_str());
45aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            p2.serialize(&writer);
46aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
47aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
48aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    return pic;
49aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com}
50aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
5169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comclass SkSampleView : public SkView {
5269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.compublic:
5369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkSampleView() {
5469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        this->setVisibleP(true);
5569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        this->setClipToBounds(false);
5669f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    };
5769f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comprotected:
5869f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    virtual void onDraw(SkCanvas* canvas) {
5969f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        canvas->drawColor(0xFFFFFFFF);
6069f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        SkPaint p;
6169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        p.setTextSize(20);
6269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        p.setAntiAlias(true);
6369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        canvas->drawText("Hello World!", 13, 50, 30, p);
64aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com     //   SkRect r = {50, 50, 80, 80};
6569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        p.setColor(0xAA11EEAA);
66aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com   //     canvas->drawRect(r, p);
67aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        
68aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkRect result;
69aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkPath path;
70aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.moveTo(0, 0);
71aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.lineTo(1, 1);
72aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.lineTo(1, 8);
73aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.lineTo(0, 9);
74aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkASSERT(path.hasRectangularInterior(&result));
75aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        
76aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.reset();
77aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.addRect(10, 10, 100, 100, SkPath::kCW_Direction);
78aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.addRect(20, 20, 50, 50, SkPath::kCW_Direction);
79aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.addRect(50, 50, 90, 90, SkPath::kCCW_Direction);
80aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        p.setColor(0xAA335577);
81aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        canvas->drawPath(path, p);
82aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkASSERT(!path.hasRectangularInterior(NULL));
83aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.reset();
84aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.addRect(10, 10, 100, 100, SkPath::kCW_Direction);
85aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.addRect(20, 20, 80, 80, SkPath::kCW_Direction);
86aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkRect expected = {20, 20, 80, 80};
87aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkASSERT(path.hasRectangularInterior(&result));
88aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkASSERT(result == expected);
89aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
9069f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    }
9169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comprivate:
9269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    typedef SkView INHERITED; 
9369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com};
9469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
95aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comvoid application_init();
96aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comvoid application_term();
97aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
98aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comstatic int showPathContour(SkPath::Iter& iter) {
99aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    uint8_t verb;
100aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkPoint pts[4];
101aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int moves = 0;
102aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    bool waitForClose = false;
103aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
104aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        switch (verb) {
105aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            case SkPath::kMove_Verb:
106aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                if (!waitForClose) {
107aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    ++moves;
108aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    waitForClose = true;
109aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                }
110aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDebugf("path.moveTo(%1.9g, %1.9g);\n", pts[0].fX, pts[0].fY);
111aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                break;
112aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            case SkPath::kLine_Verb:
113aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDebugf("path.lineTo(%1.9g, %1.9g);\n", pts[1].fX, pts[1].fY);
114aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                break;
115aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            case SkPath::kQuad_Verb:
116aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDebugf("path.quadTo(%1.9g, %1.9g, %1.9g, %1.9g);\n",
117aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY);
118aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                break;
119aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            case SkPath::kCubic_Verb:
120aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDebugf("path.cubicTo(%1.9g, %1.9g, %1.9g, %1.9g, %1.9g, %1.9g);\n",
121aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY,
122aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    pts[3].fX, pts[3].fY);
123aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                break;
124aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            case SkPath::kClose_Verb:
125aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                waitForClose = false;
126aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDebugf("path.close();\n");
127aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                break;
128aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            default:
129aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkDEBUGFAIL("bad verb");
130aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                SkASSERT(0);
131aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                return 0;
132aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
133aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
134aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    return moves;
135aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com}
136aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
137aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comclass PathCanvas : public SkCanvas {
1387ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawPath(const SkPath& path, const SkPaint& paint) {
139aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        if (nameonly) {
140aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkDebugf("    %s%d,\n", filename.c_str(), ++count);
141aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            return;
142aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
143aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkPath::Iter iter(path, true);
144aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkDebugf("<div id=\"%s%d\">\n", filename.c_str(), ++count);
145aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkASSERT(path.getFillType() < SkPath::kInverseWinding_FillType);
146aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkDebugf("path.setFillType(SkPath::k%s_FillType);\n",
147aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            path.getFillType() == SkPath::kWinding_FillType ? "Winding" : "EvenOdd");
148aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        int contours = showPathContour(iter);
149aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkRect r;
150aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkRect copy = r;
151aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        bool hasOne = path.hasRectangularInterior(&r);
152aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        bool expected = (path.getFillType() == SkPath::kWinding_FillType && contours == 1)
153aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            || (path.getFillType() == SkPath::kEvenOdd_FillType && contours == 2);
154aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        if (!expected) {
155aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkDebugf("suspect contours=%d\n", contours);
156aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
157aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        int verbs = path.countVerbs();
158aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        int points = path.countPoints();
159aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        if (hasOne) {
160aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (rectVerbsMin > verbs) {
161aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                rectVerbsMin = verbs;
162aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
163aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (rectVerbsMax < verbs) {
164aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                rectVerbsMax = verbs;
165aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
166aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (rectPointsMin > points) {
167aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                rectPointsMin = points;
168aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
169aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (rectPointsMax < points) {
170aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                rectPointsMax = points;
171aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
172aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkDebugf("path.addRect(%1.9g, %1.9g, %1.9g, %1.9g);\n",
173aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                    r.fLeft, r.fTop, r.fRight, r.fBottom);
174aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        } else {
175aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (verbsMin > verbs) {
176aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                verbsMin = verbs;
177aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
178aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (verbsMax < verbs) {
179aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                verbsMax = verbs;
180aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
181aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (pointsMin > points) {
182aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                pointsMin = points;
183aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
184aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (pointsMax < points) {
185aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                pointsMax = points;
186aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            }
187aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            SkDebugf("no interior bounds\n");
188aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
189aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        path.hasRectangularInterior(&copy);
190aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkDebugf("</div>\n\n");
191aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
192aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    
193aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    virtual void drawPosTextH(const void* text, size_t byteLength,
194aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                              const SkScalar xpos[], SkScalar constY,
195aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com                              const SkPaint& paint) {
196aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
197aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    
198aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.compublic:
199aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    void divName(const SkString& str, bool only) {
200aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        filename = str;
201aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        char* chars = filename.writable_str();
202aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        while (*chars) {
203aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            if (*chars == '.' || *chars == '-') *chars = '_';
204aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            chars++;
205aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        }
206aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        count = 0;
207aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        nameonly = only;
208aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
209aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    
210aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    void init() {
211aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pointsMin = verbsMin = SK_MaxS32;
212aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pointsMax = verbsMax = SK_MinS32;
213aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        rectPointsMin = rectVerbsMin = SK_MaxS32;
214aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        rectPointsMax = rectVerbsMax = SK_MinS32;
215aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
216aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    
217aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkString filename;
218aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int count;
219aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    bool nameonly;
220aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int pointsMin;
221aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int pointsMax;
222aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int verbsMin;
223aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int verbsMax;
224aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int rectPointsMin;
225aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int rectPointsMax;
226aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int rectVerbsMin;
227aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    int rectVerbsMax;
228aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com};
229aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
230aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.combool runone = false;
231aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
23269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comvoid application_init() {
23369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkGraphics::Init();
23469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkEvent::Init();
235aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    if (runone) {
236aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        return;
237aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
238aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    const char pictDir[] = "/Volumes/chrome/nih/skia/skp/skp";
239aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkOSFile::Iter iter(pictDir, "skp");
240aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkString filename;
241aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    PathCanvas canvas;
242aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    canvas.init();
243aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    while (iter.next(&filename)) {
244aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkString path;
245aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com     //   if (true) filename.set("tabl_www_sahadan_com.skp");
246aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        make_filepath(&path, pictDir, filename);
247aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        canvas.divName(filename, false);
248aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkPicture* pic = LoadPicture(path.c_str());
249aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pic->draw(&canvas);
250aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkDELETE(pic);
251aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
252aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("\n</div>\n\n");
253aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
254aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("<script type=\"text/javascript\">\n\n");
255aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("var testDivs = [\n");
256aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
257aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    iter.reset(pictDir, "skp");
258aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    while (iter.next(&filename)) {
259aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkString path;
260aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        make_filepath(&path, pictDir, filename);
261aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        canvas.divName(filename, true);
262aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkPicture* pic = LoadPicture(path.c_str());
263aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        pic->draw(&canvas);
264aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com        SkDELETE(pic);
265aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    }
266aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("];\n\n");
267aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
268aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("points min=%d max=%d verbs min=%d max=%d\n", canvas.pointsMin, canvas.pointsMax,
269aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            canvas.verbsMin, canvas.verbsMax);
270aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("rect points min=%d max=%d verbs min=%d max=%d\n", canvas.rectPointsMin, canvas.rectPointsMax,
271aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com            canvas.rectVerbsMin, canvas.rectVerbsMax);
272aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com
273aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    SkDebugf("\n");
27469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com}
27569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
27669f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comvoid application_term() {
27769f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkGraphics::Term();
27869f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkEvent::Term();
27969f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com}
28069f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
28169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comclass FillLayout : public SkView::Layout {
28269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.comprotected:
28369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    virtual void onLayoutChildren(SkView* parent) {
28469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        SkView* view = SkView::F2BIter(parent).next();
28569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        view->setSize(parent->width(), parent->height());
28669f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    }
28769f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com};
28869f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
28969f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com#import "SimpleApp.h"
29069f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com@implementation SimpleNSView
29169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
29269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com- (id)initWithDefaults {
293aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com    if ((self = [super initWithDefaults])) {
29469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        fWind = new SkOSWindow(self);
29569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        fWind->setLayout(new FillLayout, false);
29669f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com        fWind->attachChildToFront(new SkSampleView)->unref();
29769f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    }
29869f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    return self;
29969f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com}
30069f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
30169f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com- (void)drawRect:(NSRect)dirtyRect {
30269f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
30369f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com    SkCGDrawBitmap(ctx, fWind->getBitmap(), 0, 0);
30469f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com}
30569f2e05b58cd42bb5925214feb1aecc9a1690f6dyangsu@google.com
306aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com@end
307