63a470227b
Make draw command image widget resize. The widget was not resizing, effectively preventing the window from being resized smaller. Make the rasterized draw command image be proportional to the widget size. The draw rasterization canvas is still an equilateral rectangle with dimensions of the smaller side of the widget. Makes the widget re-rasterize the image only when the draw command changes, not for each widget paint. Renames the widget from "image widget" to "draw command geometry widget". Makes the background of the image black, similar to the raster widget background. Adds a tooltip saying "Command geometry" for the widget, so that user might understand what the contents should be. This commit is part of work that tries to make the debugger window to be a bit more resizeable, so that it would fit 1900x1200 screen. Review URL: https://codereview.chromium.org/787143004
87 lines
2.4 KiB
C++
87 lines
2.4 KiB
C++
|
|
/*
|
|
* 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 <QtGui>
|
|
|
|
#include "SkDebugger.h"
|
|
#include "SkDrawCommandGeometryWidget.h"
|
|
|
|
SkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger)
|
|
: QFrame()
|
|
, fDebugger(debugger) {
|
|
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 rowPixels;
|
|
if (const void* pixels = fSurface->peekPixels(&info, &rowPixels)) {
|
|
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<const uchar*>(pixels),
|
|
info.width(),
|
|
info.height(),
|
|
QImage::Format_ARGB32_Premultiplied);
|
|
painter.drawImage(resultRect, image);
|
|
}
|
|
}
|
|
|
|
void SkDrawCommandGeometryWidget::updateImage() {
|
|
if (!fSurface) {
|
|
return;
|
|
}
|
|
|
|
bool didRender = false;
|
|
const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands();
|
|
if (0 != commands.count()) {
|
|
SkDrawCommand* command = commands[fDebugger->index()];
|
|
didRender = command->render(fSurface->getCanvas());
|
|
}
|
|
|
|
if (!didRender) {
|
|
fSurface->getCanvas()->clear(SK_ColorTRANSPARENT);
|
|
}
|
|
|
|
fSurface->getCanvas()->flush();
|
|
update();
|
|
}
|