| |
| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkRasterWidget.h" |
| #include "SkDebugger.h" |
| #include <QtGui> |
| |
| SkRasterWidget::SkRasterWidget(SkDebugger *debugger) |
| : QWidget() |
| , fDebugger(debugger) |
| , fNeedImageUpdate(false) { |
| this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}"); |
| } |
| |
| void SkRasterWidget::resizeEvent(QResizeEvent* event) { |
| 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) { |
| QPainter painter(this); |
| painter.setRenderHint(QPainter::Antialiasing); |
| QStyleOption opt; |
| opt.init(this); |
| style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); |
| |
| if (!fSurface) { |
| return; |
| } |
| |
| 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(this->contentsRect(), image.rgbSwapped()); |
| #else |
| painter.drawImage(this->contentsRect(), image); |
| #endif |
| } |
| } |
| |
| void SkRasterWidget::updateImage() { |
| if (!fSurface) { |
| return; |
| } |
| fNeedImageUpdate = true; |
| this->update(); |
| } |