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