|
1 | 1 | import 'dart:math' hide log; |
2 | | -import 'dart:ui' as ui; |
3 | 2 |
|
4 | 3 | import 'package:codelessly_api/codelessly_api.dart'; |
5 | 4 | import 'package:collection/collection.dart'; |
6 | 5 | import 'package:flutter/material.dart'; |
7 | | -import 'package:flutter/rendering.dart'; |
8 | 6 | import 'package:vector_math/vector_math_64.dart' as vec_math; |
9 | 7 |
|
10 | 8 | import '../../../codelessly_sdk.dart'; |
@@ -580,7 +578,7 @@ List<Widget> buildFills( |
580 | 578 | for (final model in node.fills.reversed) { |
581 | 579 | final index = node.fills.indexOf(model); |
582 | 580 | if (!model.visible) continue; |
583 | | - if (model.blendMode != BlendModeC.srcOver) { |
| 581 | + if (settings.withBlendModes && model.blendMode != BlendModeC.srcOver) { |
584 | 582 | lastBlendTree.add(model); |
585 | 583 | continue; |
586 | 584 | } |
@@ -608,9 +606,9 @@ List<Widget> buildFills( |
608 | 606 | for (final paint in lastBlendTree.reversed) |
609 | 607 | if (paint.visible) |
610 | 608 | Positioned.fill( |
611 | | - child: PaintBlendMask( |
612 | | - model: paint, |
613 | | - image: null, |
| 609 | + child: BlendMask( |
| 610 | + key: ObjectKey(paint.blendMode), |
| 611 | + blendMode: paint.blendMode.flutterBlendMode, |
614 | 612 | child: buildFill( |
615 | 613 | node, |
616 | 614 | index: node.fills.indexOf(paint), |
@@ -827,129 +825,3 @@ class RelativeTransform { |
827 | 825 | skew: skew ?? this.skew, |
828 | 826 | ); |
829 | 827 | } |
830 | | - |
831 | | -class BlendMask extends SingleChildRenderObjectWidget { |
832 | | - final List<BlendMode> blendModes; |
833 | | - final double opacity; |
834 | | - |
835 | | - const BlendMask({ |
836 | | - required this.blendModes, |
837 | | - this.opacity = 1.0, |
838 | | - super.key, |
839 | | - required Widget super.child, |
840 | | - }); |
841 | | - |
842 | | - @override |
843 | | - RenderObject createRenderObject(context) => |
844 | | - RenderBlendMask(blendModes, opacity); |
845 | | - |
846 | | - @override |
847 | | - void updateRenderObject(BuildContext context, RenderBlendMask renderObject) { |
848 | | - renderObject.blendModes = blendModes; |
849 | | - renderObject.opacity = opacity; |
850 | | - } |
851 | | -} |
852 | | - |
853 | | -class RenderBlendMask extends RenderProxyBox { |
854 | | - List<BlendMode> blendModes; |
855 | | - double opacity; |
856 | | - |
857 | | - RenderBlendMask(this.blendModes, this.opacity); |
858 | | - |
859 | | - @override |
860 | | - void paint(context, offset) { |
861 | | - // Complex blend modes can be raster cached incorrectly on the Skia backend. |
862 | | - // context.setWillChangeHint(); |
863 | | - for (var blend in blendModes) { |
864 | | - context.canvas.saveLayer( |
865 | | - offset & size, |
866 | | - Paint() |
867 | | - ..blendMode = blend |
868 | | - ..color = Color.fromARGB((opacity * 255).round(), 255, 255, 255), |
869 | | - ); |
870 | | - } |
871 | | - super.paint(context, offset); |
872 | | - context.canvas.restore(); |
873 | | - } |
874 | | -} |
875 | | - |
876 | | -class PaintBlendMask extends SingleChildRenderObjectWidget { |
877 | | - final PaintModel _model; |
878 | | - final ui.Image? _image; |
879 | | - |
880 | | - const PaintBlendMask({ |
881 | | - required PaintModel model, |
882 | | - ui.Image? image, |
883 | | - super.key, |
884 | | - super.child, |
885 | | - }) : _model = model, |
886 | | - _image = image; |
887 | | - |
888 | | - @override |
889 | | - RenderObject createRenderObject(context) { |
890 | | - return RenderPaintBlendMask(_model, _image); |
891 | | - } |
892 | | - |
893 | | - @override |
894 | | - void updateRenderObject( |
895 | | - BuildContext context, RenderPaintBlendMask renderObject) { |
896 | | - renderObject._model = _model; |
897 | | - renderObject._image = _image; |
898 | | - } |
899 | | -} |
900 | | - |
901 | | -class RenderPaintBlendMask extends RenderProxyBox { |
902 | | - PaintModel _model; |
903 | | - ui.Image? _image; |
904 | | - |
905 | | - RenderPaintBlendMask(PaintModel model, ui.Image? image) |
906 | | - : _model = model, |
907 | | - _image = image; |
908 | | - |
909 | | - Paint makePaint(Rect bounds) { |
910 | | - Paint paint = Paint()..blendMode = _model.blendMode.flutterBlendMode; |
911 | | - |
912 | | - switch (_model.type) { |
913 | | - case PaintType.solid: |
914 | | - Color? color = _model.toFlutterColor(); |
915 | | - if (color != null) { |
916 | | - paint.color = color; |
917 | | - } |
918 | | - case PaintType.gradientLinear: |
919 | | - case PaintType.gradientRadial: |
920 | | - case PaintType.gradientAngular: |
921 | | - case PaintType.gradientDiamond: |
922 | | - paint.shader = retrieveGradient(_model)?.createShader(bounds); |
923 | | - case PaintType.image: |
924 | | - if (_image case ui.Image image) { |
925 | | - paint.shader = ImageShader( |
926 | | - image, |
927 | | - TileMode.clamp, |
928 | | - TileMode.clamp, |
929 | | - Matrix4.identity().storage, |
930 | | - ); |
931 | | - } |
932 | | - case PaintType.emoji: |
933 | | - break; |
934 | | - } |
935 | | - |
936 | | - return paint; |
937 | | - } |
938 | | - |
939 | | - @override |
940 | | - void paint(context, offset) { |
941 | | - // Complex blend modes can be raster cached incorrectly on the Skia backend. |
942 | | - // context.setWillChangeHint(); |
943 | | - context.canvas.saveLayer( |
944 | | - offset & size, |
945 | | - // makePaint(offset & size), |
946 | | - Paint() |
947 | | - ..blendMode = _model.blendMode.flutterBlendMode |
948 | | - ..color = Colors.white, |
949 | | - ); |
950 | | - |
951 | | - super.paint(context, offset); |
952 | | - |
953 | | - context.canvas.restore(); |
954 | | - } |
955 | | -} |
0 commit comments