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