|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# imagecomposer.cpp Example File
painting/imagecomposition/imagecomposer.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2006-2006 Trolltech ASA. All rights reserved.
    **
    ** This file is part of the example classes of the Qt Toolkit.
    **
    ** Licensees holding valid Qt Preview licenses may use this file in
    ** accordance with the Qt Preview License Agreement provided with the
    ** Software.
    **
    ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
    ** information about Qt Commercial License Agreements.
    **
    ** Contact info@trolltech.com if any conditions of this licensing are
    ** not clear to you.
    **
    ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
    ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    **
    ****************************************************************************/

    #include <QtGui>

    #include "imagecomposer.h"

    static const QSize resultSize(200, 200);

    ImageComposer::ImageComposer()
    {
        sourceButton = new QToolButton;
        sourceButton->setIconSize(resultSize);

        operatorComboBox = new QComboBox;
        addOp(QPainter::CompositionMode_SourceOver, tr("SourceOver"));
        addOp(QPainter::CompositionMode_DestinationOver, tr("DestinationOver"));
        addOp(QPainter::CompositionMode_Clear, tr("Clear"));
        addOp(QPainter::CompositionMode_Source, tr("Source"));
        addOp(QPainter::CompositionMode_Destination, tr("Destination"));
        addOp(QPainter::CompositionMode_SourceIn, tr("SourceIn"));
        addOp(QPainter::CompositionMode_DestinationIn, tr("DestinationIn"));
        addOp(QPainter::CompositionMode_SourceOut, tr("SourceOut"));
        addOp(QPainter::CompositionMode_DestinationOut, tr("DestinationOut"));
        addOp(QPainter::CompositionMode_SourceAtop, tr("SourceAtop"));
        addOp(QPainter::CompositionMode_DestinationAtop, tr("DestinationAtop"));
        addOp(QPainter::CompositionMode_Xor, tr("Xor"));

        destinationButton = new QToolButton;
        destinationButton->setIconSize(resultSize);

        equalLabel = new QLabel(tr("="));

        resultLabel = new QLabel;
        resultLabel->setMinimumWidth(resultSize.width());

        connect(sourceButton, SIGNAL(clicked()), this, SLOT(chooseSource()));
        connect(operatorComboBox, SIGNAL(activated(int)),
                this, SLOT(recalculateResult()));
        connect(destinationButton, SIGNAL(clicked()),
                this, SLOT(chooseDestination()));

        QGridLayout *mainLayout = new QGridLayout;
        mainLayout->addWidget(sourceButton, 0, 0, 3, 1);
        mainLayout->addWidget(operatorComboBox, 1, 1);
        mainLayout->addWidget(destinationButton, 0, 2, 3, 1);
        mainLayout->addWidget(equalLabel, 1, 3);
        mainLayout->addWidget(resultLabel, 0, 4, 3, 1);
        mainLayout->setSizeConstraint(QLayout::SetFixedSize);
        setLayout(mainLayout);

        resultImage = QImage(resultSize, QImage::Format_ARGB32_Premultiplied);

        loadImage(":/images/butterfly.png", &sourceImage, sourceButton);
        loadImage(":/images/checker.png", &destinationImage, destinationButton);

        setWindowTitle(tr("Image Composition"));
    }

    void ImageComposer::chooseSource()
    {
        chooseImage(tr("Choose Source Image"), &sourceImage, sourceButton);
    }

    void ImageComposer::chooseDestination()
    {
        chooseImage(tr("Choose Destination Image"), &destinationImage,
                    destinationButton);
    }

    void ImageComposer::recalculateResult()
    {
        QPainter::CompositionMode mode = currentMode();

        QPainter painter(&resultImage);
        painter.setCompositionMode(QPainter::CompositionMode_Source);
        painter.fillRect(resultImage.rect(), Qt::transparent);
        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
        painter.drawImage(0, 0, destinationImage);
        painter.setCompositionMode(mode);
        painter.drawImage(0, 0, sourceImage);
        painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
        painter.fillRect(resultImage.rect(), Qt::white);
        painter.end();

        resultLabel->setPixmap(QPixmap::fromImage(resultImage));
    }

    void ImageComposer::addOp(QPainter::CompositionMode mode, const QString &name)
    {
        operatorComboBox->addItem(name, mode);
    }

    void ImageComposer::chooseImage(const QString &title, QImage *image,
                                    QToolButton *button)
    {
        QString fileName = QFileDialog::getOpenFileName(this, title);
        if (!fileName.isEmpty())
            loadImage(fileName, image, button);
    }

    void ImageComposer::loadImage(const QString &fileName, QImage *image,
                                  QToolButton *button)
    {
        image->load(fileName);

        QImage fixedImage(resultSize, QImage::Format_ARGB32_Premultiplied);
        QPainter painter(&fixedImage);
        painter.setCompositionMode(QPainter::CompositionMode_Source);
        painter.fillRect(fixedImage.rect(), Qt::transparent);
        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
        painter.drawImage(imagePos(*image), *image);
        painter.end();
        button->setIcon(QPixmap::fromImage(fixedImage));

        *image = fixedImage;

        recalculateResult();
    }

    QPainter::CompositionMode ImageComposer::currentMode() const
    {
        return (QPainter::CompositionMode)
               operatorComboBox->itemData(operatorComboBox->currentIndex()).toInt();
    }

    QPoint ImageComposer::imagePos(const QImage &image) const
    {
        return QPoint((resultSize.width() - image.width()) / 2,
                      (resultSize.height() - image.height()) / 2);
    }