From 2a5dcdcd85c8c9ad28bbf503e2d5a7c04226b6e8 Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Thu, 24 Jan 2019 05:10:40 +0200 Subject: [PATCH] Fix crash on missing viewBox attribute on Pattern element --- .../src/main/java/com/horcrux/svg/Brush.java | 13 ++++++++----- ios/Brushes/RNSVGPainter.m | 19 +++++++++++++------ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/Brush.java b/android/src/main/java/com/horcrux/svg/Brush.java index 0e8aed9d..699f8522 100644 --- a/android/src/main/java/com/horcrux/svg/Brush.java +++ b/android/src/main/java/com/horcrux/svg/Brush.java @@ -118,16 +118,19 @@ class Brush { double w = PropHelper.fromRelative(mPoints[2], width, offsetX, scale, textSize); double h = PropHelper.fromRelative(mPoints[3], height, offsetY, scale, textSize); - RectF vbRect = mPattern.getViewBox(); - RectF eRect = new RectF((float)x, (float)y, (float)w, (float)h); - Matrix mViewBoxMatrix = ViewBox.getTransform(vbRect, eRect, mPattern.mAlign, mPattern.mMeetOrSlice); - Bitmap bitmap = Bitmap.createBitmap( (int) w, (int) h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); - canvas.concat(mViewBoxMatrix); + + RectF vbRect = mPattern.getViewBox(); + if (vbRect != null && vbRect.width() > 0 && vbRect.height() > 0) { + RectF eRect = new RectF((float) x, (float) y, (float) w, (float) h); + Matrix mViewBoxMatrix = ViewBox.getTransform(vbRect, eRect, mPattern.mAlign, mPattern.mMeetOrSlice); + canvas.concat(mViewBoxMatrix); + } + mPattern.draw(canvas, new Paint(), opacity); Matrix patternMatrix = new Matrix(); diff --git a/ios/Brushes/RNSVGPainter.m b/ios/Brushes/RNSVGPainter.m index 0a10ed07..7c977ef7 100644 --- a/ios/Brushes/RNSVGPainter.m +++ b/ios/Brushes/RNSVGPainter.m @@ -117,12 +117,19 @@ void PatternFunction(void* info, CGContextRef context) RNSVGPainter *_painter = (__bridge RNSVGPainter *)info; RNSVGPattern *_pattern = [_painter pattern]; CGRect rect = _painter.paintBounds; - - CGAffineTransform _viewBoxTransform = [RNSVGViewBox getTransform:CGRectMake(_pattern.minX, _pattern.minY, _pattern.vbWidth, _pattern.vbHeight) - eRect:rect - align:_pattern.align - meetOrSlice:_pattern.meetOrSlice]; - CGContextConcatCTM(context, _viewBoxTransform); + CGFloat minX = _pattern.minX; + CGFloat minY = _pattern.minY; + CGFloat vbWidth = _pattern.vbWidth; + CGFloat vbHeight = _pattern.vbHeight; + if (vbWidth > 0 && vbHeight > 0) { + CGRect vbRect = CGRectMake(minX, minY, vbWidth, vbHeight); + CGAffineTransform _viewBoxTransform = [RNSVGViewBox + getTransform:vbRect + eRect:rect + align:_pattern.align + meetOrSlice:_pattern.meetOrSlice]; + CGContextConcatCTM(context, _viewBoxTransform); + } [_pattern renderTo:context rect:rect]; }