1
0
mirror of synced 2025-01-31 12:13:49 +01:00

Remove ability to render exported tags as it was broken and elongated the render time of some animations.

This commit is contained in:
Jennifer Taylor 2021-05-16 22:19:07 +00:00
parent ec20ab4cf1
commit 40968ab039
2 changed files with 10 additions and 51 deletions

View File

@ -98,15 +98,8 @@ class PlacedClip(PlacedObject):
def finished(self) -> bool:
return self.frame == len(self.source.frames)
@property
def running(self) -> bool:
for obj in self.placed_objects:
if isinstance(obj, PlacedClip) and obj.running:
return True
return not self.finished
def __repr__(self) -> str:
return f"PlacedClip(object_id={self.object_id}, depth={self.depth}, source={self.source}, frame={self.frame}, total_frames={len(self.source.frames)}, running={self.running}, finished={self.finished})"
return f"PlacedClip(object_id={self.object_id}, depth={self.depth}, source={self.source}, frame={self.frame}, total_frames={len(self.source.frames)}, finished={self.finished})"
class AFPRenderer(VerboseOutput):
@ -118,6 +111,8 @@ class AFPRenderer(VerboseOutput):
self.shapes: Dict[str, Shape] = shapes
self.textures: Dict[str, Image.Image] = textures
# TODO: We have to resolve imports.
self.swfs: Dict[str, SWF] = swfs
# Internal render parameters.
@ -140,19 +135,13 @@ class AFPRenderer(VerboseOutput):
self.swfs[name] = data
def render_path(self, path: str, background_color: Optional[Color] = None, verbose: bool = False, only_depths: Optional[List[int]] = None) -> Tuple[int, List[Image.Image]]:
# Given a path to a SWF root animation or an exported animation inside a SWF,
# attempt to render it to a list of frames, one per image.
components = path.split(".")
if len(components) > 2:
raise Exception('Expected a path in the form of "moviename" or "moviename.exportedtag"!')
# Given a path to a SWF root animation, attempt to render it to a list of frames.
for name, swf in self.swfs.items():
if swf.exported_name == components[0]:
if swf.exported_name == path:
# This is the SWF we care about.
with self.debugging(verbose):
swf.color = background_color or swf.color
return self.__render(swf, components[1] if len(components) > 1 else None, only_depths=only_depths)
return self.__render(swf, only_depths=only_depths)
raise Exception(f'{path} not found in registered SWFs!')
@ -163,9 +152,6 @@ class AFPRenderer(VerboseOutput):
for name, swf in self.swfs.items():
paths.append(swf.exported_name)
for export_tag in swf.exported_tags:
paths.append(f"{swf.exported_name}.{export_tag}")
return paths
def __place(self, tag: Tag, operating_clip: PlacedClip, prefix: str = "") -> Tuple[Optional[PlacedClip], bool]:
@ -508,30 +494,7 @@ class AFPRenderer(VerboseOutput):
# Return if anything was modified.
return changed
def __find_renderable(self, clip: PlacedClip, tag: Optional[int]) -> Optional[PlacedClip]:
if clip.source.tag_id == tag:
return clip
for obj in clip.placed_objects:
if isinstance(obj, PlacedClip):
maybe = self.__find_renderable(obj, tag)
if maybe is not None:
return maybe
return None
def __render(self, swf: SWF, export_tag: Optional[str], only_depths: Optional[List[int]] = None) -> Tuple[int, List[Image.Image]]:
# If we are rendering an exported tag, we want to perform the actions of the
# rest of the SWF but not update any layers as a result.
visible_tag = None
if export_tag is not None:
# Make sure this tag is actually present in the SWF.
if export_tag not in swf.exported_tags:
raise Exception(f'{export_tag} is not exported by {swf.exported_name}!')
visible_tag = swf.exported_tags[export_tag]
# TODO: We have to resolve imports.
def __render(self, swf: SWF, only_depths: Optional[List[int]] = None) -> Tuple[int, List[Image.Image]]:
# Now, let's go through each frame, performing actions as necessary.
spf = 1.0 / swf.fps
frames: List[Image.Image] = []
@ -557,7 +520,7 @@ class AFPRenderer(VerboseOutput):
self.__registered_objects = {}
try:
while root_clip.running:
while not root_clip.finished:
# Create a new image to render into.
time = spf * frameno
color = swf.color or Color(0.0, 0.0, 0.0, 0.0)
@ -571,11 +534,7 @@ class AFPRenderer(VerboseOutput):
# get the layering correct, but its important to preserve the original
# insertion order for delete requests.
curimage = Image.new("RGBA", (int(swf.location.width), int(swf.location.height)), color=color.as_tuple())
clip = self.__find_renderable(root_clip, visible_tag)
if clip:
for obj in sorted(clip.placed_objects, key=lambda obj: obj.depth):
curimage = self.__render_object(curimage, obj, root_clip.transform, root_clip.rotation_offset, only_depths=only_depths)
curimage = self.__render_object(curimage, root_clip, root_clip.transform, root_clip.rotation_offset, only_depths=only_depths)
else:
# Nothing changed, make a copy of the previous render.
self.vprint(" Using previous frame render")

View File

@ -246,7 +246,7 @@ def main() -> int:
metavar="PATH",
type=str,
required=True,
help='A path to render, specified either as "moviename" or "moviename.exportedtag".',
help='A path to render, specified as "moviename" of the animation to render. Use the "list" command to discover paths in a file.',
)
render_parser.add_argument(
"--output",