163a470227beed0de553d769724e0108808391e42kkinnunen
263a470227beed0de553d769724e0108808391e42kkinnunen/*
363a470227beed0de553d769724e0108808391e42kkinnunen * Copyright 2014 Google Inc.
463a470227beed0de553d769724e0108808391e42kkinnunen *
563a470227beed0de553d769724e0108808391e42kkinnunen * Use of this source code is governed by a BSD-style license that can be
663a470227beed0de553d769724e0108808391e42kkinnunen * found in the LICENSE file.
763a470227beed0de553d769724e0108808391e42kkinnunen */
863a470227beed0de553d769724e0108808391e42kkinnunen
963a470227beed0de553d769724e0108808391e42kkinnunen#include <QtGui>
1063a470227beed0de553d769724e0108808391e42kkinnunen
1163a470227beed0de553d769724e0108808391e42kkinnunen#include "SkDebugger.h"
1263a470227beed0de553d769724e0108808391e42kkinnunen#include "SkDrawCommandGeometryWidget.h"
1363a470227beed0de553d769724e0108808391e42kkinnunen
1463a470227beed0de553d769724e0108808391e42kkinnunenSkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger)
1563a470227beed0de553d769724e0108808391e42kkinnunen    : QFrame()
160cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    , fDebugger(debugger)
170cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    , fCommandIndex(-1) {
1863a470227beed0de553d769724e0108808391e42kkinnunen    this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}");
1963a470227beed0de553d769724e0108808391e42kkinnunen}
2063a470227beed0de553d769724e0108808391e42kkinnunen
2163a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) {
2263a470227beed0de553d769724e0108808391e42kkinnunen    this->QFrame::resizeEvent(event);
2363a470227beed0de553d769724e0108808391e42kkinnunen    QRect r = this->contentsRect();
2463a470227beed0de553d769724e0108808391e42kkinnunen    int dim = std::min(r.width(), r.height());
2563a470227beed0de553d769724e0108808391e42kkinnunen    if (dim == 0) {
2663a470227beed0de553d769724e0108808391e42kkinnunen        fSurface.reset(NULL);
2763a470227beed0de553d769724e0108808391e42kkinnunen    } else {
2863a470227beed0de553d769724e0108808391e42kkinnunen        SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim);
2963a470227beed0de553d769724e0108808391e42kkinnunen        fSurface.reset(SkSurface::NewRaster(info));
3063a470227beed0de553d769724e0108808391e42kkinnunen        this->updateImage();
3163a470227beed0de553d769724e0108808391e42kkinnunen    }
3263a470227beed0de553d769724e0108808391e42kkinnunen}
3363a470227beed0de553d769724e0108808391e42kkinnunen
3463a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) {
3563a470227beed0de553d769724e0108808391e42kkinnunen    this->QFrame::paintEvent(event);
3663a470227beed0de553d769724e0108808391e42kkinnunen
3763a470227beed0de553d769724e0108808391e42kkinnunen    if (!fSurface) {
3863a470227beed0de553d769724e0108808391e42kkinnunen        return;
3963a470227beed0de553d769724e0108808391e42kkinnunen    }
4063a470227beed0de553d769724e0108808391e42kkinnunen
4163a470227beed0de553d769724e0108808391e42kkinnunen    QPainter painter(this);
4263a470227beed0de553d769724e0108808391e42kkinnunen    painter.setRenderHint(QPainter::Antialiasing);
4363a470227beed0de553d769724e0108808391e42kkinnunen
4463a470227beed0de553d769724e0108808391e42kkinnunen    SkImageInfo info;
45cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    size_t rowBytes;
46cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) {
4763a470227beed0de553d769724e0108808391e42kkinnunen        SkASSERT(info.width() > 0);
4863a470227beed0de553d769724e0108808391e42kkinnunen        SkASSERT(info.height() > 0);
4963a470227beed0de553d769724e0108808391e42kkinnunen
5063a470227beed0de553d769724e0108808391e42kkinnunen        QRectF resultRect;
5163a470227beed0de553d769724e0108808391e42kkinnunen        if (this->width() < this->height()) {
5263a470227beed0de553d769724e0108808391e42kkinnunen            float ratio = this->width() / info.width();
5363a470227beed0de553d769724e0108808391e42kkinnunen            resultRect = QRectF(0, 0, this->width(), ratio * info.height());
5463a470227beed0de553d769724e0108808391e42kkinnunen        } else {
5563a470227beed0de553d769724e0108808391e42kkinnunen            float ratio = this->height() / info.height();
5663a470227beed0de553d769724e0108808391e42kkinnunen            resultRect = QRectF(0, 0, ratio * info.width(), this->height());
5763a470227beed0de553d769724e0108808391e42kkinnunen        }
5863a470227beed0de553d769724e0108808391e42kkinnunen
5963a470227beed0de553d769724e0108808391e42kkinnunen        resultRect.moveCenter(this->contentsRect().center());
6063a470227beed0de553d769724e0108808391e42kkinnunen
6163a470227beed0de553d769724e0108808391e42kkinnunen        QImage image(reinterpret_cast<const uchar*>(pixels),
6263a470227beed0de553d769724e0108808391e42kkinnunen                     info.width(),
6363a470227beed0de553d769724e0108808391e42kkinnunen                     info.height(),
64cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen                     rowBytes,
6563a470227beed0de553d769724e0108808391e42kkinnunen                     QImage::Format_ARGB32_Premultiplied);
6663a470227beed0de553d769724e0108808391e42kkinnunen        painter.drawImage(resultRect, image);
6763a470227beed0de553d769724e0108808391e42kkinnunen    }
6863a470227beed0de553d769724e0108808391e42kkinnunen}
6963a470227beed0de553d769724e0108808391e42kkinnunen
700cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunenvoid SkDrawCommandGeometryWidget::setDrawCommandIndex(int commandIndex) {
710cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    fCommandIndex = commandIndex;
720cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    this->updateImage();
730cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen}
740cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen
7563a470227beed0de553d769724e0108808391e42kkinnunenvoid SkDrawCommandGeometryWidget::updateImage() {
7663a470227beed0de553d769724e0108808391e42kkinnunen    if (!fSurface) {
7763a470227beed0de553d769724e0108808391e42kkinnunen        return;
7863a470227beed0de553d769724e0108808391e42kkinnunen    }
7963a470227beed0de553d769724e0108808391e42kkinnunen
8063a470227beed0de553d769724e0108808391e42kkinnunen    bool didRender = false;
8163a470227beed0de553d769724e0108808391e42kkinnunen    const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands();
820cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    if (0 != commands.count() && fCommandIndex >= 0) {
830cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen        SkASSERT(commands.count() > fCommandIndex);
840cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen        SkDrawCommand* command = commands[fCommandIndex];
8563a470227beed0de553d769724e0108808391e42kkinnunen        didRender = command->render(fSurface->getCanvas());
8663a470227beed0de553d769724e0108808391e42kkinnunen    }
8763a470227beed0de553d769724e0108808391e42kkinnunen
8863a470227beed0de553d769724e0108808391e42kkinnunen    if (!didRender) {
8963a470227beed0de553d769724e0108808391e42kkinnunen        fSurface->getCanvas()->clear(SK_ColorTRANSPARENT);
9063a470227beed0de553d769724e0108808391e42kkinnunen    }
9163a470227beed0de553d769724e0108808391e42kkinnunen
9263a470227beed0de553d769724e0108808391e42kkinnunen    fSurface->getCanvas()->flush();
930cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen    this->update();
9463a470227beed0de553d769724e0108808391e42kkinnunen}
95