/*
 * 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"
#include "SkDebugger.h"
#include <QtGui>

SkRasterWidget::SkRasterWidget(SkDebugger *debugger)
    : QWidget()
    , fDebugger(debugger)
    , fNeedImageUpdate(false) {
    this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
}

void SkRasterWidget::resizeEvent(QResizeEvent* event) {
    this->QWidget::resizeEvent(event);

    QRect r = this->contentsRect();
    if (r.width() == 0 || r.height() == 0) {
        fSurface.reset(nullptr);
    } else {
        SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
        fSurface.reset(SkSurface::NewRaster(info));
    }
    this->updateImage();
}

void SkRasterWidget::paintEvent(QPaintEvent* event) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QStyleOption opt;
    opt.init(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);

    if (!fSurface) {
        return;
    }

    if (fNeedImageUpdate) {
        fDebugger->draw(fSurface->getCanvas());
        fSurface->getCanvas()->flush();
        fNeedImageUpdate = false;
        emit drawComplete();
    }

    SkImageInfo info;
    size_t rowBytes;
    if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) {
        QImage image(reinterpret_cast<const uchar*>(pixels),
                     info.width(),
                     info.height(),
                     rowBytes,
                     QImage::Format_ARGB32_Premultiplied);
#if SK_R32_SHIFT == 0
        painter.drawImage(this->contentsRect(), image.rgbSwapped());
#else
        painter.drawImage(this->contentsRect(), image);
#endif
    }
}

void SkRasterWidget::updateImage() {
    if (!fSurface) {
        return;
    }
    fNeedImageUpdate = true;
    this->update();
}