Artifact
f523328eb89b3c1e53a46f070e214b3fd4c486dd :
File
qrscan.fs
— part of check-in
[531f5bc61f]
at
2019-01-16 17:45:30
on branch trunk
— Replace 0 [IF] for emacs editings with \\\
(user:
bernd
size: 13021)
0000: 5c 20 73 63 61 6e 20 63 6f 6c 6f 72 20 51 52 20 \ scan color QR
0010: 63 6f 64 65 73 20 6f 6e 20 41 6e 64 72 6f 69 64 codes on Android
0020: 0a 0a 5c 20 43 6f 70 79 72 69 67 68 74 20 28 43 ..\ Copyright (C
0030: 29 20 32 30 31 36 2d 32 30 31 38 20 20 20 42 65 ) 2016-2018 Be
0040: 72 6e 64 20 50 61 79 73 61 6e 0a 0a 5c 20 54 68 rnd Paysan..\ Th
0050: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 is program is fr
0060: 65 65 20 73 6f 66 74 77 61 72 65 3a 20 79 6f 75 ee software: you
0070: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74 can redistribut
0080: 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 e it and/or modi
0090: 66 79 0a 5c 20 69 74 20 75 6e 64 65 72 20 74 68 fy.\ it under th
00a0: 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 e terms of the G
00b0: 4e 55 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 NU Affero Genera
00c0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 l Public License
00d0: 20 61 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 as published by
00e0: 0a 5c 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 .\ the Free Soft
00f0: 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c ware Foundation,
0100: 20 65 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 either version
0110: 33 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 3 of the License
0120: 2c 20 6f 72 0a 5c 20 28 61 74 20 79 6f 75 72 20 , or.\ (at your
0130: 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 option) any late
0140: 72 20 76 65 72 73 69 6f 6e 2e 0a 0a 5c 20 54 68 r version...\ Th
0150: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0160: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the
0170: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi
0180: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 5c 20 ll be useful,.\
0190: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
01a0: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
01b0: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
01c0: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 5c ed warranty of.\
01d0: 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 MERCHANTABILITY
01e0: 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 or FITNESS FOR
01f0: 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 52 A PARTICULAR PUR
0200: 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 0a 5c POSE. See the.\
0210: 20 47 4e 55 20 41 66 66 65 72 6f 20 47 65 6e 65 GNU Affero Gene
0220: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e ral Public Licen
0230: 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 se for more deta
0240: 69 6c 73 2e 0a 0a 5c 20 59 6f 75 20 73 68 6f 75 ils...\ You shou
0250: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 ld have received
0260: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 a copy of the G
0270: 4e 55 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 NU Affero Genera
0280: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 l Public License
0290: 0a 5c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 .\ along with th
02a0: 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 20 is program. If
02b0: 6e 6f 74 2c 20 73 65 65 20 3c 68 74 74 70 3a 2f not, see <http:/
02c0: 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c 69 63 /www.gnu.org/lic
02d0: 65 6e 73 65 73 2f 3e 2e 0a 0a 72 65 71 75 69 72 enses/>...requir
02e0: 65 20 6d 69 6e 6f 73 32 2f 67 6c 2d 68 65 6c 70 e minos2/gl-help
02f0: 65 72 2e 66 73 0a 5b 49 46 44 45 46 5d 20 61 6e er.fs.[IFDEF] an
0300: 64 72 6f 69 64 0a 20 20 20 20 72 65 71 75 69 72 droid. requir
0310: 65 20 6d 69 6e 6f 73 32 2f 61 6e 64 72 6f 69 64 e minos2/android
0320: 2d 72 65 63 6f 72 64 65 72 2e 66 73 0a 5b 45 4c -recorder.fs.[EL
0330: 53 45 5d 0a 20 20 20 20 5b 49 46 55 4e 44 45 46 SE]. [IFUNDEF
0340: 5d 20 63 61 6d 2d 77 0a 09 24 31 30 30 20 76 61 ] cam-w..$100 va
0350: 6c 75 65 20 63 61 6d 2d 77 0a 09 24 31 30 30 20 lue cam-w..$100
0360: 76 61 6c 75 65 20 63 61 6d 2d 68 0a 20 20 20 20 value cam-h.
0370: 5b 54 48 45 4e 5d 0a 5b 54 48 45 4e 5d 0a 0a 5c [THEN].[THEN]..\
0380: 20 72 65 70 6c 61 63 65 20 73 6f 6d 65 20 74 6f replace some to
0390: 6f 6c 73 20 61 76 61 69 6c 61 62 6c 65 20 75 6e ols available un
03a0: 64 65 72 20 6e 65 74 32 6f 0a 0a 5b 49 46 55 4e der net2o..[IFUN
03b0: 44 45 46 5d 20 71 72 28 0a 20 20 20 20 64 65 62 DEF] qr(. deb
03c0: 75 67 3a 20 71 72 28 0a 20 20 20 20 2b 64 62 20 ug: qr(. +db
03d0: 71 72 28 20 5c 20 74 75 72 6e 20 69 74 20 6f 6e qr( \ turn it on
03e0: 20 29 0a 5b 54 48 45 4e 5d 0a 0a 5b 49 46 55 4e ).[THEN]..[IFUN
03f0: 44 45 46 5d 20 78 74 79 70 65 0a 20 20 20 20 3a DEF] xtype. :
0400: 20 68 65 78 5b 20 5d 5d 20 5b 3a 20 5b 5b 20 3b hex[ ]] [: [[ ;
0410: 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 3a immediate. :
0420: 20 5d 68 65 78 20 5d 5d 20 3b 5d 20 24 31 30 20 ]hex ]] ;] $10
0430: 62 61 73 65 2d 65 78 65 63 75 74 65 20 5b 5b 20 base-execute [[
0440: 3b 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 ; immediate.
0450: 3a 20 78 74 79 70 65 20 28 20 61 64 64 72 20 75 : xtype ( addr u
0460: 20 2d 2d 20 29 20 20 68 65 78 5b 0a 09 62 6f 75 -- ) hex[..bou
0470: 6e 64 73 20 3f 44 4f 20 20 49 20 63 40 20 30 20 nds ?DO I c@ 0
0480: 3c 23 20 23 20 23 20 23 3e 20 74 79 70 65 20 20 <# # # #> type
0490: 4c 4f 4f 50 20 20 5d 68 65 78 20 3b 0a 5b 54 48 LOOP ]hex ;.[TH
04a0: 45 4e 5d 0a 0a 5b 49 46 55 4e 44 45 46 5d 20 74 EN]..[IFUNDEF] t
04b0: 61 67 68 61 73 68 3f 0a 20 20 20 20 3a 20 74 61 aghash?. : ta
04c0: 67 68 61 73 68 3f 20 28 20 61 64 64 72 6b 65 79 ghash? ( addrkey
04d0: 20 75 31 20 61 64 64 72 65 63 63 20 75 32 20 74 u1 addrecc u2 t
04e0: 61 67 20 2d 2d 20 66 6c 61 67 20 29 0a 09 64 72 ag -- flag )..dr
04f0: 6f 70 20 32 64 72 6f 70 20 32 64 72 6f 70 20 74 op 2drop 2drop t
0500: 72 75 65 20 3b 0a 5b 54 48 45 4e 5d 0a 0a 5c 20 rue ;.[THEN]..\
0510: 73 63 61 6e 20 6d 61 74 72 69 78 20 6d 61 6e 69 scan matrix mani
0520: 70 75 6c 61 74 69 6f 6e 0a 0a 43 72 65 61 74 65 pulation..Create
0530: 20 73 63 61 6e 2d 6d 61 74 72 69 78 0a 31 65 20 scan-matrix.1e
0540: 73 66 2c 20 30 65 20 73 66 2c 20 30 65 20 73 66 sf, 0e sf, 0e sf
0550: 2c 20 30 65 20 73 66 2c 0a 30 65 20 73 66 2c 20 , 0e sf,.0e sf,
0560: 31 65 20 73 66 2c 20 30 65 20 73 66 2c 20 30 65 1e sf, 0e sf, 0e
0570: 20 73 66 2c 0a 30 65 20 73 66 2c 20 30 65 20 73 sf,.0e sf, 0e s
0580: 66 2c 20 31 65 20 73 66 2c 20 30 65 20 73 66 2c f, 1e sf, 0e sf,
0590: 0a 30 65 20 73 66 2c 20 30 65 20 73 66 2c 20 30 .0e sf, 0e sf, 0
05a0: 65 20 73 66 2c 20 31 65 20 73 66 2c 0a 0a 73 63 e sf, 1e sf,..sc
05b0: 61 6e 2d 6d 61 74 72 69 78 20 31 31 20 73 66 6c an-matrix 11 sfl
05c0: 6f 61 74 73 20 2b 20 43 6f 6e 73 74 61 6e 74 20 oats + Constant
05d0: 33 64 2d 65 6e 61 62 6c 65 72 0a 0a 33 32 20 73 3d-enabler..32 s
05e0: 66 6c 6f 61 74 73 20 62 75 66 66 65 72 3a 20 73 floats buffer: s
05f0: 63 61 6e 2d 69 6e 76 65 72 73 65 0a 33 32 20 73 can-inverse.32 s
0600: 66 6c 6f 61 74 73 20 62 75 66 66 65 72 3a 20 69 floats buffer: i
0610: 6e 76 65 72 73 65 2d 64 65 66 61 75 6c 74 0a 69 nverse-default.i
0620: 6e 76 65 72 73 65 2d 64 65 66 61 75 6c 74 20 33 nverse-default 3
0630: 32 20 73 66 6c 6f 61 74 73 20 62 6f 75 6e 64 73 2 sfloats bounds
0640: 0a 5b 3f 44 4f 5d 20 31 65 20 66 64 75 70 20 5b .[?DO] 1e fdup [
0650: 49 5d 20 73 66 21 20 5b 49 5d 20 34 20 73 66 6c I] sf! [I] 4 sfl
0660: 6f 61 74 73 20 2b 20 73 66 21 20 39 20 73 66 6c oats + sf! 9 sfl
0670: 6f 61 74 73 20 5b 2b 4c 4f 4f 50 5d 0a 0a 38 33 oats [+LOOP]..83
0680: 65 20 46 56 61 6c 75 65 20 78 2d 73 63 61 6e 73 e FValue x-scans
0690: 69 7a 65 0a 38 33 65 20 46 56 61 6c 75 65 20 79 ize.83e FValue y
06a0: 2d 73 63 61 6e 73 69 7a 65 0a 0a 30 65 20 46 56 -scansize..0e FV
06b0: 61 6c 75 65 20 79 2d 6f 66 66 73 65 74 0a 30 65 alue y-offset.0e
06c0: 20 46 56 61 6c 75 65 20 78 2d 6f 66 66 73 65 74 FValue x-offset
06d0: 0a 0a 5c 20 6d 61 74 72 69 78 20 69 6e 76 65 72 ..\ matrix inver
06e0: 73 69 6f 6e 0a 0a 27 20 64 66 6c 6f 61 74 73 20 sion..' dfloats
06f0: 61 6c 69 61 73 20 38 2a 0a 3a 20 2e 6d 61 74 20 alias 8*.: .mat
0700: 7b 20 6d 61 74 20 2d 2d 20 7d 0a 20 20 20 20 34 { mat -- }. 4
0710: 20 30 20 44 4f 20 20 63 72 0a 09 38 20 30 20 44 0 DO cr..8 0 D
0720: 4f 0a 09 20 20 20 20 6d 61 74 20 4a 20 38 2a 20 O.. mat J 8*
0730: 49 20 2b 20 73 66 6c 6f 61 74 73 20 2b 20 73 66 I + sfloats + sf
0740: 40 20 66 2e 0a 09 4c 4f 4f 50 0a 20 20 20 20 4c @ f...LOOP. L
0750: 4f 4f 50 20 3b 0a 3a 20 69 6e 69 74 2d 73 63 61 OOP ;.: init-sca
0760: 6e 27 20 28 20 2d 2d 20 29 0a 20 20 20 20 69 6e n' ( -- ). in
0770: 76 65 72 73 65 2d 64 65 66 61 75 6c 74 20 73 63 verse-default sc
0780: 61 6e 2d 69 6e 76 65 72 73 65 20 5b 20 33 32 20 an-inverse [ 32
0790: 73 66 6c 6f 61 74 73 20 5d 4c 20 6d 6f 76 65 20 sfloats ]L move
07a0: 3b 0a 3a 20 73 66 61 78 2b 79 38 20 28 20 72 61 ;.: sfax+y8 ( ra
07b0: 20 61 64 64 72 31 20 61 64 64 72 32 20 2d 2d 20 addr1 addr2 --
07c0: 29 0a 20 20 20 20 5b 20 38 20 73 66 6c 6f 61 74 ). [ 8 sfloat
07d0: 73 20 5d 4c 20 62 6f 75 6e 64 73 20 3f 44 4f 0a s ]L bounds ?DO.
07e0: 09 64 75 70 20 73 66 40 20 66 6f 76 65 72 20 49 .dup sf@ fover I
07f0: 20 73 66 40 20 66 2a 20 66 2b 20 64 75 70 20 73 sf@ f* f+ dup s
0800: 66 21 20 73 66 6c 6f 61 74 2b 0a 20 20 20 20 5b f! sfloat+. [
0810: 20 31 20 73 66 6c 6f 61 74 73 20 5d 4c 20 2b 4c 1 sfloats ]L +L
0820: 4f 4f 50 20 20 64 72 6f 70 20 66 64 72 6f 70 20 OOP drop fdrop
0830: 3b 0a 3a 20 73 66 61 78 38 20 28 20 72 61 20 61 ;.: sfax8 ( ra a
0840: 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 5b 20 38 ddr -- ). [ 8
0850: 20 73 66 6c 6f 61 74 73 20 5d 4c 20 62 6f 75 6e sfloats ]L boun
0860: 64 73 20 3f 44 4f 0a 09 66 64 75 70 20 49 20 73 ds ?DO..fdup I s
0870: 66 40 20 66 2a 20 49 20 73 66 21 0a 20 20 20 20 f@ f* I sf!.
0880: 5b 20 31 20 73 66 6c 6f 61 74 73 20 5d 4c 20 2b [ 1 sfloats ]L +
0890: 4c 4f 4f 50 20 20 66 64 72 6f 70 20 3b 0a 3a 20 LOOP fdrop ;.:
08a0: 74 69 6a 38 20 28 20 61 64 64 72 31 20 61 64 64 tij8 ( addr1 add
08b0: 72 32 20 2d 2d 20 29 0a 20 20 20 20 5b 20 38 20 r2 -- ). [ 8
08c0: 73 66 6c 6f 61 74 73 20 5d 4c 20 62 6f 75 6e 64 sfloats ]L bound
08d0: 73 20 3f 44 4f 0a 09 64 75 70 20 73 66 40 20 49 s ?DO..dup sf@ I
08e0: 20 73 66 40 20 64 75 70 20 73 66 21 20 49 20 73 sf@ dup sf! I s
08f0: 66 21 20 73 66 6c 6f 61 74 2b 0a 20 20 20 20 5b f! sfloat+. [
0900: 20 31 20 73 66 6c 6f 61 74 73 20 5d 4c 20 2b 4c 1 sfloats ]L +L
0910: 4f 4f 50 20 20 64 72 6f 70 20 3b 0a 20 20 20 20 OOP drop ;.
0920: 0a 3a 20 6d 61 74 72 69 78 2d 69 6e 76 65 72 74 .: matrix-invert
0930: 34 20 7b 20 6d 61 74 20 2d 2d 20 7d 20 5c 20 73 4 { mat -- } \ s
0940: 68 6f 72 74 63 75 74 20 74 6f 20 69 6e 76 65 72 hortcut to inver
0950: 74 20 74 79 70 69 63 61 6c 20 6d 61 74 72 69 78 t typical matrix
0960: 0a 20 20 20 20 6d 61 74 20 73 66 40 20 66 61 62 . mat sf@ fab
0970: 73 20 6d 61 74 20 5b 20 38 20 73 66 6c 6f 61 74 s mat [ 8 sfloat
0980: 73 20 5d 4c 20 2b 20 73 66 40 20 66 61 62 73 20 s ]L + sf@ fabs
0990: 66 3c 20 49 46 0a 09 6d 61 74 20 64 75 70 20 5b f< IF..mat dup [
09a0: 20 38 20 73 66 6c 6f 61 74 73 20 5d 4c 20 2b 20 8 sfloats ]L +
09b0: 74 69 6a 38 20 5c 20 65 78 63 68 61 6e 67 65 20 tij8 \ exchange
09c0: 74 77 6f 20 6c 69 6e 65 73 0a 20 20 20 20 54 48 two lines. TH
09d0: 45 4e 0a 20 20 20 20 34 20 30 20 44 4f 0a 09 34 EN. 4 0 DO..4
09e0: 20 30 20 44 4f 0a 09 20 20 20 20 6d 61 74 20 4a 0 DO.. mat J
09f0: 20 5b 20 39 20 73 66 6c 6f 61 74 73 20 5d 4c 20 [ 9 sfloats ]L
0a00: 2a 20 2b 20 73 66 40 20 31 2f 66 0a 09 20 20 20 * + sf@ 1/f..
0a10: 20 49 20 4a 20 3c 3e 20 49 46 0a 09 09 6d 61 74 I J <> IF...mat
0a20: 20 49 20 38 2a 20 73 66 6c 6f 61 74 73 20 2b 0a I 8* sfloats +.
0a30: 09 09 6d 61 74 20 4a 20 38 2a 20 73 66 6c 6f 61 ..mat J 8* sfloa
0a40: 74 73 20 2b 0a 09 09 6f 76 65 72 20 4a 20 73 66 ts +...over J sf
0a50: 6c 6f 61 74 73 20 2b 20 73 66 40 20 66 2a 20 66 loats + sf@ f* f
0a60: 6e 65 67 61 74 65 20 73 66 61 78 2b 79 38 0a 09 negate sfax+y8..
0a70: 20 20 20 20 45 4c 53 45 0a 09 09 6d 61 74 20 4a ELSE...mat J
0a80: 20 38 2a 20 73 66 6c 6f 61 74 73 20 2b 20 73 66 8* sfloats + sf
0a90: 61 78 38 0a 09 20 20 20 20 54 48 45 4e 0a 09 20 ax8.. THEN..
0aa0: 20 20 20 28 20 6d 61 74 20 2e 6d 61 74 20 63 72 ( mat .mat cr
0ab0: 20 29 20 5c 20 64 65 62 75 67 67 69 6e 67 20 6f ) \ debugging o
0ac0: 75 74 70 75 74 0a 09 4c 4f 4f 50 0a 20 20 20 20 utput..LOOP.
0ad0: 4c 4f 4f 50 20 3b 0a 0a 73 63 61 6e 2d 69 6e 76 LOOP ;..scan-inv
0ae0: 65 72 73 65 20 20 30 20 73 66 6c 6f 61 74 73 20 erse 0 sfloats
0af0: 2b 20 43 6f 6e 73 74 61 6e 74 20 78 2d 73 63 6c + Constant x-scl
0b00: 0a 73 63 61 6e 2d 69 6e 76 65 72 73 65 20 20 31 .scan-inverse 1
0b10: 20 73 66 6c 6f 61 74 73 20 2b 20 43 6f 6e 73 74 sfloats + Const
0b20: 61 6e 74 20 79 2d 72 6f 74 73 0a 73 63 61 6e 2d ant y-rots.scan-
0b30: 69 6e 76 65 72 73 65 20 20 38 20 73 66 6c 6f 61 inverse 8 sfloa
0b40: 74 73 20 2b 20 43 6f 6e 73 74 61 6e 74 20 78 2d ts + Constant x-
0b50: 72 6f 74 73 0a 73 63 61 6e 2d 69 6e 76 65 72 73 rots.scan-invers
0b60: 65 20 20 39 20 73 66 6c 6f 61 74 73 20 2b 20 43 e 9 sfloats + C
0b70: 6f 6e 73 74 61 6e 74 20 79 2d 73 63 6c 0a 73 63 onstant y-scl.sc
0b80: 61 6e 2d 69 6e 76 65 72 73 65 20 32 34 20 73 66 an-inverse 24 sf
0b90: 6c 6f 61 74 73 20 2b 20 43 6f 6e 73 74 61 6e 74 loats + Constant
0ba0: 20 78 2d 73 70 6f 73 0a 73 63 61 6e 2d 69 6e 76 x-spos.scan-inv
0bb0: 65 72 73 65 20 32 35 20 73 66 6c 6f 61 74 73 20 erse 25 sfloats
0bc0: 2b 20 43 6f 6e 73 74 61 6e 74 20 79 2d 73 70 6f + Constant y-spo
0bd0: 73 0a 0a 3a 20 3e 73 63 61 6e 2d 6d 61 74 72 69 s..: >scan-matri
0be0: 78 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 63 61 x ( -- ). sca
0bf0: 6e 2d 69 6e 76 65 72 73 65 20 6d 61 74 72 69 78 n-inverse matrix
0c00: 2d 69 6e 76 65 72 74 34 0a 20 20 20 20 73 63 61 -invert4. sca
0c10: 6e 2d 6d 61 74 72 69 78 20 5b 20 73 63 61 6e 2d n-matrix [ scan-
0c20: 69 6e 76 65 72 73 65 20 34 20 73 66 6c 6f 61 74 inverse 4 sfloat
0c30: 73 20 2b 20 5d 4c 20 5b 20 33 32 20 73 66 6c 6f s + ]L [ 32 sflo
0c40: 61 74 73 20 5d 4c 20 62 6f 75 6e 64 73 20 3f 44 ats ]L bounds ?D
0c50: 4f 0a 09 49 20 6f 76 65 72 20 5b 20 34 20 73 66 O..I over [ 4 sf
0c60: 6c 6f 61 74 73 20 5d 4c 20 6d 6f 76 65 20 20 5b loats ]L move [
0c70: 20 34 20 73 66 6c 6f 61 74 73 20 5d 4c 20 2b 0a 4 sfloats ]L +.
0c80: 20 20 20 20 5b 20 38 20 73 66 6c 6f 61 74 73 20 [ 8 sfloats
0c90: 5d 4c 20 2b 4c 4f 4f 50 20 20 64 72 6f 70 0a 20 ]L +LOOP drop.
0ca0: 20 20 20 2d 31 65 20 33 64 2d 65 6e 61 62 6c 65 -1e 3d-enable
0cb0: 72 20 73 66 21 20 3b 0a 0a 5c 20 73 63 61 6e 20 r sf! ;..\ scan
0cc0: 63 6f 6e 73 74 61 6e 74 73 0a 0a 24 34 30 20 56 constants..$40 V
0cd0: 61 6c 75 65 20 73 63 61 6e 2d 77 0a 73 63 61 6e alue scan-w.scan
0ce0: 2d 77 20 32 2f 20 64 75 70 20 2a 20 31 2d 20 32 -w 2/ dup * 1- 2
0cf0: 2f 20 32 2f 20 31 2b 20 43 6f 6e 73 74 61 6e 74 / 2/ 1+ Constant
0d00: 20 62 75 66 2d 6c 65 6e 0a 73 63 61 6e 2d 77 20 buf-len.scan-w
0d10: 32 2a 20 56 61 6c 75 65 20 73 63 61 6e 2d 72 69 2* Value scan-ri
0d20: 67 68 74 0a 73 63 61 6e 2d 77 20 32 2a 20 64 75 ght.scan-w 2* du
0d30: 70 20 33 20 72 73 68 69 66 74 20 2b 20 6e 65 67 p 3 rshift + neg
0d40: 61 74 65 20 56 61 6c 75 65 20 73 63 61 6e 2d 6c ate Value scan-l
0d50: 65 66 74 0a 0a 61 6c 73 6f 20 6f 70 65 6e 67 6c eft..also opengl
0d60: 0a 0a 3a 20 64 72 61 77 2d 73 63 61 6e 20 28 20 ..: draw-scan (
0d70: 64 69 72 65 63 74 69 6f 6e 20 78 73 63 61 6c 65 direction xscale
0d80: 20 79 73 63 61 6c 65 20 2d 2d 20 29 0a 20 20 20 yscale -- ).
0d90: 20 5c 47 20 64 72 61 77 20 61 20 73 63 61 6e 20 \G draw a scan
0da0: 72 6f 74 61 74 65 64 2f 74 69 6c 74 65 64 20 62 rotated/tilted b
0db0: 79 20 73 63 61 6e 20 6d 61 74 72 69 78 0a 20 20 y scan matrix.
0dc0: 20 20 66 6f 76 65 72 20 66 6e 65 67 61 74 65 20 fover fnegate
0dd0: 66 6f 76 65 72 20 66 6e 65 67 61 74 65 20 30 65 fover fnegate 0e
0de0: 20 7b 20 66 3a 20 73 78 20 66 3a 20 73 79 20 66 { f: sx f: sy f
0df0: 3a 20 2d 73 78 20 66 3a 20 2d 73 79 20 66 3a 20 : -sx f: -sy f:
0e00: 7a 20 7d 0a 20 20 20 20 76 69 30 20 3e 76 0a 20 z }. vi0 >v.
0e10: 20 20 20 20 2d 73 78 20 20 73 79 20 7a 20 3e 78 -sx sy z >x
0e20: 79 7a 20 6e 3e 20 72 6f 74 3e 73 74 20 20 20 77 yz n> rot>st w
0e30: 68 69 74 65 23 20 69 3e 63 20 76 2b 0a 20 20 20 hite# i>c v+.
0e40: 20 20 20 73 78 20 20 73 79 20 7a 20 3e 78 79 7a sx sy z >xyz
0e50: 20 6e 3e 20 72 6f 74 3e 73 74 20 20 20 77 68 69 n> rot>st whi
0e60: 74 65 23 20 69 3e 63 20 76 2b 0a 20 20 20 20 20 te# i>c v+.
0e70: 20 73 78 20 2d 73 79 20 7a 20 3e 78 79 7a 20 6e sx -sy z >xyz n
0e80: 3e 20 72 6f 74 3e 73 74 20 20 20 77 68 69 74 65 > rot>st white
0e90: 23 20 69 3e 63 20 76 2b 0a 20 20 20 20 20 2d 73 # i>c v+. -s
0ea0: 78 20 2d 73 79 20 7a 20 3e 78 79 7a 20 6e 3e 20 x -sy z >xyz n>
0eb0: 72 6f 74 3e 73 74 20 20 20 77 68 69 74 65 23 20 rot>st white#
0ec0: 69 3e 63 20 76 2b 0a 20 20 20 20 76 3e 20 64 72 i>c v+. v> dr
0ed0: 6f 70 20 30 20 69 2c 20 31 20 69 2c 20 32 20 69 op 0 i, 1 i, 2 i
0ee0: 2c 20 30 20 69 2c 20 32 20 69 2c 20 33 20 69 2c , 0 i, 2 i, 3 i,
0ef0: 0a 20 20 20 20 47 4c 5f 54 52 49 41 4e 47 4c 45 . GL_TRIANGLE
0f00: 53 20 64 72 61 77 2d 65 6c 65 6d 65 6e 74 73 20 S draw-elements
0f10: 3b 0a 0a 56 61 72 69 61 62 6c 65 20 73 63 61 6e ;..Variable scan
0f20: 2d 62 75 66 2d 72 61 77 0a 56 61 72 69 61 62 6c -buf-raw.Variabl
0f30: 65 20 73 63 61 6e 2d 62 75 66 30 0a 56 61 72 69 e scan-buf0.Vari
0f40: 61 62 6c 65 20 73 63 61 6e 2d 62 75 66 31 0a 56 able scan-buf1.V
0f50: 61 72 69 61 62 6c 65 20 72 65 64 2d 62 75 66 0a ariable red-buf.
0f60: 56 61 72 69 61 62 6c 65 20 67 72 65 65 6e 2d 62 Variable green-b
0f70: 75 66 0a 56 61 72 69 61 62 6c 65 20 62 6c 75 65 uf.Variable blue
0f80: 2d 62 75 66 0a 0a 24 32 38 20 56 61 6c 75 65 20 -buf..$28 Value
0f90: 62 6c 75 65 2d 6c 65 76 65 6c 23 0a 24 37 30 20 blue-level#.$70
0fa0: 56 61 6c 75 65 20 67 72 65 65 6e 2d 6c 65 76 65 Value green-leve
0fb0: 6c 23 0a 24 37 30 20 56 61 6c 75 65 20 72 65 64 l#.$70 Value red
0fc0: 2d 6c 65 76 65 6c 23 0a 0a 27 20 73 66 6c 6f 61 -level#..' sfloa
0fd0: 74 73 20 61 6c 69 61 73 20 72 67 62 61 73 20 28 ts alias rgbas (
0fe0: 20 6f 6e 65 20 72 67 62 61 20 69 73 20 74 68 65 one rgba is the
0ff0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 73 66 6c 6f size of an sflo
1000: 61 74 20 29 0a 27 20 73 66 6c 6f 61 74 2b 20 61 at ).' sfloat+ a
1010: 6c 69 61 73 20 72 67 62 61 2b 0a 0a 5b 49 46 44 lias rgba+..[IFD
1020: 45 46 5d 20 64 69 73 74 64 65 62 75 67 0a 20 20 EF] distdebug.
1030: 20 20 33 20 63 65 6c 6c 73 20 62 75 66 66 65 72 3 cells buffer
1040: 3a 20 64 69 73 74 30 0a 20 20 20 20 64 69 73 74 : dist0. dist
1050: 30 20 63 65 6c 6c 2b 20 43 6f 6e 73 74 61 6e 74 0 cell+ Constant
1060: 20 64 69 73 74 30 2d 6d 61 78 0a 20 20 20 20 64 dist0-max. d
1070: 69 73 74 30 2d 6d 61 78 20 63 65 6c 6c 2b 20 43 ist0-max cell+ C
1080: 6f 6e 73 74 61 6e 74 20 64 69 73 74 30 2d 6d 69 onstant dist0-mi
1090: 6e 0a 20 20 20 20 33 20 63 65 6c 6c 73 20 62 75 n. 3 cells bu
10a0: 66 66 65 72 3a 20 64 69 73 74 31 0a 20 20 20 20 ffer: dist1.
10b0: 64 69 73 74 31 20 63 65 6c 6c 2b 20 43 6f 6e 73 dist1 cell+ Cons
10c0: 74 61 6e 74 20 64 69 73 74 31 2d 6d 61 78 0a 20 tant dist1-max.
10d0: 20 20 20 64 69 73 74 31 2d 6d 61 78 20 63 65 6c dist1-max cel
10e0: 6c 2b 20 43 6f 6e 73 74 61 6e 74 20 64 69 73 74 l+ Constant dist
10f0: 31 2d 6d 69 6e 0a 20 20 20 20 0a 20 20 20 20 3a 1-min. . :
1100: 20 3f 3f 20 28 20 76 61 6c 75 65 20 6c 65 76 65 ?? ( value leve
1110: 6c 20 2d 2d 20 66 6c 61 67 20 29 0a 09 2d 20 64 l -- flag )..- d
1120: 75 70 20 64 75 70 20 30 3c 20 49 46 20 20 6e 65 up dup 0< IF ne
1130: 67 61 74 65 20 64 69 73 74 30 20 20 45 4c 53 45 gate dist0 ELSE
1140: 20 20 64 69 73 74 31 20 20 54 48 45 4e 0a 09 32 dist1 THEN..2
1150: 64 75 70 20 2b 21 20 63 65 6c 6c 2b 0a 09 32 64 dup +! cell+..2d
1160: 75 70 20 40 20 75 6d 61 78 20 6f 76 65 72 20 21 up @ umax over !
1170: 20 63 65 6c 6c 2b 0a 09 74 75 63 6b 20 40 20 75 cell+..tuck @ u
1180: 6d 69 6e 20 73 77 61 70 20 21 0a 09 30 3c 20 3b min swap !..0< ;
1190: 0a 5b 45 4c 53 45 5d 0a 20 20 20 20 27 20 3c 20 .[ELSE]. ' <
11a0: 61 6c 69 61 73 20 3f 3f 0a 5b 54 48 45 4e 5d 0a alias ??.[THEN].
11b0: 0a 3a 20 72 67 62 40 20 28 20 61 64 64 72 20 2d .: rgb@ ( addr -
11c0: 2d 20 72 20 67 20 62 20 29 0a 20 20 20 20 3e 72 - r g b ). >r
11d0: 20 72 40 20 63 40 20 72 40 20 31 2b 20 63 40 20 r@ c@ r@ 1+ c@
11e0: 72 3e 20 32 20 2b 20 63 40 20 3b 0a 0a 30 20 56 r> 2 + c@ ;..0 V
11f0: 61 6c 75 65 20 72 67 62 2d 78 6f 72 0a 0a 3a 20 alue rgb-xor..:
1200: 72 67 62 3f 20 28 20 61 64 64 72 20 2d 2d 20 72 rgb? ( addr -- r
1210: 67 62 62 69 74 20 29 0a 20 20 20 20 72 67 62 40 gbbit ). rgb@
1220: 0a 20 20 20 20 62 6c 75 65 2d 6c 65 76 65 6c 23 . blue-level#
1230: 20 20 3f 3f 20 6e 65 67 61 74 65 20 32 2a 20 73 ?? negate 2* s
1240: 77 61 70 0a 20 20 20 20 67 72 65 65 6e 2d 6c 65 wap. green-le
1250: 76 65 6c 23 20 3f 3f 20 2d 20 32 2a 20 73 77 61 vel# ?? - 2* swa
1260: 70 0a 20 20 20 20 72 65 64 2d 6c 65 76 65 6c 23 p. red-level#
1270: 20 20 20 3f 3f 20 2d 20 72 67 62 2d 78 6f 72 20 ?? - rgb-xor
1280: 78 6f 72 20 3b 0a 0a 3a 20 65 78 74 72 61 63 74 xor ;..: extract
1290: 2d 73 74 72 69 70 20 28 20 61 64 64 72 20 75 20 -strip ( addr u
12a0: 73 74 65 70 20 2d 2d 20 73 74 72 69 70 20 29 20 step -- strip )
12b0: 72 67 62 61 73 20 7b 20 73 74 65 70 20 7d 0a 20 rgbas { step }.
12c0: 20 20 20 30 20 2d 72 6f 74 20 62 6f 75 6e 64 73 0 -rot bounds
12d0: 20 55 2b 44 4f 0a 09 32 2a 20 32 2a 20 49 20 72 U+DO..2* 2* I r
12e0: 67 62 3f 20 33 20 61 6e 64 20 2b 0a 20 20 20 20 gb? 3 and +.
12f0: 73 74 65 70 20 2b 4c 4f 4f 50 20 3b 0a 0a 24 35 step +LOOP ;..$5
1300: 31 20 62 75 66 66 65 72 3a 20 67 75 65 73 73 62 1 buffer: guessb
1310: 75 66 0a 67 75 65 73 73 62 75 66 20 24 34 30 20 uf.guessbuf $40
1320: 2b 20 43 6f 6e 73 74 61 6e 74 20 67 75 65 73 73 + Constant guess
1330: 65 63 63 0a 67 75 65 73 73 65 63 63 20 24 31 30 ecc.guessecc $10
1340: 20 2b 20 43 6f 6e 73 74 61 6e 74 20 67 75 65 73 + Constant gues
1350: 73 74 61 67 0a 0a 73 63 61 6e 2d 77 20 33 20 72 stag..scan-w 3 r
1360: 73 68 69 66 74 20 43 6f 6e 73 74 61 6e 74 20 73 shift Constant s
1370: 63 61 6e 2d 73 74 65 70 0a 0a 3a 20 3e 73 74 72 can-step..: >str
1380: 69 70 20 28 20 69 6e 64 65 78 20 2d 2d 2d 20 61 ip ( index --- a
1390: 64 64 72 20 29 0a 20 20 20 20 32 2a 20 32 2a 20 ddr ). 2* 2*
13a0: 73 63 61 6e 2d 77 20 2b 20 73 63 61 6e 2d 77 20 scan-w + scan-w
13b0: 32 2a 20 2a 20 73 63 61 6e 2d 77 20 2b 20 72 67 2* * scan-w + rg
13c0: 62 61 73 0a 20 20 20 20 73 63 61 6e 2d 62 75 66 bas. scan-buf
13d0: 31 20 24 40 20 72 6f 74 20 73 61 66 65 2f 73 74 1 $@ rot safe/st
13e0: 72 69 6e 67 20 64 72 6f 70 20 3b 0a 3a 20 3e 73 ring drop ;.: >s
13f0: 74 72 69 70 33 32 20 28 20 61 64 64 72 20 2d 2d trip32 ( addr --
1400: 20 61 64 64 72 27 20 75 20 73 74 65 70 20 29 0a addr' u step ).
1410: 20 20 20 20 73 63 61 6e 2d 72 69 67 68 74 20 2d scan-right -
1420: 20 24 31 30 30 20 34 20 3b 0a 3a 20 3e 67 75 65 $100 4 ;.: >gue
1430: 73 73 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 ss ( -- addr u )
1440: 0a 20 20 20 20 67 75 65 73 73 62 75 66 20 24 34 . guessbuf $4
1450: 30 20 32 64 75 70 20 62 6f 75 6e 64 73 20 2d 38 0 2dup bounds -8
1460: 20 2d 72 6f 74 20 55 2b 44 4f 0a 09 64 75 70 20 -rot U+DO..dup
1470: 3e 73 74 72 69 70 20 3e 73 74 72 69 70 33 32 0a >strip >strip32.
1480: 09 65 78 74 72 61 63 74 2d 73 74 72 69 70 20 49 .extract-strip I
1490: 20 62 65 2d 6c 21 0a 09 31 2b 0a 20 20 20 20 34 be-l!..1+. 4
14a0: 20 2b 4c 4f 4f 50 20 20 64 72 6f 70 20 3b 0a 3a +LOOP drop ;.:
14b0: 20 65 63 63 2d 68 6f 72 40 20 28 20 6f 66 66 20 ecc-hor@ ( off
14c0: 2d 2d 20 6c 20 29 0a 20 20 20 20 3e 73 74 72 69 -- l ). >stri
14d0: 70 20 3e 73 74 72 69 70 33 32 20 65 78 74 72 61 p >strip32 extra
14e0: 63 74 2d 73 74 72 69 70 20 3b 0a 3a 20 65 63 63 ct-strip ;.: ecc
14f0: 2d 76 65 72 40 20 28 20 6f 66 66 73 65 74 20 2d -ver@ ( offset -
1500: 2d 20 75 6c 20 29 0a 20 20 20 20 23 2d 38 20 3e - ul ). #-8 >
1510: 73 74 72 69 70 20 2b 20 73 63 61 6e 2d 77 20 64 strip + scan-w d
1520: 75 70 20 33 20 6c 73 68 69 66 74 20 2a 20 73 63 up 3 lshift * sc
1530: 61 6e 2d 77 20 33 20 6c 73 68 69 66 74 20 65 78 an-w 3 lshift ex
1540: 74 72 61 63 74 2d 73 74 72 69 70 20 3b 0a 3a 20 tract-strip ;.:
1550: 74 61 67 40 20 28 20 2d 2d 20 74 61 67 20 29 0a tag@ ( -- tag ).
1560: 20 20 20 20 23 2d 39 20 3e 73 74 72 69 70 20 73 #-9 >strip s
1570: 63 61 6e 2d 6c 65 66 74 20 2b 20 24 31 33 30 20 can-left + $130
1580: 5b 20 23 31 37 20 34 20 2a 20 5d 4c 20 65 78 74 [ #17 4 * ]L ext
1590: 72 61 63 74 2d 73 74 72 69 70 20 34 20 6c 73 68 ract-strip 4 lsh
15a0: 69 66 74 0a 20 20 20 20 23 30 38 20 3e 73 74 72 ift. #08 >str
15b0: 69 70 20 73 63 61 6e 2d 6c 65 66 74 20 2b 20 24 ip scan-left + $
15c0: 31 33 30 20 5b 20 23 31 37 20 34 20 2a 20 5d 4c 130 [ #17 4 * ]L
15d0: 20 65 78 74 72 61 63 74 2d 73 74 72 69 70 20 6f extract-strip o
15e0: 72 20 3b 0a 0a 3a 20 3e 67 75 65 73 73 65 63 63 r ;..: >guessecc
15f0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 23 2d 39 20 ( -- ). #-9
1600: 20 20 20 20 20 20 20 65 63 63 2d 68 6f 72 40 20 ecc-hor@
1610: 67 75 65 73 73 65 63 63 20 20 20 20 20 20 62 65 guessecc be
1620: 2d 6c 21 0a 20 20 20 20 23 30 38 20 20 20 20 20 -l!. #08
1630: 20 20 20 65 63 63 2d 68 6f 72 40 20 67 75 65 73 ecc-hor@ gues
1640: 73 65 63 63 20 20 34 20 2b 20 62 65 2d 6c 21 0a secc 4 + be-l!.
1650: 20 20 20 20 73 63 61 6e 2d 6c 65 66 74 20 20 65 scan-left e
1660: 63 63 2d 76 65 72 40 20 67 75 65 73 73 65 63 63 cc-ver@ guessecc
1670: 20 20 38 20 2b 20 62 65 2d 6c 21 0a 20 20 20 20 8 + be-l!.
1680: 73 63 61 6e 2d 72 69 67 68 74 20 65 63 63 2d 76 scan-right ecc-v
1690: 65 72 40 20 67 75 65 73 73 65 63 63 20 24 43 20 er@ guessecc $C
16a0: 2b 20 62 65 2d 6c 21 20 3b 0a 0a 3a 20 65 63 63 + be-l! ;..: ecc
16b0: 2d 6f 6b 3f 20 28 20 61 64 64 72 6b 65 79 20 75 -ok? ( addrkey u
16c0: 31 20 61 64 64 72 65 63 63 20 75 32 20 2d 2d 20 1 addrecc u2 --
16d0: 66 6c 61 67 20 29 0a 20 20 20 20 32 64 75 70 20 flag ). 2dup
16e0: 2b 20 63 40 20 74 61 67 68 61 73 68 3f 20 3b 0a + c@ taghash? ;.
16f0: 0a 24 38 30 30 30 20 43 6f 6e 73 74 61 6e 74 20 .$8000 Constant
1700: 69 6e 69 74 2d 78 79 0a 0a 3a 20 67 65 74 2d 6d init-xy..: get-m
1710: 69 6e 6d 61 78 2d 72 67 62 20 28 20 61 64 64 72 inmax-rgb ( addr
1720: 20 75 20 2d 2d 20 6d 69 6e 72 20 6d 61 78 72 20 u -- minr maxr
1730: 6d 69 6e 67 20 6d 61 78 67 20 6d 69 6e 62 20 6d ming maxg minb m
1740: 61 78 62 20 29 0a 20 20 20 20 24 46 46 46 20 2d axb ). $FFF -
1750: 24 46 46 46 20 32 64 75 70 20 32 64 75 70 20 7b $FFF 2dup 2dup {
1760: 20 6d 69 6e 72 20 6d 61 78 72 20 6d 69 6e 67 20 minr maxr ming
1770: 6d 61 78 67 20 6d 69 6e 62 20 6d 61 78 62 20 7d maxg minb maxb }
1780: 0a 20 20 20 20 62 6f 75 6e 64 73 20 3f 44 4f 0a . bounds ?DO.
1790: 09 49 20 72 67 62 40 0a 09 64 75 70 20 6d 61 78 .I rgb@..dup max
17a0: 62 20 6d 61 78 20 74 6f 20 6d 61 78 62 20 20 6d b max to maxb m
17b0: 69 6e 62 20 6d 69 6e 20 74 6f 20 6d 69 6e 62 0a inb min to minb.
17c0: 09 64 75 70 20 6d 61 78 67 20 6d 61 78 20 74 6f .dup maxg max to
17d0: 20 6d 61 78 67 20 20 6d 69 6e 67 20 6d 69 6e 20 maxg ming min
17e0: 74 6f 20 6d 69 6e 67 0a 09 64 75 70 20 6d 61 78 to ming..dup max
17f0: 72 20 6d 61 78 20 74 6f 20 6d 61 78 72 20 20 6d r max to maxr m
1800: 69 6e 72 20 6d 69 6e 20 74 6f 20 6d 69 6e 72 0a inr min to minr.
1810: 20 20 20 20 34 20 2b 4c 4f 4f 50 20 6d 69 6e 72 4 +LOOP minr
1820: 20 6d 61 78 72 20 6d 69 6e 67 20 6d 61 78 67 20 maxr ming maxg
1830: 6d 69 6e 62 20 6d 61 78 62 20 3b 0a 0a 23 31 30 minb maxb ;..#10
1840: 20 43 65 6c 6c 73 20 62 75 66 66 65 72 3a 20 70 Cells buffer: p
1850: 30 0a 70 30 20 32 20 63 65 6c 6c 73 20 2b 20 43 0.p0 2 cells + C
1860: 6f 6e 73 74 61 6e 74 20 70 31 0a 70 31 20 32 20 onstant p1.p1 2
1870: 63 65 6c 6c 73 20 2b 20 43 6f 6e 73 74 61 6e 74 cells + Constant
1880: 20 70 32 0a 70 32 20 32 20 63 65 6c 6c 73 20 2b p2.p2 2 cells +
1890: 20 43 6f 6e 73 74 61 6e 74 20 70 33 0a 70 33 20 Constant p3.p3
18a0: 32 20 63 65 6c 6c 73 20 2b 20 43 6f 6e 73 74 61 2 cells + Consta
18b0: 6e 74 20 70 78 0a 0a 3a 20 6d 69 6e c2 b2 21 20 nt px..: min²!
18c0: 28 20 78 20 79 20 61 64 64 72 20 2d 2d 20 29 20 ( x y addr -- )
18d0: 3e 72 0a 20 20 20 20 6f 76 65 72 20 64 75 70 20 >r. over dup
18e0: 2a 20 6f 76 65 72 20 64 75 70 20 2a 20 2b 0a 20 * over dup * +.
18f0: 20 20 20 72 40 20 32 40 20 64 75 70 20 2a 20 73 r@ 2@ dup * s
1900: 77 61 70 20 64 75 70 20 2a 20 2b 20 75 3c 20 49 wap dup * + u< I
1910: 46 0a 09 72 3e 20 32 21 20 20 45 58 49 54 0a 20 F..r> 2! EXIT.
1920: 20 20 20 54 48 45 4e 20 20 32 64 72 6f 70 20 72 THEN 2drop r
1930: 64 72 6f 70 20 3b 0a 0a 3a 20 73 65 61 72 63 68 drop ;..: search
1940: 2d 63 6f 72 6e 65 72 73 20 28 20 2d 2d 20 29 0a -corners ( -- ).
1950: 20 20 20 20 69 6e 69 74 2d 78 79 20 70 30 20 21 init-xy p0 !
1960: 20 20 70 30 20 70 30 20 63 65 6c 6c 2b 20 37 20 p0 p0 cell+ 7
1970: 63 65 6c 6c 73 20 63 6d 6f 76 65 20 5c 20 66 69 cells cmove \ fi
1980: 6c 6c 20 61 6c 6c 20 77 69 74 68 20 74 68 65 20 ll all with the
1990: 73 61 6d 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 same contents.
19a0: 20 20 73 63 61 6e 2d 62 75 66 30 20 24 40 20 64 scan-buf0 $@ d
19b0: 72 6f 70 0a 20 20 20 20 73 63 61 6e 2d 77 20 64 rop. scan-w d
19c0: 75 70 20 6e 65 67 61 74 65 20 44 4f 0a 09 73 63 up negate DO..sc
19d0: 61 6e 2d 77 20 64 75 70 20 6e 65 67 61 74 65 20 an-w dup negate
19e0: 44 4f 0a 09 20 20 20 20 64 75 70 20 72 67 62 3f DO.. dup rgb?
19f0: 20 64 75 70 20 34 20 61 6e 64 20 49 46 20 20 33 dup 4 and IF 3
1a00: 20 61 6e 64 20 32 20 78 6f 72 0a 09 09 32 2a 20 and 2 xor...2*
1a10: 63 65 6c 6c 73 20 70 30 20 2b 20 49 20 4a 20 72 cells p0 + I J r
1a20: 6f 74 20 6d 69 6e c2 b2 21 0a 09 20 20 20 20 45 ot min²!.. E
1a30: 4c 53 45 0a 09 09 64 72 6f 70 0a 09 20 20 20 20 LSE...drop..
1a40: 54 48 45 4e 0a 09 20 20 20 20 72 67 62 61 2b 0a THEN.. rgba+.
1a50: 09 4c 4f 4f 50 0a 20 20 20 20 4c 4f 4f 50 20 20 .LOOP. LOOP
1a60: 64 72 6f 70 20 3b 0a 0a 3a 20 3f 6c 65 67 69 74 drop ;..: ?legit
1a70: 20 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 ( -- flag ).
1a80: 20 70 30 20 32 40 20 69 6e 69 74 2d 78 79 20 64 p0 2@ init-xy d
1a90: 75 70 20 64 3c 3e 0a 20 20 20 20 70 31 20 32 40 up d<>. p1 2@
1aa0: 20 69 6e 69 74 2d 78 79 20 64 75 70 20 64 3c 3e init-xy dup d<>
1ab0: 20 61 6e 64 0a 20 20 20 20 70 32 20 32 40 20 69 and. p2 2@ i
1ac0: 6e 69 74 2d 78 79 20 64 75 70 20 64 3c 3e 20 61 nit-xy dup d<> a
1ad0: 6e 64 0a 20 20 20 20 70 33 20 32 40 20 69 6e 69 nd. p3 2@ ini
1ae0: 74 2d 78 79 20 64 75 70 20 64 3c 3e 20 61 6e 64 t-xy dup d<> and
1af0: 20 3b 0a 0a 3a 20 63 6f 6d 70 75 74 65 2d 78 70 ;..: compute-xp
1b00: 6f 69 6e 74 20 28 20 2d 2d 20 72 78 20 72 79 20 oint ( -- rx ry
1b10: 29 0a 20 20 20 20 70 30 20 32 40 20 73 3e 66 20 ). p0 2@ s>f
1b20: 73 3e 66 20 7b 20 66 3a 20 79 30 20 66 3a 20 78 s>f { f: y0 f: x
1b30: 30 20 7d 0a 20 20 20 20 70 33 20 32 40 20 73 3e 0 }. p3 2@ s>
1b40: 66 20 73 3e 66 20 7b 20 66 3a 20 79 31 20 66 3a f s>f { f: y1 f:
1b50: 20 78 31 20 7d 0a 20 20 20 20 70 31 20 32 40 20 x1 }. p1 2@
1b60: 73 3e 66 20 73 3e 66 20 7b 20 66 3a 20 79 32 20 s>f s>f { f: y2
1b70: 66 3a 20 78 32 20 7d 0a 20 20 20 20 70 32 20 32 f: x2 }. p2 2
1b80: 40 20 73 3e 66 20 73 3e 66 20 7b 20 66 3a 20 79 @ s>f s>f { f: y
1b90: 33 20 66 3a 20 78 33 20 7d 0a 20 20 20 20 78 30 3 f: x3 }. x0
1ba0: 20 79 31 20 66 2a 20 79 30 20 78 31 20 66 2a 20 y1 f* y0 x1 f*
1bb0: 66 2d 20 7b 20 66 3a 20 64 78 79 30 31 20 7d 0a f- { f: dxy01 }.
1bc0: 20 20 20 20 78 32 20 79 33 20 66 2a 20 79 32 20 x2 y3 f* y2
1bd0: 78 33 20 66 2a 20 66 2d 20 7b 20 66 3a 20 64 78 x3 f* f- { f: dx
1be0: 79 32 33 20 7d 0a 20 20 20 20 78 30 20 78 31 20 y23 }. x0 x1
1bf0: 66 2d 20 78 32 20 78 33 20 66 2d 20 7b 20 66 3a f- x2 x3 f- { f:
1c00: 20 64 78 30 31 20 66 3a 20 64 78 32 33 20 7d 0a dx01 f: dx23 }.
1c10: 20 20 20 20 79 30 20 79 31 20 66 2d 20 79 32 20 y0 y1 f- y2
1c20: 79 33 20 66 2d 20 7b 20 66 3a 20 64 79 30 31 20 y3 f- { f: dy01
1c30: 66 3a 20 64 79 32 33 20 7d 0a 20 20 20 20 64 78 f: dy23 }. dx
1c40: 30 31 20 64 79 32 33 20 66 2a 20 64 79 30 31 20 01 dy23 f* dy01
1c50: 64 78 32 33 20 66 2a 20 66 2d 20 31 2f 66 20 7b dx23 f* f- 1/f {
1c60: 20 66 3a 20 2f 64 65 74 31 20 7d 0a 20 20 20 20 f: /det1 }.
1c70: 64 78 79 30 31 20 64 78 32 33 20 66 2a 20 64 78 dxy01 dx23 f* dx
1c80: 79 32 33 20 64 78 30 31 20 66 2a 20 66 2d 20 2f y23 dx01 f* f- /
1c90: 64 65 74 31 20 66 2a 20 5c 20 78 0a 20 20 20 20 det1 f* \ x.
1ca0: 64 78 79 30 31 20 64 79 32 33 20 66 2a 20 64 78 dxy01 dy23 f* dx
1cb0: 79 32 33 20 64 79 30 31 20 66 2a 20 66 2d 20 2f y23 dy01 f* f- /
1cc0: 64 65 74 31 20 66 2a 20 5c 20 79 0a 20 20 20 20 det1 f* \ y.
1cd0: 66 6f 76 65 72 20 66 3e 73 20 66 64 75 70 20 66 fover f>s fdup f
1ce0: 3e 73 20 70 78 20 32 21 20 3b 0a 0a 3a 20 70 2b >s px 2! ;..: p+
1cf0: 20 28 20 78 31 20 79 31 20 78 32 20 79 32 20 2d ( x1 y1 x2 y2 -
1d00: 2d 20 78 31 2b 78 32 20 79 31 2b 79 32 20 29 0a - x1+x2 y1+y2 ).
1d10: 20 20 20 20 72 6f 74 20 2b 20 3e 72 20 2b 20 72 rot + >r + r
1d20: 3e 20 3b 0a 3a 20 70 32 2f 20 28 20 78 31 20 79 > ;.: p2/ ( x1 y
1d30: 31 20 2d 2d 20 78 32 20 79 32 20 29 0a 20 20 20 1 -- x2 y2 ).
1d40: 20 32 2f 20 73 77 61 70 20 32 2f 20 73 77 61 70 2/ swap 2/ swap
1d50: 20 3b 0a 3a 20 70 2d 20 28 20 78 31 20 79 31 20 ;.: p- ( x1 y1
1d60: 78 32 20 79 32 20 2d 2d 20 78 31 2d 78 32 20 79 x2 y2 -- x1-x2 y
1d70: 31 2d 79 32 20 29 0a 20 20 20 20 72 6f 74 20 73 1-y2 ). rot s
1d80: 77 61 70 20 2d 20 3e 72 20 2d 20 72 3e 20 3b 0a wap - >r - r> ;.
1d90: 0a 3a 20 73 63 61 6e 2d 67 72 61 62 20 28 20 77 .: scan-grab ( w
1da0: 20 68 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 h addr -- ).
1db0: 20 3e 72 20 20 30 20 30 20 32 73 77 61 70 0a 20 >r 0 0 2swap.
1dc0: 20 20 20 32 64 75 70 20 2a 20 72 67 62 61 73 20 2dup * rgbas
1dd0: 72 40 20 24 21 6c 65 6e 0a 20 20 20 20 47 4c 5f r@ $!len. GL_
1de0: 52 47 42 41 20 47 4c 5f 55 4e 53 49 47 4e 45 44 RGBA GL_UNSIGNED
1df0: 5f 42 59 54 45 20 72 3e 20 24 40 20 64 72 6f 70 _BYTE r> $@ drop
1e00: 20 67 6c 52 65 61 64 50 69 78 65 6c 73 20 3b 0a glReadPixels ;.
1e10: 3a 20 73 63 61 6e 2d 67 72 61 62 2d 62 75 66 20 : scan-grab-buf
1e20: 28 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 ( addr -- ).
1e30: 73 63 61 6e 2d 77 20 32 2a 20 64 75 70 20 72 6f scan-w 2* dup ro
1e40: 74 20 73 63 61 6e 2d 67 72 61 62 20 3b 0a 3a 20 t scan-grab ;.:
1e50: 73 63 61 6e 2d 67 72 61 62 2d 63 61 6d 20 28 20 scan-grab-cam (
1e60: 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 63 61 addr -- ). ca
1e70: 6d 2d 77 20 63 61 6d 2d 68 20 72 6f 74 20 73 63 m-w cam-h rot sc
1e80: 61 6e 2d 67 72 61 62 20 3b 0a 0a 74 65 78 3a 20 an-grab ;..tex:
1e90: 73 63 61 6e 2d 74 65 78 2d 72 61 77 0a 74 65 78 scan-tex-raw.tex
1ea0: 3a 20 73 63 61 6e 2d 74 65 78 0a 74 65 78 3a 20 : scan-tex.tex:
1eb0: 73 63 61 6e 2d 74 65 78 2d 66 69 6e 61 6c 0a 0a scan-tex-final..
1ec0: 30 20 56 61 6c 75 65 20 73 63 61 6e 2d 66 62 2d 0 Value scan-fb-
1ed0: 72 61 77 0a 30 20 56 61 6c 75 65 20 73 63 61 6e raw.0 Value scan
1ee0: 2d 66 62 0a 30 20 56 61 6c 75 65 20 73 63 61 6e -fb.0 Value scan
1ef0: 2d 66 62 2d 66 69 6e 61 6c 0a 0a 3a 20 73 63 61 -fb-final..: sca
1f00: 6e 2d 67 72 61 62 2d 72 61 77 20 28 20 2d 2d 20 n-grab-raw ( --
1f10: 29 0a 20 20 20 20 63 61 6d 2d 77 20 63 61 6d 2d ). cam-w cam-
1f20: 68 20 73 63 61 6e 2d 66 62 2d 72 61 77 20 3e 66 h scan-fb-raw >f
1f30: 72 61 6d 65 62 75 66 66 65 72 20 73 63 61 6e 2d ramebuffer scan-
1f40: 62 75 66 2d 72 61 77 20 73 63 61 6e 2d 67 72 61 buf-raw scan-gra
1f50: 62 2d 63 61 6d 20 3b 0a 3a 20 73 63 61 6e 2d 67 b-cam ;.: scan-g
1f60: 72 61 62 30 20 28 20 2d 2d 20 29 0a 20 20 20 20 rab0 ( -- ).
1f70: 73 63 61 6e 2d 62 75 66 30 20 73 63 61 6e 2d 67 scan-buf0 scan-g
1f80: 72 61 62 2d 62 75 66 20 3b 0a 3a 20 73 63 61 6e rab-buf ;.: scan
1f90: 2d 67 72 61 62 31 20 28 20 2d 2d 20 29 0a 20 20 -grab1 ( -- ).
1fa0: 20 20 73 63 61 6e 2d 62 75 66 31 20 73 63 61 6e scan-buf1 scan
1fb0: 2d 67 72 61 62 2d 62 75 66 20 3b 0a 0a 61 6c 73 -grab-buf ;..als
1fc0: 6f 20 73 6f 69 6c 0a 0a 30 20 56 61 6c 75 65 20 o soil..0 Value
1fd0: 73 63 61 6e 23 0a 0a 3a 20 73 61 76 65 2d 70 6e scan#..: save-pn
1fe0: 67 30 20 28 20 2d 2d 20 29 0a 20 20 20 20 5b 3a g0 ( -- ). [:
1ff0: 20 2e 22 20 73 63 61 6e 69 6d 67 30 2d 22 20 73 ." scanimg0-" s
2000: 63 61 6e 23 20 30 20 2e 72 20 2e 22 20 2e 70 6e can# 0 .r ." .pn
2010: 67 22 20 3b 5d 20 24 74 6d 70 0a 20 20 20 20 53 g" ;] $tmp. S
2020: 4f 49 4c 5f 53 41 56 45 5f 54 59 50 45 5f 50 4e OIL_SAVE_TYPE_PN
2030: 47 20 31 32 38 20 64 75 70 20 34 20 73 63 61 6e G 128 dup 4 scan
2040: 2d 62 75 66 30 20 24 40 20 64 72 6f 70 20 53 4f -buf0 $@ drop SO
2050: 49 4c 5f 73 61 76 65 5f 69 6d 61 67 65 20 3b 0a IL_save_image ;.
2060: 3a 20 73 61 76 65 2d 70 6e 67 31 20 28 20 2d 2d : save-png1 ( --
2070: 20 29 0a 20 20 20 20 5b 3a 20 2e 22 20 73 63 61 ). [: ." sca
2080: 6e 69 6d 67 31 2d 22 20 73 63 61 6e 23 20 30 20 nimg1-" scan# 0
2090: 2e 72 20 2e 22 20 2e 70 6e 67 22 20 3b 5d 20 24 .r ." .png" ;] $
20a0: 74 6d 70 0a 20 20 20 20 53 4f 49 4c 5f 53 41 56 tmp. SOIL_SAV
20b0: 45 5f 54 59 50 45 5f 50 4e 47 20 31 32 38 20 64 E_TYPE_PNG 128 d
20c0: 75 70 20 34 20 73 63 61 6e 2d 62 75 66 31 20 24 up 4 scan-buf1 $
20d0: 40 20 64 72 6f 70 20 53 4f 49 4c 5f 73 61 76 65 @ drop SOIL_save
20e0: 5f 69 6d 61 67 65 20 3b 0a 3a 20 73 61 76 65 2d _image ;.: save-
20f0: 70 6e 67 2d 72 61 77 20 28 20 2d 2d 20 29 0a 20 png-raw ( -- ).
2100: 20 20 20 5b 3a 20 2e 22 20 73 63 61 6e 69 6d 67 [: ." scanimg
2110: 72 61 77 2d 22 20 73 63 61 6e 23 20 30 20 2e 72 raw-" scan# 0 .r
2120: 20 2e 22 20 2e 70 6e 67 22 20 3b 5d 20 24 74 6d ." .png" ;] $tm
2130: 70 0a 20 20 20 20 53 4f 49 4c 5f 53 41 56 45 5f p. SOIL_SAVE_
2140: 54 59 50 45 5f 50 4e 47 20 63 61 6d 2d 77 20 63 TYPE_PNG cam-w c
2150: 61 6d 2d 68 20 34 20 73 63 61 6e 2d 62 75 66 2d am-h 4 scan-buf-
2160: 72 61 77 20 24 40 20 64 72 6f 70 20 53 4f 49 4c raw $@ drop SOIL
2170: 5f 73 61 76 65 5f 69 6d 61 67 65 20 3b 0a 3a 20 _save_image ;.:
2180: 73 61 76 65 2d 70 6e 67 73 20 28 20 2d 2d 20 29 save-pngs ( -- )
2190: 0a 20 20 20 20 73 63 61 6e 2d 67 72 61 62 2d 72 . scan-grab-r
21a0: 61 77 20 73 61 76 65 2d 70 6e 67 2d 72 61 77 0a aw save-png-raw.
21b0: 20 20 20 20 73 61 76 65 2d 70 6e 67 30 20 73 61 save-png0 sa
21c0: 76 65 2d 70 6e 67 31 0a 20 20 20 20 31 20 2b 74 ve-png1. 1 +t
21d0: 6f 20 73 63 61 6e 23 0a 20 20 20 20 30 3e 66 72 o scan#. 0>fr
21e0: 61 6d 65 62 75 66 66 65 72 20 3b 0a 0a 70 72 65 amebuffer ;..pre
21f0: 76 69 6f 75 73 0a 0a 3a 20 2e 78 70 6f 69 6e 74 vious..: .xpoint
2200: 20 28 20 78 20 79 20 2d 2d 20 29 0a 20 20 20 20 ( x y -- ).
2210: 70 30 20 32 40 20 73 77 61 70 20 2e 20 2e 20 73 p0 2@ swap . . s
2220: 70 61 63 65 0a 20 20 20 20 70 31 20 32 40 20 73 pace. p1 2@ s
2230: 77 61 70 20 2e 20 2e 20 73 70 61 63 65 0a 20 20 wap . . space.
2240: 20 20 70 32 20 32 40 20 73 77 61 70 20 2e 20 2e p2 2@ swap . .
2250: 20 73 70 61 63 65 0a 20 20 20 20 70 33 20 32 40 space. p3 2@
2260: 20 73 77 61 70 20 2e 20 2e 20 73 70 61 63 65 0a swap . . space.
2270: 20 20 20 20 66 73 77 61 70 20 66 2e 20 66 2e 20 fswap f. f.
2280: 63 72 20 3b 0a 0a 3a 20 6e 65 77 2d 73 63 61 6e cr ;..: new-scan
2290: 74 65 78 2d 72 61 77 20 28 20 2d 2d 20 29 0a 20 tex-raw ( -- ).
22a0: 20 20 20 73 63 61 6e 2d 74 65 78 2d 72 61 77 20 scan-tex-raw
22b0: 30 3e 63 6c 65 61 72 0a 20 20 20 20 63 61 6d 2d 0>clear. cam-
22c0: 77 20 63 61 6d 2d 68 20 47 4c 5f 52 47 42 41 20 w cam-h GL_RGBA
22d0: 6e 65 77 2d 74 65 78 74 62 75 66 66 65 72 20 74 new-textbuffer t
22e0: 6f 20 73 63 61 6e 2d 66 62 2d 72 61 77 20 3b 0a o scan-fb-raw ;.
22f0: 3a 20 6e 65 77 2d 73 63 61 6e 74 65 78 20 28 20 : new-scantex (
2300: 2d 2d 20 29 0a 20 20 20 20 73 63 61 6e 2d 74 65 -- ). scan-te
2310: 78 20 30 3e 63 6c 65 61 72 0a 20 20 20 20 73 63 x 0>clear. sc
2320: 61 6e 2d 77 20 32 2a 20 64 75 70 20 47 4c 5f 52 an-w 2* dup GL_R
2330: 47 42 41 20 6e 65 77 2d 74 65 78 74 62 75 66 66 GBA new-textbuff
2340: 65 72 20 74 6f 20 73 63 61 6e 2d 66 62 20 3b 0a er to scan-fb ;.
2350: 3a 20 6e 65 77 2d 73 63 61 6e 74 65 78 2d 66 69 : new-scantex-fi
2360: 6e 61 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 nal ( -- ). s
2370: 63 61 6e 2d 74 65 78 2d 66 69 6e 61 6c 20 30 3e can-tex-final 0>
2380: 63 6c 65 61 72 0a 20 20 20 20 73 63 61 6e 2d 77 clear. scan-w
2390: 20 32 2a 20 64 75 70 20 47 4c 5f 52 47 42 41 20 2* dup GL_RGBA
23a0: 6e 65 77 2d 74 65 78 74 62 75 66 66 65 72 20 74 new-textbuffer t
23b0: 6f 20 73 63 61 6e 2d 66 62 2d 66 69 6e 61 6c 20 o scan-fb-final
23c0: 3b 0a 3a 20 6e 65 77 2d 73 63 61 6e 74 65 78 65 ;.: new-scantexe
23d0: 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 63 61 s ( -- ). sca
23e0: 6e 2d 66 62 20 30 3d 20 49 46 0a 09 6e 65 77 2d n-fb 0= IF..new-
23f0: 73 63 61 6e 74 65 78 2d 72 61 77 20 6e 65 77 2d scantex-raw new-
2400: 73 63 61 6e 74 65 78 20 6e 65 77 2d 73 63 61 6e scantex new-scan
2410: 74 65 78 2d 66 69 6e 61 6c 20 30 3e 66 72 61 6d tex-final 0>fram
2420: 65 62 75 66 66 65 72 0a 20 20 20 20 54 48 45 4e ebuffer. THEN
2430: 20 3b 0a 3a 20 73 63 61 6c 65 2b 72 6f 74 61 74 ;.: scale+rotat
2440: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 70 31 20 e ( -- ). p1
2450: 32 40 20 70 30 20 32 40 20 70 2d 20 70 33 20 32 2@ p0 2@ p- p3 2
2460: 40 20 70 32 20 32 40 20 70 2d 20 70 2b 20 70 32 @ p2 2@ p- p+ p2
2470: 2f 0a 20 20 20 20 73 3e 66 20 79 2d 73 63 61 6e /. s>f y-scan
2480: 73 69 7a 65 20 66 2f 20 79 2d 72 6f 74 73 20 73 size f/ y-rots s
2490: 66 21 20 20 73 3e 66 20 78 2d 73 63 61 6e 73 69 f! s>f x-scansi
24a0: 7a 65 20 66 2f 20 78 2d 73 63 6c 20 73 66 21 0a ze f/ x-scl sf!.
24b0: 20 20 20 20 70 30 20 32 40 20 70 32 20 32 40 20 p0 2@ p2 2@
24c0: 70 2d 20 70 31 20 32 40 20 70 33 20 32 40 20 70 p- p1 2@ p3 2@ p
24d0: 2d 20 70 2b 20 70 32 2f 0a 20 20 20 20 73 3e 66 - p+ p2/. s>f
24e0: 20 79 2d 73 63 61 6e 73 69 7a 65 20 66 2f 20 79 y-scansize f/ y
24f0: 2d 73 63 6c 20 73 66 21 20 20 73 3e 66 20 78 2d -scl sf! s>f x-
2500: 73 63 61 6e 73 69 7a 65 20 66 2f 20 78 2d 72 6f scansize f/ x-ro
2510: 74 73 20 73 66 21 20 3b 0a 3a 20 73 65 74 2d 73 ts sf! ;.: set-s
2520: 63 61 6e 27 20 28 20 2d 2d 20 29 0a 20 20 20 20 can' ( -- ).
2530: 63 6f 6d 70 75 74 65 2d 78 70 6f 69 6e 74 20 28 compute-xpoint (
2540: 20 2e 2e 20 78 20 79 20 29 0a 20 20 20 20 73 63 .. x y ). sc
2550: 61 6c 65 2b 72 6f 74 61 74 65 0a 20 20 20 20 79 ale+rotate. y
2560: 2d 6f 66 66 73 65 74 20 66 2b 20 73 63 61 6e 2d -offset f+ scan-
2570: 77 20 66 6d 2f 20 79 2d 73 70 6f 73 20 73 66 21 w fm/ y-spos sf!
2580: 0a 20 20 20 20 78 2d 6f 66 66 73 65 74 20 66 2b . x-offset f+
2590: 20 73 63 61 6e 2d 77 20 66 6d 2f 20 78 2d 73 70 scan-w fm/ x-sp
25a0: 6f 73 20 73 66 21 20 3b 0a 0a 3a 20 73 63 61 6e os sf! ;..: scan
25b0: 2d 78 79 20 28 20 2d 2d 20 73 78 20 73 79 20 29 -xy ( -- sx sy )
25c0: 0a 20 20 20 20 31 65 20 63 61 6d 2d 68 20 63 61 . 1e cam-h ca
25d0: 6d 2d 77 20 6f 76 65 72 20 75 6d 69 6e 20 73 77 m-w over umin sw
25e0: 61 70 20 66 6d 2a 2f 0a 20 20 20 20 31 65 20 63 ap fm*/. 1e c
25f0: 61 6d 2d 77 20 63 61 6d 2d 68 20 6f 76 65 72 20 am-w cam-h over
2600: 75 6d 69 6e 20 20 20 20 20 20 66 6d 2a 2f 20 3b umin fm*/ ;
2610: 0a 0a 3a 20 73 63 61 6e 2d 6c 65 67 69 74 20 28 ..: scan-legit (
2620: 20 2d 2d 20 29 20 5c 20 72 65 73 69 7a 65 20 61 -- ) \ resize a
2630: 20 6c 65 67 69 74 20 51 52 20 63 6f 64 65 0a 20 legit QR code.
2640: 20 20 20 63 6c 65 61 72 20 69 6e 69 74 2d 73 63 clear init-sc
2650: 61 6e 27 20 73 65 74 2d 73 63 61 6e 27 20 3e 73 an' set-scan' >s
2660: 63 61 6e 2d 6d 61 74 72 69 78 0a 20 20 20 20 73 can-matrix. s
2670: 63 61 6e 2d 6d 61 74 72 69 78 20 4d 56 50 4d 61 can-matrix MVPMa
2680: 74 72 69 78 20 73 65 74 2d 6d 61 74 72 69 78 0a trix set-matrix.
2690: 20 20 20 20 73 63 61 6e 2d 6d 61 74 72 69 78 20 scan-matrix
26a0: 4d 56 4d 61 74 72 69 78 20 20 73 65 74 2d 6d 61 MVMatrix set-ma
26b0: 74 72 69 78 0a 20 20 20 20 73 63 61 6e 2d 74 65 trix. scan-te
26c0: 78 2d 72 61 77 20 6c 69 6e 65 61 72 2d 6d 69 70 x-raw linear-mip
26d0: 6d 61 70 20 30 20 73 63 61 6e 2d 78 79 20 64 72 map 0 scan-xy dr
26e0: 61 77 2d 73 63 61 6e 20 73 63 61 6e 2d 67 72 61 aw-scan scan-gra
26f0: 62 31 20 3b 0a 0a 3a 20 73 63 61 6e 2d 6c 65 67 b1 ;..: scan-leg
2700: 69 74 3f 20 28 20 2d 2d 20 61 64 64 72 20 75 20 it? ( -- addr u
2710: 66 6c 61 67 20 29 0a 20 20 20 20 5b 49 46 44 45 flag ). [IFDE
2720: 46 5d 20 64 69 73 74 64 65 62 75 67 0a 09 64 69 F] distdebug..di
2730: 73 74 30 20 6f 66 66 20 64 69 73 74 30 2d 6d 61 st0 off dist0-ma
2740: 78 20 6f 66 66 20 64 69 73 74 30 2d 6d 69 6e 20 x off dist0-min
2750: 6f 6e 0a 09 64 69 73 74 31 20 6f 66 66 20 64 69 on..dist1 off di
2760: 73 74 31 2d 6d 61 78 20 6f 66 66 20 64 69 73 74 st1-max off dist
2770: 31 2d 6d 69 6e 20 6f 6e 0a 20 20 20 20 5b 54 48 1-min on. [TH
2780: 45 4e 5d 0a 20 20 20 20 73 63 61 6e 2d 6c 65 67 EN]. scan-leg
2790: 69 74 20 3e 67 75 65 73 73 0a 20 20 20 20 3e 67 it >guess. >g
27a0: 75 65 73 73 65 63 63 20 74 61 67 40 20 67 75 65 uessecc tag@ gue
27b0: 73 73 74 61 67 20 63 21 0a 20 20 20 20 32 64 75 sstag c!. 2du
27c0: 70 20 67 75 65 73 73 65 63 63 20 24 31 30 20 65 p guessecc $10 e
27d0: 63 63 2d 6f 6b 3f 20 3b 0a 0a 43 72 65 61 74 65 cc-ok? ;..Create
27e0: 20 73 61 74 25 73 20 31 2e 30 65 20 73 66 2c 20 sat%s 1.0e sf,
27f0: 31 2e 36 36 36 65 20 73 66 2c 20 31 2e 33 33 33 1.666e sf, 1.333
2800: 65 20 73 66 2c 20 32 2e 30 65 20 73 66 2c 0a 64 e sf, 2.0e sf,.d
2810: 6f 65 73 3e 20 28 20 6e 20 2d 2d 20 29 20 73 77 oes> ( n -- ) sw
2820: 61 70 20 73 66 6c 6f 61 74 73 20 2b 20 73 66 40 ap sfloats + sf@
2830: 20 3b 0a 0a 3a 20 74 65 78 2d 66 72 61 6d 65 20 ;..: tex-frame
2840: 28 20 2d 2d 20 29 0a 20 20 20 20 70 72 6f 67 72 ( -- ). progr
2850: 61 6d 20 69 6e 69 74 2d 70 72 6f 67 72 61 6d 20 am init-program
2860: 73 65 74 2d 75 6e 69 66 6f 72 6d 73 0a 20 20 20 set-uniforms.
2870: 20 75 6e 69 74 2d 6d 61 74 72 69 78 20 4d 56 50 unit-matrix MVP
2880: 4d 61 74 72 69 78 20 73 65 74 2d 6d 61 74 72 69 Matrix set-matri
2890: 78 0a 20 20 20 20 75 6e 69 74 2d 6d 61 74 72 69 x. unit-matri
28a0: 78 20 4d 56 4d 61 74 72 69 78 20 73 65 74 2d 6d x MVMatrix set-m
28b0: 61 74 72 69 78 20 3b 0a 3a 20 64 72 61 77 2d 73 atrix ;.: draw-s
28c0: 63 61 6c 65 64 20 28 20 69 20 2d 2d 20 29 0a 20 caled ( i -- ).
28d0: 20 20 20 33 20 61 6e 64 20 73 61 74 25 73 20 73 3 and sat%s s
28e0: 61 74 75 72 61 74 65 25 20 73 66 21 0a 20 20 20 aturate% sf!.
28f0: 20 53 61 74 75 72 61 74 65 20 31 20 73 61 74 75 Saturate 1 satu
2900: 72 61 74 65 25 20 67 6c 55 6e 69 66 6f 72 6d 31 rate% glUniform1
2910: 66 76 0a 20 20 20 20 74 65 78 2d 66 72 61 6d 65 fv. tex-frame
2920: 20 20 20 73 63 61 6e 2d 77 20 32 2a 20 64 75 70 scan-w 2* dup
2930: 20 73 63 61 6e 2d 66 62 20 3e 66 72 61 6d 65 62 scan-fb >frameb
2940: 75 66 66 65 72 0a 20 20 20 20 73 63 61 6e 2d 74 uffer. scan-t
2950: 65 78 2d 72 61 77 20 6c 69 6e 65 61 72 2d 6d 69 ex-raw linear-mi
2960: 70 6d 61 70 20 30 20 73 63 61 6e 2d 78 79 20 64 pmap 0 scan-xy d
2970: 72 61 77 2d 73 63 61 6e 0a 20 20 20 20 73 63 61 raw-scan. sca
2980: 6e 2d 67 72 61 62 30 20 20 73 63 61 6e 2d 77 20 n-grab0 scan-w
2990: 32 2a 20 64 75 70 20 73 63 61 6e 2d 66 62 2d 66 2* dup scan-fb-f
29a0: 69 6e 61 6c 20 3e 66 72 61 6d 65 62 75 66 66 65 inal >framebuffe
29b0: 72 20 3b 0a 3a 20 73 61 74 2d 72 65 73 65 74 20 r ;.: sat-reset
29c0: 28 20 73 61 74 20 2d 2d 20 29 0a 20 20 20 20 73 ( sat -- ). s
29d0: 61 74 75 72 61 74 65 25 20 73 66 21 20 53 61 74 aturate% sf! Sat
29e0: 75 72 61 74 65 20 31 20 73 61 74 75 72 61 74 65 urate 1 saturate
29f0: 25 20 67 6c 55 6e 69 66 6f 72 6d 31 66 76 20 3b % glUniform1fv ;
2a00: 0a 0a 70 72 65 76 69 6f 75 73 0a 0a 5b 49 46 44 ..previous..[IFD
2a10: 45 46 5d 20 61 6e 64 72 6f 69 64 0a 20 20 20 20 EF] android.
2a20: 72 65 71 75 69 72 65 20 61 6e 64 72 6f 69 64 2f require android/
2a30: 71 72 73 63 61 6e 2d 61 6e 64 72 6f 69 64 2e 66 qrscan-android.f
2a40: 73 0a 20 20 20 20 61 6c 73 6f 20 61 6e 64 72 6f s. also andro
2a50: 69 64 0a 5b 45 4c 53 45 5d 0a 20 20 20 20 5b 49 id.[ELSE]. [I
2a60: 46 44 45 46 5d 20 6c 69 6e 75 78 0a 09 72 65 71 FDEF] linux..req
2a70: 75 69 72 65 20 6c 69 6e 75 78 2f 71 72 73 63 61 uire linux/qrsca
2a80: 6e 2d 6c 69 6e 75 78 2e 66 73 0a 20 20 20 20 5b n-linux.fs. [
2a90: 54 48 45 4e 5d 0a 5b 54 48 45 4e 5d 0a 0a 5b 49 THEN].[THEN]..[I
2aa0: 46 55 4e 44 45 46 5d 20 73 63 61 6e 2d 72 65 73 FUNDEF] scan-res
2ab0: 75 6c 74 0a 20 20 20 20 3a 20 73 63 61 6e 2d 72 ult. : scan-r
2ac0: 65 73 75 6c 74 20 28 20 61 64 64 72 20 75 20 74 esult ( addr u t
2ad0: 61 67 20 2d 2d 20 29 0a 09 71 72 28 20 3e 72 0a ag -- )..qr( >r.
2ae0: 09 62 6f 75 6e 64 73 20 3f 44 4f 20 20 2e 22 20 .bounds ?DO ."
2af0: 71 72 20 3a 20 22 20 49 20 24 31 30 20 78 74 79 qr : " I $10 xty
2b00: 70 65 20 63 72 20 24 31 30 20 2b 4c 4f 4f 50 0a pe cr $10 +LOOP.
2b10: 09 72 3e 20 2e 22 20 74 61 67 3a 20 22 20 64 75 .r> ." tag: " du
2b20: 70 20 68 65 78 2e 20 63 72 0a 09 2e 22 20 65 63 p hex. cr..." ec
2b30: 63 3a 20 22 20 67 75 65 73 73 65 63 63 20 24 31 c: " guessecc $1
2b40: 30 20 78 74 79 70 65 20 63 72 0a 09 5b 49 46 44 0 xtype cr..[IFD
2b50: 45 46 5d 20 64 69 73 74 64 65 62 75 67 0a 09 20 EF] distdebug..
2b60: 20 20 20 2e 22 20 64 69 73 74 2f 6d 69 6e 2f 6d ." dist/min/m
2b70: 61 78 3a 20 22 0a 09 20 20 20 20 64 69 73 74 30 ax: ".. dist0
2b80: 20 40 20 73 3e 66 20 5b 20 31 38 20 31 38 20 2a @ s>f [ 18 18 *
2b90: 20 5d 4c 20 66 6d 2f 20 66 3e 73 20 2e 20 64 69 ]L fm/ f>s . di
2ba0: 73 74 30 2d 6d 69 6e 20 3f 20 64 69 73 74 30 2d st0-min ? dist0-
2bb0: 6d 61 78 20 3f 20 73 70 61 63 65 0a 09 20 20 20 max ? space..
2bc0: 20 64 69 73 74 31 20 40 20 73 3e 66 20 5b 20 31 dist1 @ s>f [ 1
2bd0: 38 20 31 38 20 2a 20 5d 4c 20 66 6d 2f 20 66 3e 8 18 * ]L fm/ f>
2be0: 73 20 2e 20 64 69 73 74 31 2d 6d 69 6e 20 3f 20 s . dist1-min ?
2bf0: 64 69 73 74 31 2d 6d 61 78 20 3f 20 63 72 0a 09 dist1-max ? cr..
2c00: 5b 54 48 45 4e 5d 0a 09 29 20 3b 0a 5b 54 48 45 [THEN]..) ;.[THE
2c10: 4e 5d 0a 0a 3a 20 61 64 61 70 74 2d 72 67 62 20 N]..: adapt-rgb
2c20: 28 20 2d 2d 20 29 0a 20 20 20 20 73 63 61 6e 2d ( -- ). scan-
2c30: 62 75 66 30 20 24 40 20 67 65 74 2d 6d 69 6e 6d buf0 $@ get-minm
2c40: 61 78 2d 72 67 62 20 7b 20 64 3a 20 72 20 64 3a ax-rgb { d: r d:
2c50: 20 67 20 64 3a 20 62 20 7d 0a 20 20 20 20 62 20 g d: b }. b
2c60: 6f 76 65 72 20 2d 20 32 2f 20 32 2f 20 20 20 2b over - 2/ 2/ +
2c70: 20 74 6f 20 62 6c 75 65 2d 6c 65 76 65 6c 23 20 to blue-level#
2c80: 20 20 20 5c 20 62 6c 75 65 20 6c 65 76 65 6c 20 \ blue level
2c90: 69 73 20 31 2f 34 20 6f 66 20 74 6f 74 61 6c 0a is 1/4 of total.
2ca0: 20 20 20 20 67 20 6f 76 65 72 20 2d 20 32 20 35 g over - 2 5
2cb0: 20 2a 2f 20 20 2b 20 74 6f 20 67 72 65 65 6e 2d */ + to green-
2cc0: 6c 65 76 65 6c 23 20 20 20 5c 20 67 72 65 65 6e level# \ green
2cd0: 20 61 74 20 34 30 25 20 6f 66 20 74 6f 74 61 6c at 40% of total
2ce0: 0a 20 20 20 20 72 20 6f 76 65 72 20 2d 20 32 2f . r over - 2/
2cf0: 20 20 20 20 20 20 2b 20 74 6f 20 72 65 64 2d 6c + to red-l
2d00: 65 76 65 6c 23 20 3b 20 20 20 5c 20 72 65 64 20 evel# ; \ red
2d10: 61 74 20 35 30 25 20 6f 66 20 74 6f 74 61 6c 0a at 50% of total.
2d20: 0a 3a 20 73 63 61 6e 2d 69 74 20 28 20 2d 2d 20 .: scan-it ( --
2d30: 29 0a 20 20 20 20 73 65 61 72 63 68 2d 63 6f 72 ). search-cor
2d40: 6e 65 72 73 0a 20 20 20 20 3f 6c 65 67 69 74 20 ners. ?legit
2d50: 49 46 20 20 73 63 61 6e 2d 6c 65 67 69 74 3f 20 IF scan-legit?
2d60: 49 46 0a 09 20 20 20 20 67 75 65 73 73 65 63 63 IF.. guessecc
2d70: 20 24 31 30 20 2b 20 63 40 20 73 63 61 6e 2d 72 $10 + c@ scan-r
2d80: 65 73 75 6c 74 20 71 72 28 20 2e 22 20 74 6f 6f esult qr( ." too
2d90: 6b 3a 20 22 20 2e 74 69 6d 65 20 63 72 20 29 0a k: " .time cr ).
2da0: 09 20 20 20 20 71 72 28 20 73 61 76 65 2d 70 6e . qr( save-pn
2db0: 67 31 20 31 20 2b 74 6f 20 73 63 61 6e 23 20 29 g1 1 +to scan# )
2dc0: 0a 09 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 ..ELSE 2drop T
2dd0: 48 45 4e 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a HEN. THEN ;..
2de0: 3a 20 73 63 61 6e 2d 6f 6e 63 65 20 28 20 2d 2d : scan-once ( --
2df0: 20 29 0a 20 20 20 20 73 61 74 75 72 61 74 65 25 ). saturate%
2e00: 20 73 66 40 20 7b 20 66 3a 20 73 61 74 20 7d 0a sf@ { f: sat }.
2e10: 20 20 20 20 64 72 61 77 2d 63 61 6d 20 71 72 28 draw-cam qr(
2e20: 20 21 74 69 6d 65 20 29 20 33 20 30 20 44 4f 0a !time ) 3 0 DO.
2e30: 09 49 20 64 72 61 77 2d 73 63 61 6c 65 64 20 61 .I draw-scaled a
2e40: 64 61 70 74 2d 72 67 62 0a 09 37 20 74 6f 20 72 dapt-rgb..7 to r
2e50: 67 62 2d 78 6f 72 20 73 63 61 6e 2d 69 74 0a 09 gb-xor scan-it..
2e60: 30 20 74 6f 20 72 67 62 2d 78 6f 72 20 73 63 61 0 to rgb-xor sca
2e70: 6e 2d 69 74 0a 20 20 20 20 4c 4f 4f 50 20 20 73 n-it. LOOP s
2e80: 61 74 20 73 61 74 2d 72 65 73 65 74 0a 20 20 20 at sat-reset.
2e90: 20 65 6b 65 79 3f 20 49 46 20 20 65 6b 65 79 20 ekey? IF ekey
2ea0: 64 75 70 20 6b 2d 76 6f 6c 75 70 20 3d 20 73 77 dup k-volup = sw
2eb0: 61 70 20 62 6c 20 3d 20 6f 72 20 20 49 46 20 20 ap bl = or IF
2ec0: 73 61 76 65 2d 70 6e 67 73 20 20 54 48 45 4e 20 save-pngs THEN
2ed0: 20 54 48 45 4e 20 3b 0a 3a 20 73 63 61 6e 2d 6c THEN ;.: scan-l
2ee0: 6f 6f 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 31 oop ( -- ). 1
2ef0: 20 6c 65 76 65 6c 23 20 2b 21 40 20 3e 72 20 20 level# +!@ >r
2f00: 42 45 47 49 4e 20 20 73 63 61 6e 2d 6f 6e 63 65 BEGIN scan-once
2f10: 20 3e 6c 6f 6f 70 65 72 20 6c 65 76 65 6c 23 20 >looper level#
2f20: 40 20 72 40 20 3c 3d 20 55 4e 54 49 4c 0a 20 20 @ r@ <= UNTIL.
2f30: 20 20 72 64 72 6f 70 20 3b 0a 0a 3a 20 73 63 61 rdrop ;..: sca
2f40: 6e 2d 71 72 20 28 20 2d 2d 20 29 0a 20 20 20 20 n-qr ( -- ).
2f50: 5b 49 46 44 45 46 5d 20 6c 61 73 74 73 63 61 6e [IFDEF] lastscan
2f60: 24 20 20 6c 61 73 74 73 63 61 6e 24 20 24 66 72 $ lastscan$ $fr
2f70: 65 65 20 20 5b 54 48 45 4e 5d 0a 20 20 20 20 73 ee [THEN]. s
2f80: 63 61 6e 2d 73 74 61 72 74 20 20 5b 27 5d 20 73 can-start ['] s
2f90: 63 61 6e 2d 6c 6f 6f 70 20 63 61 74 63 68 20 20 can-loop catch
2fa0: 6c 65 76 65 6c 23 20 6f 66 66 0a 20 20 20 20 63 level# off. c
2fb0: 61 6d 2d 65 6e 64 20 30 3e 66 72 61 6d 65 62 75 am-end 0>framebu
2fc0: 66 66 65 72 0a 20 20 20 20 5b 49 46 44 45 46 5d ffer. [IFDEF]
2fd0: 20 73 61 74 75 72 61 74 65 25 20 31 2e 30 65 20 saturate% 1.0e
2fe0: 73 61 74 75 72 61 74 65 25 20 73 66 21 20 5b 54 saturate% sf! [T
2ff0: 48 45 4e 5d 0a 20 20 20 20 5b 49 46 44 45 46 5d HEN]. [IFDEF]
3000: 20 73 68 6f 77 73 74 61 74 75 73 20 73 68 6f 77 showstatus show
3010: 73 74 61 74 75 73 20 5b 54 48 45 4e 5d 0a 20 20 status [THEN].
3020: 20 20 5b 49 46 44 45 46 5d 20 74 65 72 6d 69 6e [IFDEF] termin
3030: 61 6c 2d 70 72 6f 67 72 61 6d 20 74 65 72 6d 69 al-program termi
3040: 6e 61 6c 2d 70 72 6f 67 72 61 6d 20 74 65 72 6d nal-program term
3050: 69 6e 61 6c 2d 69 6e 69 74 20 5b 54 48 45 4e 5d inal-init [THEN]
3060: 0a 20 20 20 20 64 75 70 20 49 46 0a 09 2e 22 20 . dup IF..."
3070: 53 63 61 6e 20 66 61 69 6c 65 64 22 20 63 72 0a Scan failed" cr.
3080: 20 20 20 20 45 4c 53 45 0a 09 2e 22 20 53 63 61 ELSE..." Sca
3090: 6e 20 63 6f 6d 70 6c 65 74 65 64 22 20 63 72 0a n completed" cr.
30a0: 20 20 20 20 54 48 45 4e 0a 20 20 20 20 74 68 72 THEN. thr
30b0: 6f 77 20 3b 0a 0a 70 72 65 76 69 6f 75 73 0a 0a ow ;..previous..
30c0: 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d 20 29 0a 20 :noname ( -- ).
30d0: 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 74 2d ?get-me init-
30e0: 63 6c 69 65 6e 74 0a 20 20 20 20 3f 6e 65 78 74 client. ?next
30f0: 61 72 67 20 49 46 20 20 73 22 20 2d 6d 61 6e 79 arg IF s" -many
3100: 22 20 73 74 72 3d 20 30 3d 20 20 45 4c 53 45 20 " str= 0= ELSE
3110: 20 74 72 75 65 20 20 54 48 45 4e 20 20 74 6f 20 true THEN to
3120: 73 63 61 6e 2d 6f 6e 63 65 3f 0a 20 20 20 20 73 scan-once?. s
3130: 63 61 6e 2d 71 72 20 3b 20 69 73 20 72 75 6e 2d can-qr ; is run-
3140: 73 63 61 6e 2d 71 72 0a 0a 5c 5c 5c 0a 4c 6f 63 scan-qr..\\\.Loc
3150: 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 66 6f al Variables:.fo
3160: 72 74 68 2d 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a rth-local-words:
3170: 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e . (. (("n
3180: 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 et2o:" "+net2o:"
3190: 29 20 64 65 66 69 6e 69 74 69 6f 6e 2d 73 74 61 ) definition-sta
31a0: 72 74 65 72 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d rter (font-lock-
31b0: 6b 65 79 77 6f 72 64 2d 66 61 63 65 20 2e 20 31 keyword-face . 1
31c0: 29 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c 6e 5d ). "[ \t\n]
31d0: 22 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c " t name (font-l
31e0: 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d ock-function-nam
31f0: 65 2d 66 61 63 65 20 2e 20 33 29 29 0a 20 20 20 e-face . 3)).
3200: 20 20 28 22 5b 61 2d 7a 30 2d 39 5d 2b 28 22 20 ("[a-z0-9]+("
3210: 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e 74 2d immediate (font-
3220: 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 2d 66 61 63 lock-comment-fac
3230: 65 20 2e 20 31 29 0a 20 20 20 20 20 20 22 29 22 e . 1). ")"
3240: 20 6e 69 6c 20 63 6f 6d 6d 65 6e 74 20 28 66 6f nil comment (fo
3250: 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 2d nt-lock-comment-
3260: 66 61 63 65 20 2e 20 31 29 29 0a 20 20 20 20 29 face . 1)). )
3270: 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 69 6e 64 .forth-local-ind
3280: 65 6e 74 2d 77 6f 72 64 73 3a 0a 20 20 20 20 28 ent-words:. (
3290: 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f 3a 22 . (("net2o:"
32a0: 20 22 2b 6e 65 74 32 6f 3a 22 29 20 28 30 20 2e "+net2o:") (0 .
32b0: 20 32 29 20 28 30 20 2e 20 32 29 20 6e 6f 6e 2d 2) (0 . 2) non-
32c0: 69 6d 6d 65 64 69 61 74 65 29 0a 20 20 20 20 29 immediate). )
32d0: 0a 45 6e 64 3a 0a 5b 54 48 45 4e 5d 0a .End:.[THEN].