mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-08-16 02:44:58 +00:00
fix: getScreenCTM calculation
This commit is contained in:
@@ -189,6 +189,7 @@ class RNSVGRenderableManager extends ReactContextBaseJavaModule {
|
||||
RenderableView svg = RenderableViewManager.getRenderableViewByTag(tag);
|
||||
Matrix screenCTM = svg.mCTM;
|
||||
SvgView root = svg.getSvgView();
|
||||
float scale = svg.mScale;
|
||||
float[] values = new float[9];
|
||||
screenCTM.getValues(values);
|
||||
WritableMap result = Arguments.createMap();
|
||||
@@ -196,8 +197,8 @@ class RNSVGRenderableManager extends ReactContextBaseJavaModule {
|
||||
result.putDouble("b", values[Matrix.MSKEW_Y]);
|
||||
result.putDouble("c", values[Matrix.MSKEW_X]);
|
||||
result.putDouble("d", values[Matrix.MSCALE_Y]);
|
||||
result.putDouble("e", values[Matrix.MTRANS_X] + root.getLeft());
|
||||
result.putDouble("f", values[Matrix.MTRANS_Y] + root.getTop());
|
||||
result.putDouble("e", values[Matrix.MTRANS_X] + root.getLeft() / scale);
|
||||
result.putDouble("f", values[Matrix.MTRANS_Y] + root.getTop() / scale);
|
||||
successCallback.invoke(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
@property (nonatomic, assign) CGRect boundingBox;
|
||||
@property (nonatomic, assign) CGAffineTransform initialCTM;
|
||||
@property (nonatomic, assign) CGAffineTransform invInitialCTM;
|
||||
@property (nonatomic, assign) CGAffineTransform viewBoxTransform;
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
NSMutableDictionary<NSString *, RNSVGPainter *> *_painters;
|
||||
NSMutableDictionary<NSString *, RNSVGNode *> *_markers;
|
||||
NSMutableDictionary<NSString *, RNSVGNode *> *_masks;
|
||||
CGAffineTransform _viewBoxTransform;
|
||||
CGAffineTransform _invviewBoxTransform;
|
||||
bool rendered;
|
||||
}
|
||||
|
||||
@@ -226,12 +226,12 @@ RCT_EXPORT_METHOD(getCTM:(nonnull NSNumber *)reactTag callback:(RCTResponseSende
|
||||
callback(
|
||||
@[
|
||||
@{
|
||||
@"a":n(ctm.a),
|
||||
@"b":n(ctm.b),
|
||||
@"c":n(ctm.c),
|
||||
@"d":n(ctm.d),
|
||||
@"e":n(ctm.tx),
|
||||
@"f":n(ctm.ty)
|
||||
@"a":@(ctm.a),
|
||||
@"b":@(ctm.b),
|
||||
@"c":@(ctm.c),
|
||||
@"d":@(ctm.d),
|
||||
@"e":@(ctm.tx),
|
||||
@"f":@(ctm.ty)
|
||||
}
|
||||
]
|
||||
);
|
||||
@@ -242,25 +242,24 @@ RCT_EXPORT_METHOD(getCTM:(nonnull NSNumber *)reactTag callback:(RCTResponseSende
|
||||
attempt:0];
|
||||
}
|
||||
|
||||
static NSNumber *n(CGFloat af) {
|
||||
return [NSNumber numberWithDouble:af];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getScreenCTM:(nonnull NSNumber *)reactTag callback:(RCTResponseSenderBlock)callback)
|
||||
{
|
||||
[self
|
||||
withTag:reactTag
|
||||
success:^(RNSVGRenderable *svg){
|
||||
CGAffineTransform ctm = svg.screenCTM;
|
||||
RNSVGSvgView* root = svg.svgView;
|
||||
CGAffineTransform viewbox = [root getViewBoxTransform];
|
||||
CGAffineTransform ctm = CGAffineTransformConcat(svg.ctm, viewbox);
|
||||
CGPoint offset = [root convertPoint:CGPointZero toView:svg.window];
|
||||
callback(
|
||||
@[
|
||||
@{
|
||||
@"a":n(ctm.a),
|
||||
@"b":n(ctm.b),
|
||||
@"c":n(ctm.c),
|
||||
@"d":n(ctm.d),
|
||||
@"e":n(ctm.tx),
|
||||
@"f":n(ctm.ty)
|
||||
@"a":@(ctm.a),
|
||||
@"b":@(ctm.b),
|
||||
@"c":@(ctm.c),
|
||||
@"d":@(ctm.d),
|
||||
@"e":@(ctm.tx + offset.x),
|
||||
@"f":@(ctm.ty + offset.y)
|
||||
}
|
||||
]
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user