public override void DrawLayer(BitmapCanvas canvas, Matrix3X3 parentMatrix, byte parentAlpha) { var bitmap = Bitmap; if (bitmap == null) { return; } _paint.Alpha = parentAlpha; canvas.Save(); canvas.Concat(parentMatrix); RectExt.Set(ref _src, 0, 0, PixelWidth, PixelHeight); RectExt.Set(ref _dst, 0, 0, (int)(PixelWidth * _density), (int)(PixelHeight * _density)); canvas.DrawBitmap(bitmap, _src, _dst, _paint); canvas.Restore(); }
public override void DrawLayer(BitmapCanvas canvas, Matrix3X3 parentMatrix, byte parentAlpha) { canvas.Save(); if (!_lottieDrawable.UseTextGlyphs()) { canvas.SetMatrix(parentMatrix); } var documentData = _textAnimation.Value; if (!_composition.Fonts.TryGetValue(documentData.FontName, out var font)) { // Something is wrong. canvas.Restore(); return; } _fillPaint.Color = _colorAnimation?.Value ?? documentData.Color; _strokePaint.Color = _strokeColorAnimation?.Value ?? documentData.StrokeColor; var alpha = (byte)(Transform.Opacity.Value * 255 / 100f); _fillPaint.Alpha = alpha; _strokePaint.Alpha = alpha; if (_strokeWidthAnimation?.Value != null) { _strokePaint.StrokeWidth = _strokeWidthAnimation.Value.Value; } else { var parentScale = Utils.Utils.GetScale(parentMatrix); _strokePaint.StrokeWidth = documentData.StrokeWidth * Utils.Utils.DpScale() * parentScale; } if (_lottieDrawable.UseTextGlyphs()) { DrawTextGlyphs(documentData, parentMatrix, font, canvas); } else { DrawTextWithFont(documentData, font, parentMatrix, canvas); } canvas.Restore(); }
public override void DrawLayer(BitmapCanvas canvas, Matrix3X3 parentMatrix, byte parentAlpha) { var bitmap = Bitmap; if (bitmap == null) { return; } var density = Utils.Utils.DpScale(); _paint.Alpha = parentAlpha; if (_colorFilterAnimation != null) { _paint.ColorFilter = _colorFilterAnimation.Value; } canvas.Save(); canvas.Concat(parentMatrix); RectExt.Set(ref _src, 0, 0, PixelWidth, PixelHeight); RectExt.Set(ref _dst, 0, 0, (int)(PixelWidth * density), (int)(PixelHeight * density)); canvas.DrawBitmap(bitmap, _src, _dst, _paint); canvas.Restore(); }
public override void DrawLayer(BitmapCanvas canvas, Matrix3X3 parentMatrix, byte parentAlpha) { LottieLog.BeginSection("CompositionLayer.Draw"); canvas.Save(); RectExt.Set(ref _newClipRect, 0, 0, LayerModel.PreCompWidth, LayerModel.PreCompHeight); parentMatrix.MapRect(ref _newClipRect); for (var i = _layers.Count - 1; i >= 0; i--) { var nonEmptyClip = true; if (!_newClipRect.IsEmpty) { nonEmptyClip = canvas.ClipRect(_newClipRect); } if (nonEmptyClip) { var layer = _layers[i]; layer.Draw(canvas, parentMatrix, parentAlpha); } } canvas.Restore(); LottieLog.EndSection("CompositionLayer.Draw"); }
//public int Opacity //{ // get // { // return PixelFormat.TRANSLUCENT; // } //} public override void Render(RenderTarget target) { lock (this) { if (_bitmapCanvas == null) { return; } using (_bitmapCanvas.CreateSession(target.Size.Width, target.Size.Height, (DeviceContext)target)) { _bitmapCanvas.Clear(Color.Transparent); LottieLog.BeginSection("Drawable.Draw"); if (_compositionLayer == null) { return; } var scale = _scale; float extraScale = 1f; float maxScale = GetMaxScale(_bitmapCanvas); if (scale > maxScale) { scale = maxScale; extraScale = _scale / scale; } if (extraScale > 1) { // This is a bit tricky... // We can't draw on a canvas larger than ViewConfiguration.get(context).getScaledMaximumDrawingCacheSize() // which works out to be roughly the size of the screen because Android can't generate a // bitmap large enough to render to. // As a result, we cap the scale such that it will never be wider/taller than the screen // and then only render in the top left corner of the canvas. We then use extraScale // to scale up the rest of the scale. However, since we rendered the animation to the top // left corner, we need to scale up and translate the canvas to zoom in on the top left // corner. _bitmapCanvas.Save(); float halfWidth = (float)_composition.Bounds.Width / 2f; float halfHeight = (float)_composition.Bounds.Height / 2f; float scaledHalfWidth = halfWidth * scale; float scaledHalfHeight = halfHeight * scale; _bitmapCanvas.Translate( Scale * halfWidth - scaledHalfWidth, Scale * halfHeight - scaledHalfHeight); _bitmapCanvas.Scale(extraScale, extraScale, scaledHalfWidth, scaledHalfHeight); } _matrix.Reset(); _matrix = MatrixExt.PreScale(_matrix, scale, scale); _compositionLayer.Draw(_bitmapCanvas, _matrix, _alpha); LottieLog.EndSection("Drawable.Draw"); if (extraScale > 1) { //_bitmapCanvas.Restore(); _bitmapCanvas.RestoreAll(); } } } }