Skip to content

Commit b242a33

Browse files
authored
Added more merge optimizer options and moved optimizer call for LottieViewer (#460)
1 parent 76d04c3 commit b242a33

File tree

3 files changed

+95
-19
lines changed

3 files changed

+95
-19
lines changed

source/Lottie/Loader.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Threading.Tasks;
1313
using Microsoft.Toolkit.Uwp.UI.Lottie.CompMetadata;
1414
using Microsoft.Toolkit.Uwp.UI.Lottie.LottieData;
15+
using Microsoft.Toolkit.Uwp.UI.Lottie.LottieData.Optimization;
1516
using Microsoft.Toolkit.Uwp.UI.Lottie.LottieData.Serialization;
1617
using Microsoft.Toolkit.Uwp.UI.Lottie.LottieToWinComp;
1718
using Windows.Foundation.Metadata;
@@ -84,6 +85,11 @@ await Task.Run(() =>
8485
LottieCompositionReader.Options.IgnoreMatchNames,
8586
out var readerIssues);
8687

88+
if (lottieComposition is not null)
89+
{
90+
lottieComposition = LottieMergeOptimizer.Optimize(lottieComposition);
91+
}
92+
8793
if (diagnostics is not null)
8894
{
8995
diagnostics.JsonParsingIssues = ToIssues(readerIssues);

source/LottieData/Optimization/Experimental/MergeHelper.cs

Lines changed: 89 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,82 @@ MergeResult<Path> MergePaths(Path a, TimeRange aRange, Path b, TimeRange bRange)
374374
return new MergeResult<Path>(new Path(args, a.DrawingDirection, geometryData.Value!));
375375
}
376376

377+
MergeResult<Rectangle> MergeRectangles(Rectangle a, TimeRange aRange, Rectangle b, TimeRange bRange)
378+
{
379+
if (a.BlendMode != b.BlendMode || a.DrawingDirection != b.DrawingDirection)
380+
{
381+
return MergeResult<Rectangle>.Failed;
382+
}
383+
384+
var args = new ShapeLayerContentArgs
385+
{
386+
Name = $"{a.Name} {b.Name}",
387+
MatchName = $"{a.MatchName}{b.MatchName}",
388+
BlendMode = a.BlendMode,
389+
};
390+
391+
var position = MergeIAnimatableVector3(a.Position, aRange, b.Position, bRange);
392+
var size = MergeIAnimatableVector3(a.Size, aRange, b.Size, bRange);
393+
var roundness = MergeAnimatable(a.Roundness, aRange, b.Roundness, bRange);
394+
395+
if (!position.Success || !size.Success || !roundness.Success)
396+
{
397+
return MergeResult<Rectangle>.Failed;
398+
}
399+
400+
return new MergeResult<Rectangle>(new Rectangle(args, a.DrawingDirection, position.Value!, size.Value!, roundness.Value!));
401+
}
402+
403+
MergeResult<TrimPath> MergeTrimPaths(TrimPath a, TimeRange aRange, TrimPath b, TimeRange bRange)
404+
{
405+
if (a.BlendMode != b.BlendMode || a.TrimPathType != b.TrimPathType)
406+
{
407+
return MergeResult<TrimPath>.Failed;
408+
}
409+
410+
var args = new ShapeLayerContentArgs
411+
{
412+
Name = $"{a.Name} {b.Name}",
413+
MatchName = $"{a.MatchName}{b.MatchName}",
414+
BlendMode = a.BlendMode,
415+
};
416+
417+
var start = MergeAnimatable(a.Start, aRange, b.Start, bRange);
418+
var end = MergeAnimatable(a.End, aRange, b.End, bRange);
419+
var offset = MergeAnimatable(a.Offset, aRange, b.Offset, bRange);
420+
421+
if (!start.Success || !end.Success || !offset.Success)
422+
{
423+
return MergeResult<TrimPath>.Failed;
424+
}
425+
426+
return new MergeResult<TrimPath>(new TrimPath(args, a.TrimPathType, start.Value!, end.Value!, offset.Value!));
427+
}
428+
429+
MergeResult<RoundCorners> MergeRoundCorners(RoundCorners a, TimeRange aRange, RoundCorners b, TimeRange bRange)
430+
{
431+
if (a.BlendMode != b.BlendMode)
432+
{
433+
return MergeResult<RoundCorners>.Failed;
434+
}
435+
436+
var args = new ShapeLayerContentArgs
437+
{
438+
Name = $"{a.Name} {b.Name}",
439+
MatchName = $"{a.MatchName}{b.MatchName}",
440+
BlendMode = a.BlendMode,
441+
};
442+
443+
var radius = MergeAnimatable(a.Radius, aRange, b.Radius, bRange);
444+
445+
if (!radius.Success)
446+
{
447+
return MergeResult<RoundCorners>.Failed;
448+
}
449+
450+
return new MergeResult<RoundCorners>(new RoundCorners(args, radius.Value!));
451+
}
452+
377453
MergeResult<Ellipse> MergeEllipses(Ellipse a, TimeRange aRange, Ellipse b, TimeRange bRange)
378454
{
379455
if (a.BlendMode != b.BlendMode || a.DrawingDirection != b.DrawingDirection)
@@ -508,20 +584,26 @@ MergeResult<ShapeLayerContent> MergeShapeLayerContents(ShapeLayerContent a, Time
508584

509585
switch (a.ContentType)
510586
{
511-
case ShapeContentType.Group:
512-
return MergeResult<ShapeLayerContent>.From(MergeShapeGroup((ShapeGroup)a, aRange, (ShapeGroup)b, bRange));
513-
case ShapeContentType.Path:
514-
return MergeResult<ShapeLayerContent>.From(MergePaths((Path)a, aRange, (Path)b, bRange));
515587
case ShapeContentType.Ellipse:
516588
return MergeResult<ShapeLayerContent>.From(MergeEllipses((Ellipse)a, aRange, (Ellipse)b, bRange));
589+
case ShapeContentType.Group:
590+
return MergeResult<ShapeLayerContent>.From(MergeShapeGroup((ShapeGroup)a, aRange, (ShapeGroup)b, bRange));
517591
case ShapeContentType.LinearGradientFill:
518592
return MergeResult<ShapeLayerContent>.From(MergeLinearGradientFills((LinearGradientFill)a, aRange, (LinearGradientFill)b, bRange));
519-
case ShapeContentType.Transform:
520-
return MergeResult<ShapeLayerContent>.From(MergeTransform((Transform)a, aRange, (Transform)b, bRange));
593+
case ShapeContentType.Path:
594+
return MergeResult<ShapeLayerContent>.From(MergePaths((Path)a, aRange, (Path)b, bRange));
595+
case ShapeContentType.Rectangle:
596+
return MergeResult<ShapeLayerContent>.From(MergeRectangles((Rectangle)a, aRange, (Rectangle)b, bRange));
597+
case ShapeContentType.RoundCorners:
598+
return MergeResult<ShapeLayerContent>.From(MergeRoundCorners((RoundCorners)a, aRange, (RoundCorners)b, bRange));
521599
case ShapeContentType.SolidColorFill:
522600
return MergeResult<ShapeLayerContent>.From(MergeSolidColorFills((SolidColorFill)a, aRange, (SolidColorFill)b, bRange));
523601
case ShapeContentType.SolidColorStroke:
524602
return MergeResult<ShapeLayerContent>.From(MergeSolidColorStrokes((SolidColorStroke)a, aRange, (SolidColorStroke)b, bRange));
603+
case ShapeContentType.Transform:
604+
return MergeResult<ShapeLayerContent>.From(MergeTransform((Transform)a, aRange, (Transform)b, bRange));
605+
case ShapeContentType.TrimPath:
606+
return MergeResult<ShapeLayerContent>.From(MergeTrimPaths((TrimPath)a, aRange, (TrimPath)b, bRange));
525607
}
526608

527609
return MergeResult<ShapeLayerContent>.Failed;
@@ -678,16 +760,6 @@ MergeResult<Asset> MergeAssets(Asset a, TimeRange aParentRange, Asset b, TimeRan
678760

679761
public MergeResult<LayerGroup> MergeLayerGroups(LayerGroup a, LayerGroup b)
680762
{
681-
if (a.MainLayer is PreCompLayer || b.MainLayer is PreCompLayer)
682-
{
683-
return MergeResult<LayerGroup>.Failed;
684-
}
685-
686-
if (a.MatteLayer is PreCompLayer || b.MatteLayer is PreCompLayer)
687-
{
688-
return MergeResult<LayerGroup>.Failed;
689-
}
690-
691763
if (!a.CanBeMerged || !b.CanBeMerged)
692764
{
693765
return MergeResult<LayerGroup>.Failed;
@@ -836,7 +908,7 @@ MergeResult<PreCompLayer> MergePreCompLayers(PreCompLayer a, PreCompLayer b)
836908

837909
var bAsset = GetAssetById(b.RefId);
838910

839-
if (aAsset is not LayerCollectionAsset || bAsset is not LayerCollectionAsset || aAsset == bAsset)
911+
if (aAsset is not LayerCollectionAsset || bAsset is not LayerCollectionAsset)
840912
{
841913
return MergeResult<PreCompLayer>.Failed;
842914
}

source/LottieReader/Serialization/LottieCompositionReader.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,6 @@ LottieComposition ParseLottieComposition(ref Reader reader)
288288
layers: new LayerCollection(layers),
289289
markers: markers);
290290

291-
result = LottieMergeOptimizer.Optimize(result);
292-
293291
return result;
294292
}
295293

0 commit comments

Comments
 (0)