1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc. 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include <QtGui> 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDebugger.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDrawCommandGeometryWidget.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger) 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : QFrame() 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDebugger(debugger) 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fCommandIndex(-1) { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}"); 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) { 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->QFrame::resizeEvent(event); 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot QRect r = this->contentsRect(); 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int dim = std::min(r.width(), r.height()); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (dim == 0) { 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fSurface = nullptr; 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim); 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fSurface = SkSurface::MakeRaster(info); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->updateImage(); 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->QFrame::paintEvent(event); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fSurface) { 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot QPainter painter(this); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot painter.setRenderHint(QPainter::Antialiasing); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPixmap pixmap; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fSurface->peekPixels(&pixmap)) { 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(pixmap.width() > 0); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(pixmap.height() > 0); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot QRectF resultRect; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (this->width() < this->height()) { 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float ratio = this->width() / pixmap.width(); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot resultRect = QRectF(0, 0, this->width(), ratio * pixmap.height()); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float ratio = this->height() / pixmap.height(); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot resultRect = QRectF(0, 0, ratio * pixmap.width(), this->height()); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot resultRect.moveCenter(this->contentsRect().center()); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot QImage image(reinterpret_cast<const uchar*>(pixmap.addr()), 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pixmap.width(), 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pixmap.height(), 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pixmap.rowBytes(), 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot QImage::Format_ARGB32_Premultiplied); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot painter.drawImage(resultRect, image); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::setDrawCommandIndex(int commandIndex) { 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCommandIndex = commandIndex; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->updateImage(); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::updateImage() { 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fSurface) { 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool didRender = false; 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands(); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (0 != commands.count() && fCommandIndex >= 0) { 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(commands.count() > fCommandIndex); 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDrawCommand* command = commands[fCommandIndex]; 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot didRender = command->render(fSurface->getCanvas()); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!didRender) { 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fSurface->getCanvas()->clear(SK_ColorTRANSPARENT); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fSurface->getCanvas()->flush(); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->update(); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 95