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.html696
1 files changed, 343 insertions, 353 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 1d323964..4b482fb7 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
@@ -14,7 +14,7 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PNG 画像の最小構成エンコーダを実装する|REPL: Rest-Eat-Program Loop</title>
- <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9">
+ <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23">
</head>
<body class="single">
<header class="header">
@@ -135,45 +135,44 @@
以下のソースコードをベースにする。今回 PNG のデコーダは扱わないので、読み込みには Go の標準ライブラリ <code>image/png</code> を用いる。
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"image"</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"io"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"os"</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
<p>
以降は、<code>writeSignature</code> や <code>writeChunkIhdr</code> などを実装していく。
@@ -216,22 +215,21 @@
<code>writeSignature</code> の実装はこちら:
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #0a3069">"encoding/binary"</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
<p>
<code>encoding/binary</code> パッケージの <code>binary.Write</code> を使い、固定の 8 バイトを書き込む。
@@ -260,57 +258,55 @@
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="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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
<p>
できた <code>crc</code> 関数を使って、chunk 一般を書き込む関数も用意しておこう。
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
<p>
仕様どおり、<code>chunkType</code> と <code>data</code> から CRC を計算し、<code>data</code> の長さと合わせて書き込んでいる。PNG では基本的に big endian を使うことに注意する。
@@ -388,21 +384,20 @@
今回ほとんどのデータは決め打ちするので、データに応じて変わるのは width と height だけになる。コードは次のようになる。
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #0a3069">"bytes"</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
</section>
<section id="section--implement-png-encoder--idat-chunk">
@@ -436,23 +431,22 @@
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="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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
<p>
「データ」の部分には圧縮したデータが入るのだが、真面目に deflate アルゴリズムを実装する必要はない。Zlib には無圧縮のデータブロックを格納することができるので、これを使う。本来は、データの圧縮効率の悪いランダムなデータをそのまま格納するためのものだが、今回は deflate の実装をサボるために使う。
@@ -478,31 +472,30 @@
実際にこの手抜き zlib を実装したものがこちら:
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
</section>
<section id="section--implement-png-encoder--idat-chunk--image-data">
@@ -517,21 +510,20 @@
先ほどの <code>encodeZlib</code> も使って実際に実装したものがこちら:
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
</section>
</section>
@@ -544,10 +536,9 @@
特に追加のデータはなく、必要なのは chunk type の <code>IEND</code> くらいなので実装は簡単:
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
</section>
</section>
@@ -557,181 +548,180 @@
最後に全ソースコードを再掲しておく。
</p>
<div class="codeblock">
- <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>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">package</span> <span style="color: #24292f;background-color: #f6f8fa">main</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><span style="color: #cf222e">import</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"bytes"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"encoding/binary"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"image"</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">_</span> <span style="color: #0a3069">"image/png"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"io"</span>
+</div><div class="codeblock-line"> <span style="color: #0a3069">"os"</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x89</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x50</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// P</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x4E</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// N</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x47</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// G</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0D</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// CR</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x1A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// EOF (^Z)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">0x0A</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// LF</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">blockSize</span> <span style="color: #0550ae">:=</span> <span style="color: #0550ae">65535</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">:=</span> <span style="color: #953800">false</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">isFinalBlock</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><span style="color: #cf222e">var</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #cf222e">bool</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">crcTableComputed</span> <span style="color: #0550ae">=</span> <span style="color: #953800">true</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">makeCrcTable</span><span style="color: #24292f;background-color: #f6f8fa">()</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> <span style="color: #0550ae">:=</span> <span style="color: #24292f;background-color: #f6f8fa">crc</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #24292f;background-color: #f6f8fa">c</span>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line">
+</div><div class="codeblock-line"><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>
+</div><div class="codeblock-line"> <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>
+</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
</div>
</section>
<section id="section--references">