Fix crash on missing viewBox attribute on Pattern element

This commit is contained in:
Mikael Sand
2019-01-24 05:10:40 +02:00
parent b3d29c9045
commit 2a5dcdcd85
2 changed files with 21 additions and 11 deletions
@@ -118,16 +118,19 @@ class Brush {
double w = PropHelper.fromRelative(mPoints[2], width, offsetX, scale, textSize); double w = PropHelper.fromRelative(mPoints[2], width, offsetX, scale, textSize);
double h = PropHelper.fromRelative(mPoints[3], height, offsetY, 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( Bitmap bitmap = Bitmap.createBitmap(
(int) w, (int) w,
(int) h, (int) h,
Bitmap.Config.ARGB_8888); Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap); 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); mPattern.draw(canvas, new Paint(), opacity);
Matrix patternMatrix = new Matrix(); Matrix patternMatrix = new Matrix();
+13 -6
View File
@@ -117,12 +117,19 @@ void PatternFunction(void* info, CGContextRef context)
RNSVGPainter *_painter = (__bridge RNSVGPainter *)info; RNSVGPainter *_painter = (__bridge RNSVGPainter *)info;
RNSVGPattern *_pattern = [_painter pattern]; RNSVGPattern *_pattern = [_painter pattern];
CGRect rect = _painter.paintBounds; CGRect rect = _painter.paintBounds;
CGFloat minX = _pattern.minX;
CGAffineTransform _viewBoxTransform = [RNSVGViewBox getTransform:CGRectMake(_pattern.minX, _pattern.minY, _pattern.vbWidth, _pattern.vbHeight) CGFloat minY = _pattern.minY;
eRect:rect CGFloat vbWidth = _pattern.vbWidth;
align:_pattern.align CGFloat vbHeight = _pattern.vbHeight;
meetOrSlice:_pattern.meetOrSlice]; if (vbWidth > 0 && vbHeight > 0) {
CGContextConcatCTM(context, _viewBoxTransform); 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]; [_pattern renderTo:context rect:rect];
} }