From a61a22ab4309b04611ef6580732f4ddc60272ab4 Mon Sep 17 00:00:00 2001 From: rekushi <1+rekushi@noreply.flipnote.world> Date: Thu, 29 Oct 2026 04:24:33 +0000 Subject: [PATCH] fix(ppm): respect hidden layers when rendering frames Read both layer-visibility flags and omit disabled layers from rendered images. --- Hatenatools/PPM.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Hatenatools/PPM.py b/Hatenatools/PPM.py index c87f918..2334cca 100644 --- a/Hatenatools/PPM.py +++ b/Hatenatools/PPM.py @@ -155,6 +155,7 @@ class PPM: self.RawThumbnail = None self.SoundData = None self.forced_speed = forced_speed + self.LayerVisibility = (True, True) def ReadFile(self, path, DecodeThumbnail=False, ReadFrames=True, ReadSound=False):#Load: (thumbnail, frames, sound) f = open(path, "rb") ret = self.Read(f.read(), DecodeThumbnail, ReadFrames, ReadSound) @@ -199,6 +200,7 @@ class PPM: #read the animation sequence header: self.Looped = data[0x06A6] >> 1 & 0x01 == 1#Unverified? + self.LayerVisibility = (not bool(data[0x06A6] & 0x10), not bool(data[0x06A6] & 0x20)) AnimationOffset = 0x6a8 + AscDec(data[0x6a0:0x6a4], True) FrameOffsets = [AnimationOffset + AscDec(data[0x06a8+i*4:0x06a8+i*4+4], True) for i in range(self.FrameCount)] @@ -269,8 +271,8 @@ class PPM: out = np.zeros((256, 192), dtype=">u4") out[:] = Palette[0] - out[Frame[1]] = Color2 - out[Frame[0]] = Color1 + if self.LayerVisibility[1]: out[Frame[1]] = Color2 + if self.LayerVisibility[0]: out[Frame[0]] = Color1 return out def GetThumbnail(self, force=False):