1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/*
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com *
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file.
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "SkColorPriv.h"
11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkDebugCanvas.h"
12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkDrawCommand.h"
13f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "SkDrawFilter.h"
146dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com#include "SkDevice.h"
15f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "SkXfermode.h"
16902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
176ae24e0f5fa3306054679d0ec8f9d1f5d35c2617reed@google.comSkDebugCanvas::SkDebugCanvas(int width, int height)
18e254310a55d55a710309714c48f7fbbe7a6126f7commit-bot@chromium.org        : INHERITED(width, height)
1957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        , fPicture(NULL)
201735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org        , fWidth(width)
211735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org        , fHeight(height)
221735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org        , fFilter(false)
23768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        , fMegaVizMode(false)
241735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org        , fIndex(0)
25f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        , fOverdrawViz(false)
2606d6ac645d9269ea05f7461533c646fd3ea71628scroggo@google.com        , fOverdrawFilter(NULL)
2732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        , fOverrideTexFiltering(false)
2832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        , fTexOverrideFilter(NULL)
2906d6ac645d9269ea05f7461533c646fd3ea71628scroggo@google.com        , fOutstandingSaveCount(0) {
30e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix.reset();
318b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com
328b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
338b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // operations. This can lead to problems in the debugger which expects all
348b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // the operations in the captured skp to appear in the debug canvas. To
358b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // circumvent this we create a wide open clip here (an empty clip rect
368b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // is not sufficient).
378b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // Internally, the SkRect passed to clipRect is converted to an SkIRect and
388b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // rounded out. The following code creates a nearly maximal rect that will
398b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // not get collapsed by the coming conversions (Due to precision loss the
408b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    // inset has to be surprisingly large).
418b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    SkIRect largeIRect = SkIRect::MakeLargest();
428b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    largeIRect.inset(1024, 1024);
436c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com    SkRect large = SkRect::Make(largeIRect);
448b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com#ifdef SK_DEBUG
458b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    large.roundOut(&largeIRect);
468b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com    SkASSERT(!largeIRect.isEmpty());
478b15717bb02c9101e8c621affd41a2e5c2cc8636robertphillips@google.com#endif
488f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    // call the base class' version to avoid adding a draw command
498f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->INHERITED::onClipRect(large, SkRegion::kReplace_Op, kHard_ClipEdgeStyle);
50902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
51902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
529cda6f753c913453b5a793836bf17a74bf0e6c49chudy@google.comSkDebugCanvas::~SkDebugCanvas() {
5367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    fCommandVector.deleteAll();
54f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    SkSafeUnref(fOverdrawFilter);
551735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org    SkSafeUnref(fTexOverrideFilter);
569cda6f753c913453b5a793836bf17a74bf0e6c49chudy@google.com}
57902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
58902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
5957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    command->setOffset(this->getOpID());
6067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    fCommandVector.push(command);
61902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
62902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
63902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::draw(SkCanvas* canvas) {
641735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org    if (!fCommandVector.isEmpty()) {
6557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        this->drawTo(canvas, fCommandVector.count() - 1);
66902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
67902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
68902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
69830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.comvoid SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
70e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    canvas->concat(fUserMatrix);
71830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com}
72830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
73830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.comint SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
740b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    SkBitmap bitmap;
759ebcac54635cde63110d73ad7c43d70772e7872freed@google.com    bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
760b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com
770b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    SkCanvas canvas(bitmap);
7894acc70312d8fe6605dea99f27f62b180bf22284robertphillips@google.com    canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
79830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    applyUserTransform(&canvas);
800b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com
810b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    int layer = 0;
82751961d4711184f1c9b6f29811ae1e7b4b3ce37cchudy@google.com    SkColor prev = bitmap.getColor(0,0);
830b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    for (int i = 0; i < index; i++) {
8467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        if (fCommandVector[i]->isVisible()) {
8567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            fCommandVector[i]->execute(&canvas);
860b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        }
870b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        if (prev != bitmap.getColor(0,0)) {
880b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            layer = i;
890b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        }
900b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        prev = bitmap.getColor(0,0);
910b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    }
920b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com    return layer;
930b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com}
940b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com
95cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.orgclass OverdrawXfermode : public SkXfermode {
96cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.orgpublic:
97cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org    virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const SK_OVERRIDE {
98cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        // This table encodes the color progression of the overdraw visualization
99cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        static const SkPMColor gTable[] = {
100cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0x00, 0x00, 0x00, 0x00),
101cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 128, 158, 255),
102cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 170, 185, 212),
103cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 213, 195, 170),
104cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255, 192, 127),
105cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255, 185, 85),
106cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255, 165, 42),
107cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255, 135, 0),
108cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255,  95, 0),
109cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255,  50, 0),
110cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            SkPackARGB32(0xFF, 255,  0, 0)
111cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        };
11260bd7519a9db4ddddd95e490f93165e5676f90f5skia.committer@gmail.com
113cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
114cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            if (gTable[i] == dst) {
115cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org                return gTable[i+1];
116cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org            }
117f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        }
11860bd7519a9db4ddddd95e490f93165e5676f90f5skia.committer@gmail.com
119cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        return gTable[SK_ARRAY_COUNT(gTable)-1];
120f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    }
121f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
122cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org    virtual Factory getFactory() const SK_OVERRIDE { return NULL; }
123cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING
124cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org    virtual void toString(SkString* str) const { str->set("OverdrawXfermode"); }
125cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org#endif
126cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org};
127f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
12832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comclass SkOverdrawFilter : public SkDrawFilter {
129f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.compublic:
13032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    SkOverdrawFilter() {
131cc277b729b16c0d8d042f9ae1db6563fb4538d88commit-bot@chromium.org        fXferMode = SkNEW(OverdrawXfermode);
132f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    }
133f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
13432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    virtual ~SkOverdrawFilter() {
135f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        delete fXferMode;
136f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    }
137f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
138f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
139f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        p->setXfermode(fXferMode);
140f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        return true;
141f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    }
142f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
143f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comprotected:
144f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    SkXfermode* fXferMode;
145f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
146f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comprivate:
147f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    typedef SkDrawFilter INHERITED;
148f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com};
149f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
150f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.com// SkTexOverrideFilter modifies every paint to use the specified
15132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com// texture filtering mode
15232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comclass SkTexOverrideFilter : public SkDrawFilter {
15332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.compublic:
15432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
15532bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    }
15632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
15732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    void setFilterLevel(SkPaint::FilterLevel filterLevel) {
15832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        fFilterLevel = filterLevel;
15932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    }
16032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
16132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
16232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        p->setFilterLevel(fFilterLevel);
16332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        return true;
16432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    }
16532bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
16632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comprotected:
16732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    SkPaint::FilterLevel fFilterLevel;
16832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
16932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comprivate:
17032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    typedef SkDrawFilter INHERITED;
17132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com};
17232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
173768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.orgclass SkDebugClipVisitor : public SkCanvas::ClipVisitor {
174768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.orgpublic:
175768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    SkDebugClipVisitor(SkCanvas* canvas) : fCanvas(canvas) {}
176768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
177768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    virtual void clipRect(const SkRect& r, SkRegion::Op, bool doAA) SK_OVERRIDE {
178768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkPaint p;
179768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setColor(SK_ColorRED);
180768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setStyle(SkPaint::kStroke_Style);
181768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setAntiAlias(doAA);
182768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        fCanvas->drawRect(r, p);
183768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
184768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    virtual void clipRRect(const SkRRect& rr, SkRegion::Op, bool doAA) SK_OVERRIDE {
185768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkPaint p;
186768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setColor(SK_ColorGREEN);
187768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setStyle(SkPaint::kStroke_Style);
188768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setAntiAlias(doAA);
189768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        fCanvas->drawRRect(rr, p);
190768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
191768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    virtual void clipPath(const SkPath& path, SkRegion::Op, bool doAA) SK_OVERRIDE {
192768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkPaint p;
193768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setColor(SK_ColorBLUE);
194768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setStyle(SkPaint::kStroke_Style);
195768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        p.setAntiAlias(doAA);
196768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        fCanvas->drawPath(path, p);
197768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
198768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
199768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.orgprotected:
200768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    SkCanvas* fCanvas;
201768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
202768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.orgprivate:
203768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    typedef SkCanvas::ClipVisitor INHERITED;
204768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org};
205768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
206768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org// set up the saveLayer commands so that the active ones
207768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org// return true in their 'active' method
2081643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.orgvoid SkDebugCanvas::markActiveCommands(int index) {
2091643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org    fActiveLayers.rewind();
2101643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org    fActiveCulls.rewind();
211768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
212768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    for (int i = 0; i < fCommandVector.count(); ++i) {
213768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        fCommandVector[i]->setActive(false);
214768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
215768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
216768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    for (int i = 0; i < index; ++i) {
217768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkDrawCommand::Action result = fCommandVector[i]->action();
2181643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        if (SkDrawCommand::kPushLayer_Action == result) {
2191643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org            fActiveLayers.push(fCommandVector[i]);
2201643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        } else if (SkDrawCommand::kPopLayer_Action == result) {
2211643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org            fActiveLayers.pop();
2221643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        } else if (SkDrawCommand::kPushCull_Action == result) {
2231643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org            fActiveCulls.push(fCommandVector[i]);
2241643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        } else if (SkDrawCommand::kPopCull_Action == result) {
2251643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org            fActiveCulls.pop();
226768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        }
227768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
228768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
2291643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org    for (int i = 0; i < fActiveLayers.count(); ++i) {
2301643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        fActiveLayers[i]->setActive(true);
2311643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org    }
2321643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org
2331643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org    for (int i = 0; i < fActiveCulls.count(); ++i) {
2341643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        fActiveCulls[i]->setActive(true);
235768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
236768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org}
237768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
2380b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.comvoid SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
23967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(!fCommandVector.isEmpty());
24067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(index < fCommandVector.count());
2411735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org    int i = 0;
242830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
2432a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    bool pathOpsMode = getAllowSimplifyClip();
2442a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    canvas->setAllowSimplifyClip(pathOpsMode);
245830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    // This only works assuming the canvas and device are the same ones that
246830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    // were previously drawn into because they need to preserve all saves
247830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    // and restores.
2481735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org    // The visibility filter also requires a full re-draw - otherwise we can
2491735d6696e9a941925e6ca352849307d698ef139commit-bot@chromium.org    // end up drawing the filter repeatedly.
2502a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    if (fIndex < index && !fFilter && !fMegaVizMode && !pathOpsMode) {
251830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com        i = fIndex + 1;
252830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    } else {
2530699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com        for (int j = 0; j < fOutstandingSaveCount; j++) {
2540699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com            canvas->restore();
2550699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com        }
256dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com        canvas->clear(SK_ColorTRANSPARENT);
257830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com        canvas->resetMatrix();
25804ba448579b976369075c675d847ef0f779d40f4skia.committer@gmail.com        SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
25994acc70312d8fe6605dea99f27f62b180bf22284robertphillips@google.com                                     SkIntToScalar(fHeight));
2604c7962e0a866b8416fa7046791c129eb5430b677chudy@google.com        canvas->clipRect(rect, SkRegion::kReplace_Op );
261830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com        applyUserTransform(canvas);
2620699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com        fOutstandingSaveCount = 0;
263a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    }
264f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
265a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    // The setting of the draw filter has to go here (rather than in
266a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    // SkRasterWidget) due to the canvas restores this class performs.
267a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    // Since the draw filter is stored in the layer stack if we
268a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    // call setDrawFilter on anything but the root layer odd things happen.
269a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    if (fOverdrawViz) {
270a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org        if (NULL == fOverdrawFilter) {
27132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com            fOverdrawFilter = new SkOverdrawFilter;
272a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org        }
273f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
274a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org        if (fOverdrawFilter != canvas->getDrawFilter()) {
275a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org            canvas->setDrawFilter(fOverdrawFilter);
276f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com        }
27732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    } else if (fOverrideTexFiltering) {
27832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        if (NULL == fTexOverrideFilter) {
27932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com            fTexOverrideFilter = new SkTexOverrideFilter;
28032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        }
28132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
28232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        if (fTexOverrideFilter != canvas->getDrawFilter()) {
28332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com            canvas->setDrawFilter(fTexOverrideFilter);
28432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        }
285a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org    } else {
286a27622c18de99fdb2c68e23b01006d3aa2bd1699commit-bot@chromium.org        canvas->setDrawFilter(NULL);
287830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    }
288830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
289768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    if (fMegaVizMode) {
2901643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org        this->markActiveCommands(index);
291768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
292768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
293830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    for (; i <= index; i++) {
2940b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        if (i == index && fFilter) {
2950b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            SkPaint p;
2960b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            p.setColor(0xAAFFFFFF);
2970b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            canvas->save();
2980b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            canvas->resetMatrix();
2990b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            SkRect mask;
3000b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            mask.set(SkIntToScalar(0), SkIntToScalar(0),
3010b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com                    SkIntToScalar(fWidth), SkIntToScalar(fHeight));
3020b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            canvas->clipRect(mask, SkRegion::kReplace_Op, false);
3030b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
3040b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com                    SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
3050b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com            canvas->restore();
3060b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com        }
307902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
30867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        if (fCommandVector[i]->isVisible()) {
309768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org            if (fMegaVizMode && fCommandVector[i]->active()) {
3101643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org                // "active" commands execute their visualization behaviors:
3111643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org                //     All active saveLayers get replaced with saves so all draws go to the
3121643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org                //     visible canvas.
3131643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org                //     All active culls draw their cull box
3141643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org                fCommandVector[i]->vizExecute(canvas);
315768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org            } else {
316768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org                fCommandVector[i]->execute(canvas);
317768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org            }
3181643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org
3191643b2c9bc5adb4324bb459bb7811f58bc7c2d62commit-bot@chromium.org            fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
320902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        }
321902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
322768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
323768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    if (fMegaVizMode) {
324768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight));
325768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        r.outset(SK_Scalar1, SK_Scalar1);
326768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
327768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        canvas->save();
328768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        // nuke the CTM
329768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        canvas->setMatrix(SkMatrix::I());
330768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        // turn off clipping
331768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        canvas->clipRect(r, SkRegion::kReplace_Op);
332768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
333768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        // visualize existing clips
334768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        SkDebugClipVisitor visitor(canvas);
335768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
336768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        canvas->replayClips(&visitor);
337768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
338768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org        canvas->restore();
339768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    }
3402a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    if (pathOpsMode) {
3412a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        this->resetClipStackData();
3422a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        const SkClipStack* clipStack = canvas->getClipStack();
3432a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        SkClipStack::Iter iter(*clipStack, SkClipStack::Iter::kBottom_IterStart);
3442a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        const SkClipStack::Element* element;
3452a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        SkPath devPath;
3462a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        while ((element = iter.next())) {
3472a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            SkClipStack::Element::Type type = element->getType();
3482a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            SkPath operand;
3492a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            if (type != SkClipStack::Element::kEmpty_Type) {
3502a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org               element->asPath(&operand);
3512a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            }
3522a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            SkRegion::Op elementOp = element->getOp();
3532a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            this->addClipStackData(devPath, operand, elementOp);
3542a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            if (elementOp == SkRegion::kReplace_Op) {
3552a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                devPath = operand;
3562a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            } else {
3572a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                Op(devPath, operand, (SkPathOp) elementOp, &devPath);
3582a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            }
3592a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        }
3602a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        this->lastClipStackData(devPath);
3612a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
362a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com    fMatrix = canvas->getTotalMatrix();
3635c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org    if (!canvas->getClipDeviceBounds(&fClip)) {
3645c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org        fClip.setEmpty();
3655c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org    }
366830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    fIndex = index;
367902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
368902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
36950c84da68b17647371a81593402e897d639989e4robertphillips@google.comvoid SkDebugCanvas::deleteDrawCommandAt(int index) {
37050c84da68b17647371a81593402e897d639989e4robertphillips@google.com    SkASSERT(index < fCommandVector.count());
37150c84da68b17647371a81593402e897d639989e4robertphillips@google.com    delete fCommandVector[index];
37250c84da68b17647371a81593402e897d639989e4robertphillips@google.com    fCommandVector.remove(index);
37350c84da68b17647371a81593402e897d639989e4robertphillips@google.com}
37450c84da68b17647371a81593402e897d639989e4robertphillips@google.com
375902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comSkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
37667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(index < fCommandVector.count());
37767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    return fCommandVector[index];
378902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
379902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
38050c84da68b17647371a81593402e897d639989e4robertphillips@google.comvoid SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
38150c84da68b17647371a81593402e897d639989e4robertphillips@google.com    SkASSERT(index < fCommandVector.count());
38250c84da68b17647371a81593402e897d639989e4robertphillips@google.com    delete fCommandVector[index];
38350c84da68b17647371a81593402e897d639989e4robertphillips@google.com    fCommandVector[index] = command;
38450c84da68b17647371a81593402e897d639989e4robertphillips@google.com}
38550c84da68b17647371a81593402e897d639989e4robertphillips@google.com
38697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
38767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(index < fCommandVector.count());
38867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    return fCommandVector[index]->Info();
3897e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com}
390902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
3917e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.combool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
39267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(index < fCommandVector.count());
39367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    return fCommandVector[index]->isVisible();
394902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
395902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
3968a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comconst SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
39767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    return fCommandVector;
398902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
399902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
400febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.comSkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
401febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com    return fCommandVector;
402febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com}
403febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com
404902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// TODO(chudy): Free command string memory.
4058a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comSkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
40667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
40767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    if (!fCommandVector.isEmpty()) {
40867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        for (int i = 0; i < fCommandVector.count(); i ++) {
40967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            commandString->push_back() = fCommandVector[i]->toString();
410902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        }
411902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
412902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return commandString;
413902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
414902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
41557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgSkTDArray<size_t>* SkDebugCanvas::getDrawCommandOffsets() const {
41657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    SkTDArray<size_t>* commandOffsets = new SkTDArray<size_t>;
41757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    if (!fCommandVector.isEmpty()) {
41857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        for (int i = 0; i < fCommandVector.count(); i ++) {
41957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            *commandOffsets->push() = fCommandVector[i]->offset();
42057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        }
42157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    }
42257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    return commandOffsets;
42357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org}
42457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org
425f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.comvoid SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
42632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    if (NULL == fTexOverrideFilter) {
42732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com        fTexOverrideFilter = new SkTexOverrideFilter;
42832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    }
42932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
430f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.com    fOverrideTexFiltering = overrideTexFiltering;
43132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    fTexOverrideFilter->setFilterLevel(level);
43232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com}
43332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
434902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::clear(SkColor color) {
43557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkClearCommand(color));
436902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
437902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4388f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
4398f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle == edgeStyle));
440902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
441902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4428f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
4438f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle == edgeStyle));
444902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
445902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4468f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDebugCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
4478f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->addDrawCommand(new SkClipRRectCommand(rrect, op, kSoft_ClipEdgeStyle == edgeStyle));
44867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com}
44967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
4508f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDebugCanvas::onClipRegion(const SkRegion& region, SkRegion::Op op) {
4518f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->addDrawCommand(new SkClipRegionCommand(region, op));
452902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
453902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
45444c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkDebugCanvas::didConcat(const SkMatrix& matrix) {
455d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    switch (matrix.getType()) {
456d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org        case SkMatrix::kTranslate_Mask:
457d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            this->addDrawCommand(new SkTranslateCommand(matrix.getTranslateX(),
458d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org                                                        matrix.getTranslateY()));
459d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            break;
460d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org        case SkMatrix::kScale_Mask:
461d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            this->addDrawCommand(new SkScaleCommand(matrix.getScaleX(),
462d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org                                                    matrix.getScaleY()));
463d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            break;
464d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org        default:
465d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            this->addDrawCommand(new SkConcatCommand(matrix));
466d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org            break;
467d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    }
468d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org
46944c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    this->INHERITED::didConcat(matrix);
470902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
471902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
472902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
473eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                               SkScalar top, const SkPaint* paint = NULL) {
47457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
475902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
476902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4777112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
4787475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com                                         const SkRect* src, const SkRect& dst,
479eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                         const SkPaint* paint,
480eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                         SkCanvas::DrawBitmapRectFlags flags) {
48157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
482902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
483902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
484902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
485eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                     const SkMatrix& matrix, const SkPaint* paint) {
48657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
487902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
488902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
489902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
490902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
49157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
492902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
493902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
494902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawData(const void* data, size_t length) {
49557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawDataCommand(data, length));
496902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
497902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4980a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkDebugCanvas::beginCommentGroup(const char* description) {
49957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkBeginCommentGroupCommand(description));
5000a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com}
5010a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
5020a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkDebugCanvas::addComment(const char* kywd, const char* value) {
50357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkCommentCommand(kywd, value));
5040a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com}
5050a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
5060a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkDebugCanvas::endCommentGroup() {
50757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkEndCommentGroupCommand());
5080a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com}
5090a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
51067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.comvoid SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
51157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawOvalCommand(oval, paint));
51267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com}
51367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
514902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawPaint(const SkPaint& paint) {
51557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawPaintCommand(paint));
516902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
517902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5187ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
51957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawPathCommand(path, paint));
520902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
521902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5229b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillipsvoid SkDebugCanvas::onDrawPicture(const SkPicture* picture) {
52357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawPictureCommand(picture));
524902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
525902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
526902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawPoints(PointMode mode, size_t count,
527a3a09ab1d5e8ecc6f16b14610f9dd74be569cc29robertphillips@google.com                               const SkPoint pts[], const SkPaint& paint) {
52857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
529902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
530902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
531e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDebugCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
532e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                  const SkPaint& paint) {
53357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
534902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
535902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
536e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDebugCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
537e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                   SkScalar constY, const SkPaint& paint) {
53857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(
5397a11591e5e09493f1589c93d53fd1fe10086920acommit-bot@chromium.org        new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
540902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
541902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5427ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
543902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // NOTE(chudy): Messing up when renamed to DrawRect... Why?
5447a11591e5e09493f1589c93d53fd1fe10086920acommit-bot@chromium.org    addDrawCommand(new SkDrawRectCommand(rect, paint));
545902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
546902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
54767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.comvoid SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
54857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawRRectCommand(rrect, paint));
54967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com}
55067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
551ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgvoid SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
552ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org                                 const SkPaint& paint) {
5533d305207bd40f4e5ae10010492420a2fdfa1153ccommit-bot@chromium.org    this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint));
554ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org}
555ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org
556902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
5576ede1fe62bbb4e98f4eff4e4afb1d20e1e070423robertphillips@google.com                               const SkPaint* paint = NULL) {
55857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
559902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
560902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
561e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDebugCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
562e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                               const SkPaint& paint) {
56357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
564902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
565902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
566e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDebugCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
567e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                     const SkMatrix* matrix, const SkPaint& paint) {
56857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(
5697a11591e5e09493f1589c93d53fd1fe10086920acommit-bot@chromium.org        new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
570902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
571902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
572902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
573902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
574902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        SkXfermode*, const uint16_t indices[], int indexCount,
575902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        const SkPaint& paint) {
57657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
57757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                         texs, colors, NULL, indices, indexCount, paint));
578902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
579902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
580210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.orgvoid SkDebugCanvas::onPushCull(const SkRect& cullRect) {
581210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    this->addDrawCommand(new SkPushCullCommand(cullRect));
582210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org}
583210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
584210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.orgvoid SkDebugCanvas::onPopCull() {
585210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    this->addDrawCommand(new SkPopCullCommand());
586210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org}
587210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
588e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDebugCanvas::willRestore() {
589e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->addDrawCommand(new SkRestoreCommand());
590e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willRestore();
591902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
592902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
593e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDebugCanvas::willSave(SaveFlags flags) {
594e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->addDrawCommand(new SkSaveCommand(flags));
595e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willSave(flags);
596902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
597902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
598e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkDebugCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
599e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org                                                         SaveFlags flags) {
600e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
601e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willSaveLayer(bounds, paint, flags);
602e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    // No need for a full layer.
603e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    return kNoLayer_SaveLayerStrategy;
604902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
605902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
60644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkDebugCanvas::didSetMatrix(const SkMatrix& matrix) {
60757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->addDrawCommand(new SkSetMatrixCommand(matrix));
60844c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    this->INHERITED::didSetMatrix(matrix);
609902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
610902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
611902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebugCanvas::toggleCommand(int index, bool toggle) {
61267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkASSERT(index < fCommandVector.count());
61367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    fCommandVector[index]->setVisible(toggle);
614902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
6152a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6162a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgstatic const char* gFillTypeStrs[] = {
6172a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kWinding_FillType",
6182a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kEvenOdd_FillType",
6192a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kInverseWinding_FillType",
6202a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kInverseEvenOdd_FillType"
6212a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org};
6222a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6232a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgstatic const char* gOpStrs[] = {
6242a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kDifference_PathOp",
6252a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kIntersect_PathOp",
6262a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kUnion_PathOp",
6272a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kXor_PathOp",
6282a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    "kReverseDifference_PathOp",
6292a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org};
6302a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6312a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgstatic const char kHTML4SpaceIndent[] = "&nbsp;&nbsp;&nbsp;&nbsp;";
6322a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6332a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::outputScalar(SkScalar num) {
6342a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    if (num == (int) num) {
6352a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("%d", (int) num);
6362a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    } else {
6372a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        SkString str;
6382a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        str.printf("%1.9g", num);
6392a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        int width = (int) str.size();
6402a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        const char* cStr = str.c_str();
6412a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        while (cStr[width - 1] == '0') {
6422a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            --width;
6432a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        }
6442a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        str.resize(width);
6452a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("%sf", str.c_str());
6462a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
6472a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
6482a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6492a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::outputPointsCommon(const SkPoint* pts, int count) {
6502a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    for (int index = 0; index < count; ++index) {
6512a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        this->outputScalar(pts[index].fX);
6522a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf(", ");
6532a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        this->outputScalar(pts[index].fY);
6542a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        if (index + 1 < count) {
6552a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            fClipStackData.appendf(", ");
6562a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        }
6572a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
6582a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
6592a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6602a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::outputPoints(const SkPoint* pts, int count) {
6612a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    this->outputPointsCommon(pts, count);
6622a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fClipStackData.appendf(");<br>");
6632a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
6642a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6652a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::outputConicPoints(const SkPoint* pts, SkScalar weight) {
6662a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    this->outputPointsCommon(pts, 2);
6672a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fClipStackData.appendf(", ");
6682a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    this->outputScalar(weight);
6692a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fClipStackData.appendf(");<br>");
6702a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
6712a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
6722a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::addPathData(const SkPath& path, const char* pathName) {
6732a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    SkPath::RawIter iter(path);
6742a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    SkPath::FillType fillType = path.getFillType();
6752a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fClipStackData.appendf("%sSkPath %s;<br>", kHTML4SpaceIndent, pathName);
6762a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fClipStackData.appendf("%s%s.setFillType(SkPath::%s);<br>", kHTML4SpaceIndent, pathName,
6772a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            gFillTypeStrs[fillType]);
6782a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    iter.setPath(path);
6792a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    uint8_t verb;
6802a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    SkPoint pts[4];
6812a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
6822a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        switch (verb) {
6832a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kMove_Verb:
6842a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.moveTo(", kHTML4SpaceIndent, pathName);
6852a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                this->outputPoints(&pts[0], 1);
6862a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                continue;
6872a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kLine_Verb:
6882a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.lineTo(", kHTML4SpaceIndent, pathName);
6892a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                this->outputPoints(&pts[1], 1);
6902a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                break;
6912a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kQuad_Verb:
6922a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.quadTo(", kHTML4SpaceIndent, pathName);
6932a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                this->outputPoints(&pts[1], 2);
6942a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                break;
6952a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kConic_Verb:
6962a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.conicTo(", kHTML4SpaceIndent, pathName);
6972a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                this->outputConicPoints(&pts[1], iter.conicWeight());
6982a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                break;
6992a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kCubic_Verb:
7002a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.cubicTo(", kHTML4SpaceIndent, pathName);
7012a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                this->outputPoints(&pts[1], 3);
7022a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                break;
7032a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            case SkPath::kClose_Verb:
7042a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                fClipStackData.appendf("%s%s.close();<br>", kHTML4SpaceIndent, pathName);
7052a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                break;
7062a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            default:
7072a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                SkDEBUGFAIL("bad verb");
7082a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                return;
7092a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        }
7102a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
7112a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
7122a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
7132a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebugCanvas::addClipStackData(const SkPath& devPath, const SkPath& operand,
7142a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org                                     SkRegion::Op elementOp) {
7152a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    if (elementOp == SkRegion::kReplace_Op) {
7162a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        if (!lastClipStackData(devPath)) {
7172a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            fSaveDevPath = operand;
7182a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        }
7192a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fCalledAddStackData = false;
7202a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    } else {
7212a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("<br>static void test(skiatest::Reporter* reporter,"
7222a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            " const char* filename) {<br>");
7232a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        addPathData(fCalledAddStackData ? devPath : fSaveDevPath, "path");
7242a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        addPathData(operand, "pathB");
7252a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("%stestPathOp(reporter, path, pathB, %s, filename);<br>",
7262a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            kHTML4SpaceIndent, gOpStrs[elementOp]);
7272a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("}<br>");
7282a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fCalledAddStackData = true;
7292a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
7302a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
7312a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
7322a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgbool SkDebugCanvas::lastClipStackData(const SkPath& devPath) {
7332a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    if (fCalledAddStackData) {
7342a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        fClipStackData.appendf("<br>");
7352a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        addPathData(devPath, "pathOut");
7362a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org        return true;
7372a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    }
7382a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    return false;
7392a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
740