163a470227beed0de553d769724e0108808391e42kkinnunen 263a470227beed0de553d769724e0108808391e42kkinnunen/* 363a470227beed0de553d769724e0108808391e42kkinnunen * Copyright 2014 Google Inc. 463a470227beed0de553d769724e0108808391e42kkinnunen * 563a470227beed0de553d769724e0108808391e42kkinnunen * Use of this source code is governed by a BSD-style license that can be 663a470227beed0de553d769724e0108808391e42kkinnunen * found in the LICENSE file. 763a470227beed0de553d769724e0108808391e42kkinnunen */ 863a470227beed0de553d769724e0108808391e42kkinnunen 963a470227beed0de553d769724e0108808391e42kkinnunen#include <QtGui> 1063a470227beed0de553d769724e0108808391e42kkinnunen 1163a470227beed0de553d769724e0108808391e42kkinnunen#include "SkDebugger.h" 1263a470227beed0de553d769724e0108808391e42kkinnunen#include "SkDrawCommandGeometryWidget.h" 1363a470227beed0de553d769724e0108808391e42kkinnunen 1463a470227beed0de553d769724e0108808391e42kkinnunenSkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger) 1563a470227beed0de553d769724e0108808391e42kkinnunen : QFrame() 160cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen , fDebugger(debugger) 170cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen , fCommandIndex(-1) { 1863a470227beed0de553d769724e0108808391e42kkinnunen this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}"); 1963a470227beed0de553d769724e0108808391e42kkinnunen} 2063a470227beed0de553d769724e0108808391e42kkinnunen 2163a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) { 2263a470227beed0de553d769724e0108808391e42kkinnunen this->QFrame::resizeEvent(event); 2363a470227beed0de553d769724e0108808391e42kkinnunen QRect r = this->contentsRect(); 2463a470227beed0de553d769724e0108808391e42kkinnunen int dim = std::min(r.width(), r.height()); 2563a470227beed0de553d769724e0108808391e42kkinnunen if (dim == 0) { 2663a470227beed0de553d769724e0108808391e42kkinnunen fSurface.reset(NULL); 2763a470227beed0de553d769724e0108808391e42kkinnunen } else { 2863a470227beed0de553d769724e0108808391e42kkinnunen SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim); 2963a470227beed0de553d769724e0108808391e42kkinnunen fSurface.reset(SkSurface::NewRaster(info)); 3063a470227beed0de553d769724e0108808391e42kkinnunen this->updateImage(); 3163a470227beed0de553d769724e0108808391e42kkinnunen } 3263a470227beed0de553d769724e0108808391e42kkinnunen} 3363a470227beed0de553d769724e0108808391e42kkinnunen 3463a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) { 3563a470227beed0de553d769724e0108808391e42kkinnunen this->QFrame::paintEvent(event); 3663a470227beed0de553d769724e0108808391e42kkinnunen 3763a470227beed0de553d769724e0108808391e42kkinnunen if (!fSurface) { 3863a470227beed0de553d769724e0108808391e42kkinnunen return; 3963a470227beed0de553d769724e0108808391e42kkinnunen } 4063a470227beed0de553d769724e0108808391e42kkinnunen 4163a470227beed0de553d769724e0108808391e42kkinnunen QPainter painter(this); 4263a470227beed0de553d769724e0108808391e42kkinnunen painter.setRenderHint(QPainter::Antialiasing); 4363a470227beed0de553d769724e0108808391e42kkinnunen 4463a470227beed0de553d769724e0108808391e42kkinnunen SkImageInfo info; 45cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen size_t rowBytes; 46cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) { 4763a470227beed0de553d769724e0108808391e42kkinnunen SkASSERT(info.width() > 0); 4863a470227beed0de553d769724e0108808391e42kkinnunen SkASSERT(info.height() > 0); 4963a470227beed0de553d769724e0108808391e42kkinnunen 5063a470227beed0de553d769724e0108808391e42kkinnunen QRectF resultRect; 5163a470227beed0de553d769724e0108808391e42kkinnunen if (this->width() < this->height()) { 5263a470227beed0de553d769724e0108808391e42kkinnunen float ratio = this->width() / info.width(); 5363a470227beed0de553d769724e0108808391e42kkinnunen resultRect = QRectF(0, 0, this->width(), ratio * info.height()); 5463a470227beed0de553d769724e0108808391e42kkinnunen } else { 5563a470227beed0de553d769724e0108808391e42kkinnunen float ratio = this->height() / info.height(); 5663a470227beed0de553d769724e0108808391e42kkinnunen resultRect = QRectF(0, 0, ratio * info.width(), this->height()); 5763a470227beed0de553d769724e0108808391e42kkinnunen } 5863a470227beed0de553d769724e0108808391e42kkinnunen 5963a470227beed0de553d769724e0108808391e42kkinnunen resultRect.moveCenter(this->contentsRect().center()); 6063a470227beed0de553d769724e0108808391e42kkinnunen 6163a470227beed0de553d769724e0108808391e42kkinnunen QImage image(reinterpret_cast<const uchar*>(pixels), 6263a470227beed0de553d769724e0108808391e42kkinnunen info.width(), 6363a470227beed0de553d769724e0108808391e42kkinnunen info.height(), 64cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen rowBytes, 6563a470227beed0de553d769724e0108808391e42kkinnunen QImage::Format_ARGB32_Premultiplied); 6663a470227beed0de553d769724e0108808391e42kkinnunen painter.drawImage(resultRect, image); 6763a470227beed0de553d769724e0108808391e42kkinnunen } 6863a470227beed0de553d769724e0108808391e42kkinnunen} 6963a470227beed0de553d769724e0108808391e42kkinnunen 700cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunenvoid SkDrawCommandGeometryWidget::setDrawCommandIndex(int commandIndex) { 710cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fCommandIndex = commandIndex; 720cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen this->updateImage(); 730cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen} 740cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen 7563a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::updateImage() { 7663a470227beed0de553d769724e0108808391e42kkinnunen if (!fSurface) { 7763a470227beed0de553d769724e0108808391e42kkinnunen return; 7863a470227beed0de553d769724e0108808391e42kkinnunen } 7963a470227beed0de553d769724e0108808391e42kkinnunen 8063a470227beed0de553d769724e0108808391e42kkinnunen bool didRender = false; 8163a470227beed0de553d769724e0108808391e42kkinnunen const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands(); 820cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen if (0 != commands.count() && fCommandIndex >= 0) { 830cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen SkASSERT(commands.count() > fCommandIndex); 840cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen SkDrawCommand* command = commands[fCommandIndex]; 8563a470227beed0de553d769724e0108808391e42kkinnunen didRender = command->render(fSurface->getCanvas()); 8663a470227beed0de553d769724e0108808391e42kkinnunen } 8763a470227beed0de553d769724e0108808391e42kkinnunen 8863a470227beed0de553d769724e0108808391e42kkinnunen if (!didRender) { 8963a470227beed0de553d769724e0108808391e42kkinnunen fSurface->getCanvas()->clear(SK_ColorTRANSPARENT); 9063a470227beed0de553d769724e0108808391e42kkinnunen } 9163a470227beed0de553d769724e0108808391e42kkinnunen 9263a470227beed0de553d769724e0108808391e42kkinnunen fSurface->getCanvas()->flush(); 930cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen this->update(); 9463a470227beed0de553d769724e0108808391e42kkinnunen} 95