aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html')
-rw-r--r--services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html694
1 files changed, 352 insertions, 342 deletions
diff --git a/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html b/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html
index 7ab1e9b5..07518f23 100644
--- a/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html
+++ b/services/nuldoc/public/blog/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html
@@ -135,44 +135,45 @@
以下のソースコードをベースにする。今回 PNG のデコーダは扱わないので、読み込みには Go の標準ライブラリ <code>image/png</code> を用いる。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">package</span><span style="color:#6F42C1"> main</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">import</span><span style="color:#24292E"> (</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">image</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#24292E"> _ </span><span style="color:#032F62">"</span><span style="color:#6F42C1">image/png</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">io</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">os</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> main</span><span style="color:#24292E">() {</span></span>
-<span class="line"><span style="color:#24292E"> inFile, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> os.</span><span style="color:#6F42C1">Open</span><span style="color:#24292E">(</span><span style="color:#032F62">"input.png"</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> defer</span><span style="color:#24292E"> inFile.</span><span style="color:#6F42C1">Close</span><span style="color:#24292E">()</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> img, _, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> image.</span><span style="color:#6F42C1">Decode</span><span style="color:#24292E">(inFile)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> outFile, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> os.</span><span style="color:#6F42C1">Create</span><span style="color:#24292E">(</span><span style="color:#032F62">"output.png"</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> defer</span><span style="color:#24292E"> outFile.</span><span style="color:#6F42C1">Close</span><span style="color:#24292E">()</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writePng</span><span style="color:#24292E">(outFile, img)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writePng</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">img</span><span style="color:#6F42C1"> image</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Image</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> width </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(img.</span><span style="color:#6F42C1">Bounds</span><span style="color:#24292E">().</span><span style="color:#6F42C1">Dx</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#24292E"> height </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(img.</span><span style="color:#6F42C1">Bounds</span><span style="color:#24292E">().</span><span style="color:#6F42C1">Dy</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#6F42C1"> writeSignature</span><span style="color:#24292E">(w)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIhdr</span><span style="color:#24292E">(w, width, height)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIdat</span><span style="color:#24292E">(w, width, height, img)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIend</span><span style="color:#24292E">(w)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span>
+
+<span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+ <span style="color: #0a3069">"image"</span>
+ <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span>
+ <span style="color: #0a3069">"io"</span>
+ <span style="color: #0a3069">"os"</span>
+<span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+ <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
<p>
以降は、<code>writeSignature</code> や <code>writeChunkIhdr</code> などを実装していく。
@@ -215,21 +216,22 @@
<code>writeSignature</code> の実装はこちら:
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">import</span><span style="color:#032F62"> "</span><span style="color:#6F42C1">encoding/binary</span><span style="color:#032F62">"</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeSignature</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> sig </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> [</span><span style="color:#005CC5">8</span><span style="color:#24292E">]</span><span style="color:#D73A49">uint8</span><span style="color:#24292E">{</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">89</span><span style="color:#24292E">,</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">50</span><span style="color:#24292E">, </span><span style="color:#6A737D">// P</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">4E</span><span style="color:#24292E">, </span><span style="color:#6A737D">// N</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">47</span><span style="color:#24292E">, </span><span style="color:#6A737D">// G</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0D</span><span style="color:#24292E">, </span><span style="color:#6A737D">// CR</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// LF</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">1A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// EOF (^Z)</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// LF</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, sig)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">import</span> <span style="color: #0a3069">"encoding/binary"</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+ <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span>
+ <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span>
+ <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span>
+ <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span>
+ <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+ <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span>
+ <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
<p>
<code>encoding/binary</code> パッケージの <code>binary.Write</code> を使い、固定の 8 バイトを書き込む。
@@ -258,55 +260,57 @@
CRC (Cyclic Redundancy Check) は誤り検出符号の一種。Go 言語では <code>hash/crc32</code> パッケージにあるが、今回はこれも自前で実装する。PNG の仕様書に C 言語のサンプルコードが載っている ( <a href="https://www.w3.org/TR/png/#D-CRCAppendix" rel="noreferrer" target="_blank">D. Sample CRC implementation</a> ) ので、これを Go に移植する。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> (</span></span>
-<span class="line"><span style="color:#24292E"> crcTable [</span><span style="color:#005CC5">256</span><span style="color:#24292E">]</span><span style="color:#D73A49">uint32</span></span>
-<span class="line"><span style="color:#24292E"> crcTableComputed </span><span style="color:#D73A49">bool</span></span>
-<span class="line"><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> makeCrcTable</span><span style="color:#24292E">() {</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#005CC5"> 256</span><span style="color:#24292E">; n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(n)</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> k </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; k </span><span style="color:#D73A49">&#x3C;</span><span style="color:#005CC5"> 8</span><span style="color:#24292E">; k</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">&#x26;</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">) </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">EDB88320</span><span style="color:#D73A49"> ^</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 1</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">else</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#24292E"> c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 1</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> crcTable[n] </span><span style="color:#D73A49">=</span><span style="color:#24292E"> c</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> crcTableComputed </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> true</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> updateCrc</span><span style="color:#24292E">(</span><span style="color:#E36209">crc</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#D73A49"> !</span><span style="color:#24292E">crcTableComputed {</span></span>
-<span class="line"><span style="color:#6F42C1"> makeCrcTable</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> crc</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(buf); n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#24292E"> crcTable[(c</span><span style="color:#D73A49">^uint32</span><span style="color:#24292E">(buf[n]))</span><span style="color:#D73A49">&#x26;0x</span><span style="color:#005CC5">FF</span><span style="color:#24292E">] </span><span style="color:#D73A49">^</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 8</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> c</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> crc</span><span style="color:#24292E">(</span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#6F42C1"> updateCrc</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">FFFFFFFF</span><span style="color:#24292E">, buf) </span><span style="color:#D73A49">^</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFFFFFF</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span>
+<span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">1</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&amp;</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
<p>
できた <code>crc</code> 関数を使って、chunk 一般を書き込む関数も用意しておこう。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">chunkType</span><span style="color:#D73A49"> string</span><span style="color:#24292E">, </span><span style="color:#E36209">data</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">:=</span><span style="color:#6F42C1"> make</span><span style="color:#24292E">([]</span><span style="color:#D73A49">byte</span><span style="color:#24292E">, </span><span style="color:#005CC5">0</span><span style="color:#24292E">, </span><span style="color:#6F42C1">len</span><span style="color:#24292E">(chunkType)</span><span style="color:#D73A49">+</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(data))</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> append</span><span style="color:#24292E">(typeAndData, []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">(chunkType)</span><span style="color:#D73A49">...</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> append</span><span style="color:#24292E">(typeAndData, data</span><span style="color:#D73A49">...</span><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, </span><span style="color:#D73A49">uint32</span><span style="color:#24292E">(</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(data)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, typeAndData)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, </span><span style="color:#6F42C1">crc</span><span style="color:#24292E">(typeAndData))</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
<p>
仕様どおり、<code>chunkType</code> と <code>data</code> から CRC を計算し、<code>data</code> の長さと合わせて書き込んでいる。PNG では基本的に big endian を使うことに注意する。
@@ -384,20 +388,21 @@
今回ほとんどのデータは決め打ちするので、データに応じて変わるのは width と height だけになる。コードは次のようになる。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">import</span><span style="color:#032F62"> "</span><span style="color:#6F42C1">bytes</span><span style="color:#032F62">"</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIhdr</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">width</span><span style="color:#24292E">, </span><span style="color:#E36209">height</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> buf </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, width)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, height)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">8</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">2</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IHDR"</span><span style="color:#24292E">, buf.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">import</span> <span style="color: #0a3069">"bytes"</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
</section>
<section id="section--implement-png-encoder--idat-chunk">
@@ -431,22 +436,23 @@
Adler-32 も CRC と同じく誤り検出符号である。こちらも zlib の仕様書に C 言語でサンプルコードが記載されている ( <a href="https://www.rfc-editor.org/rfc/rfc1950#section-9" rel="noreferrer" target="_blank">9. Appendix: Sample code</a> ) ので、Go に移植する。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">const</span><span style="color:#005CC5"> adler32Base</span><span style="color:#D73A49"> =</span><span style="color:#005CC5"> 65521</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> updateAdler32</span><span style="color:#24292E">(</span><span style="color:#E36209">adler</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> s1 </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> adler </span><span style="color:#D73A49">&#x26;</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFF</span></span>
-<span class="line"><span style="color:#24292E"> s2 </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> (adler </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 16</span><span style="color:#24292E">) </span><span style="color:#D73A49">&#x26;</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFF</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(buf); n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> s1 </span><span style="color:#D73A49">=</span><span style="color:#24292E"> (s1 </span><span style="color:#D73A49">+</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(buf[n])) </span><span style="color:#D73A49">%</span><span style="color:#24292E"> adler32Base</span></span>
-<span class="line"><span style="color:#24292E"> s2 </span><span style="color:#D73A49">=</span><span style="color:#24292E"> (s2 </span><span style="color:#D73A49">+</span><span style="color:#24292E"> s1) </span><span style="color:#D73A49">%</span><span style="color:#24292E"> adler32Base</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> (s2 </span><span style="color:#D73A49">&#x3C;&#x3C;</span><span style="color:#005CC5"> 16</span><span style="color:#24292E">) </span><span style="color:#D73A49">+</span><span style="color:#24292E"> s1</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> adler32</span><span style="color:#24292E">(</span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#6F42C1"> updateAdler32</span><span style="color:#24292E">(</span><span style="color:#005CC5">1</span><span style="color:#24292E">, buf)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">0xFFFF</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">0xFFFF</span>
+
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">&lt;&lt;</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
<p>
「データ」の部分には圧縮したデータが入るのだが、真面目に deflate アルゴリズムを実装する必要はない。Zlib には無圧縮のデータブロックを格納することができるので、これを使う。本来は、データの圧縮効率の悪いランダムなデータをそのまま格納するためのものだが、今回は deflate の実装をサボるために使う。
@@ -472,30 +478,31 @@
実際にこの手抜き zlib を実装したものがこちら:
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> encodeZlib</span><span style="color:#24292E">(</span><span style="color:#E36209">data</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) []</span><span style="color:#D73A49">byte</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> buf </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">78</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">01</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> blockSize </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 65535</span></span>
-<span class="line"><span style="color:#24292E"> isFinalBlock </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> false</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> i </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; </span><span style="color:#D73A49">!</span><span style="color:#24292E">isFinalBlock; i</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> block []</span><span style="color:#D73A49">byte</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(data) </span><span style="color:#D73A49">&#x3C;=</span><span style="color:#24292E"> (i</span><span style="color:#D73A49">+</span><span style="color:#005CC5">1</span><span style="color:#24292E">)</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize {</span></span>
-<span class="line"><span style="color:#24292E"> block </span><span style="color:#D73A49">=</span><span style="color:#24292E"> data[i</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize:]</span></span>
-<span class="line"><span style="color:#24292E"> isFinalBlock </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> true</span></span>
-<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">else</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> block </span><span style="color:#D73A49">=</span><span style="color:#24292E"> data[i</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize : (i</span><span style="color:#D73A49">+</span><span style="color:#005CC5">1</span><span style="color:#24292E">)</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize]</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, isFinalBlock)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, </span><span style="color:#D73A49">uint16</span><span style="color:#24292E">(</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(block)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, </span><span style="color:#D73A49">uint16</span><span style="color:#24292E">(</span><span style="color:#D73A49">^</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(block)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, block)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#6F42C1">adler32</span><span style="color:#24292E">(data))</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> buf.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span>
+ <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span>
+ <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&lt;=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span>
+ <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
</section>
<section id="section--implement-png-encoder--idat-chunk--image-data">
@@ -510,20 +517,21 @@
先ほどの <code>encodeZlib</code> も使って実際に実装したものがこちら:
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIdat</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">width</span><span style="color:#24292E">, </span><span style="color:#E36209">height</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">img</span><span style="color:#6F42C1"> image</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Image</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> pixels </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> y </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">); y </span><span style="color:#D73A49">&#x3C;</span><span style="color:#24292E"> height; y</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> x </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">); x </span><span style="color:#D73A49">&#x3C;</span><span style="color:#24292E"> width; x</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> r, g, b, _ </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> img.</span><span style="color:#6F42C1">At</span><span style="color:#24292E">(</span><span style="color:#D73A49">int</span><span style="color:#24292E">(x), </span><span style="color:#D73A49">int</span><span style="color:#24292E">(y)).</span><span style="color:#6F42C1">RGBA</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(r))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(g))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(b))</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IDAT"</span><span style="color:#24292E">, </span><span style="color:#6F42C1">encodeZlib</span><span style="color:#24292E">(pixels.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">()))</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
</section>
</section>
@@ -536,9 +544,10 @@
特に追加のデータはなく、必要なのは chunk type の <code>IEND</code> くらいなので実装は簡単:
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIend</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IEND"</span><span style="color:#24292E">, </span><span style="color:#005CC5">nil</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
</section>
</section>
@@ -548,180 +557,181 @@
最後に全ソースコードを再掲しておく。
</p>
<div class="codeblock">
- <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">package</span><span style="color:#6F42C1"> main</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">import</span><span style="color:#24292E"> (</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">bytes</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">encoding/binary</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">image</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#24292E"> _ </span><span style="color:#032F62">"</span><span style="color:#6F42C1">image/png</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">io</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#032F62"> "</span><span style="color:#6F42C1">os</span><span style="color:#032F62">"</span></span>
-<span class="line"><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> main</span><span style="color:#24292E">() {</span></span>
-<span class="line"><span style="color:#24292E"> inFile, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> os.</span><span style="color:#6F42C1">Open</span><span style="color:#24292E">(</span><span style="color:#032F62">"input.png"</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> defer</span><span style="color:#24292E"> inFile.</span><span style="color:#6F42C1">Close</span><span style="color:#24292E">()</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> img, _, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> image.</span><span style="color:#6F42C1">Decode</span><span style="color:#24292E">(inFile)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> outFile, err </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> os.</span><span style="color:#6F42C1">Create</span><span style="color:#24292E">(</span><span style="color:#032F62">"output.png"</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> err </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> nil</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#6F42C1"> panic</span><span style="color:#24292E">(err)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> defer</span><span style="color:#24292E"> outFile.</span><span style="color:#6F42C1">Close</span><span style="color:#24292E">()</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writePng</span><span style="color:#24292E">(outFile, img)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writePng</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">img</span><span style="color:#6F42C1"> image</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Image</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> width </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(img.</span><span style="color:#6F42C1">Bounds</span><span style="color:#24292E">().</span><span style="color:#6F42C1">Dx</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#24292E"> height </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(img.</span><span style="color:#6F42C1">Bounds</span><span style="color:#24292E">().</span><span style="color:#6F42C1">Dy</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#6F42C1"> writeSignature</span><span style="color:#24292E">(w)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIhdr</span><span style="color:#24292E">(w, width, height)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIdat</span><span style="color:#24292E">(w, width, height, img)</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunkIend</span><span style="color:#24292E">(w)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeSignature</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> sig </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> [</span><span style="color:#005CC5">8</span><span style="color:#24292E">]</span><span style="color:#D73A49">uint8</span><span style="color:#24292E">{</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">89</span><span style="color:#24292E">,</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">50</span><span style="color:#24292E">, </span><span style="color:#6A737D">// P</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">4E</span><span style="color:#24292E">, </span><span style="color:#6A737D">// N</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">47</span><span style="color:#24292E">, </span><span style="color:#6A737D">// G</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0D</span><span style="color:#24292E">, </span><span style="color:#6A737D">// CR</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// LF</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">1A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// EOF (^Z)</span></span>
-<span class="line"><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">0A</span><span style="color:#24292E">, </span><span style="color:#6A737D">// LF</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, sig)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIhdr</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">width</span><span style="color:#24292E">, </span><span style="color:#E36209">height</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> buf </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, width)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, height)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">8</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">2</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IHDR"</span><span style="color:#24292E">, buf.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">())</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIdat</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">width</span><span style="color:#24292E">, </span><span style="color:#E36209">height</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">img</span><span style="color:#6F42C1"> image</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Image</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> pixels </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> y </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">); y </span><span style="color:#D73A49">&#x3C;</span><span style="color:#24292E"> height; y</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> x </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(</span><span style="color:#005CC5">0</span><span style="color:#24292E">); x </span><span style="color:#D73A49">&#x3C;</span><span style="color:#24292E"> width; x</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> r, g, b, _ </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> img.</span><span style="color:#6F42C1">At</span><span style="color:#24292E">(</span><span style="color:#D73A49">int</span><span style="color:#24292E">(x), </span><span style="color:#D73A49">int</span><span style="color:#24292E">(y)).</span><span style="color:#6F42C1">RGBA</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(r))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(g))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">pixels, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(b))</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IDAT"</span><span style="color:#24292E">, </span><span style="color:#6F42C1">encodeZlib</span><span style="color:#24292E">(pixels.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">()))</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> encodeZlib</span><span style="color:#24292E">(</span><span style="color:#E36209">data</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) []</span><span style="color:#D73A49">byte</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> buf </span><span style="color:#6F42C1">bytes</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Buffer</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">78</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#D73A49">uint8</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">01</span><span style="color:#24292E">))</span></span>
-<span class="line"><span style="color:#24292E"> blockSize </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 65535</span></span>
-<span class="line"><span style="color:#24292E"> isFinalBlock </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> false</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> i </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; </span><span style="color:#D73A49">!</span><span style="color:#24292E">isFinalBlock; i</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> var</span><span style="color:#24292E"> block []</span><span style="color:#D73A49">byte</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(data) </span><span style="color:#D73A49">&#x3C;=</span><span style="color:#24292E"> (i</span><span style="color:#D73A49">+</span><span style="color:#005CC5">1</span><span style="color:#24292E">)</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize {</span></span>
-<span class="line"><span style="color:#24292E"> block </span><span style="color:#D73A49">=</span><span style="color:#24292E"> data[i</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize:]</span></span>
-<span class="line"><span style="color:#24292E"> isFinalBlock </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> true</span></span>
-<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">else</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> block </span><span style="color:#D73A49">=</span><span style="color:#24292E"> data[i</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize : (i</span><span style="color:#D73A49">+</span><span style="color:#005CC5">1</span><span style="color:#24292E">)</span><span style="color:#D73A49">*</span><span style="color:#24292E">blockSize]</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, isFinalBlock)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, </span><span style="color:#D73A49">uint16</span><span style="color:#24292E">(</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(block)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, </span><span style="color:#D73A49">uint16</span><span style="color:#24292E">(</span><span style="color:#D73A49">^</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(block)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.LittleEndian, block)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(</span><span style="color:#D73A49">&#x26;</span><span style="color:#24292E">buf, binary.BigEndian, </span><span style="color:#6F42C1">adler32</span><span style="color:#24292E">(data))</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> buf.</span><span style="color:#6F42C1">Bytes</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunkIend</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(w, </span><span style="color:#032F62">"IEND"</span><span style="color:#24292E">, </span><span style="color:#005CC5">nil</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> writeChunk</span><span style="color:#24292E">(</span><span style="color:#E36209">w</span><span style="color:#6F42C1"> io</span><span style="color:#24292E">.</span><span style="color:#6F42C1">Writer</span><span style="color:#24292E">, </span><span style="color:#E36209">chunkType</span><span style="color:#D73A49"> string</span><span style="color:#24292E">, </span><span style="color:#E36209">data</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) {</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">:=</span><span style="color:#6F42C1"> make</span><span style="color:#24292E">([]</span><span style="color:#D73A49">byte</span><span style="color:#24292E">, </span><span style="color:#005CC5">0</span><span style="color:#24292E">, </span><span style="color:#6F42C1">len</span><span style="color:#24292E">(chunkType)</span><span style="color:#D73A49">+</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(data))</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> append</span><span style="color:#24292E">(typeAndData, []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">(chunkType)</span><span style="color:#D73A49">...</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> typeAndData </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> append</span><span style="color:#24292E">(typeAndData, data</span><span style="color:#D73A49">...</span><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, </span><span style="color:#D73A49">uint32</span><span style="color:#24292E">(</span><span style="color:#6F42C1">len</span><span style="color:#24292E">(data)))</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, typeAndData)</span></span>
-<span class="line"><span style="color:#24292E"> binary.</span><span style="color:#6F42C1">Write</span><span style="color:#24292E">(w, binary.BigEndian, </span><span style="color:#6F42C1">crc</span><span style="color:#24292E">(typeAndData))</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> (</span></span>
-<span class="line"><span style="color:#24292E"> crcTable [</span><span style="color:#005CC5">256</span><span style="color:#24292E">]</span><span style="color:#D73A49">uint32</span></span>
-<span class="line"><span style="color:#24292E"> crcTableComputed </span><span style="color:#D73A49">bool</span></span>
-<span class="line"><span style="color:#24292E">)</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> makeCrcTable</span><span style="color:#24292E">() {</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#005CC5"> 256</span><span style="color:#24292E">; n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">:=</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(n)</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> k </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; k </span><span style="color:#D73A49">&#x3C;</span><span style="color:#005CC5"> 8</span><span style="color:#24292E">; k</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">&#x26;</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">) </span><span style="color:#D73A49">!=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">EDB88320</span><span style="color:#D73A49"> ^</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 1</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">else</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#24292E"> c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 1</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> crcTable[n] </span><span style="color:#D73A49">=</span><span style="color:#24292E"> c</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#24292E"> crcTableComputed </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> true</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> updateCrc</span><span style="color:#24292E">(</span><span style="color:#E36209">crc</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> if</span><span style="color:#D73A49"> !</span><span style="color:#24292E">crcTableComputed {</span></span>
-<span class="line"><span style="color:#6F42C1"> makeCrcTable</span><span style="color:#24292E">()</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> crc</span></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(buf); n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> c </span><span style="color:#D73A49">=</span><span style="color:#24292E"> crcTable[(c</span><span style="color:#D73A49">^uint32</span><span style="color:#24292E">(buf[n]))</span><span style="color:#D73A49">&#x26;0x</span><span style="color:#005CC5">FF</span><span style="color:#24292E">] </span><span style="color:#D73A49">^</span><span style="color:#24292E"> (c </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 8</span><span style="color:#24292E">)</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> c</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> crc</span><span style="color:#24292E">(</span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#6F42C1"> updateCrc</span><span style="color:#24292E">(</span><span style="color:#D73A49">0x</span><span style="color:#005CC5">FFFFFFFF</span><span style="color:#24292E">, buf) </span><span style="color:#D73A49">^</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFFFFFF</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">const</span><span style="color:#005CC5"> adler32Base</span><span style="color:#D73A49"> =</span><span style="color:#005CC5"> 65521</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> updateAdler32</span><span style="color:#24292E">(</span><span style="color:#E36209">adler</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">, </span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> s1 </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> adler </span><span style="color:#D73A49">&#x26;</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFF</span></span>
-<span class="line"><span style="color:#24292E"> s2 </span><span style="color:#D73A49">:=</span><span style="color:#24292E"> (adler </span><span style="color:#D73A49">>></span><span style="color:#005CC5"> 16</span><span style="color:#24292E">) </span><span style="color:#D73A49">&#x26;</span><span style="color:#D73A49"> 0x</span><span style="color:#005CC5">FFFF</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49"> for</span><span style="color:#24292E"> n </span><span style="color:#D73A49">:=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">; n </span><span style="color:#D73A49">&#x3C;</span><span style="color:#6F42C1"> len</span><span style="color:#24292E">(buf); n</span><span style="color:#D73A49">++</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#24292E"> s1 </span><span style="color:#D73A49">=</span><span style="color:#24292E"> (s1 </span><span style="color:#D73A49">+</span><span style="color:#D73A49"> uint32</span><span style="color:#24292E">(buf[n])) </span><span style="color:#D73A49">%</span><span style="color:#24292E"> adler32Base</span></span>
-<span class="line"><span style="color:#24292E"> s2 </span><span style="color:#D73A49">=</span><span style="color:#24292E"> (s2 </span><span style="color:#D73A49">+</span><span style="color:#24292E"> s1) </span><span style="color:#D73A49">%</span><span style="color:#24292E"> adler32Base</span></span>
-<span class="line"><span style="color:#24292E"> }</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> (s2 </span><span style="color:#D73A49">&#x3C;&#x3C;</span><span style="color:#005CC5"> 16</span><span style="color:#24292E">) </span><span style="color:#D73A49">+</span><span style="color:#24292E"> s1</span></span>
-<span class="line"><span style="color:#24292E">}</span></span>
-<span class="line"></span>
-<span class="line"><span style="color:#D73A49">func</span><span style="color:#6F42C1"> adler32</span><span style="color:#24292E">(</span><span style="color:#E36209">buf</span><span style="color:#24292E"> []</span><span style="color:#D73A49">byte</span><span style="color:#24292E">) </span><span style="color:#D73A49">uint32</span><span style="color:#24292E"> {</span></span>
-<span class="line"><span style="color:#D73A49"> return</span><span style="color:#6F42C1"> updateAdler32</span><span style="color:#24292E">(</span><span style="color:#005CC5">1</span><span style="color:#24292E">, buf)</span></span>
-<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span>
+
+<span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+ <span style="color: #0a3069">"bytes"</span>
+ <span style="color: #0a3069">"encoding/binary"</span>
+ <span style="color: #0a3069">"image"</span>
+ <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span>
+ <span style="color: #0a3069">"io"</span>
+ <span style="color: #0a3069">"os"</span>
+<span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Open</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"input.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Decode</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">inFile</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">os</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Create</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"output.png"</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">err</span> <span style="color: #0550ae">!=</span> <span style="color: #953800">nil</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #953800">panic</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">err</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">defer</span> <span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Close</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">outFile</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writePng</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">width</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dx</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+ <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bounds</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Dy</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeSignature</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">sig</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+ <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span>
+ <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span>
+ <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span>
+ <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span>
+ <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+ <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span>
+ <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">sig</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIhdr</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IHDR"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">())</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIdat</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">height</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">img</span> <span style="color: #24292f;background-color: #f6f8fa">image</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Image</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">pixels</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #24292f;background-color: #f6f8fa">height</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #24292f;background-color: #f6f8fa">width</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">img</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">At</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">y</span><span style="color: #24292f;background-color: #f6f8fa">))</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">RGBA</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">r</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IDAT"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">pixels</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()))</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">encodeZlib</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">bytes</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Buffer</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x78</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint8</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0x01</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span>
+ <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span>
+ <span style="color: #cf222e">if</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&lt;=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #0550ae">:</span><span style="color: #24292f;background-color: #f6f8fa">]</span>
+ <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">block</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">blockSize</span><span style="color: #24292f;background-color: #f6f8fa">]</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint16</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">^</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">LittleEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">block</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&amp;</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Bytes</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunkIend</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">"IEND"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">nil</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">writeChunk</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span> <span style="color: #24292f;background-color: #f6f8fa">io</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Writer</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">chunkType</span> <span style="color: #cf222e">string</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">make</span><span style="color: #24292f;background-color: #f6f8fa">([]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">chunkType</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span> <span style="color: #0550ae">=</span> <span style="color: #953800">append</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">data</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">Write</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">binary</span><span style="color: #0550ae">.</span><span style="color: #24292f;background-color: #f6f8fa">BigEndian</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">typeAndData</span><span style="color: #24292f;background-color: #f6f8fa">))</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTable</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #cf222e">uint32</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span>
+<span style="color: #24292f;background-color: #f6f8fa">)</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">256</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">k</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">!=</span> <span style="color: #0550ae">0</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0xEDB88320</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">1</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">crc</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">if</span> <span style="color: #0550ae">!</span><span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span>
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">crcTable</span><span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #24292f;background-color: #f6f8fa">c</span><span style="color: #0550ae">^</span><span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span><span style="color: #0550ae">&amp;</span><span style="color: #0550ae">0xFF</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">^</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateCrc</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">0xFFFFFFFF</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">^</span> <span style="color: #0550ae">0xFFFFFFFF</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">const</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">65521</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">0xFFFF</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">adler</span> <span style="color: #0550ae">&gt;&gt;</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">&amp;</span> <span style="color: #0550ae">0xFFFF</span>
+
+ <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae">&lt;</span> <span style="color: #953800">len</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #0550ae">++</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s1</span> <span style="color: #0550ae">+</span> <span style="color: #cf222e">uint32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #24292f;background-color: #f6f8fa">n</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span>
+ <span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #24292f;background-color: #f6f8fa">adler32Base</span>
+ <span style="color: #24292f;background-color: #f6f8fa">}</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">s2</span> <span style="color: #0550ae">&lt;&lt;</span> <span style="color: #0550ae">16</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">s1</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+
+<span style="color: #cf222e">func</span> <span style="color: #24292f;background-color: #f6f8fa">adler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">buf</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span><span style="color: #cf222e">byte</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">uint32</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+ <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">updateAdler32</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">buf</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+<span style="color: #24292f;background-color: #f6f8fa">}</span>
+</code></pre>
</div>
</section>
<section id="section--references">