<div dir="ltr"><div>Hi all,</div><div><br></div><div>A couple of years ago I refactored Pharo's GIF parsing to be able to deal with animated GIFs (among other things). I've made good headway on a Cuis port recently and wanted to share / get feedback.</div><div>  <br></div><div>You can find the working copy here: <a href="https://gitlab.com/darth-cheney/cuis-animated-images">https://gitlab.com/darth-cheney/cuis-animated-images</a></div><div>  <br></div><div>For a sort of detailed description of the work, here is the original Pharo PR: <a href="https://github.com/pharo-project/pharo/pull/1666">https://github.com/pharo-project/pharo/pull/1666</a>. Note that the examples there are not all relevant to Cuis, since some of the ImageReadWriter messages are different in Cuis.</div><div><br></div><div>You'll notice that there are two animated image morph classes in this package: AnimatedImageMorph and AnimatedImageCompMorph. The crux is this: GIF image frames are only partial bitmap data. Each frame describes how it should be blended (or not) with the next frame, and at what offset. In my original Pharo implementation, the class AnimatedImageMorph does this compositing on the fly each time it proceeds to the next frame. That allows one to write back the frames as a GIF file that will be (almost) identical to the original. However, it really makes things complicated (see below) and bugs out on some GIFs. <br></div><div><br></div><div>So for this port, I decided to rename that version of the class to AnimatedImageCompMorph and instead present a much simpler class called AnimatedImageMorph which simply takes a sequence of Forms and updates them according to the stepTime. This works much better. But in order for it to be possible, I had to also create the GIFFrameCompiler utility class that can composite the GIF frame data into full, individual Forms for each frame. You can see this in action in the class side helper methods of AnimatedImageMorph.</div><div><br></div><div>The complication with "live-compositing" the GIF frames in AnimatedImageCompMorph stems from the fact that one cannot -- at least I couldn't find a way -- make a canvas on an existing Form and then "paint over" some rectangle with transparent pixels, and have those pixels become transparent. Instead what happens is nothing -- the original pixels retain their value. In some ways that's what one would expect of course. In our case it's a pain, because one of the composite rules for GIF frames is "restore background color" and sometimes that color is transparent. Thus the GIFFrameCompiler approach.<br></div><div>  <br></div><div>Here is a useful snippet of code that should work for all of us:</div><div>```</div><div>Feature require: 'WebClient'.</div><div>r _ WebClient httpDo: [ :client |<br>    client httpGet: '<a href="https://images.squarespace-cdn.com/content/v1/5144a1bde4b033f38036b7b9/1455023342836-Z8PTQENYPWQN56UECSRY/Casumo_Ross.gif?format=500w">https://images.squarespace-cdn.com/content/v1/5144a1bde4b033f38036b7b9/1455023342836-Z8PTQENYPWQN56UECSRY/Casumo_Ross.gif?format=500w</a>'.<br>].<br>image _ AnimatedImageMorph gifFromBinaryStream: r content asByteArray readStream.<br>image runningWorld color: (image forms first colorAt: 0@0).<br>image<br> morphPosition: 10@10;<br> openInWorld;<br>  startStepping.</div><div>```</div><div><br></div><div>If I have not formatted this package correctly, please let me know. This is my first "real" Cuis package. Additionally, is there some pattern for including test packages? I'm asking because I don't see any test packages in the image or even when I require other features.<br></div><div><br></div><div>Let me know if you have any questions or comments. Thanks!<br></div><div><br></div><div><br>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Eric</div></div></div></div></div>