/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "VisualDebugModule.h" #include "SkCanvas.h" VisualDebugModule::VisualDebugModule(VisualBench* owner) : fState(kInit_State) , fIndex(0) , fOwner(owner) { // VisualDebugModule only really makes sense for SKPs fBenchmarkStream.reset(new VisualBenchmarkStream(owner->getSurfaceProps(), true)); } bool VisualDebugModule::advanceIfNecessary(SkCanvas* canvas) { Benchmark* benchmark = fBenchmarkStream->current(); switch (fState) { case kInit_State: { // setup new benchmark benchmark->delayedSetup(); fOwner->clear(canvas, SK_ColorWHITE, 3); benchmark->preTimingHooks(canvas); // reset debug canvas SkIPoint size = benchmark->getSize(); fDebugCanvas.reset(new SkDebugCanvas(size.fX, size.fY)); // pour benchmark into canvas benchmark->draw(1, fDebugCanvas); fIndex = fDebugCanvas->getSize() - 1; fState = kPlay_State; break; } case kPlay_State: break; case kNext_State: // cleanup after the last SKP benchmark->postTimingHooks(canvas); fOwner->reset(); if (!fBenchmarkStream->next()) { SkDebugf("Exiting VisualBench successfully\n"); fOwner->closeWindow(); return false; } fState = kInit_State; break; } return true; } void VisualDebugModule::draw(SkCanvas* canvas) { if (!fBenchmarkStream->current() || !this->advanceIfNecessary(canvas)) { return; } fDebugCanvas->drawTo(canvas, fIndex); canvas->flush(); fOwner->present(); } bool VisualDebugModule::onHandleChar(SkUnichar c) { switch (c) { case ' ': fState = kNext_State; break; case 'a': fIndex = (fIndex + 1) % (fDebugCanvas->getSize() - 1); break; case 's': fIndex = fIndex <= 0 ? fDebugCanvas->getSize() - 1 : fIndex - 1; break; default: break; } return true; }