
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkRasterWidget.h"

SkRasterWidget::SkRasterWidget(SkDebugger *debugger) : QWidget() {
    fBitmap.allocN32Pixels(800, 800);
    fBitmap.eraseColor(SK_ColorTRANSPARENT);
    fDevice = new SkBitmapDevice(fBitmap);
    fDebugger = debugger;
    fCanvas = new SkCanvas(fDevice);
    this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
}

SkRasterWidget::~SkRasterWidget() {
    SkSafeUnref(fCanvas);
    SkSafeUnref(fDevice);
}

void SkRasterWidget::resizeEvent(QResizeEvent* event) {
    fBitmap.allocN32Pixels(event->size().width(), event->size().height());
    fBitmap.eraseColor(SK_ColorTRANSPARENT);
    SkSafeUnref(fCanvas);
    SkSafeUnref(fDevice);
    fDevice = new SkBitmapDevice(fBitmap);
    fCanvas = new SkCanvas(fDevice);
    this->update();
}

void SkRasterWidget::paintEvent(QPaintEvent* event) {
    if (!this->isHidden()) {
        fDebugger->draw(fCanvas);
        QPainter painter(this);
        QStyleOption opt;
        opt.init(this);

        style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);

        QPoint origin(0,0);
        QImage image((uchar *)fBitmap.getPixels(), fBitmap.width(),
                fBitmap.height(), QImage::Format_ARGB32_Premultiplied);

#if SK_R32_SHIFT == 0
        painter.drawImage(origin, image.rgbSwapped());
#else
        painter.drawImage(origin, image);
#endif
        painter.end();
        emit drawComplete();
    }
}
