34
34
#include " ofxsMultiPlane.h"
35
35
#include " ofxsImageEffect.h"
36
36
37
- // cairo helper functions
37
+ // transform helper
38
+ #include " ofxsTransform3x3.h"
39
+ #include " ofxsTransformInteract.h"
40
+
41
+ // cairo helper
38
42
#include " CairoHelper.h"
39
43
40
44
#define kPluginName " ReadSVG"
54
58
#define kParamDpiHint " Dots-per-inch (90 is default)"
55
59
#define kParamDpiDefault 90
56
60
57
- #define kParamPivot " pivot"
58
- #define kParamPivotLabel " Pivot"
59
- #define kParamPivotHint " Apply origin on transform, else center of image."
60
- #define kParamPivotDefault false
61
-
62
- #define kParamOrigin " origin"
63
- #define kParamOriginLabel " Origin"
64
- #define kParamOriginHint " Origin for transform."
65
- #define kParamOriginDefault 0 .
66
-
67
- #define kParamScale " scale"
68
- #define kParamScaleLabel " Scale"
69
- #define kParamScaleHint " Transform scale."
70
- #define kParamScaleDefault 1 .
71
-
72
- #define kParamSkew " skew"
73
- #define kParamSkewLabel " Skew"
74
- #define kParamSkewHint " Transform skew."
75
- #define kParamSkewDefault 0 .
76
-
77
- #define kParamRotate " rotate"
78
- #define kParamRotateLabel " Rotate"
79
- #define kParamRotateHint " Rotate the surface."
80
- #define kParamRotateDefault 0 .
61
+ #define kParamTranslateEnabled " translateEnabled"
62
+ #define kParamTranslateEnabledLabel " Translate"
63
+ #define kParamTranslateEnabledHint " Enable translate."
64
+ #define kParamTranslateEnabledDefault false
81
65
82
66
#define kSupportsRGBA true
83
67
#define kSupportsRGB false
@@ -179,12 +163,16 @@ class ReadSVGPlugin : public GenericReaderPlugin
179
163
int *componentCount) OVERRIDE FINAL;
180
164
virtual void changedFilename (const OFX::InstanceChangedArgs &args) OVERRIDE FINAL;
181
165
void getLayers (xmlNode *node, std::vector<std::string> *layers);
182
- OFX::IntParam *_dpi;
183
- OFX::BooleanParam *_pivot;
184
- OFX::Double2DParam *_origin;
185
- OFX::Double2DParam *_scale;
186
- OFX::Double2DParam *_skew;
187
- OFX::DoubleParam *_rotate;
166
+ IntParam *_dpi;
167
+ BooleanParam *_translateEnabled;
168
+ Double2DParam* _translate;
169
+ DoubleParam* _rotate;
170
+ Double2DParam* _scale;
171
+ BooleanParam* _scaleUniform;
172
+ DoubleParam* _skewX;
173
+ DoubleParam* _skewY;
174
+ ChoiceParam* _skewOrder;
175
+ Double2DParam* _center;
188
176
std::vector<std::string> imageLayers;
189
177
};
190
178
@@ -203,20 +191,29 @@ ReadSVGPlugin::ReadSVGPlugin(OfxImageEffectHandle handle,
203
191
false
204
192
#endif
205
193
)
206
- ,_dpi(nullptr )
207
- , _pivot(nullptr )
208
- , _origin(nullptr )
209
- , _scale(nullptr )
210
- , _skew(nullptr )
194
+ , _dpi(nullptr )
195
+ , _translateEnabled(nullptr )
196
+ , _translate(nullptr )
211
197
, _rotate(nullptr )
198
+ , _scale(nullptr )
199
+ , _scaleUniform(nullptr )
200
+ , _skewX(nullptr )
201
+ , _skewY(nullptr )
202
+ , _skewOrder(nullptr )
203
+ , _center(nullptr )
212
204
{
213
205
_dpi = fetchIntParam (kParamDpi );
214
- _pivot = fetchBooleanParam (kParamPivot );
215
- _origin = fetchDouble2DParam (kParamOrigin );
216
- _scale = fetchDouble2DParam (kParamScale );
217
- _skew = fetchDouble2DParam (kParamSkew );
218
- _rotate = fetchDoubleParam (kParamRotate );
219
- assert (_dpi && _pivot && _origin && _scale && _skew && _rotate);
206
+ _translateEnabled = fetchBooleanParam (kParamTranslateEnabled );
207
+ assert (_dpi && _translateEnabled);
208
+
209
+ _translate = fetchDouble2DParam (kParamTransformTranslateOld );
210
+ _rotate = fetchDoubleParam (kParamTransformRotateOld );
211
+ _scale = fetchDouble2DParam (kParamTransformScaleOld );
212
+ _scaleUniform = fetchBooleanParam (kParamTransformScaleUniformOld );
213
+ _skewX = fetchDoubleParam (kParamTransformSkewXOld );
214
+ _skewY = fetchDoubleParam (kParamTransformSkewYOld );
215
+ _skewOrder = fetchChoiceParam (kParamTransformSkewOrderOld );
216
+ _center = fetchDouble2DParam (kParamTransformCenterOld );
220
217
}
221
218
222
219
ReadSVGPlugin::~ReadSVGPlugin ()
@@ -353,19 +350,22 @@ ReadSVGPlugin::decodePlane(const std::string& filename,
353
350
cairo_surface_t *surface;
354
351
cairo_t *cr;
355
352
cairo_status_t status;
356
- double imageWidth, imageHeight, scaleWidth, scaleHeight, originX, originY, scaleX, scaleY, skewX, skewY, rotate;
357
- int dpi, width, height, renderWidth, renderHeight;
358
- bool pivot;
353
+ double imageWidth, imageHeight, scaleWidth, scaleHeight;
354
+ double translateX, translateY, rotate, scaleX, scaleY, skewX, skewY, centerX, centerY;
355
+ int dpi, width, height, renderWidth, renderHeight, skewO;
356
+ bool scaleUniform, translateEnabled;
359
357
360
358
_dpi->getValueAtTime (time, dpi);
361
- _pivot->getValueAtTime (time, pivot);
362
- _origin->getValueAtTime (time, originX, originY);
363
- _scale->getValueAtTime (time, scaleX, scaleY);
364
- _skew->getValueAtTime (time, skewX, skewY);
365
- _rotate->getValueAtTime (time, rotate);
359
+ _translateEnabled->getValueAtTime (time, translateEnabled);
366
360
367
- bool hasTransform = (pivot || scaleX != 1 . || scaleY != 1 . || skewX != 0 . || skewY != 0 . || rotate != 0 .);
368
- bool hasDpi = (dpi != kParamDpiDefault );
361
+ _translate->getValueAtTime (time, translateX, translateY);
362
+ _rotate->getValueAtTime (time, rotate);
363
+ _scale->getValueAtTime (time, scaleX, scaleY);
364
+ _scaleUniform->getValueAtTime (time, scaleUniform);
365
+ _skewX->getValueAtTime (time, skewX);
366
+ _skewY->getValueAtTime (time, skewY);;
367
+ _skewOrder->getValueAtTime (time, skewO);
368
+ _center->getValueAtTime (time, centerX, centerY);
369
369
370
370
// load svg
371
371
handle = rsvg_handle_new_from_file (filename.c_str (), &error);
@@ -384,15 +384,14 @@ ReadSVGPlugin::decodePlane(const std::string& filename,
384
384
renderWidth= renderWindow.x2 - renderWindow.x1 ;
385
385
renderHeight= renderWindow.y2 - renderWindow.y1 ;
386
386
387
- if (hasDpi ) {
387
+ if (dpi != kParamDpiDefault ) {
388
388
width = imageWidth * dpi / kParamDpiDefault ;
389
389
height = imageHeight * dpi / kParamDpiDefault ;
390
390
}
391
391
else {
392
392
width = imageWidth;
393
393
height = imageHeight;
394
394
}
395
-
396
395
if (width != renderWidth || height != renderHeight) {
397
396
setPersistentMessage (OFX::Message::eMessageError, " " , " Image don't match RenderWindow" );
398
397
OFX::throwSuiteStatusException (kOfxStatErrFormat );
@@ -410,19 +409,14 @@ ReadSVGPlugin::decodePlane(const std::string& filename,
410
409
CairoHelper::applyScale (cr, {scaleWidth, scaleHeight});
411
410
412
411
// transform
413
- if (hasTransform) {
414
- if (!pivot) {
415
- originX = hasDpi ? width / scaleWidth / 2 . : width / 2 .;
416
- originY = hasDpi ? height / scaleHeight / 2 . : height / 2 .;
417
- } else {
418
- // TODO
419
- }
420
- CairoHelper::applyTransform (cr, {{originX, originY},
421
- {scaleX, scaleY},
422
- {skewX, skewY},
423
- rotate,
424
- pivot});
425
- }
412
+ CairoHelper::applyTransform (cr, {{translateX, translateY},
413
+ {(translateEnabled ? translateX : centerX),
414
+ (translateEnabled ? translateY : centerY)},
415
+ {scaleX, scaleY},
416
+ {(skewO == 1 ? skewY : skewX),
417
+ (skewO == 1 ? skewX : skewY)},
418
+ rotate,
419
+ translateEnabled});
426
420
427
421
// render svg
428
422
if (layerID.empty ()) {
@@ -629,6 +623,9 @@ ReadSVGPluginFactory::describe(OFX::ImageEffectDescriptor &desc)
629
623
kIsMultiPlanar );
630
624
desc.setLabel (kPluginName );
631
625
desc.setPluginDescription (kPluginDescription );
626
+
627
+ Transform3x3Describe (desc, true );
628
+ desc.setOverlayInteractDescriptor (new TransformOverlayDescriptorOldParams);
632
629
}
633
630
634
631
/* * @brief The describe in context function, passed a plugin descriptor and a context */
@@ -655,67 +652,25 @@ ReadSVGPluginFactory::describeInContext(OFX::ImageEffectDescriptor &desc,
655
652
param->setDisplayRange (1 , 500 );
656
653
param->setDefault (kParamDpiDefault );
657
654
param->setAnimates (false );
658
- param->setLayoutHint (OFX::eLayoutHintDivider);
659
- if (page) { page->addChild (*param); }
660
- }
661
- {
662
- BooleanParamDescriptor* param = desc.defineBooleanParam (kParamPivot );
663
- param->setLabel (kParamPivotLabel );
664
- param->setHint (kParamPivotHint );
665
- param->setDefault (kParamPivotDefault );
666
- param->setAnimates (false );
667
655
param->setLayoutHint (OFX::eLayoutHintNoNewLine);
668
656
if (page) { page->addChild (*param); }
669
657
}
670
658
{
671
- Double2DParamDescriptor* param = desc.defineDouble2DParam (kParamOrigin );
672
- param->setLabel (kParamOriginLabel );
673
- param->setHint (kParamOriginHint );
674
- param->setRange (INT_MIN, INT_MIN,
675
- INT_MAX, INT_MAX);
676
- param->setDisplayRange (-1000 , -1000 ,
677
- 1000 , 1000 );
678
- param->setDefault (kParamOriginDefault ,
679
- kParamOriginDefault );
680
- param->setAnimates (true );
681
- if (page) { page->addChild (*param); }
682
- }
683
- {
684
- Double2DParamDescriptor* param = desc.defineDouble2DParam (kParamScale );
685
- param->setLabel (kParamScaleLabel );
686
- param->setHint (kParamScaleHint );
687
- param->setRange (INT_MIN, INT_MIN,
688
- INT_MAX, INT_MAX);
689
- param->setDisplayRange (-5 , -5 ,
690
- 5 , 5 );
691
- param->setDefault (kParamScaleDefault ,
692
- kParamScaleDefault );
693
- param->setAnimates (true );
694
- if (page) { page->addChild (*param); }
695
- }
696
- {
697
- Double2DParamDescriptor* param = desc.defineDouble2DParam (kParamSkew );
698
- param->setLabel (kParamSkewLabel );
699
- param->setHint (kParamSkewHint );
700
- param->setRange (INT_MIN, INT_MIN,
701
- INT_MAX, INT_MAX);
702
- param->setDisplayRange (-5 , -5 ,
703
- 5 , 5 );
704
- param->setDefault (kParamSkewDefault ,
705
- kParamSkewDefault );
706
- param->setAnimates (true );
707
- if (page) { page->addChild (*param); }
708
- }
709
- {
710
- DoubleParamDescriptor* param = desc.defineDoubleParam (kParamRotate );
711
- param->setLabel (kParamRotateLabel );
712
- param->setHint (kParamRotateHint );
713
- param->setRange (-360 ., 360 .);
714
- param->setDefault (kParamRotateDefault );
715
- param->setAnimates (true );
659
+ BooleanParamDescriptor* param = desc.defineBooleanParam (kParamTranslateEnabled );
660
+ param->setLabel (kParamTranslateEnabledLabel );
661
+ param->setHint (kParamTranslateEnabledHint );
662
+ param->setDefault (kParamTranslateEnabledDefault );
663
+ param->setAnimates (false );
716
664
param->setLayoutHint (OFX::eLayoutHintDivider);
717
665
if (page) { page->addChild (*param); }
718
666
}
667
+ ofxsTransformDescribeParams (desc,
668
+ page,
669
+ NULL ,
670
+ true ,
671
+ true ,
672
+ false ,
673
+ false );
719
674
GenericReaderDescribeInContextEnd (desc,
720
675
context,
721
676
page,
0 commit comments