Index: debugger/QT/SkDrawCommandGeometryWidget.cpp |
diff --git a/debugger/QT/SkDrawCommandGeometryWidget.cpp b/debugger/QT/SkDrawCommandGeometryWidget.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1172e7952d5f3acffca4fa5ac18299e210c3f77a |
--- /dev/null |
+++ b/debugger/QT/SkDrawCommandGeometryWidget.cpp |
@@ -0,0 +1,86 @@ |
+ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include <QtGui> |
+ |
+#include "SkDebugger.h" |
+#include "SkDrawCommandGeometryWidget.h" |
+ |
+SkDrawCommandGeometryWidget::SkDrawCommandGeometryWidget(SkDebugger *debugger) |
+ : QFrame() |
+ , fDebugger(debugger) { |
+ this->setStyleSheet("QFrame {background-color: black; border: 1px solid #cccccc;}"); |
+} |
+ |
+void SkDrawCommandGeometryWidget::resizeEvent(QResizeEvent* event) { |
+ this->QFrame::resizeEvent(event); |
+ QRect r = this->contentsRect(); |
+ int dim = std::min(r.width(), r.height()); |
+ if (dim == 0) { |
+ fSurface.reset(NULL); |
+ } else { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(dim, dim); |
+ fSurface.reset(SkSurface::NewRaster(info)); |
+ this->updateImage(); |
+ } |
+} |
+ |
+void SkDrawCommandGeometryWidget::paintEvent(QPaintEvent* event) { |
+ this->QFrame::paintEvent(event); |
+ |
+ if (!fSurface) { |
+ return; |
+ } |
+ |
+ QPainter painter(this); |
+ painter.setRenderHint(QPainter::Antialiasing); |
+ |
+ SkImageInfo info; |
+ size_t rowPixels; |
+ if (const void* pixels = fSurface->peekPixels(&info, &rowPixels)) { |
+ SkASSERT(info.width() > 0); |
+ SkASSERT(info.height() > 0); |
+ |
+ QRectF resultRect; |
+ if (this->width() < this->height()) { |
+ float ratio = this->width() / info.width(); |
+ resultRect = QRectF(0, 0, this->width(), ratio * info.height()); |
+ } else { |
+ float ratio = this->height() / info.height(); |
+ resultRect = QRectF(0, 0, ratio * info.width(), this->height()); |
+ } |
+ |
+ resultRect.moveCenter(this->contentsRect().center()); |
+ |
+ QImage image(reinterpret_cast<const uchar*>(pixels), |
+ info.width(), |
+ info.height(), |
+ QImage::Format_ARGB32_Premultiplied); |
+ painter.drawImage(resultRect, image); |
+ } |
+} |
+ |
+void SkDrawCommandGeometryWidget::updateImage() { |
+ if (!fSurface) { |
+ return; |
+ } |
+ |
+ bool didRender = false; |
+ const SkTDArray<SkDrawCommand*>& commands = fDebugger->getDrawCommands(); |
+ if (0 != commands.count()) { |
+ SkDrawCommand* command = commands[fDebugger->index()]; |
+ didRender = command->render(fSurface->getCanvas()); |
+ } |
+ |
+ if (!didRender) { |
+ fSurface->getCanvas()->clear(SK_ColorTRANSPARENT); |
+ } |
+ |
+ fSurface->getCanvas()->flush(); |
+ update(); |
+} |