/* * 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 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 = nullptr; } else { SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height()); fSurface = SkSurface::MakeRaster(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; Q_EMIT drawComplete(); } SkPixmap pixmap; if (fSurface->peekPixels(&pixmap)) { QImage image(reinterpret_cast(pixmap.addr()), pixmap.width(), pixmap.height(), pixmap.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(); }