Index: debugger/QT/SkRasterWidget.cpp |
diff --git a/debugger/QT/SkRasterWidget.cpp b/debugger/QT/SkRasterWidget.cpp |
index 5363d4ad5f9ddf55264b38b36e7df462fb76bda9..72a742f7aa2610e512e08948695d4f145ab6ff7e 100644 |
--- a/debugger/QT/SkRasterWidget.cpp |
+++ b/debugger/QT/SkRasterWidget.cpp |
@@ -7,50 +7,67 @@ |
*/ |
#include "SkRasterWidget.h" |
+#include "SkDebugger.h" |
+#include <QtGui> |
-SkRasterWidget::SkRasterWidget(SkDebugger *debugger) : QWidget() { |
- fBitmap.allocN32Pixels(800, 800); |
- fBitmap.eraseColor(SK_ColorTRANSPARENT); |
- fDevice = new SkBitmapDevice(fBitmap); |
- fDebugger = debugger; |
- fCanvas = new SkCanvas(fDevice); |
+SkRasterWidget::SkRasterWidget(SkDebugger *debugger) |
+ : QWidget() |
+ , fDebugger(debugger) |
+ , fNeedImageUpdate(false) { |
this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}"); |
} |
-SkRasterWidget::~SkRasterWidget() { |
- SkSafeUnref(fCanvas); |
- SkSafeUnref(fDevice); |
-} |
- |
void SkRasterWidget::resizeEvent(QResizeEvent* event) { |
- fBitmap.allocN32Pixels(event->size().width(), event->size().height()); |
- fBitmap.eraseColor(SK_ColorTRANSPARENT); |
- SkSafeUnref(fCanvas); |
- SkSafeUnref(fDevice); |
- fDevice = new SkBitmapDevice(fBitmap); |
- fCanvas = new SkCanvas(fDevice); |
- this->update(); |
+ this->QWidget::resizeEvent(event); |
+ |
+ QRect r = this->contentsRect(); |
+ if (r.width() == 0 || r.height() == 0) { |
+ fSurface.reset(NULL); |
+ } else { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height()); |
+ fSurface.reset(SkSurface::NewRaster(info)); |
+ } |
+ this->updateImage(); |
} |
void SkRasterWidget::paintEvent(QPaintEvent* event) { |
- if (!this->isHidden()) { |
- fDebugger->draw(fCanvas); |
- QPainter painter(this); |
- QStyleOption opt; |
- opt.init(this); |
+ QPainter painter(this); |
+ painter.setRenderHint(QPainter::Antialiasing); |
+ QStyleOption opt; |
+ opt.init(this); |
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); |
- style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); |
+ if (!fSurface) { |
+ return; |
+ } |
- QPoint origin(0,0); |
- QImage image((uchar *)fBitmap.getPixels(), fBitmap.width(), |
- fBitmap.height(), QImage::Format_ARGB32_Premultiplied); |
+ 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(origin, image.rgbSwapped()); |
+ painter.drawImage(this->contentsRect(), image.rgbSwapped()); |
#else |
- painter.drawImage(origin, image); |
+ painter.drawImage(this->contentsRect(), image); |
#endif |
- painter.end(); |
- emit drawComplete(); |
} |
} |
+ |
+void SkRasterWidget::updateImage() { |
+ if (!fSurface) { |
+ return; |
+ } |
+ fNeedImageUpdate = true; |
+ this->update(); |
+} |