1
2 /*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9 #include "SkRasterWidget.h"
10 #include "SkDebugger.h"
11 #include <QtGui>
12
SkRasterWidget(SkDebugger * debugger)13 SkRasterWidget::SkRasterWidget(SkDebugger *debugger)
14 : QWidget()
15 , fDebugger(debugger)
16 , fNeedImageUpdate(false) {
17 this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
18 }
19
resizeEvent(QResizeEvent * event)20 void SkRasterWidget::resizeEvent(QResizeEvent* event) {
21 this->QWidget::resizeEvent(event);
22
23 QRect r = this->contentsRect();
24 if (r.width() == 0 || r.height() == 0) {
25 fSurface = nullptr;
26 } else {
27 SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
28 fSurface = SkSurface::MakeRaster(info);
29 }
30 this->updateImage();
31 }
32
paintEvent(QPaintEvent * event)33 void SkRasterWidget::paintEvent(QPaintEvent* event) {
34 QPainter painter(this);
35 painter.setRenderHint(QPainter::Antialiasing);
36 QStyleOption opt;
37 opt.init(this);
38 style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
39
40 if (!fSurface) {
41 return;
42 }
43
44 if (fNeedImageUpdate) {
45 fDebugger->draw(fSurface->getCanvas());
46 fSurface->getCanvas()->flush();
47 fNeedImageUpdate = false;
48 Q_EMIT drawComplete();
49 }
50
51 SkPixmap pixmap;
52
53 if (fSurface->peekPixels(&pixmap)) {
54 QImage image(reinterpret_cast<const uchar*>(pixmap.addr()),
55 pixmap.width(),
56 pixmap.height(),
57 pixmap.rowBytes(),
58 QImage::Format_ARGB32_Premultiplied);
59 #if SK_R32_SHIFT == 0
60 painter.drawImage(this->contentsRect(), image.rgbSwapped());
61 #else
62 painter.drawImage(this->contentsRect(), image);
63 #endif
64 }
65 }
66
updateImage()67 void SkRasterWidget::updateImage() {
68 if (!fSurface) {
69 return;
70 }
71 fNeedImageUpdate = true;
72 this->update();
73 }
74