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