about summary refs log tree commit diff stats
path: root/html/511image.mu.html
blob: 86b124697fcf234628778d1468cb95f31a19ceb7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"time"

	"framagit.org/andinus/cetus/pkg/background"
	"framagit.org/andinus/cetus/pkg/cetus"
	"framagit.org/andinus/cetus/pkg/nasa"
)

type apod struct {
	Copyright      string `json:"copyright"`
	Date           string `json:"date"`
	Explanation    string `json:"explanation"`
	HdURL          string `json:"hdurl"`
	MediaType      string `json:"media_type"`
	ServiceVersion string `json:"service_version"`
	Title          string `json:"title"`
	Url            string `json:"url"`

	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

var (
	t         time.Duration
	api       string
	date      string
	dump      bool
	quiet     bool
	random    bool
	apiKey    string
	version   bool
	fetchOnly bool
	pathOnly  bool
)

func main() {
	parseFlags()

	if version {
		cetus.Version()
		return
	}

	// Convert timeout to seconds
	t = t * time.Second

	if random {
		date = nasa.RandDate()
	}

	body, err := apodBody()
	if dump {
		fmt.Println(body)
		return
	}

	apod := apod{}
	err = json.Unmarshal([]byte(body), &apod)
	cetus.ErrChk("body unmarshal failed", err)
	if len(apod.Msg) != 0 {
		log.Println("Message: ", apod.Msg)
	}

	printDetails(apod)

	// if fetchOnly is true then don't set background
	if fetchOnly {
		return
	}

	// if media type is an image then set background
	if apod.MediaType == "image" {
		err = background.Set(apod.HdURL)
		cetus.ErrChk("setting background failed", err)
	}
}

func parseFlags() {
	flag.BoolVar(&quiet, "quiet", false, "No output")
	flag.BoolVar(&version, "version", false, "Cetus version")
	flag.BoolVar(&fetchOnly, "fetch-only", false, "Don't set background, only fetch info")
	flag.BoolVar(&dump, "dump", false, "Only dump received response")
	dateHelp := fmt.Sprintf("Choose a random date between 1995-06-16 & %s",
		time.Now().UTC().Format("2006-01-02"))
	flag.BoolVar(&random, "random", false, dateHelp)
	flag.BoolVar(&pathOnly, "path-only", false, "Print only path of the image")

	flag.StringVar(&api, "api", "https://api.nasa.gov/planetary/apod", "APOD API URL")
	flag.StringVar(&apiKey, "api-key", "DEMO_KEY", "api.nasa.gov key for expanded usage")

	dateDefault := time.Now().UTC().Format("2006-01-02")
	flag.StringVar(&date, "date", dateDefault, "Date of the APOD image to retrieve")

	flag.DurationVar(&t, "timeout", 32*time.Second, "Timeout for http client in seconds")
	flag.Parse()

}

func printDetails(apod apod) {
	if quiet {
		return
	}
	if pathOnly {
		cetus.PrintPath(apod.HdURL)
		return
	}
	fmt.Printf("Title: %s\n\n", apod.Title)
	fmt.Printf("Copyright: %s\n", apod.Copyright)
	fmt.Printf("Date: %s\n\n", apod.Date)
	fmt.Printf("Media Type: %s\n", apod.MediaType)
	if apod.MediaType == "image" {
		fmt.Printf("URL: %s\n\n", apod.HdURL)
	} else {
		fmt.Printf("URL: %s\n\n", apod.Url)
	}
	fmt.Printf("Explanation: %s\n", apod.Explanation)
}

func apodBody() (string, error) {
	reqInfo := make(map[string]string)
	reqInfo["api"] = api
	reqInfo["apiKey"] = apiKey
	reqInfo["date"] = date

	body, err := nasa.GetApodJson(reqInfo, t)
	return body, err
}
ef='#n949'>949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mu - 511image.mu</title>
<meta name="Generator" content="Vim/8.2">
<meta name="plugin-version" content="vim8.1_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback">
<meta name="colorscheme" content="minimal-light">
<style>
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Delimiter { color: #c000c0; }
.muRegEcx { color: #870000; }
.muRegEdx { color: #af5f00; }
.muRegEbx { color: #5f00ff; }
.muRegEsi { color: #005faf; }
.muRegEdi { color: #00af00; }
.Constant { color: #008787; }
.Special { color: #ff6060; }
.PreProc { color: #c000c0; }
.muFunction { color: #af5f00; text-decoration: underline; }
.muComment { color: #005faf; }
.muS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
-->
</style>

<script>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/511image.mu'>https://github.com/akkartik/mu/blob/main/511image.mu</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">   1 </span><span class="muComment"># Loading images from disk, rendering images to screen.</span>
<span id="L2" class="LineNr">   2 </span><span class="muComment">#</span>
<span id="L3" class="LineNr">   3 </span><span class="muComment"># Currently supports ASCII Netpbm formats.</span>
<span id="L4" class="LineNr">   4 </span><span class="muComment">#   <a href="https://en.wikipedia.org/wiki/Netpbm#File_formats">https://en.wikipedia.org/wiki/Netpbm#File_formats</a></span>
<span id="L5" class="LineNr">   5 </span>
<span id="L6" class="LineNr">   6 </span><span class="PreProc">type</span> <a href='511image.mu.html#L6'>image</a> <span class="Delimiter">{</span>
<span id="L7" class="LineNr">   7 </span>  <span class="PreProc">type</span>: int  <span class="muComment"># supported types:</span>
<span id="L8" class="LineNr">   8 </span>             <span class="muComment">#  1: portable bitmap (P1) - pixels 0 or 1</span>
<span id="L9" class="LineNr">   9 </span>             <span class="muComment">#  2: portable greymap (P2) - pixels 1-byte greyscale values</span>
<span id="L10" class="LineNr">  10 </span>             <span class="muComment">#  3: portable pixmap (P3) - pixels 3-byte rgb values</span>
<span id="L11" class="LineNr">  11 </span>  max: int
<span id="L12" class="LineNr">  12 </span>  width: int
<span id="L13" class="LineNr">  13 </span>  height: int
<span id="L14" class="LineNr">  14 </span>  data: (handle array byte)
<span id="L15" class="LineNr">  15 </span><span class="Delimiter">}</span>
<span id="L16" class="LineNr">  16 </span>
<span id="L17" class="LineNr">  17 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L17'>initialize-image</a></span> _self: (addr <a href='511image.mu.html#L6'>image</a>), in: (addr stream byte) <span class="Delimiter">{</span>
<span id="L18" class="LineNr">  18 </span>  <span class="PreProc">var</span> self/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _self
<span id="L19" class="LineNr">  19 </span>  <span class="PreProc">var</span> mode-storage: slice
<span id="L20" class="LineNr">  20 </span>  <span class="PreProc">var</span> mode/<span class="muRegEcx">ecx</span>: (addr slice) <span class="Special">&lt;-</span> address mode-storage
<span id="L21" class="LineNr">  21 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, mode
<span id="L22" class="LineNr">  22 </span>  <span class="Delimiter">{</span>
<span id="L23" class="LineNr">  23 </span>    <span class="PreProc">var</span> P1?/eax: boolean <span class="Special">&lt;-</span> <a href='123slice.subx.html#L120'>slice-equal?</a> mode, <span class="Constant">&quot;P1&quot;</span>
<span id="L24" class="LineNr">  24 </span>    compare P1?, <span class="Constant">0</span>/false
<span id="L25" class="LineNr">  25 </span>    <span class="PreProc">break-if-=</span>
<span id="L26" class="LineNr">  26 </span>    <span class="PreProc">var</span> type-a/eax: (addr int) <span class="Special">&lt;-</span> get self, <span class="PreProc">type</span>
<span id="L27" class="LineNr">  27 </span>    copy-to *type-a, <span class="Constant">1</span>/ppm
<span id="L28" class="LineNr">  28 </span>    <a href='511image.mu.html#L86'>initialize-image-from-pbm</a> self, in
<span id="L29" class="LineNr">  29 </span>    <span class="PreProc">return</span>
<span id="L30" class="LineNr">  30 </span>  <span class="Delimiter">}</span>
<span id="L31" class="LineNr">  31 </span>  <span class="Delimiter">{</span>
<span id="L32" class="LineNr">  32 </span>    <span class="PreProc">var</span> P2?/eax: boolean <span class="Special">&lt;-</span> <a href='123slice.subx.html#L120'>slice-equal?</a> mode, <span class="Constant">&quot;P2&quot;</span>
<span id="L33" class="LineNr">  33 </span>    compare P2?, <span class="Constant">0</span>/false
<span id="L34" class="LineNr">  34 </span>    <span class="PreProc">break-if-=</span>
<span id="L35" class="LineNr">  35 </span>    <span class="PreProc">var</span> type-a/eax: (addr int) <span class="Special">&lt;-</span> get self, <span class="PreProc">type</span>
<span id="L36" class="LineNr">  36 </span>    copy-to *type-a, <span class="Constant">2</span>/pgm
<span id="L37" class="LineNr">  37 </span>    <a href='511image.mu.html#L198'>initialize-image-from-pgm</a> self, in
<span id="L38" class="LineNr">  38 </span>    <span class="PreProc">return</span>
<span id="L39" class="LineNr">  39 </span>  <span class="Delimiter">}</span>
<span id="L40" class="LineNr">  40 </span>  <span class="Delimiter">{</span>
<span id="L41" class="LineNr">  41 </span>    <span class="PreProc">var</span> P3?/eax: boolean <span class="Special">&lt;-</span> <a href='123slice.subx.html#L120'>slice-equal?</a> mode, <span class="Constant">&quot;P3&quot;</span>
<span id="L42" class="LineNr">  42 </span>    compare P3?, <span class="Constant">0</span>/false
<span id="L43" class="LineNr">  43 </span>    <span class="PreProc">break-if-=</span>
<span id="L44" class="LineNr">  44 </span>    <span class="PreProc">var</span> type-a/eax: (addr int) <span class="Special">&lt;-</span> get self, <span class="PreProc">type</span>
<span id="L45" class="LineNr">  45 </span>    copy-to *type-a, <span class="Constant">3</span>/ppm
<span id="L46" class="LineNr">  46 </span>    <a href='511image.mu.html#L684'>initialize-image-from-ppm</a> self, in
<span id="L47" class="LineNr">  47 </span>    <span class="PreProc">return</span>
<span id="L48" class="LineNr">  48 </span>  <span class="Delimiter">}</span>
<span id="L49" class="LineNr">  49 </span>  <a href='317abort.subx.html#L5'>abort</a> <span class="Constant">&quot;initialize-image: unrecognized <a href='511image.mu.html#L6'>image</a> type&quot;</span>
<span id="L50" class="LineNr">  50 </span><span class="Delimiter">}</span>
<span id="L51" class="LineNr">  51 </span>
<span id="L52" class="LineNr">  52 </span><span class="muComment"># dispatch to a few variants with mostly identical boilerplate</span>
<span id="L53" class="LineNr">  53 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L53'>render-image</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), _img: (addr <a href='511image.mu.html#L6'>image</a>), xmin: int, ymin: int, width: int, height: int <span class="Delimiter">{</span>
<span id="L54" class="LineNr">  54 </span>  <span class="PreProc">var</span> img/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _img
<span id="L55" class="LineNr">  55 </span>  <span class="PreProc">var</span> type-a/eax: (addr int) <span class="Special">&lt;-</span> get img, <span class="PreProc">type</span>
<span id="L56" class="LineNr">  56 </span>  <span class="Delimiter">{</span>
<span id="L57" class="LineNr">  57 </span>    compare *type-a, <span class="Constant">1</span>/pbm
<span id="L58" class="LineNr">  58 </span>    <span class="PreProc">break-if-!=</span>
<span id="L59" class="LineNr">  59 </span>    <a href='511image.mu.html#L125'>render-pbm-image</a> <a href='500fake-screen.mu.html#L14'>screen</a>, img, xmin, ymin, width, height
<span id="L60" class="LineNr">  60 </span>    <span class="PreProc">return</span>
<span id="L61" class="LineNr">  61 </span>  <span class="Delimiter">}</span>
<span id="L62" class="LineNr">  62 </span>  <span class="Delimiter">{</span>
<span id="L63" class="LineNr">  63 </span>    compare *type-a, <span class="Constant">2</span>/pgm
<span id="L64" class="LineNr">  64 </span>    <span class="PreProc">break-if-!=</span>
<span id="L65" class="LineNr">  65 </span>    <span class="PreProc">var</span> img2-storage: <a href='511image.mu.html#L6'>image</a>
<span id="L66" class="LineNr">  66 </span>    <span class="PreProc">var</span> img2/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> address img2-storage
<span id="L67" class="LineNr">  67 </span>    <a href='511image.mu.html#L389'>dither-pgm-unordered</a> img, img2
<span id="L68" class="LineNr">  68 </span>    <a href='511image.mu.html#L1033'>render-raw-image</a> <a href='500fake-screen.mu.html#L14'>screen</a>, img2, xmin, ymin, width, height
<span id="L69" class="LineNr">  69 </span>    <span class="PreProc">return</span>
<span id="L70" class="LineNr">  70 </span>  <span class="Delimiter">}</span>
<span id="L71" class="LineNr">  71 </span>  <span class="Delimiter">{</span>
<span id="L72" class="LineNr">  72 </span>    compare *type-a, <span class="Constant">3</span>/ppm
<span id="L73" class="LineNr">  73 </span>    <span class="PreProc">break-if-!=</span>
<span id="L74" class="LineNr">  74 </span>    <span class="PreProc">var</span> img2-storage: <a href='511image.mu.html#L6'>image</a>
<span id="L75" class="LineNr">  75 </span>    <span class="PreProc">var</span> img2/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> address img2-storage
<span id="L76" class="LineNr">  76 </span>    <a href='511image.mu.html#L834'>dither-ppm-unordered</a> img, img2
<span id="L77" class="LineNr">  77 </span>    <a href='511image.mu.html#L1033'>render-raw-image</a> <a href='500fake-screen.mu.html#L14'>screen</a>, img2, xmin, ymin, width, height
<span id="L78" class="LineNr">  78 </span>    <span class="PreProc">return</span>
<span id="L79" class="LineNr">  79 </span>  <span class="Delimiter">}</span>
<span id="L80" class="LineNr">  80 </span>  <a href='317abort.subx.html#L5'>abort</a> <span class="Constant">&quot;render-image: unrecognized <a href='511image.mu.html#L6'>image</a> type&quot;</span>
<span id="L81" class="LineNr">  81 </span><span class="Delimiter">}</span>
<span id="L82" class="LineNr">  82 </span>
<span id="L83" class="LineNr">  83 </span><span class="muComment">## helpers</span>
<span id="L84" class="LineNr">  84 </span>
<span id="L85" class="LineNr">  85 </span><span class="muComment"># import a black-and-white ascii bitmap (each pixel is 0 or 1)</span>
<span id="L86" class="LineNr">  86 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L86'>initialize-image-from-pbm</a></span> _self: (addr <a href='511image.mu.html#L6'>image</a>), in: (addr stream byte) <span class="Delimiter">{</span>
<span id="L87" class="LineNr">  87 </span>  <span class="PreProc">var</span> self/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _self
<span id="L88" class="LineNr">  88 </span>  <span class="PreProc">var</span> curr-word-storage: slice
<span id="L89" class="LineNr">  89 </span>  <span class="PreProc">var</span> curr-word/<span class="muRegEcx">ecx</span>: (addr slice) <span class="Special">&lt;-</span> address curr-word-storage
<span id="L90" class="LineNr">  90 </span>  <span class="muComment"># load width, height</span>
<span id="L91" class="LineNr">  91 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L92" class="LineNr">  92 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L93" class="LineNr">  93 </span>  <span class="PreProc">var</span> width/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L94" class="LineNr">  94 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L95" class="LineNr">  95 </span>  tmp <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L96" class="LineNr">  96 </span>  <span class="PreProc">var</span> height/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L97" class="LineNr">  97 </span>  <span class="muComment"># save width, height</span>
<span id="L98" class="LineNr">  98 </span>  <span class="PreProc">var</span> dest/eax: (addr int) <span class="Special">&lt;-</span> get self, width
<span id="L99" class="LineNr">  99 </span>  copy-to *dest, width
<span id="L100" class="LineNr"> 100 </span>  dest <span class="Special">&lt;-</span> get self, height
<span id="L101" class="LineNr"> 101 </span>  copy-to *dest, height
<span id="L102" class="LineNr"> 102 </span>  <span class="muComment"># initialize data</span>
<span id="L103" class="LineNr"> 103 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy width
<span id="L104" class="LineNr"> 104 </span>  capacity <span class="Special">&lt;-</span> multiply height
<span id="L105" class="LineNr"> 105 </span>  <span class="PreProc">var</span> data-ah/<span class="muRegEdi">edi</span>: (addr handle array byte) <span class="Special">&lt;-</span> get self, data
<span id="L106" class="LineNr"> 106 </span>  populate data-ah, capacity
<span id="L107" class="LineNr"> 107 </span>  <span class="PreProc">var</span> _data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *data-ah
<span id="L108" class="LineNr"> 108 </span>  <span class="PreProc">var</span> data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _data
<span id="L109" class="LineNr"> 109 </span>  <span class="PreProc">var</span> i/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L110" class="LineNr"> 110 </span>  <span class="Delimiter">{</span>
<span id="L111" class="LineNr"> 111 </span>    compare i, capacity
<span id="L112" class="LineNr"> 112 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L113" class="LineNr"> 113 </span>    <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L114" class="LineNr"> 114 </span>    <span class="PreProc">var</span> src/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L115" class="LineNr"> 115 </span>    <span class="Delimiter">{</span>
<span id="L116" class="LineNr"> 116 </span>      <span class="PreProc">var</span> dest/<span class="muRegEcx">ecx</span>: (addr byte) <span class="Special">&lt;-</span> index data, i
<span id="L117" class="LineNr"> 117 </span>      copy-byte-to *dest, src
<span id="L118" class="LineNr"> 118 </span>    <span class="Delimiter">}</span>
<span id="L119" class="LineNr"> 119 </span>    i <span class="Special">&lt;-</span> increment
<span id="L120" class="LineNr"> 120 </span>    <span class="PreProc">loop</span>
<span id="L121" class="LineNr"> 121 </span>  <span class="Delimiter">}</span>
<span id="L122" class="LineNr"> 122 </span><span class="Delimiter">}</span>
<span id="L123" class="LineNr"> 123 </span>
<span id="L124" class="LineNr"> 124 </span><span class="muComment"># render a black-and-white ascii bitmap (each pixel is 0 or 1)</span>
<span id="L125" class="LineNr"> 125 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L125'>render-pbm-image</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), _img: (addr <a href='511image.mu.html#L6'>image</a>), xmin: int, ymin: int, width: int, height: int <span class="Delimiter">{</span>
<span id="L126" class="LineNr"> 126 </span>  <span class="PreProc">var</span> img/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _img
<span id="L127" class="LineNr"> 127 </span>  <span class="muComment"># yratio = height/img-&gt;height</span>
<span id="L128" class="LineNr"> 128 </span>  <span class="PreProc">var</span> img-height-a/eax: (addr int) <span class="Special">&lt;-</span> get img, height
<span id="L129" class="LineNr"> 129 </span>  <span class="PreProc">var</span> img-height/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *img-height-a
<span id="L130" class="LineNr"> 130 </span>  <span class="PreProc">var</span> yratio/<span class="Constant">xmm1</span>: float <span class="Special">&lt;-</span> convert height
<span id="L131" class="LineNr"> 131 </span>  yratio <span class="Special">&lt;-</span> divide img-height
<span id="L132" class="LineNr"> 132 </span>  <span class="muComment"># xratio = width/img-&gt;width</span>
<span id="L133" class="LineNr"> 133 </span>  <span class="PreProc">var</span> img-width-a/eax: (addr int) <span class="Special">&lt;-</span> get img, width
<span id="L134" class="LineNr"> 134 </span>  <span class="PreProc">var</span> img-width/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy *img-width-a
<span id="L135" class="LineNr"> 135 </span>  <span class="PreProc">var</span> img-width-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert img-width
<span id="L136" class="LineNr"> 136 </span>  <span class="PreProc">var</span> xratio/<span class="Constant">xmm2</span>: float <span class="Special">&lt;-</span> convert width
<span id="L137" class="LineNr"> 137 </span>  xratio <span class="Special">&lt;-</span> divide img-width-f
<span id="L138" class="LineNr"> 138 </span>  <span class="muComment"># esi = img-&gt;data</span>
<span id="L139" class="LineNr"> 139 </span>  <span class="PreProc">var</span> img-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get img, data
<span id="L140" class="LineNr"> 140 </span>  <span class="PreProc">var</span> _img-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *img-data-ah
<span id="L141" class="LineNr"> 141 </span>  <span class="PreProc">var</span> img-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _img-data
<span id="L142" class="LineNr"> 142 </span>  <span class="PreProc">var</span> len/<span class="muRegEdi">edi</span>: int <span class="Special">&lt;-</span> length img-data
<span id="L143" class="LineNr"> 143 </span>  <span class="muComment">#</span>
<span id="L144" class="LineNr"> 144 </span>  <span class="PreProc">var</span> one/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">1</span>
<span id="L145" class="LineNr"> 145 </span>  <span class="PreProc">var</span> one-f/<span class="Constant">xmm3</span>: float <span class="Special">&lt;-</span> convert one
<span id="L146" class="LineNr"> 146 </span>  <span class="PreProc">var</span> width-f/<span class="Constant">xmm4</span>: float <span class="Special">&lt;-</span> convert width
<span id="L147" class="LineNr"> 147 </span>  <span class="PreProc">var</span> height-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> convert height
<span id="L148" class="LineNr"> 148 </span>  <span class="PreProc">var</span> zero/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L149" class="LineNr"> 149 </span>  <span class="PreProc">var</span> zero-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert zero
<span id="L150" class="LineNr"> 150 </span>  <span class="PreProc">var</span> y/<span class="Constant">xmm6</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L151" class="LineNr"> 151 </span>  <span class="Delimiter">{</span>
<span id="L152" class="LineNr"> 152 </span>    compare y, height-f
<span id="L153" class="LineNr"> 153 </span>    <span class="PreProc">break-if-float&gt;=</span>
<span id="L154" class="LineNr"> 154 </span>    <span class="PreProc">var</span> imgy-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy y
<span id="L155" class="LineNr"> 155 </span>    imgy-f <span class="Special">&lt;-</span> divide yratio
<span id="L156" class="LineNr"> 156 </span>    <span class="PreProc">var</span> imgy/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> truncate imgy-f
<span id="L157" class="LineNr"> 157 </span>    <span class="PreProc">var</span> x/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L158" class="LineNr"> 158 </span>    <span class="Delimiter">{</span>
<span id="L159" class="LineNr"> 159 </span>      compare x, width-f
<span id="L160" class="LineNr"> 160 </span>      <span class="PreProc">break-if-float&gt;=</span>
<span id="L161" class="LineNr"> 161 </span>      <span class="PreProc">var</span> imgx-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy x
<span id="L162" class="LineNr"> 162 </span>      imgx-f <span class="Special">&lt;-</span> divide xratio
<span id="L163" class="LineNr"> 163 </span>      <span class="PreProc">var</span> imgx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> truncate imgx-f
<span id="L164" class="LineNr"> 164 </span>      <span class="PreProc">var</span> idx/eax: int <span class="Special">&lt;-</span> copy imgy
<span id="L165" class="LineNr"> 165 </span>      idx <span class="Special">&lt;-</span> multiply img-width
<span id="L166" class="LineNr"> 166 </span>      idx <span class="Special">&lt;-</span> add imgx
<span id="L167" class="LineNr"> 167 </span>      <span class="muComment"># error info in case we rounded wrong and 'index' will fail bounds-check</span>
<span id="L168" class="LineNr"> 168 </span>      compare idx, len
<span id="L169" class="LineNr"> 169 </span>      <span class="Delimiter">{</span>
<span id="L170" class="LineNr"> 170 </span>        <span class="PreProc">break-if-&lt;</span>
<span id="L171" class="LineNr"> 171 </span>        <a href='500fake-screen.mu.html#L190'>set-cursor-position</a> <span class="Constant">0</span>/screen, <span class="Constant">0x20</span>/x <span class="Constant">0x20</span>/y
<span id="L172" class="LineNr"> 172 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgx, <span class="Constant">3</span>/fg <span class="Constant">0</span>/bg
<span id="L173" class="LineNr"> 173 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgy, <span class="Constant">4</span>/fg <span class="Constant">0</span>/bg
<span id="L174" class="LineNr"> 174 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, idx, <span class="Constant">5</span>/fg <span class="Constant">0</span>/bg
<span id="L175" class="LineNr"> 175 </span>      <span class="Delimiter">}</span>
<span id="L176" class="LineNr"> 176 </span>      <span class="PreProc">var</span> src-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L177" class="LineNr"> 177 </span>      <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy-byte *src-a
<span id="L178" class="LineNr"> 178 </span>      <span class="PreProc">var</span> color-int/eax: int <span class="Special">&lt;-</span> copy src
<span id="L179" class="LineNr"> 179 </span>      <span class="Delimiter">{</span>
<span id="L180" class="LineNr"> 180 </span>        compare color-int, <span class="Constant">0</span>/black
<span id="L181" class="LineNr"> 181 </span>        <span class="PreProc">break-if-=</span>
<span id="L182" class="LineNr"> 182 </span>        color-int <span class="Special">&lt;-</span> copy <span class="Constant">0xf</span>/white
<span id="L183" class="LineNr"> 183 </span>      <span class="Delimiter">}</span>
<span id="L184" class="LineNr"> 184 </span>      <span class="PreProc">var</span> screenx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> convert x
<span id="L185" class="LineNr"> 185 </span>      screenx <span class="Special">&lt;-</span> add xmin
<span id="L186" class="LineNr"> 186 </span>      <span class="PreProc">var</span> screeny/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> convert y
<span id="L187" class="LineNr"> 187 </span>      screeny <span class="Special">&lt;-</span> add ymin
<span id="L188" class="LineNr"> 188 </span>      <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, screenx, screeny, color-int
<span id="L189" class="LineNr"> 189 </span>      x <span class="Special">&lt;-</span> add one-f
<span id="L190" class="LineNr"> 190 </span>      <span class="PreProc">loop</span>
<span id="L191" class="LineNr"> 191 </span>    <span class="Delimiter">}</span>
<span id="L192" class="LineNr"> 192 </span>    y <span class="Special">&lt;-</span> add one-f
<span id="L193" class="LineNr"> 193 </span>    <span class="PreProc">loop</span>
<span id="L194" class="LineNr"> 194 </span>  <span class="Delimiter">}</span>
<span id="L195" class="LineNr"> 195 </span><span class="Delimiter">}</span>
<span id="L196" class="LineNr"> 196 </span>
<span id="L197" class="LineNr"> 197 </span><span class="muComment"># import a greyscale ascii &quot;greymap&quot; (each pixel is a shade of grey from 0 to 255)</span>
<span id="L198" class="LineNr"> 198 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L198'>initialize-image-from-pgm</a></span> _self: (addr <a href='511image.mu.html#L6'>image</a>), in: (addr stream byte) <span class="Delimiter">{</span>
<span id="L199" class="LineNr"> 199 </span>  <span class="PreProc">var</span> self/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _self
<span id="L200" class="LineNr"> 200 </span>  <span class="PreProc">var</span> curr-word-storage: slice
<span id="L201" class="LineNr"> 201 </span>  <span class="PreProc">var</span> curr-word/<span class="muRegEcx">ecx</span>: (addr slice) <span class="Special">&lt;-</span> address curr-word-storage
<span id="L202" class="LineNr"> 202 </span>  <span class="muComment"># load width, height</span>
<span id="L203" class="LineNr"> 203 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L204" class="LineNr"> 204 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L205" class="LineNr"> 205 </span>  <span class="PreProc">var</span> width/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L206" class="LineNr"> 206 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L207" class="LineNr"> 207 </span>  tmp <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L208" class="LineNr"> 208 </span>  <span class="PreProc">var</span> height/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L209" class="LineNr"> 209 </span>  <span class="muComment"># check and save color levels</span>
<span id="L210" class="LineNr"> 210 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L211" class="LineNr"> 211 </span>  <span class="Delimiter">{</span>
<span id="L212" class="LineNr"> 212 </span>    tmp <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L213" class="LineNr"> 213 </span>    compare tmp, <span class="Constant">0xff</span>
<span id="L214" class="LineNr"> 214 </span>    <span class="PreProc">break-if-=</span>
<span id="L215" class="LineNr"> 215 </span>    <a href='501draw-text.mu.html#L279'>draw-text-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, <span class="Constant">&quot;levels of grey is not 255; continuing and hoping for the best&quot;</span>, <span class="Constant">0x2b</span>/fg <span class="Constant">0</span>/bg
<span id="L216" class="LineNr"> 216 </span>  <span class="Delimiter">}</span>
<span id="L217" class="LineNr"> 217 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr int) <span class="Special">&lt;-</span> get self, max
<span id="L218" class="LineNr"> 218 </span>  copy-to *dest, tmp
<span id="L219" class="LineNr"> 219 </span>  <span class="muComment"># save width, height</span>
<span id="L220" class="LineNr"> 220 </span>  dest <span class="Special">&lt;-</span> get self, width
<span id="L221" class="LineNr"> 221 </span>  copy-to *dest, width
<span id="L222" class="LineNr"> 222 </span>  dest <span class="Special">&lt;-</span> get self, height
<span id="L223" class="LineNr"> 223 </span>  copy-to *dest, height
<span id="L224" class="LineNr"> 224 </span>  <span class="muComment"># initialize data</span>
<span id="L225" class="LineNr"> 225 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy width
<span id="L226" class="LineNr"> 226 </span>  capacity <span class="Special">&lt;-</span> multiply height
<span id="L227" class="LineNr"> 227 </span>  <span class="PreProc">var</span> data-ah/<span class="muRegEdi">edi</span>: (addr handle array byte) <span class="Special">&lt;-</span> get self, data
<span id="L228" class="LineNr"> 228 </span>  populate data-ah, capacity
<span id="L229" class="LineNr"> 229 </span>  <span class="PreProc">var</span> _data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *data-ah
<span id="L230" class="LineNr"> 230 </span>  <span class="PreProc">var</span> data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _data
<span id="L231" class="LineNr"> 231 </span>  <span class="PreProc">var</span> i/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L232" class="LineNr"> 232 </span>  <span class="Delimiter">{</span>
<span id="L233" class="LineNr"> 233 </span>    compare i, capacity
<span id="L234" class="LineNr"> 234 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L235" class="LineNr"> 235 </span>    <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L236" class="LineNr"> 236 </span>    <span class="PreProc">var</span> src/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L237" class="LineNr"> 237 </span>    <span class="Delimiter">{</span>
<span id="L238" class="LineNr"> 238 </span>      <span class="PreProc">var</span> dest/<span class="muRegEcx">ecx</span>: (addr byte) <span class="Special">&lt;-</span> index data, i
<span id="L239" class="LineNr"> 239 </span>      copy-byte-to *dest, src
<span id="L240" class="LineNr"> 240 </span>    <span class="Delimiter">}</span>
<span id="L241" class="LineNr"> 241 </span>    i <span class="Special">&lt;-</span> increment
<span id="L242" class="LineNr"> 242 </span>    <span class="PreProc">loop</span>
<span id="L243" class="LineNr"> 243 </span>  <span class="Delimiter">}</span>
<span id="L244" class="LineNr"> 244 </span><span class="Delimiter">}</span>
<span id="L245" class="LineNr"> 245 </span>
<span id="L246" class="LineNr"> 246 </span><span class="muComment"># render a greyscale ascii &quot;greymap&quot; (each pixel is a shade of grey from 0 to 255) by quantizing the shades</span>
<span id="L247" class="LineNr"> 247 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L247'>render-pgm-image</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), _img: (addr <a href='511image.mu.html#L6'>image</a>), xmin: int, ymin: int, width: int, height: int <span class="Delimiter">{</span>
<span id="L248" class="LineNr"> 248 </span>  <span class="PreProc">var</span> img/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _img
<span id="L249" class="LineNr"> 249 </span>  <span class="muComment"># yratio = height/img-&gt;height</span>
<span id="L250" class="LineNr"> 250 </span>  <span class="PreProc">var</span> img-height-a/eax: (addr int) <span class="Special">&lt;-</span> get img, height
<span id="L251" class="LineNr"> 251 </span>  <span class="PreProc">var</span> img-height/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *img-height-a
<span id="L252" class="LineNr"> 252 </span>  <span class="PreProc">var</span> yratio/<span class="Constant">xmm1</span>: float <span class="Special">&lt;-</span> convert height
<span id="L253" class="LineNr"> 253 </span>  yratio <span class="Special">&lt;-</span> divide img-height
<span id="L254" class="LineNr"> 254 </span>  <span class="muComment"># xratio = width/img-&gt;width</span>
<span id="L255" class="LineNr"> 255 </span>  <span class="PreProc">var</span> img-width-a/eax: (addr int) <span class="Special">&lt;-</span> get img, width
<span id="L256" class="LineNr"> 256 </span>  <span class="PreProc">var</span> img-width/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy *img-width-a
<span id="L257" class="LineNr"> 257 </span>  <span class="PreProc">var</span> img-width-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert img-width
<span id="L258" class="LineNr"> 258 </span>  <span class="PreProc">var</span> xratio/<span class="Constant">xmm2</span>: float <span class="Special">&lt;-</span> convert width
<span id="L259" class="LineNr"> 259 </span>  xratio <span class="Special">&lt;-</span> divide img-width-f
<span id="L260" class="LineNr"> 260 </span>  <span class="muComment"># esi = img-&gt;data</span>
<span id="L261" class="LineNr"> 261 </span>  <span class="PreProc">var</span> img-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get img, data
<span id="L262" class="LineNr"> 262 </span>  <span class="PreProc">var</span> _img-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *img-data-ah
<span id="L263" class="LineNr"> 263 </span>  <span class="PreProc">var</span> img-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _img-data
<span id="L264" class="LineNr"> 264 </span>  <span class="PreProc">var</span> len/<span class="muRegEdi">edi</span>: int <span class="Special">&lt;-</span> length img-data
<span id="L265" class="LineNr"> 265 </span>  <span class="muComment">#</span>
<span id="L266" class="LineNr"> 266 </span>  <span class="PreProc">var</span> one/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">1</span>
<span id="L267" class="LineNr"> 267 </span>  <span class="PreProc">var</span> one-f/<span class="Constant">xmm3</span>: float <span class="Special">&lt;-</span> convert one
<span id="L268" class="LineNr"> 268 </span>  <span class="PreProc">var</span> width-f/<span class="Constant">xmm4</span>: float <span class="Special">&lt;-</span> convert width
<span id="L269" class="LineNr"> 269 </span>  <span class="PreProc">var</span> height-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> convert height
<span id="L270" class="LineNr"> 270 </span>  <span class="PreProc">var</span> zero/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L271" class="LineNr"> 271 </span>  <span class="PreProc">var</span> zero-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert zero
<span id="L272" class="LineNr"> 272 </span>  <span class="PreProc">var</span> y/<span class="Constant">xmm6</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L273" class="LineNr"> 273 </span>  <span class="Delimiter">{</span>
<span id="L274" class="LineNr"> 274 </span>    compare y, height-f
<span id="L275" class="LineNr"> 275 </span>    <span class="PreProc">break-if-float&gt;=</span>
<span id="L276" class="LineNr"> 276 </span>    <span class="PreProc">var</span> imgy-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy y
<span id="L277" class="LineNr"> 277 </span>    imgy-f <span class="Special">&lt;-</span> divide yratio
<span id="L278" class="LineNr"> 278 </span>    <span class="PreProc">var</span> imgy/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> truncate imgy-f
<span id="L279" class="LineNr"> 279 </span>    <span class="PreProc">var</span> x/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L280" class="LineNr"> 280 </span>    <span class="Delimiter">{</span>
<span id="L281" class="LineNr"> 281 </span>      compare x, width-f
<span id="L282" class="LineNr"> 282 </span>      <span class="PreProc">break-if-float&gt;=</span>
<span id="L283" class="LineNr"> 283 </span>      <span class="PreProc">var</span> imgx-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy x
<span id="L284" class="LineNr"> 284 </span>      imgx-f <span class="Special">&lt;-</span> divide xratio
<span id="L285" class="LineNr"> 285 </span>      <span class="PreProc">var</span> imgx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> truncate imgx-f
<span id="L286" class="LineNr"> 286 </span>      <span class="PreProc">var</span> idx/eax: int <span class="Special">&lt;-</span> copy imgy
<span id="L287" class="LineNr"> 287 </span>      idx <span class="Special">&lt;-</span> multiply img-width
<span id="L288" class="LineNr"> 288 </span>      idx <span class="Special">&lt;-</span> add imgx
<span id="L289" class="LineNr"> 289 </span>      <span class="muComment"># error info in case we rounded wrong and 'index' will fail bounds-check</span>
<span id="L290" class="LineNr"> 290 </span>      compare idx, len
<span id="L291" class="LineNr"> 291 </span>      <span class="Delimiter">{</span>
<span id="L292" class="LineNr"> 292 </span>        <span class="PreProc">break-if-&lt;</span>
<span id="L293" class="LineNr"> 293 </span>        <a href='500fake-screen.mu.html#L190'>set-cursor-position</a> <span class="Constant">0</span>/screen, <span class="Constant">0x20</span>/x <span class="Constant">0x20</span>/y
<span id="L294" class="LineNr"> 294 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgx, <span class="Constant">3</span>/fg <span class="Constant">0</span>/bg
<span id="L295" class="LineNr"> 295 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgy, <span class="Constant">4</span>/fg <span class="Constant">0</span>/bg
<span id="L296" class="LineNr"> 296 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, idx, <span class="Constant">5</span>/fg <span class="Constant">0</span>/bg
<span id="L297" class="LineNr"> 297 </span>      <span class="Delimiter">}</span>
<span id="L298" class="LineNr"> 298 </span>      <span class="PreProc">var</span> src-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L299" class="LineNr"> 299 </span>      <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy-byte *src-a
<span id="L300" class="LineNr"> 300 </span>      <span class="PreProc">var</span> color-int/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L314'>nearest-grey</a> src
<span id="L301" class="LineNr"> 301 </span>      <span class="PreProc">var</span> screenx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> convert x
<span id="L302" class="LineNr"> 302 </span>      screenx <span class="Special">&lt;-</span> add xmin
<span id="L303" class="LineNr"> 303 </span>      <span class="PreProc">var</span> screeny/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> convert y
<span id="L304" class="LineNr"> 304 </span>      screeny <span class="Special">&lt;-</span> add ymin
<span id="L305" class="LineNr"> 305 </span>      <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, screenx, screeny, color-int
<span id="L306" class="LineNr"> 306 </span>      x <span class="Special">&lt;-</span> add one-f
<span id="L307" class="LineNr"> 307 </span>      <span class="PreProc">loop</span>
<span id="L308" class="LineNr"> 308 </span>    <span class="Delimiter">}</span>
<span id="L309" class="LineNr"> 309 </span>    y <span class="Special">&lt;-</span> add one-f
<span id="L310" class="LineNr"> 310 </span>    <span class="PreProc">loop</span>
<span id="L311" class="LineNr"> 311 </span>  <span class="Delimiter">}</span>
<span id="L312" class="LineNr"> 312 </span><span class="Delimiter">}</span>
<span id="L313" class="LineNr"> 313 </span>
<span id="L314" class="LineNr"> 314 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L314'>nearest-grey</a></span> level-255: byte<span class="PreProc"> -&gt; </span>_/eax: int <span class="Delimiter">{</span>
<span id="L315" class="LineNr"> 315 </span>  <span class="PreProc">var</span> result/eax: int <span class="Special">&lt;-</span> copy level-255
<span id="L316" class="LineNr"> 316 </span>  result <span class="Special">&lt;-</span> shift-right <span class="Constant">4</span>
<span id="L317" class="LineNr"> 317 </span>  result <span class="Special">&lt;-</span> add <span class="Constant">0x10</span>
<span id="L318" class="LineNr"> 318 </span>  <span class="PreProc">return</span> result
<span id="L319" class="LineNr"> 319 </span><span class="Delimiter">}</span>
<span id="L320" class="LineNr"> 320 </span>
<span id="L321" class="LineNr"> 321 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L321'>dither-pgm-unordered-monochrome</a></span> _src: (addr <a href='511image.mu.html#L6'>image</a>), _dest: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Delimiter">{</span>
<span id="L322" class="LineNr"> 322 </span>  <span class="PreProc">var</span> src/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _src
<span id="L323" class="LineNr"> 323 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L324" class="LineNr"> 324 </span>  <span class="muComment"># copy 'width'</span>
<span id="L325" class="LineNr"> 325 </span>  <span class="PreProc">var</span> src-width-a/eax: (addr int) <span class="Special">&lt;-</span> get src, width
<span id="L326" class="LineNr"> 326 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-width-a
<span id="L327" class="LineNr"> 327 </span>  <span class="PreProc">var</span> src-width: int
<span id="L328" class="LineNr"> 328 </span>  copy-to src-width, tmp
<span id="L329" class="LineNr"> 329 </span>  <span class="Delimiter">{</span>
<span id="L330" class="LineNr"> 330 </span>    <span class="PreProc">var</span> dest-width-a/<span class="muRegEdx">edx</span>: (addr int) <span class="Special">&lt;-</span> get dest, width
<span id="L331" class="LineNr"> 331 </span>    copy-to *dest-width-a, tmp
<span id="L332" class="LineNr"> 332 </span>  <span class="Delimiter">}</span>
<span id="L333" class="LineNr"> 333 </span>  <span class="muComment"># copy 'height'</span>
<span id="L334" class="LineNr"> 334 </span>  <span class="PreProc">var</span> src-height-a/eax: (addr int) <span class="Special">&lt;-</span> get src, height
<span id="L335" class="LineNr"> 335 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-height-a
<span id="L336" class="LineNr"> 336 </span>  <span class="PreProc">var</span> src-height: int
<span id="L337" class="LineNr"> 337 </span>  copy-to src-height, tmp
<span id="L338" class="LineNr"> 338 </span>  <span class="Delimiter">{</span>
<span id="L339" class="LineNr"> 339 </span>    <span class="PreProc">var</span> dest-height-a/<span class="muRegEcx">ecx</span>: (addr int) <span class="Special">&lt;-</span> get dest, height
<span id="L340" class="LineNr"> 340 </span>    copy-to *dest-height-a, tmp
<span id="L341" class="LineNr"> 341 </span>  <span class="Delimiter">}</span>
<span id="L342" class="LineNr"> 342 </span>  <span class="muComment"># transform 'data'</span>
<span id="L343" class="LineNr"> 343 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy src-width
<span id="L344" class="LineNr"> 344 </span>  capacity <span class="Special">&lt;-</span> multiply src-height
<span id="L345" class="LineNr"> 345 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L346" class="LineNr"> 346 </span>  <span class="PreProc">var</span> dest-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get dest, data
<span id="L347" class="LineNr"> 347 </span>  populate dest-data-ah, capacity
<span id="L348" class="LineNr"> 348 </span>  <span class="PreProc">var</span> _dest-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *dest-data-ah
<span id="L349" class="LineNr"> 349 </span>  <span class="PreProc">var</span> dest-data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _dest-data
<span id="L350" class="LineNr"> 350 </span>  <span class="muComment"># needs a buffer to temporarily hold more than 256 levels of precision</span>
<span id="L351" class="LineNr"> 351 </span>  <span class="PreProc">var</span> errors-storage: (array int <span class="Constant">0xc0000</span>)
<span id="L352" class="LineNr"> 352 </span>  <span class="PreProc">var</span> errors/<span class="muRegEbx">ebx</span>: (addr array int) <span class="Special">&lt;-</span> address errors-storage
<span id="L353" class="LineNr"> 353 </span>  <span class="PreProc">var</span> src-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get src, data
<span id="L354" class="LineNr"> 354 </span>  <span class="PreProc">var</span> _src-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *src-data-ah
<span id="L355" class="LineNr"> 355 </span>  <span class="PreProc">var</span> src-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _src-data
<span id="L356" class="LineNr"> 356 </span>  <span class="PreProc">var</span> y/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L357" class="LineNr"> 357 </span>  <span class="Delimiter">{</span>
<span id="L358" class="LineNr"> 358 </span>    compare y, src-height
<span id="L359" class="LineNr"> 359 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L360" class="LineNr"> 360 </span>    <span class="PreProc">var</span> x/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L361" class="LineNr"> 361 </span>    <span class="Delimiter">{</span>
<span id="L362" class="LineNr"> 362 </span>      compare x, src-width
<span id="L363" class="LineNr"> 363 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L364" class="LineNr"> 364 </span>      <span class="PreProc">var</span> curr/eax: byte <span class="Special">&lt;-</span> <a href='511image.mu.html#L582'>_read-pgm-buffer</a> src-data, x, y, src-width
<span id="L365" class="LineNr"> 365 </span>      <span class="PreProc">var</span> curr-int/eax: int <span class="Special">&lt;-</span> copy curr
<span id="L366" class="LineNr"> 366 </span>      curr-int <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>  <span class="muComment"># we have 32 bits; we'll use 16 bits for the fraction and leave 8 for unanticipated overflow</span>
<span id="L367" class="LineNr"> 367 </span>      <span class="PreProc">var</span> <span class="Special">error</span>/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> errors, x, y, src-width
<span id="L368" class="LineNr"> 368 </span>      <span class="Special">error</span> <span class="Special">&lt;-</span> add curr-int
<span id="L369" class="LineNr"> 369 </span>      $_dither-pgm-unordered-monochrome:update-error: <span class="Delimiter">{</span>
<span id="L370" class="LineNr"> 370 </span>        compare <span class="Special">error</span>, <span class="Constant">0x800000</span>
<span id="L371" class="LineNr"> 371 </span>        <span class="Delimiter">{</span>
<span id="L372" class="LineNr"> 372 </span>          <span class="PreProc">break-if-&gt;=</span>
<span id="L373" class="LineNr"> 373 </span>          <a href='511image.mu.html#L592'>_write-raw-buffer</a> dest-data, x, y, src-width, <span class="Constant">0</span>/black
<span id="L374" class="LineNr"> 374 </span>          <span class="PreProc">break</span> $_dither-pgm-unordered-monochrome:update-error
<span id="L375" class="LineNr"> 375 </span>        <span class="Delimiter">}</span>
<span id="L376" class="LineNr"> 376 </span>        <a href='511image.mu.html#L592'>_write-raw-buffer</a> dest-data, x, y, src-width, <span class="Constant">1</span>/white
<span id="L377" class="LineNr"> 377 </span>        <span class="Special">error</span> <span class="Special">&lt;-</span> subtract <span class="Constant">0xff0000</span>
<span id="L378" class="LineNr"> 378 </span>      <span class="Delimiter">}</span>
<span id="L379" class="LineNr"> 379 </span>      <a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a> errors, x, y, src-width, src-height, <span class="Special">error</span>
<span id="L380" class="LineNr"> 380 </span>      x <span class="Special">&lt;-</span> increment
<span id="L381" class="LineNr"> 381 </span>      <span class="PreProc">loop</span>
<span id="L382" class="LineNr"> 382 </span>    <span class="Delimiter">}</span>
<span id="L383" class="LineNr"> 383 </span>    <a href='501draw-text.mu.html#L65'>move-cursor-to-left-margin-of-next-line</a> <span class="Constant">0</span>/screen
<span id="L384" class="LineNr"> 384 </span>    y <span class="Special">&lt;-</span> increment
<span id="L385" class="LineNr"> 385 </span>    <span class="PreProc">loop</span>
<span id="L386" class="LineNr"> 386 </span>  <span class="Delimiter">}</span>
<span id="L387" class="LineNr"> 387 </span><span class="Delimiter">}</span>
<span id="L388" class="LineNr"> 388 </span>
<span id="L389" class="LineNr"> 389 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L389'>dither-pgm-unordered</a></span> _src: (addr <a href='511image.mu.html#L6'>image</a>), _dest: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Delimiter">{</span>
<span id="L390" class="LineNr"> 390 </span>  <span class="PreProc">var</span> src/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _src
<span id="L391" class="LineNr"> 391 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L392" class="LineNr"> 392 </span>  <span class="muComment"># copy 'width'</span>
<span id="L393" class="LineNr"> 393 </span>  <span class="PreProc">var</span> src-width-a/eax: (addr int) <span class="Special">&lt;-</span> get src, width
<span id="L394" class="LineNr"> 394 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-width-a
<span id="L395" class="LineNr"> 395 </span>  <span class="PreProc">var</span> src-width: int
<span id="L396" class="LineNr"> 396 </span>  copy-to src-width, tmp
<span id="L397" class="LineNr"> 397 </span>  <span class="Delimiter">{</span>
<span id="L398" class="LineNr"> 398 </span>    <span class="PreProc">var</span> dest-width-a/<span class="muRegEdx">edx</span>: (addr int) <span class="Special">&lt;-</span> get dest, width
<span id="L399" class="LineNr"> 399 </span>    copy-to *dest-width-a, tmp
<span id="L400" class="LineNr"> 400 </span>  <span class="Delimiter">}</span>
<span id="L401" class="LineNr"> 401 </span>  <span class="muComment"># copy 'height'</span>
<span id="L402" class="LineNr"> 402 </span>  <span class="PreProc">var</span> src-height-a/eax: (addr int) <span class="Special">&lt;-</span> get src, height
<span id="L403" class="LineNr"> 403 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-height-a
<span id="L404" class="LineNr"> 404 </span>  <span class="PreProc">var</span> src-height: int
<span id="L405" class="LineNr"> 405 </span>  copy-to src-height, tmp
<span id="L406" class="LineNr"> 406 </span>  <span class="Delimiter">{</span>
<span id="L407" class="LineNr"> 407 </span>    <span class="PreProc">var</span> dest-height-a/<span class="muRegEcx">ecx</span>: (addr int) <span class="Special">&lt;-</span> get dest, height
<span id="L408" class="LineNr"> 408 </span>    copy-to *dest-height-a, tmp
<span id="L409" class="LineNr"> 409 </span>  <span class="Delimiter">}</span>
<span id="L410" class="LineNr"> 410 </span>  <span class="muComment"># compute scaling factor 255/max</span>
<span id="L411" class="LineNr"> 411 </span>  <span class="PreProc">var</span> target-scale/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0xff</span>
<span id="L412" class="LineNr"> 412 </span>  <span class="PreProc">var</span> scale-f/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> convert target-scale
<span id="L413" class="LineNr"> 413 </span>  <span class="PreProc">var</span> src-max-a/eax: (addr int) <span class="Special">&lt;-</span> get src, max
<span id="L414" class="LineNr"> 414 </span>  <span class="PreProc">var</span> tmp-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *src-max-a
<span id="L415" class="LineNr"> 415 </span>  scale-f <span class="Special">&lt;-</span> divide tmp-f
<span id="L416" class="LineNr"> 416 </span>  <span class="muComment"># transform 'data'</span>
<span id="L417" class="LineNr"> 417 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy src-width
<span id="L418" class="LineNr"> 418 </span>  capacity <span class="Special">&lt;-</span> multiply src-height
<span id="L419" class="LineNr"> 419 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L420" class="LineNr"> 420 </span>  <span class="PreProc">var</span> dest-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get dest, data
<span id="L421" class="LineNr"> 421 </span>  populate dest-data-ah, capacity
<span id="L422" class="LineNr"> 422 </span>  <span class="PreProc">var</span> _dest-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *dest-data-ah
<span id="L423" class="LineNr"> 423 </span>  <span class="PreProc">var</span> dest-data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _dest-data
<span id="L424" class="LineNr"> 424 </span>  <span class="muComment"># needs a buffer to temporarily hold more than 256 levels of precision</span>
<span id="L425" class="LineNr"> 425 </span>  <span class="PreProc">var</span> errors-storage: (array int <span class="Constant">0xc0000</span>)
<span id="L426" class="LineNr"> 426 </span>  <span class="PreProc">var</span> errors/<span class="muRegEbx">ebx</span>: (addr array int) <span class="Special">&lt;-</span> address errors-storage
<span id="L427" class="LineNr"> 427 </span>  <span class="PreProc">var</span> src-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get src, data
<span id="L428" class="LineNr"> 428 </span>  <span class="PreProc">var</span> _src-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *src-data-ah
<span id="L429" class="LineNr"> 429 </span>  <span class="PreProc">var</span> src-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _src-data
<span id="L430" class="LineNr"> 430 </span>  <span class="PreProc">var</span> y/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L431" class="LineNr"> 431 </span>  <span class="Delimiter">{</span>
<span id="L432" class="LineNr"> 432 </span>    compare y, src-height
<span id="L433" class="LineNr"> 433 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L434" class="LineNr"> 434 </span>    <span class="PreProc">var</span> x/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L435" class="LineNr"> 435 </span>    <span class="Delimiter">{</span>
<span id="L436" class="LineNr"> 436 </span>      compare x, src-width
<span id="L437" class="LineNr"> 437 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L438" class="LineNr"> 438 </span>      <span class="PreProc">var</span> initial-color/eax: byte <span class="Special">&lt;-</span> <a href='511image.mu.html#L582'>_read-pgm-buffer</a> src-data, x, y, src-width
<span id="L439" class="LineNr"> 439 </span>      <span class="muS1Comment"># . scale to 255 levels</span>
<span id="L440" class="LineNr"> 440 </span>      <span class="PreProc">var</span> initial-color-int/eax: int <span class="Special">&lt;-</span> copy initial-color
<span id="L441" class="LineNr"> 441 </span>      <span class="PreProc">var</span> initial-color-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert initial-color-int
<span id="L442" class="LineNr"> 442 </span>      initial-color-f <span class="Special">&lt;-</span> multiply scale-f
<span id="L443" class="LineNr"> 443 </span>      initial-color-int <span class="Special">&lt;-</span> convert initial-color-f
<span id="L444" class="LineNr"> 444 </span>      <span class="PreProc">var</span> <span class="Special">error</span>/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> errors, x, y, src-width
<span id="L445" class="LineNr"> 445 </span>      <span class="muComment"># error += (initial-color &lt;&lt; 16)</span>
<span id="L446" class="LineNr"> 446 </span>      <span class="Delimiter">{</span>
<span id="L447" class="LineNr"> 447 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy initial-color-int
<span id="L448" class="LineNr"> 448 </span>        tmp <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>  <span class="muComment"># we have 32 bits; we'll use 16 bits for the fraction and leave 8 for unanticipated overflow</span>
<span id="L449" class="LineNr"> 449 </span>        <span class="Special">error</span> <span class="Special">&lt;-</span> add tmp
<span id="L450" class="LineNr"> 450 </span>      <span class="Delimiter">}</span>
<span id="L451" class="LineNr"> 451 </span>      <span class="muComment"># nearest-color = nearest(error &gt;&gt; 16)</span>
<span id="L452" class="LineNr"> 452 </span>      <span class="PreProc">var</span> nearest-color/eax: int <span class="Special">&lt;-</span> copy <span class="Special">error</span>
<span id="L453" class="LineNr"> 453 </span>      nearest-color <span class="Special">&lt;-</span> shift-right-signed <span class="Constant">0x10</span>
<span id="L454" class="LineNr"> 454 </span>      <span class="Delimiter">{</span>
<span id="L455" class="LineNr"> 455 </span>        compare nearest-color, <span class="Constant">0</span>
<span id="L456" class="LineNr"> 456 </span>        <span class="PreProc">break-if-&gt;=</span>
<span id="L457" class="LineNr"> 457 </span>        nearest-color <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L458" class="LineNr"> 458 </span>      <span class="Delimiter">}</span>
<span id="L459" class="LineNr"> 459 </span>      <span class="Delimiter">{</span>
<span id="L460" class="LineNr"> 460 </span>        compare nearest-color, <span class="Constant">0xf0</span>
<span id="L461" class="LineNr"> 461 </span>        <span class="PreProc">break-if-&lt;=</span>
<span id="L462" class="LineNr"> 462 </span>        nearest-color <span class="Special">&lt;-</span> copy <span class="Constant">0xf0</span>
<span id="L463" class="LineNr"> 463 </span>      <span class="Delimiter">}</span>
<span id="L464" class="LineNr"> 464 </span>      <span class="muS1Comment"># . truncate last 4 bits</span>
<span id="L465" class="LineNr"> 465 </span>      nearest-color <span class="Special">&lt;-</span> and <span class="Constant">0xf0</span>
<span id="L466" class="LineNr"> 466 </span>      <span class="muComment"># error -= (nearest-color &lt;&lt; 16)</span>
<span id="L467" class="LineNr"> 467 </span>      <span class="Delimiter">{</span>
<span id="L468" class="LineNr"> 468 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy nearest-color
<span id="L469" class="LineNr"> 469 </span>        tmp <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>
<span id="L470" class="LineNr"> 470 </span>        <span class="Special">error</span> <span class="Special">&lt;-</span> subtract tmp
<span id="L471" class="LineNr"> 471 </span>      <span class="Delimiter">}</span>
<span id="L472" class="LineNr"> 472 </span>      <span class="muComment"># color-index = (nearest-color &gt;&gt; 4 + 16)</span>
<span id="L473" class="LineNr"> 473 </span>      <span class="PreProc">var</span> color-index/eax: int <span class="Special">&lt;-</span> copy nearest-color
<span id="L474" class="LineNr"> 474 </span>      color-index <span class="Special">&lt;-</span> shift-right <span class="Constant">4</span>
<span id="L475" class="LineNr"> 475 </span>      color-index <span class="Special">&lt;-</span> add <span class="Constant">0x10</span>
<span id="L476" class="LineNr"> 476 </span>      <span class="PreProc">var</span> color-index-byte/eax: byte <span class="Special">&lt;-</span> copy-byte color-index
<span id="L477" class="LineNr"> 477 </span>      <a href='511image.mu.html#L592'>_write-raw-buffer</a> dest-data, x, y, src-width, color-index-byte
<span id="L478" class="LineNr"> 478 </span>      <a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a> errors, x, y, src-width, src-height, <span class="Special">error</span>
<span id="L479" class="LineNr"> 479 </span>      x <span class="Special">&lt;-</span> increment
<span id="L480" class="LineNr"> 480 </span>      <span class="PreProc">loop</span>
<span id="L481" class="LineNr"> 481 </span>    <span class="Delimiter">}</span>
<span id="L482" class="LineNr"> 482 </span>    y <span class="Special">&lt;-</span> increment
<span id="L483" class="LineNr"> 483 </span>    <span class="PreProc">loop</span>
<span id="L484" class="LineNr"> 484 </span>  <span class="Delimiter">}</span>
<span id="L485" class="LineNr"> 485 </span><span class="Delimiter">}</span>
<span id="L486" class="LineNr"> 486 </span>
<span id="L487" class="LineNr"> 487 </span><span class="muComment"># Use Floyd-Steinberg algorithm for diffusing error at x, y in a 2D grid of</span>
<span id="L488" class="LineNr"> 488 </span><span class="muComment"># dimensions (width, height)</span>
<span id="L489" class="LineNr"> 489 </span><span class="muComment">#</span>
<span id="L490" class="LineNr"> 490 </span><span class="muComment"># <a href="https://tannerhelland.com/2012/12/28/dithering-eleven-algorithms-source-code.html">https://tannerhelland.com/2012/12/28/dithering-eleven-algorithms-source-code.html</a></span>
<span id="L491" class="LineNr"> 491 </span><span class="muComment">#</span>
<span id="L492" class="LineNr"> 492 </span><span class="muComment"># Error is currently a fixed-point number with 16-bit fraction. But</span>
<span id="L493" class="LineNr"> 493 </span><span class="muComment"># interestingly this function doesn't care about that.</span>
<span id="L494" class="LineNr"> 494 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a></span> errors: (addr array int), x: int, y: int, width: int, height: int, <span class="Special">error</span>: int <span class="Delimiter">{</span>
<span id="L495" class="LineNr"> 495 </span>  <span class="Delimiter">{</span>
<span id="L496" class="LineNr"> 496 </span>    compare <span class="Special">error</span>, <span class="Constant">0</span>
<span id="L497" class="LineNr"> 497 </span>    <span class="PreProc">break-if-!=</span>
<span id="L498" class="LineNr"> 498 </span>    <span class="PreProc">return</span>
<span id="L499" class="LineNr"> 499 </span>  <span class="Delimiter">}</span>
<span id="L500" class="LineNr"> 500 </span>  <span class="PreProc">var</span> width-1/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> copy width
<span id="L501" class="LineNr"> 501 </span>  width-1 <span class="Special">&lt;-</span> decrement
<span id="L502" class="LineNr"> 502 </span>  <span class="PreProc">var</span> height-1/<span class="muRegEdi">edi</span>: int <span class="Special">&lt;-</span> copy height
<span id="L503" class="LineNr"> 503 </span>  height-1 <span class="Special">&lt;-</span> decrement
<span id="L504" class="LineNr"> 504 </span>  <span class="muComment"># delta = error/16</span>
<span id="L505" class="LineNr"> 505 </span><span class="CommentedCode">#?   show-errors errors, width, height, x, y</span>
<span id="L506" class="LineNr"> 506 </span>  <span class="PreProc">var</span> delta/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Special">error</span>
<span id="L507" class="LineNr"> 507 </span>  delta <span class="Special">&lt;-</span> shift-right-signed <span class="Constant">4</span>
<span id="L508" class="LineNr"> 508 </span>  <span class="muComment"># In Floyd-Steinberg, each pixel X transmits its errors to surrounding</span>
<span id="L509" class="LineNr"> 509 </span>  <span class="muComment"># pixels in the following proportion:</span>
<span id="L510" class="LineNr"> 510 </span>  <span class="muComment">#           X     7/16</span>
<span id="L511" class="LineNr"> 511 </span>  <span class="muComment">#     3/16  5/16  1/16</span>
<span id="L512" class="LineNr"> 512 </span>  <span class="PreProc">var</span> x/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy x
<span id="L513" class="LineNr"> 513 </span>  <span class="Delimiter">{</span>
<span id="L514" class="LineNr"> 514 </span>    compare x, width-1
<span id="L515" class="LineNr"> 515 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L516" class="LineNr"> 516 </span>    <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">7</span>
<span id="L517" class="LineNr"> 517 </span>    tmp <span class="Special">&lt;-</span> multiply delta
<span id="L518" class="LineNr"> 518 </span>    <span class="PreProc">var</span> xright/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy x
<span id="L519" class="LineNr"> 519 </span>    xright <span class="Special">&lt;-</span> increment
<span id="L520" class="LineNr"> 520 </span>    <a href='511image.mu.html#L555'>_accumulate-dithering-error</a> errors, xright, y, width, tmp
<span id="L521" class="LineNr"> 521 </span>  <span class="Delimiter">}</span>
<span id="L522" class="LineNr"> 522 </span>  <span class="PreProc">var</span> y/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L523" class="LineNr"> 523 </span>  <span class="Delimiter">{</span>
<span id="L524" class="LineNr"> 524 </span>    compare y, height-1
<span id="L525" class="LineNr"> 525 </span>    <span class="PreProc">break-if-&lt;</span>
<span id="L526" class="LineNr"> 526 </span>    <span class="PreProc">return</span>
<span id="L527" class="LineNr"> 527 </span>  <span class="Delimiter">}</span>
<span id="L528" class="LineNr"> 528 </span>  <span class="PreProc">var</span> ybelow: int
<span id="L529" class="LineNr"> 529 </span>  copy-to ybelow, y
<span id="L530" class="LineNr"> 530 </span>  increment ybelow
<span id="L531" class="LineNr"> 531 </span>  <span class="Delimiter">{</span>
<span id="L532" class="LineNr"> 532 </span>    compare x, <span class="Constant">0</span>
<span id="L533" class="LineNr"> 533 </span>    <span class="PreProc">break-if-&lt;=</span>
<span id="L534" class="LineNr"> 534 </span>    <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">3</span>
<span id="L535" class="LineNr"> 535 </span>    tmp <span class="Special">&lt;-</span> multiply delta
<span id="L536" class="LineNr"> 536 </span>    <span class="PreProc">var</span> xleft/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy x
<span id="L537" class="LineNr"> 537 </span>    xleft <span class="Special">&lt;-</span> decrement
<span id="L538" class="LineNr"> 538 </span>    <a href='511image.mu.html#L555'>_accumulate-dithering-error</a> errors, xleft, ybelow, width, tmp
<span id="L539" class="LineNr"> 539 </span>  <span class="Delimiter">}</span>
<span id="L540" class="LineNr"> 540 </span>  <span class="Delimiter">{</span>
<span id="L541" class="LineNr"> 541 </span>    <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">5</span>
<span id="L542" class="LineNr"> 542 </span>    tmp <span class="Special">&lt;-</span> multiply delta
<span id="L543" class="LineNr"> 543 </span>    <a href='511image.mu.html#L555'>_accumulate-dithering-error</a> errors, x, ybelow, width, tmp
<span id="L544" class="LineNr"> 544 </span>  <span class="Delimiter">}</span>
<span id="L545" class="LineNr"> 545 </span>  <span class="Delimiter">{</span>
<span id="L546" class="LineNr"> 546 </span>    compare x, width-1
<span id="L547" class="LineNr"> 547 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L548" class="LineNr"> 548 </span>    <span class="PreProc">var</span> xright/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy x
<span id="L549" class="LineNr"> 549 </span>    xright <span class="Special">&lt;-</span> increment
<span id="L550" class="LineNr"> 550 </span>    <a href='511image.mu.html#L555'>_accumulate-dithering-error</a> errors, xright, ybelow, width, delta
<span id="L551" class="LineNr"> 551 </span>  <span class="Delimiter">}</span>
<span id="L552" class="LineNr"> 552 </span><span class="CommentedCode">#?   show-errors errors, width, height, x, y</span>
<span id="L553" class="LineNr"> 553 </span><span class="Delimiter">}</span>
<span id="L554" class="LineNr"> 554 </span>
<span id="L555" class="LineNr"> 555 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L555'>_accumulate-dithering-error</a></span> errors: (addr array int), x: int, y: int, width: int, <span class="Special">error</span>: int <span class="Delimiter">{</span>
<span id="L556" class="LineNr"> 556 </span>  <span class="PreProc">var</span> curr/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> errors, x, y, width
<span id="L557" class="LineNr"> 557 </span>  curr <span class="Special">&lt;-</span> add <span class="Special">error</span>
<span id="L558" class="LineNr"> 558 </span>  <a href='511image.mu.html#L570'>_write-dithering-error</a> errors, x, y, width, curr
<span id="L559" class="LineNr"> 559 </span><span class="Delimiter">}</span>
<span id="L560" class="LineNr"> 560 </span>
<span id="L561" class="LineNr"> 561 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L561'>_read-dithering-error</a></span> _errors: (addr array int), x: int, y: int, width: int<span class="PreProc"> -&gt; </span>_/<span class="muRegEsi">esi</span>: int <span class="Delimiter">{</span>
<span id="L562" class="LineNr"> 562 </span>  <span class="PreProc">var</span> errors/<span class="muRegEsi">esi</span>: (addr array int) <span class="Special">&lt;-</span> copy _errors
<span id="L563" class="LineNr"> 563 </span>  <span class="PreProc">var</span> idx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L564" class="LineNr"> 564 </span>  idx <span class="Special">&lt;-</span> multiply width
<span id="L565" class="LineNr"> 565 </span>  idx <span class="Special">&lt;-</span> add x
<span id="L566" class="LineNr"> 566 </span>  <span class="PreProc">var</span> result-a/eax: (addr int) <span class="Special">&lt;-</span> index errors, idx
<span id="L567" class="LineNr"> 567 </span>  <span class="PreProc">return</span> *result-a
<span id="L568" class="LineNr"> 568 </span><span class="Delimiter">}</span>
<span id="L569" class="LineNr"> 569 </span>
<span id="L570" class="LineNr"> 570 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L570'>_write-dithering-error</a></span> _errors: (addr array int), x: int, y: int, width: int, val: int <span class="Delimiter">{</span>
<span id="L571" class="LineNr"> 571 </span>  <span class="PreProc">var</span> errors/<span class="muRegEsi">esi</span>: (addr array int) <span class="Special">&lt;-</span> copy _errors
<span id="L572" class="LineNr"> 572 </span>  <span class="PreProc">var</span> idx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L573" class="LineNr"> 573 </span>  idx <span class="Special">&lt;-</span> multiply width
<span id="L574" class="LineNr"> 574 </span>  idx <span class="Special">&lt;-</span> add x
<span id="L575" class="LineNr"> 575 </span><span class="CommentedCode">#?   draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, idx, 7/fg 0/bg</span>
<span id="L576" class="LineNr"> 576 </span><span class="CommentedCode">#?   move-cursor-to-left-margin-of-next-line 0/screen</span>
<span id="L577" class="LineNr"> 577 </span>  <span class="PreProc">var</span> src/eax: int <span class="Special">&lt;-</span> copy val
<span id="L578" class="LineNr"> 578 </span>  <span class="PreProc">var</span> dest-a/<span class="muRegEdi">edi</span>: (addr int) <span class="Special">&lt;-</span> index errors, idx
<span id="L579" class="LineNr"> 579 </span>  copy-to *dest-a, src
<span id="L580" class="LineNr"> 580 </span><span class="Delimiter">}</span>
<span id="L581" class="LineNr"> 581 </span>
<span id="L582" class="LineNr"> 582 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L582'>_read-pgm-buffer</a></span> _buf: (addr array byte), x: int, y: int, width: int<span class="PreProc"> -&gt; </span>_/eax: byte <span class="Delimiter">{</span>
<span id="L583" class="LineNr"> 583 </span>  <span class="PreProc">var</span> buf/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _buf
<span id="L584" class="LineNr"> 584 </span>  <span class="PreProc">var</span> idx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L585" class="LineNr"> 585 </span>  idx <span class="Special">&lt;-</span> multiply width
<span id="L586" class="LineNr"> 586 </span>  idx <span class="Special">&lt;-</span> add x
<span id="L587" class="LineNr"> 587 </span>  <span class="PreProc">var</span> result-a/eax: (addr byte) <span class="Special">&lt;-</span> index buf, idx
<span id="L588" class="LineNr"> 588 </span>  <span class="PreProc">var</span> result/eax: byte <span class="Special">&lt;-</span> copy-byte *result-a
<span id="L589" class="LineNr"> 589 </span>  <span class="PreProc">return</span> result
<span id="L590" class="LineNr"> 590 </span><span class="Delimiter">}</span>
<span id="L591" class="LineNr"> 591 </span>
<span id="L592" class="LineNr"> 592 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L592'>_write-raw-buffer</a></span> _buf: (addr array byte), x: int, y: int, width: int, val: byte <span class="Delimiter">{</span>
<span id="L593" class="LineNr"> 593 </span>  <span class="PreProc">var</span> buf/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _buf
<span id="L594" class="LineNr"> 594 </span>  <span class="PreProc">var</span> idx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L595" class="LineNr"> 595 </span>  idx <span class="Special">&lt;-</span> multiply width
<span id="L596" class="LineNr"> 596 </span>  idx <span class="Special">&lt;-</span> add x
<span id="L597" class="LineNr"> 597 </span>  <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy val
<span id="L598" class="LineNr"> 598 </span>  <span class="PreProc">var</span> dest-a/<span class="muRegEdi">edi</span>: (addr byte) <span class="Special">&lt;-</span> index buf, idx
<span id="L599" class="LineNr"> 599 </span>  copy-byte-to *dest-a, src
<span id="L600" class="LineNr"> 600 </span><span class="Delimiter">}</span>
<span id="L601" class="LineNr"> 601 </span>
<span id="L602" class="LineNr"> 602 </span><span class="muComment"># some debugging helpers</span>
<span id="L603" class="LineNr"> 603 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L603'>show-errors</a></span> errors: (addr array int), width: int, height: int, x: int, y: int <span class="Delimiter">{</span>
<span id="L604" class="LineNr"> 604 </span>  compare y, <span class="Constant">1</span>
<span id="L605" class="LineNr"> 605 </span>  <span class="Delimiter">{</span>
<span id="L606" class="LineNr"> 606 </span>    <span class="PreProc">break-if-=</span>
<span id="L607" class="LineNr"> 607 </span>    <span class="PreProc">return</span>
<span id="L608" class="LineNr"> 608 </span>  <span class="Delimiter">}</span>
<span id="L609" class="LineNr"> 609 </span>  compare x, <span class="Constant">0</span>
<span id="L610" class="LineNr"> 610 </span>  <span class="Delimiter">{</span>
<span id="L611" class="LineNr"> 611 </span>    <span class="PreProc">break-if-=</span>
<span id="L612" class="LineNr"> 612 </span>    <span class="PreProc">return</span>
<span id="L613" class="LineNr"> 613 </span>  <span class="Delimiter">}</span>
<span id="L614" class="LineNr"> 614 </span>  <span class="PreProc">var</span> y/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L615" class="LineNr"> 615 </span>  <span class="Delimiter">{</span>
<span id="L616" class="LineNr"> 616 </span>    compare y, height
<span id="L617" class="LineNr"> 617 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L618" class="LineNr"> 618 </span>    <span class="PreProc">var</span> x/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L619" class="LineNr"> 619 </span>    <span class="Delimiter">{</span>
<span id="L620" class="LineNr"> 620 </span>      compare x, width
<span id="L621" class="LineNr"> 621 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L622" class="LineNr"> 622 </span>      <span class="PreProc">var</span> <span class="Special">error</span>/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> errors, x, y, width
<span id="L623" class="LineNr"> 623 </span>      <a href='511image.mu.html#L633'>psd</a> <span class="Constant">&quot;e&quot;</span>, <span class="Special">error</span>, <span class="Constant">5</span>/fg, x, y
<span id="L624" class="LineNr"> 624 </span>      x <span class="Special">&lt;-</span> increment
<span id="L625" class="LineNr"> 625 </span>      <span class="PreProc">loop</span>
<span id="L626" class="LineNr"> 626 </span>    <span class="Delimiter">}</span>
<span id="L627" class="LineNr"> 627 </span>    <a href='501draw-text.mu.html#L65'>move-cursor-to-left-margin-of-next-line</a> <span class="Constant">0</span>/screen
<span id="L628" class="LineNr"> 628 </span>    y <span class="Special">&lt;-</span> increment
<span id="L629" class="LineNr"> 629 </span>    <span class="PreProc">loop</span>
<span id="L630" class="LineNr"> 630 </span>  <span class="Delimiter">}</span>
<span id="L631" class="LineNr"> 631 </span><span class="Delimiter">}</span>
<span id="L632" class="LineNr"> 632 </span>
<span id="L633" class="LineNr"> 633 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L633'>psd</a></span> s: (addr array byte), d: int, fg: int, x: int, y: int <span class="Delimiter">{</span>
<span id="L634" class="LineNr"> 634 </span>  <span class="Delimiter">{</span>
<span id="L635" class="LineNr"> 635 </span>    compare y, <span class="Constant">0x18</span>
<span id="L636" class="LineNr"> 636 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L637" class="LineNr"> 637 </span>    <span class="PreProc">return</span>
<span id="L638" class="LineNr"> 638 </span>  <span class="Delimiter">}</span>
<span id="L639" class="LineNr"> 639 </span>  <span class="Delimiter">{</span>
<span id="L640" class="LineNr"> 640 </span>    compare y, <span class="Constant">0x1c</span>
<span id="L641" class="LineNr"> 641 </span>    <span class="PreProc">break-if-&lt;=</span>
<span id="L642" class="LineNr"> 642 </span>    <span class="PreProc">return</span>
<span id="L643" class="LineNr"> 643 </span>  <span class="Delimiter">}</span>
<span id="L644" class="LineNr"> 644 </span>  <span class="Delimiter">{</span>
<span id="L645" class="LineNr"> 645 </span>    compare x, <span class="Constant">0x40</span>
<span id="L646" class="LineNr"> 646 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L647" class="LineNr"> 647 </span>    <span class="PreProc">return</span>
<span id="L648" class="LineNr"> 648 </span>  <span class="Delimiter">}</span>
<span id="L649" class="LineNr"> 649 </span><span class="CommentedCode">#?   {</span>
<span id="L650" class="LineNr"> 650 </span><span class="CommentedCode">#?     compare x, 0x48</span>
<span id="L651" class="LineNr"> 651 </span><span class="CommentedCode">#?     break-if-&lt;=</span>
<span id="L652" class="LineNr"> 652 </span><span class="CommentedCode">#?     return</span>
<span id="L653" class="LineNr"> 653 </span><span class="CommentedCode">#?   }</span>
<span id="L654" class="LineNr"> 654 </span>  <a href='501draw-text.mu.html#L279'>draw-text-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, s, <span class="Constant">7</span>/fg <span class="Constant">0</span>/bg
<span id="L655" class="LineNr"> 655 </span>  <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, d, fg <span class="Constant">0</span>/bg
<span id="L656" class="LineNr"> 656 </span><span class="Delimiter">}</span>
<span id="L657" class="LineNr"> 657 </span>
<span id="L658" class="LineNr"> 658 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L658'>psx</a></span> s: (addr array byte), d: int, fg: int, x: int, y: int <span class="Delimiter">{</span>
<span id="L659" class="LineNr"> 659 </span><span class="CommentedCode">#?   {</span>
<span id="L660" class="LineNr"> 660 </span><span class="CommentedCode">#?     compare y, 0x60</span>
<span id="L661" class="LineNr"> 661 </span><span class="CommentedCode">#?     break-if-&gt;=</span>
<span id="L662" class="LineNr"> 662 </span><span class="CommentedCode">#?     return</span>
<span id="L663" class="LineNr"> 663 </span><span class="CommentedCode">#?   }</span>
<span id="L664" class="LineNr"> 664 </span><span class="CommentedCode">#?   {</span>
<span id="L665" class="LineNr"> 665 </span><span class="CommentedCode">#?     compare y, 0x6c</span>
<span id="L666" class="LineNr"> 666 </span><span class="CommentedCode">#?     break-if-&lt;=</span>
<span id="L667" class="LineNr"> 667 </span><span class="CommentedCode">#?     return</span>
<span id="L668" class="LineNr"> 668 </span><span class="CommentedCode">#?   }</span>
<span id="L669" class="LineNr"> 669 </span>  <span class="Delimiter">{</span>
<span id="L670" class="LineNr"> 670 </span>    compare x, <span class="Constant">0x20</span>
<span id="L671" class="LineNr"> 671 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L672" class="LineNr"> 672 </span>    <span class="PreProc">return</span>
<span id="L673" class="LineNr"> 673 </span>  <span class="Delimiter">}</span>
<span id="L674" class="LineNr"> 674 </span><span class="CommentedCode">#?   {</span>
<span id="L675" class="LineNr"> 675 </span><span class="CommentedCode">#?     compare x, 0x6c</span>
<span id="L676" class="LineNr"> 676 </span><span class="CommentedCode">#?     break-if-&lt;=</span>
<span id="L677" class="LineNr"> 677 </span><span class="CommentedCode">#?     return</span>
<span id="L678" class="LineNr"> 678 </span><span class="CommentedCode">#?   }</span>
<span id="L679" class="LineNr"> 679 </span>  <a href='501draw-text.mu.html#L279'>draw-text-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, s, <span class="Constant">7</span>/fg <span class="Constant">0</span>/bg
<span id="L680" class="LineNr"> 680 </span>  <a href='501draw-text.mu.html#L333'>draw-int32-hex-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, d, fg <span class="Constant">0</span>/bg
<span id="L681" class="LineNr"> 681 </span><span class="Delimiter">}</span>
<span id="L682" class="LineNr"> 682 </span>
<span id="L683" class="LineNr"> 683 </span><span class="muComment"># import a color ascii &quot;pixmap&quot; (each pixel consists of 3 shades of r/g/b from 0 to 255)</span>
<span id="L684" class="LineNr"> 684 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L684'>initialize-image-from-ppm</a></span> _self: (addr <a href='511image.mu.html#L6'>image</a>), in: (addr stream byte) <span class="Delimiter">{</span>
<span id="L685" class="LineNr"> 685 </span>  <span class="PreProc">var</span> self/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _self
<span id="L686" class="LineNr"> 686 </span>  <span class="PreProc">var</span> curr-word-storage: slice
<span id="L687" class="LineNr"> 687 </span>  <span class="PreProc">var</span> curr-word/<span class="muRegEcx">ecx</span>: (addr slice) <span class="Special">&lt;-</span> address curr-word-storage
<span id="L688" class="LineNr"> 688 </span>  <span class="muComment"># load width, height</span>
<span id="L689" class="LineNr"> 689 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L690" class="LineNr"> 690 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L691" class="LineNr"> 691 </span>  <span class="PreProc">var</span> width/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L692" class="LineNr"> 692 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L693" class="LineNr"> 693 </span>  tmp <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L694" class="LineNr"> 694 </span>  <span class="PreProc">var</span> height/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy tmp
<span id="L695" class="LineNr"> 695 </span>  <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L696" class="LineNr"> 696 </span>  <span class="muComment"># check color levels</span>
<span id="L697" class="LineNr"> 697 </span>  <span class="Delimiter">{</span>
<span id="L698" class="LineNr"> 698 </span>    tmp <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L699" class="LineNr"> 699 </span>    compare tmp, <span class="Constant">0xff</span>
<span id="L700" class="LineNr"> 700 </span>    <span class="PreProc">break-if-=</span>
<span id="L701" class="LineNr"> 701 </span>    <a href='317abort.subx.html#L5'>abort</a> <span class="Constant">&quot;initialize-image-from-ppm: supports exactly 255 levels per rgb channel&quot;</span>
<span id="L702" class="LineNr"> 702 </span>  <span class="Delimiter">}</span>
<span id="L703" class="LineNr"> 703 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr int) <span class="Special">&lt;-</span> get self, max
<span id="L704" class="LineNr"> 704 </span>  copy-to *dest, tmp
<span id="L705" class="LineNr"> 705 </span>  <span class="muComment"># save width, height</span>
<span id="L706" class="LineNr"> 706 </span>  dest <span class="Special">&lt;-</span> get self, width
<span id="L707" class="LineNr"> 707 </span>  copy-to *dest, width
<span id="L708" class="LineNr"> 708 </span>  dest <span class="Special">&lt;-</span> get self, height
<span id="L709" class="LineNr"> 709 </span>  copy-to *dest, height
<span id="L710" class="LineNr"> 710 </span>  <span class="muComment"># initialize data</span>
<span id="L711" class="LineNr"> 711 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy width
<span id="L712" class="LineNr"> 712 </span>  capacity <span class="Special">&lt;-</span> multiply height
<span id="L713" class="LineNr"> 713 </span>  <span class="muS1Comment"># . multiply by 3 for the r/g/b channels</span>
<span id="L714" class="LineNr"> 714 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy capacity
<span id="L715" class="LineNr"> 715 </span>  tmp <span class="Special">&lt;-</span> shift-left <span class="Constant">1</span>
<span id="L716" class="LineNr"> 716 </span>  capacity <span class="Special">&lt;-</span> add tmp
<span id="L717" class="LineNr"> 717 </span>  <span class="muComment">#</span>
<span id="L718" class="LineNr"> 718 </span>  <span class="PreProc">var</span> data-ah/<span class="muRegEdi">edi</span>: (addr handle array byte) <span class="Special">&lt;-</span> get self, data
<span id="L719" class="LineNr"> 719 </span>  populate data-ah, capacity
<span id="L720" class="LineNr"> 720 </span>  <span class="PreProc">var</span> _data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *data-ah
<span id="L721" class="LineNr"> 721 </span>  <span class="PreProc">var</span> data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _data
<span id="L722" class="LineNr"> 722 </span>  <span class="PreProc">var</span> i/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L723" class="LineNr"> 723 </span>  <span class="Delimiter">{</span>
<span id="L724" class="LineNr"> 724 </span>    compare i, capacity
<span id="L725" class="LineNr"> 725 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L726" class="LineNr"> 726 </span>    <a href='127next-word.subx.html#L11'>next-word</a> in, curr-word
<span id="L727" class="LineNr"> 727 </span>    <span class="PreProc">var</span> src/eax: int <span class="Special">&lt;-</span> <a href='311decimal-int.subx.html#L4'>parse-decimal-int-from-slice</a> curr-word
<span id="L728" class="LineNr"> 728 </span>    <span class="Delimiter">{</span>
<span id="L729" class="LineNr"> 729 </span>      <span class="PreProc">var</span> dest/<span class="muRegEcx">ecx</span>: (addr byte) <span class="Special">&lt;-</span> index data, i
<span id="L730" class="LineNr"> 730 </span>      copy-byte-to *dest, src
<span id="L731" class="LineNr"> 731 </span>    <span class="Delimiter">}</span>
<span id="L732" class="LineNr"> 732 </span>    i <span class="Special">&lt;-</span> increment
<span id="L733" class="LineNr"> 733 </span>    <span class="PreProc">loop</span>
<span id="L734" class="LineNr"> 734 </span>  <span class="Delimiter">}</span>
<span id="L735" class="LineNr"> 735 </span><span class="Delimiter">}</span>
<span id="L736" class="LineNr"> 736 </span>
<span id="L737" class="LineNr"> 737 </span><span class="muComment"># import a color ascii &quot;pixmap&quot; (each pixel consists of 3 shades of r/g/b from 0 to 255)</span>
<span id="L738" class="LineNr"> 738 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L738'>render-ppm-image</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), _img: (addr <a href='511image.mu.html#L6'>image</a>), xmin: int, ymin: int, width: int, height: int <span class="Delimiter">{</span>
<span id="L739" class="LineNr"> 739 </span>  <span class="PreProc">var</span> img/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _img
<span id="L740" class="LineNr"> 740 </span>  <span class="muComment"># yratio = height/img-&gt;height</span>
<span id="L741" class="LineNr"> 741 </span>  <span class="PreProc">var</span> img-height-a/eax: (addr int) <span class="Special">&lt;-</span> get img, height
<span id="L742" class="LineNr"> 742 </span>  <span class="PreProc">var</span> img-height/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *img-height-a
<span id="L743" class="LineNr"> 743 </span>  <span class="PreProc">var</span> yratio/<span class="Constant">xmm1</span>: float <span class="Special">&lt;-</span> convert height
<span id="L744" class="LineNr"> 744 </span>  yratio <span class="Special">&lt;-</span> divide img-height
<span id="L745" class="LineNr"> 745 </span>  <span class="muComment"># xratio = width/img-&gt;width</span>
<span id="L746" class="LineNr"> 746 </span>  <span class="PreProc">var</span> img-width-a/eax: (addr int) <span class="Special">&lt;-</span> get img, width
<span id="L747" class="LineNr"> 747 </span>  <span class="PreProc">var</span> img-width/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy *img-width-a
<span id="L748" class="LineNr"> 748 </span>  <span class="PreProc">var</span> img-width-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert img-width
<span id="L749" class="LineNr"> 749 </span>  <span class="PreProc">var</span> xratio/<span class="Constant">xmm2</span>: float <span class="Special">&lt;-</span> convert width
<span id="L750" class="LineNr"> 750 </span>  xratio <span class="Special">&lt;-</span> divide img-width-f
<span id="L751" class="LineNr"> 751 </span>  <span class="muComment"># esi = img-&gt;data</span>
<span id="L752" class="LineNr"> 752 </span>  <span class="PreProc">var</span> img-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get img, data
<span id="L753" class="LineNr"> 753 </span>  <span class="PreProc">var</span> _img-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *img-data-ah
<span id="L754" class="LineNr"> 754 </span>  <span class="PreProc">var</span> img-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _img-data
<span id="L755" class="LineNr"> 755 </span>  <span class="PreProc">var</span> len/<span class="muRegEdi">edi</span>: int <span class="Special">&lt;-</span> length img-data
<span id="L756" class="LineNr"> 756 </span>  <span class="muComment">#</span>
<span id="L757" class="LineNr"> 757 </span>  <span class="PreProc">var</span> one/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">1</span>
<span id="L758" class="LineNr"> 758 </span>  <span class="PreProc">var</span> one-f/<span class="Constant">xmm3</span>: float <span class="Special">&lt;-</span> convert one
<span id="L759" class="LineNr"> 759 </span>  <span class="PreProc">var</span> width-f/<span class="Constant">xmm4</span>: float <span class="Special">&lt;-</span> convert width
<span id="L760" class="LineNr"> 760 </span>  <span class="PreProc">var</span> height-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> convert height
<span id="L761" class="LineNr"> 761 </span>  <span class="PreProc">var</span> zero/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L762" class="LineNr"> 762 </span>  <span class="PreProc">var</span> zero-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert zero
<span id="L763" class="LineNr"> 763 </span>  <span class="PreProc">var</span> y/<span class="Constant">xmm6</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L764" class="LineNr"> 764 </span>  <span class="Delimiter">{</span>
<span id="L765" class="LineNr"> 765 </span>    compare y, height-f
<span id="L766" class="LineNr"> 766 </span>    <span class="PreProc">break-if-float&gt;=</span>
<span id="L767" class="LineNr"> 767 </span>    <span class="PreProc">var</span> imgy-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy y
<span id="L768" class="LineNr"> 768 </span>    imgy-f <span class="Special">&lt;-</span> divide yratio
<span id="L769" class="LineNr"> 769 </span>    <span class="PreProc">var</span> imgy/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> truncate imgy-f
<span id="L770" class="LineNr"> 770 </span>    <span class="PreProc">var</span> x/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L771" class="LineNr"> 771 </span>    <span class="Delimiter">{</span>
<span id="L772" class="LineNr"> 772 </span>      compare x, width-f
<span id="L773" class="LineNr"> 773 </span>      <span class="PreProc">break-if-float&gt;=</span>
<span id="L774" class="LineNr"> 774 </span>      <span class="PreProc">var</span> imgx-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy x
<span id="L775" class="LineNr"> 775 </span>      imgx-f <span class="Special">&lt;-</span> divide xratio
<span id="L776" class="LineNr"> 776 </span>      <span class="PreProc">var</span> imgx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> truncate imgx-f
<span id="L777" class="LineNr"> 777 </span>      <span class="PreProc">var</span> idx/eax: int <span class="Special">&lt;-</span> copy imgy
<span id="L778" class="LineNr"> 778 </span>      idx <span class="Special">&lt;-</span> multiply img-width
<span id="L779" class="LineNr"> 779 </span>      idx <span class="Special">&lt;-</span> add imgx
<span id="L780" class="LineNr"> 780 </span>      <span class="muS1Comment"># . multiply by 3 for the r/g/b channels</span>
<span id="L781" class="LineNr"> 781 </span>      <span class="Delimiter">{</span>
<span id="L782" class="LineNr"> 782 </span>        <span class="PreProc">var</span> tmp/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy idx
<span id="L783" class="LineNr"> 783 </span>        tmp <span class="Special">&lt;-</span> shift-left <span class="Constant">1</span>
<span id="L784" class="LineNr"> 784 </span>        idx <span class="Special">&lt;-</span> add tmp
<span id="L785" class="LineNr"> 785 </span>      <span class="Delimiter">}</span>
<span id="L786" class="LineNr"> 786 </span>      <span class="muComment"># error info in case we rounded wrong and 'index' will fail bounds-check</span>
<span id="L787" class="LineNr"> 787 </span>      compare idx, len
<span id="L788" class="LineNr"> 788 </span>      <span class="Delimiter">{</span>
<span id="L789" class="LineNr"> 789 </span>        <span class="PreProc">break-if-&lt;</span>
<span id="L790" class="LineNr"> 790 </span>        <a href='500fake-screen.mu.html#L190'>set-cursor-position</a> <span class="Constant">0</span>/screen, <span class="Constant">0x20</span>/x <span class="Constant">0x20</span>/y
<span id="L791" class="LineNr"> 791 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgx, <span class="Constant">3</span>/fg <span class="Constant">0</span>/bg
<span id="L792" class="LineNr"> 792 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgy, <span class="Constant">4</span>/fg <span class="Constant">0</span>/bg
<span id="L793" class="LineNr"> 793 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, idx, <span class="Constant">5</span>/fg <span class="Constant">0</span>/bg
<span id="L794" class="LineNr"> 794 </span>      <span class="Delimiter">}</span>
<span id="L795" class="LineNr"> 795 </span>      <span class="muComment"># r channel</span>
<span id="L796" class="LineNr"> 796 </span>      <span class="PreProc">var</span> r: int
<span id="L797" class="LineNr"> 797 </span>      <span class="Delimiter">{</span>
<span id="L798" class="LineNr"> 798 </span>        <span class="PreProc">var</span> src-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L799" class="LineNr"> 799 </span>        <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy-byte *src-a
<span id="L800" class="LineNr"> 800 </span>        copy-to r, src
<span id="L801" class="LineNr"> 801 </span>      <span class="Delimiter">}</span>
<span id="L802" class="LineNr"> 802 </span>      idx <span class="Special">&lt;-</span> increment
<span id="L803" class="LineNr"> 803 </span>      <span class="muComment"># g channel</span>
<span id="L804" class="LineNr"> 804 </span>      <span class="PreProc">var</span> g: int
<span id="L805" class="LineNr"> 805 </span>      <span class="Delimiter">{</span>
<span id="L806" class="LineNr"> 806 </span>        <span class="PreProc">var</span> src-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L807" class="LineNr"> 807 </span>        <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy-byte *src-a
<span id="L808" class="LineNr"> 808 </span>        copy-to g, src
<span id="L809" class="LineNr"> 809 </span>      <span class="Delimiter">}</span>
<span id="L810" class="LineNr"> 810 </span>      idx <span class="Special">&lt;-</span> increment
<span id="L811" class="LineNr"> 811 </span>      <span class="muComment"># b channel</span>
<span id="L812" class="LineNr"> 812 </span>      <span class="PreProc">var</span> b: int
<span id="L813" class="LineNr"> 813 </span>      <span class="Delimiter">{</span>
<span id="L814" class="LineNr"> 814 </span>        <span class="PreProc">var</span> src-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L815" class="LineNr"> 815 </span>        <span class="PreProc">var</span> src/eax: byte <span class="Special">&lt;-</span> copy-byte *src-a
<span id="L816" class="LineNr"> 816 </span>        copy-to b, src
<span id="L817" class="LineNr"> 817 </span>      <span class="Delimiter">}</span>
<span id="L818" class="LineNr"> 818 </span>      idx <span class="Special">&lt;-</span> increment
<span id="L819" class="LineNr"> 819 </span>      <span class="muComment"># plot nearest color</span>
<span id="L820" class="LineNr"> 820 </span>      <span class="PreProc">var</span> color/eax: int <span class="Special">&lt;-</span> <a href='505colors.mu.html#L1'>nearest-color-euclidean</a> r, g, b
<span id="L821" class="LineNr"> 821 </span>      <span class="PreProc">var</span> screenx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> convert x
<span id="L822" class="LineNr"> 822 </span>      screenx <span class="Special">&lt;-</span> add xmin
<span id="L823" class="LineNr"> 823 </span>      <span class="PreProc">var</span> screeny/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> convert y
<span id="L824" class="LineNr"> 824 </span>      screeny <span class="Special">&lt;-</span> add ymin
<span id="L825" class="LineNr"> 825 </span>      <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, screenx, screeny, color
<span id="L826" class="LineNr"> 826 </span>      x <span class="Special">&lt;-</span> add one-f
<span id="L827" class="LineNr"> 827 </span>      <span class="PreProc">loop</span>
<span id="L828" class="LineNr"> 828 </span>    <span class="Delimiter">}</span>
<span id="L829" class="LineNr"> 829 </span>    y <span class="Special">&lt;-</span> add one-f
<span id="L830" class="LineNr"> 830 </span>    <span class="PreProc">loop</span>
<span id="L831" class="LineNr"> 831 </span>  <span class="Delimiter">}</span>
<span id="L832" class="LineNr"> 832 </span><span class="Delimiter">}</span>
<span id="L833" class="LineNr"> 833 </span>
<span id="L834" class="LineNr"> 834 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L834'>dither-ppm-unordered</a></span> _src: (addr <a href='511image.mu.html#L6'>image</a>), _dest: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Delimiter">{</span>
<span id="L835" class="LineNr"> 835 </span>  <span class="PreProc">var</span> src/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _src
<span id="L836" class="LineNr"> 836 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L837" class="LineNr"> 837 </span>  <span class="muComment"># copy 'width'</span>
<span id="L838" class="LineNr"> 838 </span>  <span class="PreProc">var</span> src-width-a/eax: (addr int) <span class="Special">&lt;-</span> get src, width
<span id="L839" class="LineNr"> 839 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-width-a
<span id="L840" class="LineNr"> 840 </span>  <span class="PreProc">var</span> src-width: int
<span id="L841" class="LineNr"> 841 </span>  copy-to src-width, tmp
<span id="L842" class="LineNr"> 842 </span>  <span class="Delimiter">{</span>
<span id="L843" class="LineNr"> 843 </span>    <span class="PreProc">var</span> dest-width-a/<span class="muRegEdx">edx</span>: (addr int) <span class="Special">&lt;-</span> get dest, width
<span id="L844" class="LineNr"> 844 </span>    copy-to *dest-width-a, tmp
<span id="L845" class="LineNr"> 845 </span>  <span class="Delimiter">}</span>
<span id="L846" class="LineNr"> 846 </span>  <span class="muComment"># copy 'height'</span>
<span id="L847" class="LineNr"> 847 </span>  <span class="PreProc">var</span> src-height-a/eax: (addr int) <span class="Special">&lt;-</span> get src, height
<span id="L848" class="LineNr"> 848 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy *src-height-a
<span id="L849" class="LineNr"> 849 </span>  <span class="PreProc">var</span> src-height: int
<span id="L850" class="LineNr"> 850 </span>  copy-to src-height, tmp
<span id="L851" class="LineNr"> 851 </span>  <span class="Delimiter">{</span>
<span id="L852" class="LineNr"> 852 </span>    <span class="PreProc">var</span> dest-height-a/<span class="muRegEcx">ecx</span>: (addr int) <span class="Special">&lt;-</span> get dest, height
<span id="L853" class="LineNr"> 853 </span>    copy-to *dest-height-a, tmp
<span id="L854" class="LineNr"> 854 </span>  <span class="Delimiter">}</span>
<span id="L855" class="LineNr"> 855 </span>  <span class="muComment"># compute scaling factor 255/max</span>
<span id="L856" class="LineNr"> 856 </span>  <span class="PreProc">var</span> target-scale/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0xff</span>
<span id="L857" class="LineNr"> 857 </span>  <span class="PreProc">var</span> scale-f/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> convert target-scale
<span id="L858" class="LineNr"> 858 </span>  <span class="PreProc">var</span> src-max-a/eax: (addr int) <span class="Special">&lt;-</span> get src, max
<span id="L859" class="LineNr"> 859 </span>  <span class="PreProc">var</span> tmp-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *src-max-a
<span id="L860" class="LineNr"> 860 </span>  scale-f <span class="Special">&lt;-</span> divide tmp-f
<span id="L861" class="LineNr"> 861 </span>  <span class="muComment"># allocate 'data'</span>
<span id="L862" class="LineNr"> 862 </span>  <span class="PreProc">var</span> capacity/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy src-width
<span id="L863" class="LineNr"> 863 </span>  capacity <span class="Special">&lt;-</span> multiply src-height
<span id="L864" class="LineNr"> 864 </span>  <span class="PreProc">var</span> dest/<span class="muRegEdi">edi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _dest
<span id="L865" class="LineNr"> 865 </span>  <span class="PreProc">var</span> dest-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get dest, data
<span id="L866" class="LineNr"> 866 </span>  populate dest-data-ah, capacity
<span id="L867" class="LineNr"> 867 </span>  <span class="PreProc">var</span> _dest-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *dest-data-ah
<span id="L868" class="LineNr"> 868 </span>  <span class="PreProc">var</span> dest-data/<span class="muRegEdi">edi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _dest-data
<span id="L869" class="LineNr"> 869 </span>  <span class="muComment"># error buffers per r/g/b channel</span>
<span id="L870" class="LineNr"> 870 </span>  <span class="PreProc">var</span> red-errors-storage: (array int <span class="Constant">0xc0000</span>)
<span id="L871" class="LineNr"> 871 </span>  <span class="PreProc">var</span> tmp/eax: (addr array int) <span class="Special">&lt;-</span> address red-errors-storage
<span id="L872" class="LineNr"> 872 </span>  <span class="PreProc">var</span> red-errors: (addr array int)
<span id="L873" class="LineNr"> 873 </span>  copy-to red-errors, tmp
<span id="L874" class="LineNr"> 874 </span>  <span class="PreProc">var</span> green-errors-storage: (array int <span class="Constant">0xc0000</span>)
<span id="L875" class="LineNr"> 875 </span>  <span class="PreProc">var</span> tmp/eax: (addr array int) <span class="Special">&lt;-</span> address green-errors-storage
<span id="L876" class="LineNr"> 876 </span>  <span class="PreProc">var</span> green-errors: (addr array int)
<span id="L877" class="LineNr"> 877 </span>  copy-to green-errors, tmp
<span id="L878" class="LineNr"> 878 </span>  <span class="PreProc">var</span> blue-errors-storage: (array int <span class="Constant">0xc0000</span>)
<span id="L879" class="LineNr"> 879 </span>  <span class="PreProc">var</span> tmp/eax: (addr array int) <span class="Special">&lt;-</span> address blue-errors-storage
<span id="L880" class="LineNr"> 880 </span>  <span class="PreProc">var</span> blue-errors: (addr array int)
<span id="L881" class="LineNr"> 881 </span>  copy-to blue-errors, tmp
<span id="L882" class="LineNr"> 882 </span>  <span class="muComment"># transform 'data'</span>
<span id="L883" class="LineNr"> 883 </span>  <span class="PreProc">var</span> src-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get src, data
<span id="L884" class="LineNr"> 884 </span>  <span class="PreProc">var</span> _src-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *src-data-ah
<span id="L885" class="LineNr"> 885 </span>  <span class="PreProc">var</span> src-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _src-data
<span id="L886" class="LineNr"> 886 </span>  <span class="PreProc">var</span> y/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L887" class="LineNr"> 887 </span>  <span class="Delimiter">{</span>
<span id="L888" class="LineNr"> 888 </span>    compare y, src-height
<span id="L889" class="LineNr"> 889 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L890" class="LineNr"> 890 </span>    <span class="PreProc">var</span> x/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L891" class="LineNr"> 891 </span>    <span class="Delimiter">{</span>
<span id="L892" class="LineNr"> 892 </span>      compare x, src-width
<span id="L893" class="LineNr"> 893 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L894" class="LineNr"> 894 </span>      <span class="muComment"># - update errors and compute color levels for current pixel in each channel</span>
<span id="L895" class="LineNr"> 895 </span>      <span class="muComment"># update red-error with current image pixel</span>
<span id="L896" class="LineNr"> 896 </span>      <span class="PreProc">var</span> red-error: int
<span id="L897" class="LineNr"> 897 </span>      <span class="Delimiter">{</span>
<span id="L898" class="LineNr"> 898 </span>        <span class="PreProc">var</span> tmp/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> red-errors, x, y, src-width
<span id="L899" class="LineNr"> 899 </span>        copy-to red-error, tmp
<span id="L900" class="LineNr"> 900 </span>      <span class="Delimiter">}</span>
<span id="L901" class="LineNr"> 901 </span>      <span class="Delimiter">{</span>
<span id="L902" class="LineNr"> 902 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L987'>_ppm-error</a> src-data, x, y, src-width, <span class="Constant">0</span>/red, scale-f
<span id="L903" class="LineNr"> 903 </span>        add-to red-error, tmp
<span id="L904" class="LineNr"> 904 </span>      <span class="Delimiter">}</span>
<span id="L905" class="LineNr"> 905 </span>      <span class="muComment"># recompute red channel for current pixel</span>
<span id="L906" class="LineNr"> 906 </span>      <span class="PreProc">var</span> red-level: int
<span id="L907" class="LineNr"> 907 </span>      <span class="Delimiter">{</span>
<span id="L908" class="LineNr"> 908 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L1001'>_error-to-ppm-channel</a> red-error
<span id="L909" class="LineNr"> 909 </span>        copy-to red-level, tmp
<span id="L910" class="LineNr"> 910 </span>      <span class="Delimiter">}</span>
<span id="L911" class="LineNr"> 911 </span>      <span class="muComment"># update green-error with current image pixel</span>
<span id="L912" class="LineNr"> 912 </span>      <span class="PreProc">var</span> green-error: int
<span id="L913" class="LineNr"> 913 </span>      <span class="Delimiter">{</span>
<span id="L914" class="LineNr"> 914 </span>        <span class="PreProc">var</span> tmp/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> green-errors, x, y, src-width
<span id="L915" class="LineNr"> 915 </span>        copy-to green-error, tmp
<span id="L916" class="LineNr"> 916 </span>      <span class="Delimiter">}</span>
<span id="L917" class="LineNr"> 917 </span>      <span class="Delimiter">{</span>
<span id="L918" class="LineNr"> 918 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L987'>_ppm-error</a> src-data, x, y, src-width, <span class="Constant">1</span>/green, scale-f
<span id="L919" class="LineNr"> 919 </span>        add-to green-error, tmp
<span id="L920" class="LineNr"> 920 </span>      <span class="Delimiter">}</span>
<span id="L921" class="LineNr"> 921 </span>      <span class="muComment"># recompute green channel for current pixel</span>
<span id="L922" class="LineNr"> 922 </span>      <span class="PreProc">var</span> green-level: int
<span id="L923" class="LineNr"> 923 </span>      <span class="Delimiter">{</span>
<span id="L924" class="LineNr"> 924 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L1001'>_error-to-ppm-channel</a> green-error
<span id="L925" class="LineNr"> 925 </span>        copy-to green-level, tmp
<span id="L926" class="LineNr"> 926 </span>      <span class="Delimiter">}</span>
<span id="L927" class="LineNr"> 927 </span>      <span class="muComment"># update blue-error with current image pixel</span>
<span id="L928" class="LineNr"> 928 </span>      <span class="PreProc">var</span> blue-error: int
<span id="L929" class="LineNr"> 929 </span>      <span class="Delimiter">{</span>
<span id="L930" class="LineNr"> 930 </span>        <span class="PreProc">var</span> tmp/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L561'>_read-dithering-error</a> blue-errors, x, y, src-width
<span id="L931" class="LineNr"> 931 </span>        copy-to blue-error, tmp
<span id="L932" class="LineNr"> 932 </span>      <span class="Delimiter">}</span>
<span id="L933" class="LineNr"> 933 </span>      <span class="Delimiter">{</span>
<span id="L934" class="LineNr"> 934 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L987'>_ppm-error</a> src-data, x, y, src-width, <span class="Constant">2</span>/blue, scale-f
<span id="L935" class="LineNr"> 935 </span>        add-to blue-error, tmp
<span id="L936" class="LineNr"> 936 </span>      <span class="Delimiter">}</span>
<span id="L937" class="LineNr"> 937 </span>      <span class="muComment"># recompute blue channel for current pixel</span>
<span id="L938" class="LineNr"> 938 </span>      <span class="PreProc">var</span> blue-level: int
<span id="L939" class="LineNr"> 939 </span>      <span class="Delimiter">{</span>
<span id="L940" class="LineNr"> 940 </span>        <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> <a href='511image.mu.html#L1001'>_error-to-ppm-channel</a> blue-error
<span id="L941" class="LineNr"> 941 </span>        copy-to blue-level, tmp
<span id="L942" class="LineNr"> 942 </span>      <span class="Delimiter">}</span>
<span id="L943" class="LineNr"> 943 </span>      <span class="muComment"># - figure out the nearest color</span>
<span id="L944" class="LineNr"> 944 </span>      <span class="PreProc">var</span> nearest-color-index/eax: int <span class="Special">&lt;-</span> <a href='505colors.mu.html#L1'>nearest-color-euclidean</a> red-level, green-level, blue-level
<span id="L945" class="LineNr"> 945 </span>      <span class="Delimiter">{</span>
<span id="L946" class="LineNr"> 946 </span>        <span class="PreProc">var</span> nearest-color-index-byte/eax: byte <span class="Special">&lt;-</span> copy-byte nearest-color-index
<span id="L947" class="LineNr"> 947 </span>        <a href='511image.mu.html#L592'>_write-raw-buffer</a> dest-data, x, y, src-width, nearest-color-index-byte
<span id="L948" class="LineNr"> 948 </span>      <span class="Delimiter">}</span>
<span id="L949" class="LineNr"> 949 </span>      <span class="muComment"># - diffuse errors</span>
<span id="L950" class="LineNr"> 950 </span>      <span class="PreProc">var</span> red-level: int
<span id="L951" class="LineNr"> 951 </span>      <span class="PreProc">var</span> green-level: int
<span id="L952" class="LineNr"> 952 </span>      <span class="PreProc">var</span> blue-level: int
<span id="L953" class="LineNr"> 953 </span>      <span class="Delimiter">{</span>
<span id="L954" class="LineNr"> 954 </span>        <span class="PreProc">var</span> tmp-red-level/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L955" class="LineNr"> 955 </span>        <span class="PreProc">var</span> tmp-green-level/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L956" class="LineNr"> 956 </span>        <span class="PreProc">var</span> tmp-blue-level/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L957" class="LineNr"> 957 </span>        tmp-red-level, tmp-green-level, tmp-blue-level <span class="Special">&lt;-</span> <a href='316colors.subx.html#L7'>color-rgb</a> nearest-color-index
<span id="L958" class="LineNr"> 958 </span>        copy-to red-level, tmp-red-level
<span id="L959" class="LineNr"> 959 </span>        copy-to green-level, tmp-green-level
<span id="L960" class="LineNr"> 960 </span>        copy-to blue-level, tmp-blue-level
<span id="L961" class="LineNr"> 961 </span>      <span class="Delimiter">}</span>
<span id="L962" class="LineNr"> 962 </span>      <span class="muComment"># update red-error</span>
<span id="L963" class="LineNr"> 963 </span>      <span class="PreProc">var</span> red-level-error/eax: int <span class="Special">&lt;-</span> copy red-level
<span id="L964" class="LineNr"> 964 </span>      red-level-error <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>
<span id="L965" class="LineNr"> 965 </span>      subtract-from red-error, red-level-error
<span id="L966" class="LineNr"> 966 </span>      <a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a> red-errors, x, y, src-width, src-height, red-error
<span id="L967" class="LineNr"> 967 </span>      <span class="muComment"># update green-error</span>
<span id="L968" class="LineNr"> 968 </span>      <span class="PreProc">var</span> green-level-error/eax: int <span class="Special">&lt;-</span> copy green-level
<span id="L969" class="LineNr"> 969 </span>      green-level-error <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>
<span id="L970" class="LineNr"> 970 </span>      subtract-from green-error, green-level-error
<span id="L971" class="LineNr"> 971 </span>      <a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a> green-errors, x, y, src-width, src-height, green-error
<span id="L972" class="LineNr"> 972 </span>      <span class="muComment"># update blue-error</span>
<span id="L973" class="LineNr"> 973 </span>      <span class="PreProc">var</span> blue-level-error/eax: int <span class="Special">&lt;-</span> copy blue-level
<span id="L974" class="LineNr"> 974 </span>      blue-level-error <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>
<span id="L975" class="LineNr"> 975 </span>      subtract-from blue-error, blue-level-error
<span id="L976" class="LineNr"> 976 </span>      <a href='511image.mu.html#L494'>_diffuse-dithering-error-floyd-steinberg</a> blue-errors, x, y, src-width, src-height, blue-error
<span id="L977" class="LineNr"> 977 </span>      <span class="muComment">#</span>
<span id="L978" class="LineNr"> 978 </span>      x <span class="Special">&lt;-</span> increment
<span id="L979" class="LineNr"> 979 </span>      <span class="PreProc">loop</span>
<span id="L980" class="LineNr"> 980 </span>    <span class="Delimiter">}</span>
<span id="L981" class="LineNr"> 981 </span>    y <span class="Special">&lt;-</span> increment
<span id="L982" class="LineNr"> 982 </span>    <span class="PreProc">loop</span>
<span id="L983" class="LineNr"> 983 </span>  <span class="Delimiter">}</span>
<span id="L984" class="LineNr"> 984 </span><span class="Delimiter">}</span>
<span id="L985" class="LineNr"> 985 </span>
<span id="L986" class="LineNr"> 986 </span><span class="muComment"># convert a single channel for a single image pixel to error space</span>
<span id="L987" class="LineNr"> 987 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L987'>_ppm-error</a></span> buf: (addr array byte), x: int, y: int, width: int, channel: int, _scale-f: float<span class="PreProc"> -&gt; </span>_/eax: int <span class="Delimiter">{</span>
<span id="L988" class="LineNr"> 988 </span>  <span class="muComment"># current image pixel</span>
<span id="L989" class="LineNr"> 989 </span>  <span class="PreProc">var</span> initial-level/eax: byte <span class="Special">&lt;-</span> <a href='511image.mu.html#L1019'>_read-ppm-buffer</a> buf, x, y, width, channel
<span id="L990" class="LineNr"> 990 </span>  <span class="muComment"># scale to 255 levels</span>
<span id="L991" class="LineNr"> 991 </span>  <span class="PreProc">var</span> initial-level-int/eax: int <span class="Special">&lt;-</span> copy initial-level
<span id="L992" class="LineNr"> 992 </span>  <span class="PreProc">var</span> initial-level-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert initial-level-int
<span id="L993" class="LineNr"> 993 </span>  <span class="PreProc">var</span> scale-f/<span class="Constant">xmm1</span>: float <span class="Special">&lt;-</span> copy _scale-f
<span id="L994" class="LineNr"> 994 </span>  initial-level-f <span class="Special">&lt;-</span> multiply scale-f
<span id="L995" class="LineNr"> 995 </span>  initial-level-int <span class="Special">&lt;-</span> convert initial-level-f
<span id="L996" class="LineNr"> 996 </span>  <span class="muComment"># switch to fixed-point with 16 bits of precision</span>
<span id="L997" class="LineNr"> 997 </span>  initial-level-int <span class="Special">&lt;-</span> shift-left <span class="Constant">0x10</span>
<span id="L998" class="LineNr"> 998 </span>  <span class="PreProc">return</span> initial-level-int
<span id="L999" class="LineNr"> 999 </span><span class="Delimiter">}</span>
<span id="L1000" class="LineNr">1000 </span>
<span id="L1001" class="LineNr">1001 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L1001'>_error-to-ppm-channel</a></span> <span class="Special">error</span>: int<span class="PreProc"> -&gt; </span>_/eax: int <span class="Delimiter">{</span>
<span id="L1002" class="LineNr">1002 </span>  <span class="muComment"># clamp(error &gt;&gt; 16)</span>
<span id="L1003" class="LineNr">1003 </span>  <span class="PreProc">var</span> result/<span class="muRegEsi">esi</span>: int <span class="Special">&lt;-</span> copy <span class="Special">error</span>
<span id="L1004" class="LineNr">1004 </span>  result <span class="Special">&lt;-</span> shift-right-signed <span class="Constant">0x10</span>
<span id="L1005" class="LineNr">1005 </span>  <span class="Delimiter">{</span>
<span id="L1006" class="LineNr">1006 </span>    compare result, <span class="Constant">0</span>
<span id="L1007" class="LineNr">1007 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L1008" class="LineNr">1008 </span>    result <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L1009" class="LineNr">1009 </span>  <span class="Delimiter">}</span>
<span id="L1010" class="LineNr">1010 </span>  <span class="Delimiter">{</span>
<span id="L1011" class="LineNr">1011 </span>    compare result, <span class="Constant">0xff</span>
<span id="L1012" class="LineNr">1012 </span>    <span class="PreProc">break-if-&lt;=</span>
<span id="L1013" class="LineNr">1013 </span>    result <span class="Special">&lt;-</span> copy <span class="Constant">0xff</span>
<span id="L1014" class="LineNr">1014 </span>  <span class="Delimiter">}</span>
<span id="L1015" class="LineNr">1015 </span>  <span class="PreProc">return</span> result
<span id="L1016" class="LineNr">1016 </span><span class="Delimiter">}</span>
<span id="L1017" class="LineNr">1017 </span>
<span id="L1018" class="LineNr">1018 </span><span class="muComment"># read from a buffer containing alternating bytes from r/g/b channels</span>
<span id="L1019" class="LineNr">1019 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L1019'>_read-ppm-buffer</a></span> _buf: (addr array byte), x: int, y: int, width: int, channel: int<span class="PreProc"> -&gt; </span>_/eax: byte <span class="Delimiter">{</span>
<span id="L1020" class="LineNr">1020 </span>  <span class="PreProc">var</span> buf/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _buf
<span id="L1021" class="LineNr">1021 </span>  <span class="PreProc">var</span> idx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy y
<span id="L1022" class="LineNr">1022 </span>  idx <span class="Special">&lt;-</span> multiply width
<span id="L1023" class="LineNr">1023 </span>  idx <span class="Special">&lt;-</span> add x
<span id="L1024" class="LineNr">1024 </span>  <span class="PreProc">var</span> byte-idx/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">3</span>
<span id="L1025" class="LineNr">1025 </span>  byte-idx <span class="Special">&lt;-</span> multiply idx
<span id="L1026" class="LineNr">1026 </span>  byte-idx <span class="Special">&lt;-</span> add channel
<span id="L1027" class="LineNr">1027 </span>  <span class="PreProc">var</span> result-a/eax: (addr byte) <span class="Special">&lt;-</span> index buf, byte-idx
<span id="L1028" class="LineNr">1028 </span>  <span class="PreProc">var</span> result/eax: byte <span class="Special">&lt;-</span> copy-byte *result-a
<span id="L1029" class="LineNr">1029 </span>  <span class="PreProc">return</span> result
<span id="L1030" class="LineNr">1030 </span><span class="Delimiter">}</span>
<span id="L1031" class="LineNr">1031 </span>
<span id="L1032" class="LineNr">1032 </span><span class="muComment"># each byte in the image data is a color of the current palette</span>
<span id="L1033" class="LineNr">1033 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='511image.mu.html#L1033'>render-raw-image</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), _img: (addr <a href='511image.mu.html#L6'>image</a>), xmin: int, ymin: int, width: int, height: int <span class="Delimiter">{</span>
<span id="L1034" class="LineNr">1034 </span>  <span class="PreProc">var</span> img/<span class="muRegEsi">esi</span>: (addr <a href='511image.mu.html#L6'>image</a>) <span class="Special">&lt;-</span> copy _img
<span id="L1035" class="LineNr">1035 </span>  <span class="muComment"># yratio = height/img-&gt;height</span>
<span id="L1036" class="LineNr">1036 </span>  <span class="PreProc">var</span> img-height-a/eax: (addr int) <span class="Special">&lt;-</span> get img, height
<span id="L1037" class="LineNr">1037 </span>  <span class="PreProc">var</span> img-height/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert *img-height-a
<span id="L1038" class="LineNr">1038 </span>  <span class="PreProc">var</span> yratio/<span class="Constant">xmm1</span>: float <span class="Special">&lt;-</span> convert height
<span id="L1039" class="LineNr">1039 </span>  yratio <span class="Special">&lt;-</span> divide img-height
<span id="L1040" class="LineNr">1040 </span>  <span class="muComment"># xratio = width/img-&gt;width</span>
<span id="L1041" class="LineNr">1041 </span>  <span class="PreProc">var</span> img-width-a/eax: (addr int) <span class="Special">&lt;-</span> get img, width
<span id="L1042" class="LineNr">1042 </span>  <span class="PreProc">var</span> img-width/<span class="muRegEbx">ebx</span>: int <span class="Special">&lt;-</span> copy *img-width-a
<span id="L1043" class="LineNr">1043 </span>  <span class="PreProc">var</span> img-width-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert img-width
<span id="L1044" class="LineNr">1044 </span>  <span class="PreProc">var</span> xratio/<span class="Constant">xmm2</span>: float <span class="Special">&lt;-</span> convert width
<span id="L1045" class="LineNr">1045 </span>  xratio <span class="Special">&lt;-</span> divide img-width-f
<span id="L1046" class="LineNr">1046 </span>  <span class="muComment"># esi = img-&gt;data</span>
<span id="L1047" class="LineNr">1047 </span>  <span class="PreProc">var</span> img-data-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> get img, data
<span id="L1048" class="LineNr">1048 </span>  <span class="PreProc">var</span> _img-data/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L223'>lookup</a> *img-data-ah
<span id="L1049" class="LineNr">1049 </span>  <span class="PreProc">var</span> img-data/<span class="muRegEsi">esi</span>: (addr array byte) <span class="Special">&lt;-</span> copy _img-data
<span id="L1050" class="LineNr">1050 </span>  <span class="PreProc">var</span> len/<span class="muRegEdi">edi</span>: int <span class="Special">&lt;-</span> length img-data
<span id="L1051" class="LineNr">1051 </span>  <span class="muComment">#</span>
<span id="L1052" class="LineNr">1052 </span>  <span class="PreProc">var</span> one/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">1</span>
<span id="L1053" class="LineNr">1053 </span>  <span class="PreProc">var</span> one-f/<span class="Constant">xmm3</span>: float <span class="Special">&lt;-</span> convert one
<span id="L1054" class="LineNr">1054 </span>  <span class="PreProc">var</span> width-f/<span class="Constant">xmm4</span>: float <span class="Special">&lt;-</span> convert width
<span id="L1055" class="LineNr">1055 </span>  <span class="PreProc">var</span> height-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> convert height
<span id="L1056" class="LineNr">1056 </span>  <span class="PreProc">var</span> zero/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L1057" class="LineNr">1057 </span>  <span class="PreProc">var</span> zero-f/<span class="Constant">xmm0</span>: float <span class="Special">&lt;-</span> convert zero
<span id="L1058" class="LineNr">1058 </span>  <span class="PreProc">var</span> y/<span class="Constant">xmm6</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L1059" class="LineNr">1059 </span>  <span class="Delimiter">{</span>
<span id="L1060" class="LineNr">1060 </span>    compare y, height-f
<span id="L1061" class="LineNr">1061 </span>    <span class="PreProc">break-if-float&gt;=</span>
<span id="L1062" class="LineNr">1062 </span>    <span class="PreProc">var</span> imgy-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy y
<span id="L1063" class="LineNr">1063 </span>    imgy-f <span class="Special">&lt;-</span> divide yratio
<span id="L1064" class="LineNr">1064 </span>    <span class="PreProc">var</span> imgy/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> truncate imgy-f
<span id="L1065" class="LineNr">1065 </span>    <span class="PreProc">var</span> x/<span class="Constant">xmm7</span>: float <span class="Special">&lt;-</span> copy zero-f
<span id="L1066" class="LineNr">1066 </span>    <span class="Delimiter">{</span>
<span id="L1067" class="LineNr">1067 </span>      compare x, width-f
<span id="L1068" class="LineNr">1068 </span>      <span class="PreProc">break-if-float&gt;=</span>
<span id="L1069" class="LineNr">1069 </span>      <span class="PreProc">var</span> imgx-f/<span class="Constant">xmm5</span>: float <span class="Special">&lt;-</span> copy x
<span id="L1070" class="LineNr">1070 </span>      imgx-f <span class="Special">&lt;-</span> divide xratio
<span id="L1071" class="LineNr">1071 </span>      <span class="PreProc">var</span> imgx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> truncate imgx-f
<span id="L1072" class="LineNr">1072 </span>      <span class="PreProc">var</span> idx/eax: int <span class="Special">&lt;-</span> copy imgy
<span id="L1073" class="LineNr">1073 </span>      idx <span class="Special">&lt;-</span> multiply img-width
<span id="L1074" class="LineNr">1074 </span>      idx <span class="Special">&lt;-</span> add imgx
<span id="L1075" class="LineNr">1075 </span>      <span class="muComment"># error info in case we rounded wrong and 'index' will fail bounds-check</span>
<span id="L1076" class="LineNr">1076 </span>      compare idx, len
<span id="L1077" class="LineNr">1077 </span>      <span class="Delimiter">{</span>
<span id="L1078" class="LineNr">1078 </span>        <span class="PreProc">break-if-&lt;</span>
<span id="L1079" class="LineNr">1079 </span>        <a href='500fake-screen.mu.html#L190'>set-cursor-position</a> <span class="Constant">0</span>/screen, <span class="Constant">0x20</span>/x <span class="Constant">0x20</span>/y
<span id="L1080" class="LineNr">1080 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgx, <span class="Constant">3</span>/fg <span class="Constant">0</span>/bg
<span id="L1081" class="LineNr">1081 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, imgy, <span class="Constant">4</span>/fg <span class="Constant">0</span>/bg
<span id="L1082" class="LineNr">1082 </span>        <a href='501draw-text.mu.html#L387'>draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen</a> <span class="Constant">0</span>/screen, idx, <span class="Constant">5</span>/fg <span class="Constant">0</span>/bg
<span id="L1083" class="LineNr">1083 </span>      <span class="Delimiter">}</span>
<span id="L1084" class="LineNr">1084 </span>      <span class="PreProc">var</span> color-a/eax: (addr byte) <span class="Special">&lt;-</span> index img-data, idx
<span id="L1085" class="LineNr">1085 </span>      <span class="PreProc">var</span> color/eax: byte <span class="Special">&lt;-</span> copy-byte *color-a
<span id="L1086" class="LineNr">1086 </span>      <span class="PreProc">var</span> color-int/eax: int <span class="Special">&lt;-</span> copy color
<span id="L1087" class="LineNr">1087 </span>      <span class="PreProc">var</span> screenx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> convert x
<span id="L1088" class="LineNr">1088 </span>      screenx <span class="Special">&lt;-</span> add xmin
<span id="L1089" class="LineNr">1089 </span>      <span class="PreProc">var</span> screeny/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> convert y
<span id="L1090" class="LineNr">1090 </span>      screeny <span class="Special">&lt;-</span> add ymin
<span id="L1091" class="LineNr">1091 </span>      <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, screenx, screeny, color-int
<span id="L1092" class="LineNr">1092 </span>      x <span class="Special">&lt;-</span> add one-f
<span id="L1093" class="LineNr">1093 </span>      <span class="PreProc">loop</span>
<span id="L1094" class="LineNr">1094 </span>    <span class="Delimiter">}</span>
<span id="L1095" class="LineNr">1095 </span>    y <span class="Special">&lt;-</span> add one-f
<span id="L1096" class="LineNr">1096 </span>    <span class="PreProc">loop</span>
<span id="L1097" class="LineNr">1097 </span>  <span class="Delimiter">}</span>
<span id="L1098" class="LineNr">1098 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->