138b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com/*
338b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * Copyright 2012 Google Inc.
438b08ce020f451a66263110b32e70f5022df4f83chudy@google.com *
538b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * Use of this source code is governed by a BSD-style license that can be
638b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * found in the LICENSE file.
738b08ce020f451a66263110b32e70f5022df4f83chudy@google.com */
838b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com#include "SkRasterWidget.h"
10cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include "SkDebugger.h"
11cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include <QtGui>
1238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
13cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunenSkRasterWidget::SkRasterWidget(SkDebugger *debugger)
14cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    : QWidget()
15cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    , fDebugger(debugger)
16cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    , fNeedImageUpdate(false) {
17534c63ea911e4f7fbf89a2ba37237ea03a723fe9kkinnunen    this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
1838b08ce020f451a66263110b32e70f5022df4f83chudy@google.com}
1938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
2038b08ce020f451a66263110b32e70f5022df4f83chudy@google.comvoid SkRasterWidget::resizeEvent(QResizeEvent* event) {
21cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    this->QWidget::resizeEvent(event);
22cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen
23cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    QRect r = this->contentsRect();
24cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (r.width() == 0 || r.height() == 0) {
25cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        fSurface.reset(NULL);
26cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    } else {
27cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
28cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        fSurface.reset(SkSurface::NewRaster(info));
29cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    }
30cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    this->updateImage();
3138b08ce020f451a66263110b32e70f5022df4f83chudy@google.com}
3238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
3338b08ce020f451a66263110b32e70f5022df4f83chudy@google.comvoid SkRasterWidget::paintEvent(QPaintEvent* event) {
34cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    QPainter painter(this);
35cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    painter.setRenderHint(QPainter::Antialiasing);
36cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    QStyleOption opt;
37cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    opt.init(this);
38cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
3938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
40cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (!fSurface) {
41cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        return;
42cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    }
4338b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
44cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (fNeedImageUpdate) {
45cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        fDebugger->draw(fSurface->getCanvas());
46cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        fSurface->getCanvas()->flush();
47cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        fNeedImageUpdate = false;
48cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        emit drawComplete();
49cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    }
5038b08ce020f451a66263110b32e70f5022df4f83chudy@google.com
51cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    SkImageInfo info;
52cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    size_t rowBytes;
53cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) {
54cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        QImage image(reinterpret_cast<const uchar*>(pixels),
55cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen                     info.width(),
56cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen                     info.height(),
57cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen                     rowBytes,
58cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen                     QImage::Format_ARGB32_Premultiplied);
595a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#if SK_R32_SHIFT == 0
60cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        painter.drawImage(this->contentsRect(), image.rgbSwapped());
615a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#else
62cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        painter.drawImage(this->contentsRect(), image);
635a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#endif
6480a4a60f96c33ccd850f9b0eb4b69ab08c198196chudy@google.com    }
6538b08ce020f451a66263110b32e70f5022df4f83chudy@google.com}
66cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen
67cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunenvoid SkRasterWidget::updateImage() {
68cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (!fSurface) {
69cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen        return;
70cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    }
71cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    fNeedImageUpdate = true;
72cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    this->update();
73cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen}
74