/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include "SkDebugger.h" #include "SkDrawCommandGeometryWidget.h" SkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger) : QFrame() , fDebugger(debugger) , fCommandIndex(-1) { this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}"); } void SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) { this->QFrame::resizeEvent(event); QRect r = this->contentsRect(); int dim = std::min(r.width(), r.height()); if (dim == 0) { fSurface.reset(NULL); } else { SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim); fSurface.reset(SkSurface::NewRaster(info)); this->updateImage(); } } void SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) { this->QFrame::paintEvent(event); if (!fSurface) { return; } QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); SkImageInfo info; size_t rowBytes; if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) { SkASSERT(info.width() > 0); SkASSERT(info.height() > 0); QRectF resultRect; if (this->width() < this->height()) { float ratio = this->width() / info.width(); resultRect = QRectF(0, 0, this->width(), ratio * info.height()); } else { float ratio = this->height() / info.height(); resultRect = QRectF(0, 0, ratio * info.width(), this->height()); } resultRect.moveCenter(this->contentsRect().center()); QImage image(reinterpret_cast(pixels), info.width(), info.height(), rowBytes, QImage::Format_ARGB32_Premultiplied); painter.drawImage(resultRect, image); } } void SkDrawCommandGeometryWidget::setDrawCommandIndex(int commandIndex) { fCommandIndex = commandIndex; this->updateImage(); } void SkDrawCommandGeometryWidget::updateImage() { if (!fSurface) { return; } bool didRender = false; const SkTDArray& commands = fDebugger->getDrawCommands(); if (0 != commands.count() && fCommandIndex >= 0) { SkASSERT(commands.count() > fCommandIndex); SkDrawCommand* command = commands[fCommandIndex]; didRender = command->render(fSurface->getCanvas()); } if (!didRender) { fSurface->getCanvas()->clear(SK_ColorTRANSPARENT); } fSurface->getCanvas()->flush(); this->update(); }