1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc.
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include <QtGui>
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDebugger.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDrawCommandGeometryWidget.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger)
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : QFrame()
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fDebugger(debugger)
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fCommandIndex(-1) {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}");
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) {
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->QFrame::resizeEvent(event);
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    QRect r = this->contentsRect();
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int dim = std::min(r.width(), r.height());
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (dim == 0) {
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fSurface = nullptr;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fSurface = SkSurface::MakeRaster(info);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->updateImage();
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->QFrame::paintEvent(event);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fSurface) {
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    QPainter painter(this);
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    painter.setRenderHint(QPainter::Antialiasing);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPixmap pixmap;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fSurface->peekPixels(&pixmap)) {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(pixmap.width() > 0);
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(pixmap.height() > 0);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        QRectF resultRect;
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (this->width() < this->height()) {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            float ratio = this->width() / pixmap.width();
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            resultRect = QRectF(0, 0, this->width(), ratio * pixmap.height());
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            float ratio = this->height() / pixmap.height();
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            resultRect = QRectF(0, 0, ratio * pixmap.width(), this->height());
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        resultRect.moveCenter(this->contentsRect().center());
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        QImage image(reinterpret_cast<const uchar*>(pixmap.addr()),
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     pixmap.width(),
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     pixmap.height(),
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     pixmap.rowBytes(),
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     QImage::Format_ARGB32_Premultiplied);
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        painter.drawImage(resultRect, image);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::setDrawCommandIndex(int commandIndex) {
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCommandIndex = commandIndex;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->updateImage();
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDrawCommandGeometryWidget::updateImage() {
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fSurface) {
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool didRender = false;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands();
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (0 != commands.count() && fCommandIndex >= 0) {
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(commands.count() > fCommandIndex);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDrawCommand* command = commands[fCommandIndex];
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        didRender = command->render(fSurface->getCanvas());
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!didRender) {
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fSurface->getCanvas()->clear(SK_ColorTRANSPARENT);
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fSurface->getCanvas()->flush();
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->update();
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
95