96fcdcc219
DOCS_PREVIEW= https://skia.org/?cl=1316233002 Review URL: https://codereview.chromium.org/1316233002
74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
|
|
/*
|
|
* Copyright 2012 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "SkRasterWidget.h"
|
|
#include "SkDebugger.h"
|
|
#include <QtGui>
|
|
|
|
SkRasterWidget::SkRasterWidget(SkDebugger *debugger)
|
|
: QWidget()
|
|
, fDebugger(debugger)
|
|
, fNeedImageUpdate(false) {
|
|
this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
|
|
}
|
|
|
|
void SkRasterWidget::resizeEvent(QResizeEvent* event) {
|
|
this->QWidget::resizeEvent(event);
|
|
|
|
QRect r = this->contentsRect();
|
|
if (r.width() == 0 || r.height() == 0) {
|
|
fSurface.reset(nullptr);
|
|
} else {
|
|
SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
|
|
fSurface.reset(SkSurface::NewRaster(info));
|
|
}
|
|
this->updateImage();
|
|
}
|
|
|
|
void SkRasterWidget::paintEvent(QPaintEvent* event) {
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
QStyleOption opt;
|
|
opt.init(this);
|
|
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
|
|
|
|
if (!fSurface) {
|
|
return;
|
|
}
|
|
|
|
if (fNeedImageUpdate) {
|
|
fDebugger->draw(fSurface->getCanvas());
|
|
fSurface->getCanvas()->flush();
|
|
fNeedImageUpdate = false;
|
|
emit drawComplete();
|
|
}
|
|
|
|
SkImageInfo info;
|
|
size_t rowBytes;
|
|
if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) {
|
|
QImage image(reinterpret_cast<const uchar*>(pixels),
|
|
info.width(),
|
|
info.height(),
|
|
rowBytes,
|
|
QImage::Format_ARGB32_Premultiplied);
|
|
#if SK_R32_SHIFT == 0
|
|
painter.drawImage(this->contentsRect(), image.rgbSwapped());
|
|
#else
|
|
painter.drawImage(this->contentsRect(), image);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void SkRasterWidget::updateImage() {
|
|
if (!fSurface) {
|
|
return;
|
|
}
|
|
fNeedImageUpdate = true;
|
|
this->update();
|
|
}
|