138b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com/* 338b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * Copyright 2012 Google Inc. 438b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * 538b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * Use of this source code is governed by a BSD-style license that can be 638b08ce020f451a66263110b32e70f5022df4f83chudy@google.com * found in the LICENSE file. 738b08ce020f451a66263110b32e70f5022df4f83chudy@google.com */ 838b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com#include "SkRasterWidget.h" 10cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include "SkDebugger.h" 11cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include <QtGui> 1238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 13cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunenSkRasterWidget::SkRasterWidget(SkDebugger *debugger) 14cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen : QWidget() 15cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen , fDebugger(debugger) 16cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen , fNeedImageUpdate(false) { 17534c63ea911e4f7fbf89a2ba37237ea03a723fe9kkinnunen this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}"); 1838b08ce020f451a66263110b32e70f5022df4f83chudy@google.com} 1938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 2038b08ce020f451a66263110b32e70f5022df4f83chudy@google.comvoid SkRasterWidget::resizeEvent(QResizeEvent* event) { 21cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->QWidget::resizeEvent(event); 22cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen 23cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen QRect r = this->contentsRect(); 24cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (r.width() == 0 || r.height() == 0) { 25cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fSurface.reset(NULL); 26cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } else { 27cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height()); 28cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fSurface.reset(SkSurface::NewRaster(info)); 29cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } 30cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 3138b08ce020f451a66263110b32e70f5022df4f83chudy@google.com} 3238b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 3338b08ce020f451a66263110b32e70f5022df4f83chudy@google.comvoid SkRasterWidget::paintEvent(QPaintEvent* event) { 34cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen QPainter painter(this); 35cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen painter.setRenderHint(QPainter::Antialiasing); 36cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen QStyleOption opt; 37cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen opt.init(this); 38cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); 3938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 40cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (!fSurface) { 41cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen return; 42cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } 4338b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 44cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (fNeedImageUpdate) { 45cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fDebugger->draw(fSurface->getCanvas()); 46cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fSurface->getCanvas()->flush(); 47cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fNeedImageUpdate = false; 48cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen emit drawComplete(); 49cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } 5038b08ce020f451a66263110b32e70f5022df4f83chudy@google.com 51cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen SkImageInfo info; 52cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen size_t rowBytes; 53cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (const void* pixels = fSurface->peekPixels(&info, &rowBytes)) { 54cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen QImage image(reinterpret_cast<const uchar*>(pixels), 55cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen info.width(), 56cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen info.height(), 57cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen rowBytes, 58cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen QImage::Format_ARGB32_Premultiplied); 595a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#if SK_R32_SHIFT == 0 60cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen painter.drawImage(this->contentsRect(), image.rgbSwapped()); 615a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#else 62cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen painter.drawImage(this->contentsRect(), image); 635a867c74e1ebae237082abfa433d6833982b0babhumper@google.com#endif 6480a4a60f96c33ccd850f9b0eb4b69ab08c198196chudy@google.com } 6538b08ce020f451a66263110b32e70f5022df4f83chudy@google.com} 66cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen 67cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunenvoid SkRasterWidget::updateImage() { 68cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (!fSurface) { 69cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen return; 70cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } 71cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fNeedImageUpdate = true; 72cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->update(); 73cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen} 74