1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3  * This file is part of openfx-supportext <https://github.com/devernay/openfx-supportext>,
4  * Copyright (C) 2013-2018 INRIA
5  *
6  * openfx-supportext is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * openfx-supportext is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with openfx-supportext.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>
18  * ***** END LICENSE BLOCK ***** */
19 
20 /*
21  * OFX TransformInteract.
22  */
23 
24 #ifndef openfx_supportext_ofxsTransformInteract_h
25 #define openfx_supportext_ofxsTransformInteract_h
26 
27 #include <cmath>
28 
29 #include "ofxsImageEffect.h"
30 #include "ofxsMacros.h"
31 
32 #define kParamTransformTranslate "transformTranslate"
33 #define kParamTransformTranslateLabel "Translate"
34 #define kParamTransformTranslateHint "Translation along the x and y axes in pixels. Can also be adjusted by clicking and dragging the center handle in the Viewer."
35 #define kParamTransformRotate "transformRotate"
36 #define kParamTransformRotateLabel "Rotate"
37 #define kParamTransformRotateHint "Rotation angle in degrees around the Center. Can also be adjusted by clicking and dragging the rotation bar in the Viewer."
38 #define kParamTransformScale "transformScale"
39 #define kParamTransformScaleLabel "Scale"
40 #define kParamTransformScaleHint "Scale factor along the x and y axes. Can also be adjusted by clicking and dragging the outer circle or the diameter handles in the Viewer."
41 #define kParamTransformScaleUniform "transformScaleUniform"
42 #define kParamTransformScaleUniformLabel "Uniform"
43 #define kParamTransformScaleUniformHint "Use the X scale for both directions"
44 #define kParamTransformSkewX "transformSkewX"
45 #define kParamTransformSkewXLabel "Skew X"
46 #define kParamTransformSkewXHint "Skew along the x axis. Can also be adjusted by clicking and dragging the skew bar in the Viewer."
47 #define kParamTransformSkewY "transformSkewY"
48 #define kParamTransformSkewYLabel "Skew Y"
49 #define kParamTransformSkewYHint "Skew along the y axis."
50 #define kParamTransformSkewOrder "transformSkewOrder"
51 #define kParamTransformSkewOrderLabel "Skew Order"
52 #define kParamTransformSkewOrderHint "The order in which skew transforms are applied: X then Y, or Y then X."
53 #define kParamTransformAmount "transformAmount"
54 #define kParamTransformAmountLabel "Amount"
55 #define kParamTransformAmountHint "Amount of transform to apply. 0 means the transform is identity, 1 means to apply the full transform."
56 #define kParamTransformCenter "transformCenter"
57 #define kParamTransformCenterLabel "Center"
58 #define kParamTransformCenterHint "Center of rotation and scale."
59 #define kParamTransformCenterChanged "transformCenterChanged"
60 #define kParamTransformResetCenter "transformResetCenter"
61 #define kParamTransformResetCenterLabel "Reset Center"
62 #define kParamTransformResetCenterHint "Reset the position of the center to the center of the input region of definition"
63 #define kParamTransformInteractOpen "transformInteractOpen"
64 #define kParamTransformInteractOpenLabel "Show Interact"
65 #define kParamTransformInteractOpenHint "If checked, the transform interact is displayed over the image."
66 #define kParamTransformInteractive "transformInteractive"
67 #define kParamTransformInteractiveLabel "Interactive Update"
68 #define kParamTransformInteractiveHint "If checked, update the parameter values during interaction with the image viewer, else update the values when pen is released."
69 
70 // old parameter names (Transform DirBlur and GodRays only)
71 #define kParamTransformTranslateOld "translate"
72 #define kParamTransformRotateOld "rotate"
73 #define kParamTransformScaleOld "scale"
74 #define kParamTransformScaleUniformOld "uniform"
75 #define kParamTransformSkewXOld "skewX"
76 #define kParamTransformSkewYOld "skewY"
77 #define kParamTransformSkewOrderOld "skewOrder"
78 #define kParamTransformCenterOld "center"
79 #define kParamTransformResetCenterOld "resetCenter"
80 #define kParamTransformInteractiveOld "interactive"
81 
82 namespace OFX {
83 inline void
ofxsTransformGetScale(const OfxPointD & scaleParam,bool scaleUniform,OfxPointD * scale)84 ofxsTransformGetScale(const OfxPointD &scaleParam,
85                       bool scaleUniform,
86                       OfxPointD* scale)
87 {
88     const double SCALE_MIN = 0.0001;
89 
90     scale->x = scaleParam.x;
91     if (std::fabs(scale->x) < SCALE_MIN) {
92         scale->x = (scale->x >= 0) ? SCALE_MIN : -SCALE_MIN;
93     }
94     if (scaleUniform) {
95         scale->y = scaleParam.x;
96     } else {
97         scale->y = scaleParam.y;
98     }
99     if (std::fabs(scale->y) < SCALE_MIN) {
100         scale->y = (scale->y >= 0) ? SCALE_MIN : -SCALE_MIN;
101     }
102 }
103 
104 /// add Transform params. page and group are optional
105 void ofxsTransformDescribeParams(OFX::ImageEffectDescriptor &desc, OFX::PageParamDescriptor *page, OFX::GroupParamDescriptor *group, bool isOpen, bool oldParams, bool hasAmount, bool noTranslate);
106 
107 class TransformInteractHelper
108     : private OFX::InteractAbstract
109 {
110 protected:
111     enum DrawStateEnum
112     {
113         eInActive = 0, //< nothing happening
114         eCircleHovered, //< the scale circle is hovered
115         eLeftPointHovered, //< the left point of the circle is hovered
116         eRightPointHovered, //< the right point of the circle is hovered
117         eBottomPointHovered, //< the bottom point of the circle is hovered
118         eTopPointHovered, //< the top point of the circle is hovered
119         eCenterPointHovered, //< the center point of the circle is hovered
120         eRotationBarHovered, //< the rotation bar is hovered
121         eSkewXBarHoverered, //< the skew bar is hovered
122         eSkewYBarHoverered //< the skew bar is hovered
123     };
124 
125     enum MouseStateEnum
126     {
127         eReleased = 0,
128         eDraggingCircle,
129         eDraggingLeftPoint,
130         eDraggingRightPoint,
131         eDraggingTopPoint,
132         eDraggingBottomPoint,
133         eDraggingTranslation,
134         eDraggingCenter,
135         eDraggingRotationBar,
136         eDraggingSkewXBar,
137         eDraggingSkewYBar
138     };
139 
140     enum OrientationEnum
141     {
142         eOrientationAllDirections = 0,
143         eOrientationNotSet,
144         eOrientationHorizontal,
145         eOrientationVertical
146     };
147 
148     DrawStateEnum _drawState;
149     MouseStateEnum _mouseState;
150     int _modifierStateCtrl;
151     int _modifierStateShift;
152     OrientationEnum _orientation;
153     ImageEffect* _effect;
154     Interact* _interact;
155     OfxPointD _lastMousePos;
156     OfxPointD _centerDrag;
157     OfxPointD _translateDrag;
158     OfxPointD _scaleParamDrag;
159     bool _scaleUniformDrag;
160     double _rotateDrag;
161     double _skewXDrag;
162     double _skewYDrag;
163     int _skewOrderDrag;
164     bool _invertedDrag;
165     bool _interactiveDrag;
166 
167 public:
168     TransformInteractHelper(OFX::ImageEffect* effect, OFX::Interact* interact, bool oldParams = false);
169 
170     /** @brief virtual destructor */
~TransformInteractHelper()171     virtual ~TransformInteractHelper()
172     {
173         // fetched clips and params are owned and deleted by the ImageEffect and its ParamSet
174     }
175 
176     // overridden functions from OFX::Interact to do things
177     virtual bool draw(const OFX::DrawArgs &args) OVERRIDE;
178     virtual bool penMotion(const OFX::PenArgs &args) OVERRIDE;
179     virtual bool penDown(const OFX::PenArgs &args) OVERRIDE;
180     virtual bool penUp(const OFX::PenArgs &args) OVERRIDE;
181     virtual bool keyDown(const OFX::KeyArgs &args) OVERRIDE;
182     virtual bool keyUp(const OFX::KeyArgs &args) OVERRIDE;
keyRepeat(const KeyArgs &)183     virtual bool keyRepeat(const KeyArgs & /*args*/) OVERRIDE { return false; }
184 
gainFocus(const FocusArgs &)185     virtual void gainFocus(const FocusArgs & /*args*/) OVERRIDE {}
186 
187     virtual void loseFocus(const FocusArgs &args) OVERRIDE;
188 
189 private:
190     // NON-GENERIC
191     OFX::Double2DParam* _translate;
192     OFX::DoubleParam* _rotate;
193     OFX::Double2DParam* _scale;
194     OFX::BooleanParam* _scaleUniform;
195     OFX::DoubleParam* _skewX;
196     OFX::DoubleParam* _skewY;
197     OFX::ChoiceParam* _skewOrder;
198     OFX::Double2DParam* _center;
199     OFX::BooleanParam* _invert;
200     OFX::BooleanParam* _interactOpen;
201     OFX::BooleanParam* _interactive;
202 };
203 
204 typedef OverlayInteractFromHelper<TransformInteractHelper> TransformInteract;
205 
206 class TransformOverlayDescriptor
207     : public DefaultEffectOverlayDescriptor<TransformOverlayDescriptor, TransformInteract>
208 {
209 };
210 
211 class TransformInteractHelperOldParams
212     : public TransformInteractHelper
213 {
214 public:
TransformInteractHelperOldParams(OFX::ImageEffect * effect,OFX::Interact * interact)215     TransformInteractHelperOldParams(OFX::ImageEffect* effect,
216                                      OFX::Interact* interact)
217         : TransformInteractHelper(effect, interact, true) {}
218 };
219 
220 typedef OverlayInteractFromHelper<TransformInteractHelperOldParams> TransformInteractOldParams;
221 
222 class TransformOverlayDescriptorOldParams
223     : public DefaultEffectOverlayDescriptor<TransformOverlayDescriptorOldParams, TransformInteractOldParams>
224 {
225 };
226 } // namespace OFX
227 #endif /* defined(openfx_supportext_ofxsTransformInteract_h) */
228