| /* | |
| * 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(nullptr); | |
| } 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(); | |
| } |