skia2/debugger/QT/SkDrawCommandGeometryWidget.cpp
kkinnunen cfdc0e3fee debugger: SW rasterize the picture only when it changes
Rasterize the picture only when it changes, not every time
raster widget paints itself.

Removes include SkForceLinking.h while organizing the SkDebuggerGUI.cpp
includes.

This is part of the work trying to remove bugs that come from
SkDebugCanvas stateful draw. Part of the state comes from some
optimization that this tries to reproduce in a different way.

Review URL: https://codereview.chromium.org/839743003
2015-01-13 22:49:02 -08:00

95 lines
2.7 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)
, 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<const uchar*>(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<SkDrawCommand*>& 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();
}