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.reset(NULL);
26    } else {
27        SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
28        fSurface.reset(SkSurface::NewRaster(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        emit drawComplete();
49    }
50
51    SkImageInfo info;
52    size_t rowBytes;
53    if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) {
54        QImage image(reinterpret_cast<const uchar*>(pixels),
55                     info.width(),
56                     info.height(),
57                     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