|
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