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[] = " "; 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