SkRasterWidget.cpp revision fe17456d5e528078ce69b5f15cf7adf1fab963f9
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
13SkRasterWidget::SkRasterWidget(SkDebugger *debugger)
14    : QWidget()
15    , fDebugger(debugger)
16    , fNeedImageUpdate(false) {
17    this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
18}
19
20void 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
33void 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
67void SkRasterWidget::updateImage() {
68    if (!fSurface) {
69        return;
70    }
71    fNeedImageUpdate = true;
72    this->update();
73}
74