| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the demonstration applications of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:BSD$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** BSD License Usage |
| ** Alternatively, you may use this file under the terms of the BSD license |
| ** as follows: |
| ** |
| ** "Redistribution and use in source and binary forms, with or without |
| ** modification, are permitted provided that the following conditions are |
| ** met: |
| ** * Redistributions of source code must retain the above copyright |
| ** notice, this list of conditions and the following disclaimer. |
| ** * Redistributions in binary form must reproduce the above copyright |
| ** notice, this list of conditions and the following disclaimer in |
| ** the documentation and/or other materials provided with the |
| ** distribution. |
| ** * Neither the name of The Qt Company Ltd nor the names of its |
| ** contributors may be used to endorse or promote products derived |
| ** from this software without specific prior written permission. |
| ** |
| ** |
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #ifndef COMPOSITION_H |
| #define COMPOSITION_H |
| |
| #include "arthurwidgets.h" |
| |
| #if QT_CONFIG(opengl) |
| #include "fbopaintdevice.h" |
| #include <QOpenGLTextureBlitter> |
| #endif |
| |
| #include <QPainter> |
| #include <QEvent> |
| |
| #include <memory> |
| |
| QT_BEGIN_NAMESPACE |
| class QPushButton; |
| class QRadioButton; |
| QT_END_NAMESPACE |
| |
| class CompositionWidget : public QWidget |
| { |
| Q_OBJECT |
| |
| public: |
| explicit CompositionWidget(QWidget *parent = nullptr); |
| ~CompositionWidget(); |
| |
| public slots: |
| void nextMode(); |
| |
| private: |
| bool m_cycle_enabled; |
| |
| QRadioButton *rbClear; |
| QRadioButton *rbSource; |
| QRadioButton *rbDest; |
| QRadioButton *rbSourceOver; |
| QRadioButton *rbDestOver; |
| QRadioButton *rbSourceIn; |
| QRadioButton *rbDestIn; |
| QRadioButton *rbSourceOut; |
| QRadioButton *rbDestOut; |
| QRadioButton *rbSourceAtop; |
| QRadioButton *rbDestAtop; |
| QRadioButton *rbXor; |
| |
| QRadioButton *rbPlus; |
| QRadioButton *rbMultiply; |
| QRadioButton *rbScreen; |
| QRadioButton *rbOverlay; |
| QRadioButton *rbDarken; |
| QRadioButton *rbLighten; |
| QRadioButton *rbColorDodge; |
| QRadioButton *rbColorBurn; |
| QRadioButton *rbHardLight; |
| QRadioButton *rbSoftLight; |
| QRadioButton *rbDifference; |
| QRadioButton *rbExclusion; |
| }; |
| |
| class CompositionRenderer : public ArthurFrame |
| { |
| Q_OBJECT |
| |
| enum ObjectType { NoObject, Circle, Rectangle, Image }; |
| |
| Q_PROPERTY(int circleColor READ circleColor WRITE setCircleColor) |
| Q_PROPERTY(int circleAlpha READ circleAlpha WRITE setCircleAlpha) |
| Q_PROPERTY(bool animation READ animationEnabled WRITE setAnimationEnabled) |
| |
| public: |
| explicit CompositionRenderer(QWidget *parent = nullptr); |
| ~CompositionRenderer(); |
| |
| void paint(QPainter *) override; |
| |
| void setCirclePos(const QPointF &pos); |
| |
| QSize sizeHint() const override { return QSize(500, 400); } |
| |
| bool animationEnabled() const { return m_animation_enabled; } |
| int circleColor() const { return m_circle_hue; } |
| int circleAlpha() const { return m_circle_alpha; } |
| |
| protected: |
| void mousePressEvent(QMouseEvent *) override; |
| void mouseMoveEvent(QMouseEvent *) override; |
| void mouseReleaseEvent(QMouseEvent *) override; |
| void timerEvent(QTimerEvent *) override; |
| |
| public slots: |
| void setClearMode() { m_composition_mode = QPainter::CompositionMode_Clear; update(); } |
| void setSourceMode() { m_composition_mode = QPainter::CompositionMode_Source; update(); } |
| void setDestMode() { m_composition_mode = QPainter::CompositionMode_Destination; update(); } |
| void setSourceOverMode() { m_composition_mode = QPainter::CompositionMode_SourceOver; update(); } |
| void setDestOverMode() { m_composition_mode = QPainter::CompositionMode_DestinationOver; update(); } |
| void setSourceInMode() { m_composition_mode = QPainter::CompositionMode_SourceIn; update(); } |
| void setDestInMode() { m_composition_mode = QPainter::CompositionMode_DestinationIn; update(); } |
| void setSourceOutMode() { m_composition_mode = QPainter::CompositionMode_SourceOut; update(); } |
| void setDestOutMode() { m_composition_mode = QPainter::CompositionMode_DestinationOut; update(); } |
| void setSourceAtopMode() { m_composition_mode = QPainter::CompositionMode_SourceAtop; update(); } |
| void setDestAtopMode() { m_composition_mode = QPainter::CompositionMode_DestinationAtop; update(); } |
| void setXorMode() { m_composition_mode = QPainter::CompositionMode_Xor; update(); } |
| |
| void setPlusMode() { m_composition_mode = QPainter::CompositionMode_Plus; update(); } |
| void setMultiplyMode() { m_composition_mode = QPainter::CompositionMode_Multiply; update(); } |
| void setScreenMode() { m_composition_mode = QPainter::CompositionMode_Screen; update(); } |
| void setOverlayMode() { m_composition_mode = QPainter::CompositionMode_Overlay; update(); } |
| void setDarkenMode() { m_composition_mode = QPainter::CompositionMode_Darken; update(); } |
| void setLightenMode() { m_composition_mode = QPainter::CompositionMode_Lighten; update(); } |
| void setColorDodgeMode() { m_composition_mode = QPainter::CompositionMode_ColorDodge; update(); } |
| void setColorBurnMode() { m_composition_mode = QPainter::CompositionMode_ColorBurn; update(); } |
| void setHardLightMode() { m_composition_mode = QPainter::CompositionMode_HardLight; update(); } |
| void setSoftLightMode() { m_composition_mode = QPainter::CompositionMode_SoftLight; update(); } |
| void setDifferenceMode() { m_composition_mode = QPainter::CompositionMode_Difference; update(); } |
| void setExclusionMode() { m_composition_mode = QPainter::CompositionMode_Exclusion; update(); } |
| |
| void setCircleAlpha(int alpha) { m_circle_alpha = alpha; update(); } |
| void setCircleColor(int hue) { m_circle_hue = hue; update(); } |
| void setAnimationEnabled(bool enabled); |
| |
| private: |
| void updateCirclePos(); |
| void drawBase(QPainter &p); |
| void drawSource(QPainter &p); |
| |
| QPainter::CompositionMode m_composition_mode; |
| |
| QImage m_image; |
| QImage m_buffer; |
| QImage m_base_buffer; |
| |
| int m_circle_alpha; |
| int m_circle_hue; |
| |
| QPointF m_circle_pos; |
| QPointF m_offset; |
| |
| ObjectType m_current_object; |
| bool m_animation_enabled; |
| int m_animationTimer; |
| |
| #if QT_CONFIG(opengl) |
| std::unique_ptr<QFboPaintDevice> m_fbo; |
| int m_pbuffer_size; // width==height==size of pbuffer |
| uint m_base_tex; |
| uint m_compositing_tex; |
| QSize m_previous_size; |
| QOpenGLTextureBlitter m_blitter; |
| #endif |
| }; |
| |
| #endif // COMPOSITION_H |