Skip to content

Commit d163ea8

Browse files
authored
Expose animation metadata in generated code (#411)
Expose Lottie frame information. This is needed by some folks who are dealing with frame numbers on other platforms.
1 parent 0b69c0c commit d163ea8

File tree

3 files changed

+210
-3
lines changed

3 files changed

+210
-3
lines changed

source/UIDataCodeGen/CodeGen/CSharp/CSharpInstantiatorGenerator.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,15 @@ protected override void WriteImplementationFileStart(CodeBuilder builder)
159159

160160
builder.WriteLine();
161161

162+
WriteFrameCountPropertyImpl(builder);
163+
builder.WriteLine();
164+
165+
WriteFrameratePropertyImpl(builder);
166+
builder.WriteLine();
167+
168+
WriteDurationPropertyImpl(builder);
169+
builder.WriteLine();
170+
162171
WriteFrameToProgressImpl(builder);
163172
builder.WriteLine();
164173

@@ -584,12 +593,39 @@ void WriteIDynamicAnimatedVisualSource(CodeBuilder builder)
584593
builder.CloseScope();
585594
}
586595

596+
/// <summary>
597+
/// Generates the FrameCount property implementation.
598+
/// </summary>
599+
void WriteFrameCountPropertyImpl(CodeBuilder builder)
600+
{
601+
builder.WriteSummaryComment("Gets the number of frames in the animation.");
602+
builder.WriteLine($"public readonly double FrameCount => {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.Frames)};");
603+
}
604+
605+
/// <summary>
606+
/// Generates the Framerate property implementation.
607+
/// </summary>
608+
void WriteFrameratePropertyImpl(CodeBuilder builder)
609+
{
610+
builder.WriteSummaryComment("Gets the frame rate of the animation.");
611+
builder.WriteLine($"public readonly double Framerate => {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.FPS)};");
612+
}
613+
614+
/// <summary>
615+
/// Generates the Duration property implementation.
616+
/// </summary>
617+
void WriteDurationPropertyImpl(CodeBuilder builder)
618+
{
619+
builder.WriteSummaryComment("Gets the duration of the animation.");
620+
builder.WriteLine($"public readonly TimeSpan Duration => {_s.TimeSpan(SourceInfo.SourceMetadata.LottieMetadata.Duration.Time)};");
621+
}
622+
587623
/// <summary>
588624
/// Generates the FrameToProgress(...) implementation.
589625
/// </summary>
590626
void WriteFrameToProgressImpl(CodeBuilder builder)
591627
{
592-
builder.WriteSummaryComment("Converts a frame number to the corresponding progress value.");
628+
builder.WriteSummaryComment("Converts a zero-based frame number to the corresponding progress value denoting the start of the frame.");
593629
builder.WriteLine($"public double FrameToProgress(double frameNumber)");
594630
builder.OpenScope();
595631
builder.WriteLine($"return frameNumber / {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.Frames)};");

source/UIDataCodeGen/CodeGen/Cppwinrt/CppwinrtInstantiatorGenerator.cs

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,18 @@ string GenerateHeaderText()
225225

226226
builder.Class.Public.WriteLine();
227227

228+
WriteFrameCountDecl(builder.Class.Public);
229+
230+
builder.Class.Public.WriteLine();
231+
232+
WriteFramerateDecl(builder.Class.Public);
233+
234+
builder.Class.Public.WriteLine();
235+
236+
WriteDurationDecl(builder.Class.Public);
237+
238+
builder.Class.Public.WriteLine();
239+
228240
WriteFrameToProgressDecl(builder.Class.Public);
229241

230242
builder.Class.Public.WriteLine();
@@ -826,6 +838,18 @@ protected override void WriteImplementationFileEnd(CodeBuilder builder)
826838

827839
builder.WriteLine();
828840

841+
WriteFrameCountImpl(builder);
842+
843+
builder.WriteLine();
844+
845+
WriteFramerateImpl(builder);
846+
847+
builder.WriteLine();
848+
849+
WriteDurationImpl(builder);
850+
851+
builder.WriteLine();
852+
829853
WriteFrameToProgressImpl(builder);
830854

831855
builder.WriteLine();
@@ -845,12 +869,72 @@ protected override void WriteImplementationFileEnd(CodeBuilder builder)
845869
builder.WriteLine("} // end namespace");
846870
}
847871

872+
/// <summary>
873+
/// Generates the FrameCount property declaration.
874+
/// </summary>
875+
void WriteFrameCountDecl(CodeBuilder builder)
876+
{
877+
builder.WriteComment("Gets the number of frames in the animation.");
878+
builder.WriteLine($"double FrameCount();");
879+
}
880+
881+
/// <summary>
882+
/// Generates the FrameCount property implementation.
883+
/// </summary>
884+
void WriteFrameCountImpl(CodeBuilder builder)
885+
{
886+
builder.WriteLine($"double {_sourceClassName}::FrameCount()");
887+
builder.OpenScope();
888+
builder.WriteLine($"return {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.Frames)};");
889+
builder.CloseScope();
890+
}
891+
892+
/// <summary>
893+
/// Generates the Framerate property declaration.
894+
/// </summary>
895+
void WriteFramerateDecl(CodeBuilder builder)
896+
{
897+
builder.WriteComment("Gets the framerate of the animation.");
898+
builder.WriteLine($"double Framerate();");
899+
}
900+
901+
/// <summary>
902+
/// Generates the Framerate property implementation.
903+
/// </summary>
904+
void WriteFramerateImpl(CodeBuilder builder)
905+
{
906+
builder.WriteLine($"double {_sourceClassName}::Framerate()");
907+
builder.OpenScope();
908+
builder.WriteLine($"return {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.FPS)};");
909+
builder.CloseScope();
910+
}
911+
912+
/// <summary>
913+
/// Generates the Framerate property declaration.
914+
/// </summary>
915+
void WriteDurationDecl(CodeBuilder builder)
916+
{
917+
builder.WriteComment("Gets the duration of the animation.");
918+
builder.WriteLine($"winrt::Windows::Foundation::TimeSpan Duration();");
919+
}
920+
921+
/// <summary>
922+
/// Generates the Duration property implementation.
923+
/// </summary>
924+
void WriteDurationImpl(CodeBuilder builder)
925+
{
926+
builder.WriteLine($"TimeSpan {_sourceClassName}::Duration()");
927+
builder.OpenScope();
928+
builder.WriteLine($"return {_s.TimeSpan(SourceInfo.SourceMetadata.LottieMetadata.Duration.Time)};");
929+
builder.CloseScope();
930+
}
931+
848932
/// <summary>
849933
/// Generates the FrameToProgress(...) declaration.
850934
/// </summary>
851935
void WriteFrameToProgressDecl(CodeBuilder builder)
852936
{
853-
builder.WriteComment("Converts a frame number to the corresponding progress value.");
937+
builder.WriteComment("Converts a zero-based frame number to the corresponding progress value denoting the start of the frame.");
854938
builder.WriteLine($"double FrameToProgress(double frameNumber);");
855939
}
856940

source/UIDataCodeGen/CodeGen/Cx/CxInstantiatorGenerator.cs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,15 @@ void WriteIAnimatedVisualSourceHeaderText(HeaderBuilder builder)
153153
builder.Public.WriteLine();
154154
WriteMarkersPropertyDecl(builder.Public);
155155

156+
builder.Public.WriteLine();
157+
WriteFrameCountDecl(builder.Public);
158+
159+
builder.Public.WriteLine();
160+
WriteFramerateDecl(builder.Public);
161+
162+
builder.Public.WriteLine();
163+
WriteDurationDecl(builder.Public);
164+
156165
builder.Public.WriteLine();
157166
WriteFrameToProgressDecl(builder.Public);
158167

@@ -699,6 +708,15 @@ protected override void WriteImplementationFileEnd(CodeBuilder builder)
699708

700709
builder.WriteLine();
701710

711+
WriteFrameCountImpl(builder);
712+
builder.WriteLine();
713+
714+
WriteFramerateImpl(builder);
715+
builder.WriteLine();
716+
717+
WriteDurationImpl(builder);
718+
builder.WriteLine();
719+
702720
WriteFrameToProgressImpl(builder);
703721
builder.WriteLine();
704722

@@ -711,12 +729,81 @@ protected override void WriteImplementationFileEnd(CodeBuilder builder)
711729
WriteSetScalarPropertyImpl(builder);
712730
}
713731

732+
/// <summary>
733+
/// Generates the FrameCount property declaration.
734+
/// </summary>
735+
void WriteFrameCountDecl(CodeBuilder builder)
736+
{
737+
builder.WriteComment("Gets the number of frames in the animation.");
738+
builder.WriteLine($"property double FrameCount");
739+
builder.OpenScope();
740+
builder.WriteLine("double get();");
741+
builder.CloseScope();
742+
}
743+
744+
/// <summary>
745+
/// Generates the FrameCount property implementation.
746+
/// </summary>
747+
void WriteFrameCountImpl(CodeBuilder builder)
748+
{
749+
builder.WriteLine($"double {_s.Namespace(SourceInfo.Namespace)}::{_sourceClassName}::FrameCount::get()");
750+
builder.OpenScope();
751+
builder.WriteLine($"return {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.Frames)};");
752+
builder.CloseScope();
753+
}
754+
755+
/// <summary>
756+
/// Generates the Framerate property declaration.
757+
/// </summary>
758+
void WriteFramerateDecl(CodeBuilder builder)
759+
{
760+
builder.WriteComment("Gets the framerate of the animation.");
761+
builder.WriteLine($"property double Framerate");
762+
builder.OpenScope();
763+
builder.WriteLine("double get();");
764+
builder.CloseScope();
765+
}
766+
767+
/// <summary>
768+
/// Generates the Framerate property implementation.
769+
/// </summary>
770+
void WriteFramerateImpl(CodeBuilder builder)
771+
{
772+
builder.WriteLine($"double {_s.Namespace(SourceInfo.Namespace)}::{_sourceClassName}::Framerate::get()");
773+
builder.OpenScope();
774+
builder.WriteLine($"return {_s.Double(SourceInfo.SourceMetadata.LottieMetadata.Duration.FPS)};");
775+
builder.CloseScope();
776+
}
777+
778+
/// <summary>
779+
/// Generates the Framerate property declaration.
780+
/// </summary>
781+
void WriteDurationDecl(CodeBuilder builder)
782+
{
783+
builder.WriteComment("Gets the duration of the animation.");
784+
builder.WriteLine($"property Windows::Foundation::TimeSpan Duration");
785+
builder.OpenScope();
786+
builder.WriteLine("Windows::Foundation::TimeSpan get();");
787+
builder.CloseScope();
788+
}
789+
790+
/// <summary>
791+
/// Generates the Duration property implementation.
792+
/// </summary>
793+
void WriteDurationImpl(CodeBuilder builder)
794+
{
795+
builder.WriteLine($"TimeSpan {_s.Namespace(SourceInfo.Namespace)}::{_sourceClassName}::Duration::get()");
796+
builder.OpenScope();
797+
builder.WriteLine($"return {_s.TimeSpan(SourceInfo.SourceMetadata.LottieMetadata.Duration.Time)};");
798+
builder.CloseScope();
799+
}
800+
714801
/// <summary>
715802
/// Generates the FrameToProgress(...) declaration.
716803
/// </summary>
717804
void WriteFrameToProgressDecl(CodeBuilder builder)
718805
{
719-
builder.WriteComment("Converts a frame number to the corresponding progress value.");
806+
builder.WriteComment("Converts a zero-based frame number to the corresponding progress value denoting the start of the frame.");
720807
builder.WriteLine($"double FrameToProgress(double frameNumber);");
721808
}
722809

0 commit comments

Comments
 (0)