Home | History | Annotate | Download | only in QT
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #include "SkRasterWidget.h"
     10 #include "SkDebugger.h"
     11 #include <QtGui>
     12 
     13 SkRasterWidget::SkRasterWidget(SkDebugger *debugger)
     14     : QWidget()
     15     , fDebugger(debugger)
     16     , fNeedImageUpdate(false) {
     17     this->setStyleSheet("QWidget {background-color: black; border: 1px solid #cccccc;}");
     18 }
     19 
     20 void SkRasterWidget::resizeEvent(QResizeEvent* event) {
     21     this->QWidget::resizeEvent(event);
     22 
     23     QRect r = this->contentsRect();
     24     if (r.width() == 0 || r.height() == 0) {
     25         fSurface = nullptr;
     26     } else {
     27         SkImageInfo info = SkImageInfo::MakeN32Premul(r.width(), r.height());
     28         fSurface = SkSurface::MakeRaster(info);
     29     }
     30     this->updateImage();
     31 }
     32 
     33 void SkRasterWidget::paintEvent(QPaintEvent* event) {
     34     QPainter painter(this);
     35     painter.setRenderHint(QPainter::Antialiasing);
     36     QStyleOption opt;
     37     opt.init(this);
     38     style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
     39 
     40     if (!fSurface) {
     41         return;
     42     }
     43 
     44     if (fNeedImageUpdate) {
     45         fDebugger->draw(fSurface->getCanvas());
     46         fSurface->getCanvas()->flush();
     47         fNeedImageUpdate = false;
     48         Q_EMIT drawComplete();
     49     }
     50 
     51     SkPixmap pixmap;
     52 
     53     if (fSurface->peekPixels(&pixmap)) {
     54         QImage image(reinterpret_cast<const uchar*>(pixmap.addr()),
     55                      pixmap.width(),
     56                      pixmap.height(),
     57                      pixmap.rowBytes(),
     58                      QImage::Format_ARGB32_Premultiplied);
     59 #if SK_R32_SHIFT == 0
     60         painter.drawImage(this->contentsRect(), image.rgbSwapped());
     61 #else
     62         painter.drawImage(this->contentsRect(), image);
     63 #endif
     64     }
     65 }
     66 
     67 void SkRasterWidget::updateImage() {
     68     if (!fSurface) {
     69         return;
     70     }
     71     fNeedImageUpdate = true;
     72     this->update();
     73 }
     74