
\ -------------------------------------------------------------
\  Interface to real graphics hardware necessary.
\  This is just for ASCII art in terminal !
\ -------------------------------------------------------------

  : u.base10 ( u -- ) base @ decimal swap 0 <# #s #> type base ! ;
  : ESC[ ( -- ) 27 emit 91 emit ;
  : at-xy ( column row -- ) 1+ swap 1+ swap ESC[ u.base10 ." ;" u.base10 ." H" ;
  : page ESC[ ." 2J" 0 0 at-xy ;

: putpixel ( x y -- )  at-xy [char] * emit ;

\ -------------------------------------------------------------
\  Bresenham line
\ -------------------------------------------------------------

0 variable line-x1   0 variable line-y1
0 variable line-sx   0 variable line-sy
0 variable line-dx   0 variable line-dy
0 variable line-err

: line ( x0 y0 x1 y1 -- )

  line-y1 ! line-x1 !

  over line-x1 @ -   dup 0< if 1 else -1 then line-sx !   abs        line-dx !
  dup  line-y1 @ -   dup 0< if 1 else -1 then line-sy !   abs negate line-dy !  
  line-dx @ line-dy @ + line-err !
  
  begin
    2dup putpixel
    2dup line-x1 @ line-y1 @ d<>
  while
    line-err @ 2* >r
    r@ line-dy @ > if line-dy @ line-err +! swap line-sx @ + swap then
    r> line-dx @ < if line-dx @ line-err +!      line-sy @ +      then
  repeat
  2drop
;

\ -------------------------------------------------------------
\  Bresenham ellipse
\ -------------------------------------------------------------

0 variable ellipse-xm   0 variable ellipse-ym
0 variable ellipse-dx   0 variable ellipse-dy
0 variable ellipse-a    0 variable ellipse-b
0 variable ellipse-a^2  0 variable ellipse-b^2
0 variable ellipse-err

: ellipse-putpixel ( y x -- ) ellipse-xm @ + swap ellipse-ym @ + putpixel ;

: ellipse-step ( -- )
    ellipse-dy @        ellipse-dx @        ellipse-putpixel
    ellipse-dy @ negate ellipse-dx @        ellipse-putpixel
    ellipse-dy @ negate ellipse-dx @ negate ellipse-putpixel
    ellipse-dy @        ellipse-dx @ negate ellipse-putpixel
  
    ellipse-err @ 2* >r
    r@  ellipse-dx @ 2* 1+ ellipse-b^2 @ *        < if  1 ellipse-dx +! ellipse-dx @ 2* 1+ ellipse-b^2 @ *        ellipse-err +! then
    r>  ellipse-dy @ 2* 1- ellipse-a^2 @ * negate > if -1 ellipse-dy +! ellipse-dy @ 2* 1+ ellipse-a^2 @ * negate ellipse-err +! then
;


: ellipse ( xm ym a b -- )

  0 ellipse-dx ! dup ellipse-dy !

  dup ellipse-b ! dup * ellipse-b^2 !
  dup ellipse-a ! dup * ellipse-a^2 !
  ellipse-ym ! ellipse-xm !
  
  ellipse-b^2 @ ellipse-b @ 2* 1- ellipse-a^2 @ * - ellipse-err !
  
  begin
    ellipse-step       
    ellipse-dy @ 0<
  until
  
  ellipse-dx @
  begin
    1+
    dup ellipse-a @ <
  while
    0 over        ellipse-putpixel
    0 over negate ellipse-putpixel
  repeat
  drop
;

: circle ( xm ym r -- ) dup ellipse ;

\ -------------------------------------------------------------
\  Artwork for 8x8 Bitmap font, taken from
\  http://v3.sk/~lkundrak/fonts/freebsd/fonts/iso-8x8
\  http://v3.sk/~lkundrak/fonts/freebsd/fonts/iso15-8x8
\ -------------------------------------------------------------

hex
create font

\ Unicode point, Bitmap Data               \ ISO8859-1, Name

0020 h,  0000 h, 0000 h, 0000 h, 0000 h,   \ 32 Space SPACE
0021 h,  7830 h, 3078 h, 0030 h, 0030 h,   \ 33 !     EXCLAMATION MARK
0022 h,  6C6C h, 006C h, 0000 h, 0000 h,   \ 34 "     QUOTATION MARK
0023 h,  6C6C h, 6CFE h, 6CFE h, 006C h,   \ 35 #     NUMBER SIGN
0024 h,  7C30 h, 78C0 h, F80C h, 0030 h,   \ 36 $     DOLLAR SIGN
0025 h,  C600 h, 18CC h, 6630 h, 00C6 h,   \ 37 %     PERCENT SIGN
0026 h,  6C38 h, 7638 h, CCDC h, 0076 h,   \ 38 &     AMPERSAND
0027 h,  6060 h, 00C0 h, 0000 h, 0000 h,   \ 39 '     APOSTROPHE
0028 h,  3018 h, 6060 h, 3060 h, 0018 h,   \ 40 (     LEFT PARENTHESIS
0029 h,  3060 h, 1818 h, 3018 h, 0060 h,   \ 41 )     RIGHT PARENTHESIS
002A h,  6600 h, FF3C h, 663C h, 0000 h,   \ 42 *     ASTERISK
002B h,  3000 h, FC30 h, 3030 h, 0000 h,   \ 43 +     PLUS SIGN
002C h,  0000 h, 0000 h, 3000 h, 6030 h,   \ 44 ,     COMMA
002D h,  0000 h, FC00 h, 0000 h, 0000 h,   \ 45 -     HYPHEN-MINUS
002E h,  0000 h, 0000 h, 3000 h, 0030 h,   \ 46 .     FULL STOP
002F h,  0C06 h, 3018 h, C060 h, 0080 h,   \ 47 /     SOLIDUS
0030 h,  C67C h, DECE h, E6F6 h, 007C h,   \ 48 0     DIGIT ZERO
0031 h,  7030 h, 3030 h, 3030 h, 00FC h,   \ 49 1     DIGIT ONE
0032 h,  CC78 h, 380C h, CC60 h, 00FC h,   \ 50 2     DIGIT TWO
0033 h,  CC78 h, 380C h, CC0C h, 0078 h,   \ 51 3     DIGIT THREE
0034 h,  3C1C h, CC6C h, 0CFE h, 001E h,   \ 52 4     DIGIT FOUR
0035 h,  C0FC h, 0CF8 h, CC0C h, 0078 h,   \ 53 5     DIGIT FIVE
0036 h,  6038 h, F8C0 h, CCCC h, 0078 h,   \ 54 6     DIGIT SIX
0037 h,  CCFC h, 180C h, 3030 h, 0030 h,   \ 55 7     DIGIT SEVEN
0038 h,  CC78 h, 78CC h, CCCC h, 0078 h,   \ 56 8     DIGIT EIGHT
0039 h,  CC78 h, 7CCC h, 180C h, 0070 h,   \ 57 9     DIGIT NINE
003A h,  3000 h, 0030 h, 3000 h, 0030 h,   \ 58 :     COLON
003B h,  3000 h, 0030 h, 3000 h, 6030 h,   \ 59 ;     SEMICOLON
003C h,  3018 h, C060 h, 3060 h, 0018 h,   \ 60 <     LESS-THAN SIGN
003D h,  0000 h, 00FC h, FC00 h, 0000 h,   \ 61 =     EQUALS SIGN
003E h,  3060 h, 0C18 h, 3018 h, 0060 h,   \ 62 >     GREATER-THAN SIGN
003F h,  CC78 h, 180C h, 0030 h, 0030 h,   \ 63 ?     QUESTION MARK

0040 h,  C67C h, DEDE h, C0DE h, 0078 h,   \ 64 @     COMMERCIAL AT
0041 h,  7830 h, CCCC h, CCFC h, 00CC h,   \ 65 A     LATIN CAPITAL LETTER A
0042 h,  66FC h, 7C66 h, 6666 h, 00FC h,   \ 66 B     LATIN CAPITAL LETTER B
0043 h,  663C h, C0C0 h, 66C0 h, 003C h,   \ 67 C     LATIN CAPITAL LETTER C
0044 h,  6CF8 h, 6666 h, 6C66 h, 00F8 h,   \ 68 D     LATIN CAPITAL LETTER D
0045 h,  62FE h, 7868 h, 6268 h, 00FE h,   \ 69 E     LATIN CAPITAL LETTER E
0046 h,  62FE h, 7868 h, 6068 h, 00F0 h,   \ 70 F     LATIN CAPITAL LETTER F
0047 h,  663C h, C0C0 h, 66CE h, 003E h,   \ 71 G     LATIN CAPITAL LETTER G
0048 h,  CCCC h, FCCC h, CCCC h, 00CC h,   \ 72 H     LATIN CAPITAL LETTER H
0049 h,  3078 h, 3030 h, 3030 h, 0078 h,   \ 73 I     LATIN CAPITAL LETTER I
004A h,  0C1E h, 0C0C h, CCCC h, 0078 h,   \ 74 J     LATIN CAPITAL LETTER J
004B h,  66E6 h, 786C h, 666C h, 00E6 h,   \ 75 K     LATIN CAPITAL LETTER K
004C h,  60F0 h, 6060 h, 6662 h, 00FE h,   \ 76 L     LATIN CAPITAL LETTER L
004D h,  EEC6 h, FEFE h, C6D6 h, 00C6 h,   \ 77 M     LATIN CAPITAL LETTER M
004E h,  E6C6 h, DEF6 h, C6CE h, 00C6 h,   \ 78 N     LATIN CAPITAL LETTER N
004F h,  6C38 h, C6C6 h, 6CC6 h, 0038 h,   \ 79 O     LATIN CAPITAL LETTER O
0050 h,  66FC h, 7C66 h, 6060 h, 00F0 h,   \ 80 P     LATIN CAPITAL LETTER P
0051 h,  CC78 h, CCCC h, 78DC h, 001C h,   \ 81 Q     LATIN CAPITAL LETTER Q
0052 h,  66FC h, 7C66 h, 666C h, 00E6 h,   \ 82 R     LATIN CAPITAL LETTER R
0053 h,  CC78 h, 70E0 h, CC1C h, 0078 h,   \ 83 S     LATIN CAPITAL LETTER S
0054 h,  B4FC h, 3030 h, 3030 h, 0078 h,   \ 84 T     LATIN CAPITAL LETTER T
0055 h,  CCCC h, CCCC h, CCCC h, 00FC h,   \ 85 U     LATIN CAPITAL LETTER U
0056 h,  CCCC h, CCCC h, 78CC h, 0030 h,   \ 86 V     LATIN CAPITAL LETTER V
0057 h,  C6C6 h, D6C6 h, EEFE h, 00C6 h,   \ 87 W     LATIN CAPITAL LETTER W
0058 h,  C6C6 h, 386C h, 6C38 h, 00C6 h,   \ 88 X     LATIN CAPITAL LETTER X
0059 h,  CCCC h, 78CC h, 3030 h, 0078 h,   \ 89 Y     LATIN CAPITAL LETTER Y
005A h,  C6FE h, 188C h, 6632 h, 00FE h,   \ 90 Z     LATIN CAPITAL LETTER Z
005B h,  6078 h, 6060 h, 6060 h, 0078 h,   \ 91 [     LEFT SQUARE BRACKET
005C h,  60C0 h, 1830 h, 060C h, 0002 h,   \ 92 \     REVERSE SOLIDUS
005D h,  1878 h, 1818 h, 1818 h, 0078 h,   \ 93 ]     RIGHT SQUARE BRACKET
005E h,  3810 h, C66C h, 0000 h, 0000 h,   \ 94 ^     CIRCUMFLEX ACCENT
005F h,  0000 h, 0000 h, 0000 h, FF00 h,   \ 95 _     LOW LINE

0060 h,  3030 h, 0018 h, 0000 h, 0000 h,   \ 96 `     GRAVE ACCENT
0061 h,  0000 h, 0C78 h, CC7C h, 0076 h,   \ 97 a     LATIN SMALL LETTER A
0062 h,  60E0 h, 7C60 h, 6666 h, 00DC h,   \ 98 b     LATIN SMALL LETTER B
0063 h,  0000 h, CC78 h, CCC0 h, 0078 h,   \ 99 c     LATIN SMALL LETTER C
0064 h,  0C1C h, 7C0C h, CCCC h, 0076 h,   \ 100 d    LATIN SMALL LETTER D
0065 h,  0000 h, CC78 h, C0FC h, 0078 h,   \ 101 e    LATIN SMALL LETTER E
0066 h,  6C38 h, F060 h, 6060 h, 00F0 h,   \ 102 f    LATIN SMALL LETTER F
0067 h,  0000 h, CC76 h, 7CCC h, F80C h,   \ 103 g    LATIN SMALL LETTER G
0068 h,  60E0 h, 766C h, 6666 h, 00E6 h,   \ 104 h    LATIN SMALL LETTER H
0069 h,  0030 h, 3070 h, 3030 h, 0078 h,   \ 105 i    LATIN SMALL LETTER I
006A h,  000C h, 0C0C h, CC0C h, 78CC h,   \ 106 j    LATIN SMALL LETTER J
006B h,  60E0 h, 6C66 h, 6C78 h, 00E6 h,   \ 107 k    LATIN SMALL LETTER K
006C h,  3070 h, 3030 h, 3030 h, 0078 h,   \ 108 l    LATIN SMALL LETTER L
006D h,  0000 h, FECC h, D6FE h, 00C6 h,   \ 109 m    LATIN SMALL LETTER M
006E h,  0000 h, CCF8 h, CCCC h, 00CC h,   \ 110 n    LATIN SMALL LETTER N
006F h,  0000 h, CC78 h, CCCC h, 0078 h,   \ 111 o    LATIN SMALL LETTER O
0070 h,  0000 h, 66DC h, 7C66 h, F060 h,   \ 112 p    LATIN SMALL LETTER P
0071 h,  0000 h, CC76 h, 7CCC h, 1E0C h,   \ 113 q    LATIN SMALL LETTER Q
0072 h,  0000 h, 76DC h, 6066 h, 00F0 h,   \ 114 r    LATIN SMALL LETTER R
0073 h,  0000 h, C07C h, 0C78 h, 00F8 h,   \ 115 s    LATIN SMALL LETTER S
0074 h,  3010 h, 307C h, 3430 h, 0018 h,   \ 116 t    LATIN SMALL LETTER T
0075 h,  0000 h, CCCC h, CCCC h, 0076 h,   \ 117 u    LATIN SMALL LETTER U
0076 h,  0000 h, CCCC h, 78CC h, 0030 h,   \ 118 v    LATIN SMALL LETTER V
0077 h,  0000 h, D6C6 h, FEFE h, 006C h,   \ 119 w    LATIN SMALL LETTER W
0078 h,  0000 h, 6CC6 h, 6C38 h, 00C6 h,   \ 120 x    LATIN SMALL LETTER X
0079 h,  0000 h, CCCC h, 7CCC h, F80C h,   \ 121 y    LATIN SMALL LETTER Y
007A h,  0000 h, 98FC h, 6430 h, 00FC h,   \ 122 z    LATIN SMALL LETTER Z
007B h,  301C h, E030 h, 3030 h, 001C h,   \ 123 {    LEFT CURLY BRACKET
007C h,  1818 h, 0018 h, 1818 h, 0018 h,   \ 124 |    VERTICAL LINE
007D h,  30E0 h, 1C30 h, 3030 h, 00E0 h,   \ 125 }    RIGHT CURLY BRACKET
007E h,  DC76 h, 0000 h, 0000 h, 0000 h,   \ 126 ~    TILDE
007F h,  0000 h, 0000 h, 0000 h, 0000 h,   \ 127 Del  DELETE

00A0 h,  0000 h, 0000 h, 0000 h, 0000 h,   \ 160      NO-BREAK SPACE
00A1 h,  0030 h, 3030 h, 7878 h, 0030 h,   \ 161      INVERTED EXCLAMATION MARK
00A2 h,  0000 h, 7C10 h, C0C0 h, 107C h,   \ 162      CENT SIGN
00A3 h,  3800 h, 6060 h, 60F0 h, 00FC h,   \ 163      POUND SIGN
00A4 h,  C300 h, 663C h, 3C66 h, 00C3 h,   \ 164      CURRENCY SIGN
00A5 h,  CC00 h, 78CC h, FC30 h, 0030 h,   \ 165      YEN SIGN
00A6 h,  1818 h, 0018 h, 1818 h, 0018 h,   \ 166      BROKEN BAR
00A7 h,  C07E h, C67C h, 067C h, 00FC h,   \ 167      SECTION SIGN
00A8 h,  00C6 h, 0000 h, 0000 h, 0000 h,   \ 168      DIAERESIS
00A9 h,  827C h, A2BA h, 82BA h, 007C h,   \ 169      COPYRIGHT SIGN
00AA h,  061C h, 221E h, 3F1F h, 0000 h,   \ 170      FEMININE ORDINAL INDICATOR
00AB h,  3300 h, CC66 h, 3366 h, 0000 h,   \ 171      LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
00AC h,  FE00 h, 0006 h, 0000 h, 0000 h,   \ 172      NOT SIGN
00AD h,  0000 h, 0000 h, 0000 h, 0000 h,   \ 173      SOFT HYPHEN
00AE h,  827C h, B2BA h, 82AA h, 007C h,   \ 174      REGISTERED SIGN
00AF h,  00FE h, 0000 h, 0000 h, 0000 h,   \ 175      MACRON
00B0 h,  6C38 h, 0038 h, 0000 h, 0000 h,   \ 176      DEGREE SIGN
00B1 h,  1000 h, 107C h, 7C00 h, 0000 h,   \ 177      PLUS-MINUS SIGN
00B2 h,  361C h, 1806 h, 003E h, 0000 h,   \ 178      SUPERSCRIPT TWO
00B3 h,  021E h, 020E h, 001E h, 0000 h,   \ 179      SUPERSCRIPT THREE
00B4 h,  3018 h, 0000 h, 0000 h, 0000 h,   \ 180      ACUTE ACCENT
00B5 h,  0000 h, CCCC h, CCCC h, C076 h,   \ 181      MICRO SIGN
00B6 h,  CA7E h, 7ECA h, 0A0A h, 000A h,   \ 182      PILCROW SIGN
00B7 h,  0000 h, 1800 h, 0000 h, 0000 h,   \ 183      MIDDLE DOT
00B8 h,  0000 h, 0000 h, 0000 h, 3018 h,   \ 184      CEDILLA
00B9 h,  0E06 h, 0606 h, 0006 h, 0000 h,   \ 185      SUPERSCRIPT ONE
00BA h,  110E h, 1111 h, 1F0E h, 0000 h,   \ 186      MASCULINE ORDINAL INDICATOR
00BB h,  CC00 h, 3366 h, CC66 h, 0000 h,   \ 187      RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
00BC h,  E060 h, 6C66 h, 6733 h, 030F h,   \ 188      VULGAR FRACTION ONE QUARTER
00BD h,  E060 h, 6C66 h, 6A36 h, 0E04 h,   \ 189      VULGAR FRACTION ONE HALF
00BE h,  20F0 h, 6C96 h, 6733 h, 030F h,   \ 190      VULGAR FRACTION THREE QUARTERS
00BF h,  0030 h, 6030 h, CCC0 h, 0078 h,   \ 191      INVERTED QUESTION MARK

00C0 h,  0C18 h, 7830 h, FCCC h, 00CC h,   \ 192      LATIN CAPITAL LETTER A WITH GRAVE
00C1 h,  C060 h, 7830 h, FCCC h, 00CC h,   \ 193      LATIN CAPITAL LETTER A WITH ACUTE
00C2 h,  8478 h, 7830 h, FCCC h, 00CC h,   \ 194      LATIN CAPITAL LETTER A WITH CIRCUMFLEX
00C3 h,  9866 h, 7830 h, FCCC h, 00CC h,   \ 195      LATIN CAPITAL LETTER A WITH TILDE
00C4 h,  00CC h, 7830 h, FCCC h, 00CC h,   \ 196      LATIN CAPITAL LETTER A WITH DIAERESIS
00C5 h,  4830 h, 7830 h, FCCC h, 00CC h,   \ 197      LATIN CAPITAL LETTER A WITH RING ABOVE
00C6 h,  783E h, 9C98 h, 98F8 h, 009E h,   \ 198      LATIN CAPITAL LETTER AE
00C7 h,  663C h, C0C0 h, 66C0 h, 301C h,   \ 199      LATIN CAPITAL LETTER C WITH CEDILLA
00C8 h,  1830 h, 62FE h, 6278 h, 00FE h,   \ 200      LATIN CAPITAL LETTER E WITH GRAVE
00C9 h,  3018 h, 62FE h, 6278 h, 00FE h,   \ 201      LATIN CAPITAL LETTER E WITH ACUTE
00CA h,  4438 h, 62FE h, 6278 h, 00FE h,   \ 202      LATIN CAPITAL LETTER E WITH CIRCUMFLEX
00CB h,  0066 h, 62FE h, 6278 h, 00FE h,   \ 203      LATIN CAPITAL LETTER E WITH DIAERESIS
00CC h,  3060 h, 3078 h, 3030 h, 0078 h,   \ 204      LATIN CAPITAL LETTER I WITH GRAVE
00CD h,  3018 h, 3078 h, 3030 h, 0078 h,   \ 205      LATIN CAPITAL LETTER I WITH ACUTE
00CE h,  8478 h, 3078 h, 3030 h, 0078 h,   \ 206      LATIN CAPITAL LETTER I WITH CIRCUMFLEX
00CF h,  00CC h, 3078 h, 3030 h, 0078 h,   \ 207      LATIN CAPITAL LETTER I WITH DIAERESIS
00D0 h,  6C78 h, F666 h, 6C66 h, 0078 h,   \ 208      LATIN CAPITAL LETTER ETH (Icelandic)
00D1 h,  9866 h, F6E6 h, CEDE h, 00C6 h,   \ 209      LATIN CAPITAL LETTER N WITH TILDE
00D2 h,  1830 h, C67C h, C6C6 h, 007C h,   \ 210      LATIN CAPITAL LETTER O WITH GRAVE
00D3 h,  3018 h, C67C h, C6C6 h, 007C h,   \ 211      LATIN CAPITAL LETTER O WITH ACUTE
00D4 h,  4438 h, C67C h, C6C6 h, 007C h,   \ 212      LATIN CAPITAL LETTER O WITH CIRCUMFLEX
00D5 h,  9866 h, C67C h, C6C6 h, 007C h,   \ 213      LATIN CAPITAL LETTER O WITH TILDE
00D6 h,  00C6 h, C67C h, C6C6 h, 007C h,   \ 214      LATIN CAPITAL LETTER O WITH DIAERESIS
00D7 h,  C600 h, 386C h, 6C38 h, 00C6 h,   \ 215      MULTIPLICATION SIGN
00D8 h,  7C06 h, 9ACE h, E6B2 h, C078 h,   \ 216      LATIN CAPITAL LETTER O WITH STROKE
00D9 h,  3060 h, CCCC h, CCCC h, 00FC h,   \ 217      LATIN CAPITAL LETTER U WITH GRAVE
00DA h,  3018 h, CCCC h, CCCC h, 00FC h,   \ 218      LATIN CAPITAL LETTER U WITH ACUTE
00DB h,  8478 h, CCCC h, CCCC h, 00FC h,   \ 219      LATIN CAPITAL LETTER U WITH CIRCUMFLEX
00DC h,  00CC h, CCCC h, CCCC h, 00FC h,   \ 220      LATIN CAPITAL LETTER U WITH DIAERESIS
00DD h,  3018 h, CCCC h, 3078 h, 0078 h,   \ 221      LATIN CAPITAL LETTER Y WITH ACUTE
00DE h,  7860 h, 786C h, 6060 h, 0060 h,   \ 222      LATIN CAPITAL LETTER THORN (Icelandic)
00DF h,  CC78 h, DCC4 h, C6C6 h, C0DC h,   \ 223      LATIN SMALL LETTER SHARP S (German)

00E0 h,  1830 h, 0C78 h, CC7C h, 0076 h,   \ 224      LATIN SMALL LETTER A WITH GRAVE
00E1 h,  3018 h, 0C78 h, CC7C h, 0076 h,   \ 225      LATIN SMALL LETTER A WITH ACUTE
00E2 h,  8478 h, 0C78 h, CC7C h, 0076 h,   \ 226      LATIN SMALL LETTER A WITH CIRCUMFLEX
00E3 h,  9866 h, 0C78 h, CC7C h, 0076 h,   \ 227      LATIN SMALL LETTER A WITH TILDE
00E4 h,  00CC h, 0C78 h, CC7C h, 0076 h,   \ 228      LATIN SMALL LETTER A WITH DIAERESIS
00E5 h,  4830 h, 0C38 h, CC7C h, 0076 h,   \ 229      LATIN SMALL LETTER A WITH RING ABOVE
00E6 h,  0000 h, 32EC h, B07E h, 006E h,   \ 230      LATIN SMALL LETTER AE
00E7 h,  0000 h, 663C h, 66C0 h, 301C h,   \ 231      LATIN SMALL LETTER C WITH CEDILLA
00E8 h,  1830 h, CC78 h, C0FC h, 0078 h,   \ 232      LATIN SMALL LETTER E WITH GRAVE
00E9 h,  3018 h, CC78 h, C0FC h, 0078 h,   \ 233      LATIN SMALL LETTER E WITH ACUTE
00EA h,  8478 h, CC78 h, C0FC h, 0078 h,   \ 234      LATIN SMALL LETTER E WITH CIRCUMFLEX
00EB h,  00CC h, CC78 h, C0FC h, 0078 h,   \ 235      LATIN SMALL LETTER E WITH DIAERESIS
00EC h,  3060 h, 7000 h, 3030 h, 0078 h,   \ 236      LATIN SMALL LETTER I WITH GRAVE
00ED h,  3018 h, 7000 h, 3030 h, 0078 h,   \ 237      LATIN SMALL LETTER I WITH ACUTE
00EE h,  8870 h, 7000 h, 3030 h, 0078 h,   \ 238      LATIN SMALL LETTER I WITH CIRCUMFLEX
00EF h,  00CC h, 7000 h, 3030 h, 0078 h,   \ 239      LATIN SMALL LETTER I WITH DIAERESIS
00F0 h,  386C h, 0C6C h, CC6C h, 0078 h,   \ 240      LATIN SMALL LETTER ETH (Icelandic)
00F1 h,  9866 h, CCF8 h, CCCC h, 00CC h,   \ 241      LATIN SMALL LETTER N WITH TILDE
00F2 h,  3060 h, 7C00 h, C6C6 h, 007C h,   \ 242      LATIN SMALL LETTER O WITH GRAVE
00F3 h,  3018 h, 7C00 h, C6C6 h, 007C h,   \ 243      LATIN SMALL LETTER O WITH ACUTE
00F4 h,  4438 h, 7C00 h, C6C6 h, 007C h,   \ 244      LATIN SMALL LETTER O WITH CIRCUMFLEX
00F5 h,  9866 h, 7C00 h, C6C6 h, 007C h,   \ 245      LATIN SMALL LETTER O WITH TILDE
00F6 h,  00C6 h, 7C00 h, C6C6 h, 007C h,   \ 246      LATIN SMALL LETTER O WITH DIAERESIS
00F7 h,  0000 h, 0018 h, 007E h, 0018 h,   \ 247      DIVISION SIGN
00F8 h,  0000 h, 7C06 h, F6DE h, C07C h,   \ 248      LATIN SMALL LETTER O WITH STROKE
00F9 h,  3060 h, CC00 h, CCCC h, 0076 h,   \ 249      LATIN SMALL LETTER U WITH GRAVE
00FA h,  3018 h, CC00 h, CCCC h, 0076 h,   \ 250      LATIN SMALL LETTER U WITH ACUTE
00FB h,  4830 h, CC00 h, CCCC h, 0076 h,   \ 251      LATIN SMALL LETTER U WITH CIRCUMFLEX
00FC h,  00CC h, CC00 h, CCCC h, 0076 h,   \ 252      LATIN SMALL LETTER U WITH DIAERESIS
00FD h,  3018 h, CCCC h, 7CCC h, F80C h,   \ 253      LATIN SMALL LETTER Y WITH ACUTE
00FE h,  78E0 h, 666C h, 786C h, 00E0 h,   \ 254      LATIN SMALL LETTER THORN (Icelandic)
00FF h,  00CC h, CCCC h, 7CCC h, F80C h,   \ 255      LATIN SMALL LETTER Y WITH DIAERESIS


\ Unicode point, Bitmap Data               \ ISO8859-15, Name

20AC h,  190E h, 7E30 h, 1930 h, 000E h,   \ 164      EURO SIGN
0160 h,  7C30 h, 78C0 h, F80C h, 0000 h,   \ 166      LATIN CAPITAL LETTER S WITH CARON
0161 h,  7C30 h, 78C0 h, F80C h, 0000 h,   \ 168      LATIN SMALL LETTER S WITH CARON
017D h,  FC30 h, 3098 h, FC64 h, 0000 h,   \ 180      LATIN CAPITAL LETTER Z WITH CARON
017E h,  FC30 h, 3098 h, FC64 h, 0000 h,   \ 184      LATIN SMALL LETTER Z WITH CARON
0152 h,  D858 h, D8DC h, 3E58 h, 0000 h,   \ 188      LATIN CAPITAL LIGATURE OE
0153 h,  6C00 h, DED2 h, 6ED0 h, 0000 h,   \ 189      LATIN SMALL LIGATURE OE
0178 h,  CC00 h, 78CC h, 7830 h, 0000 h,   \ 190      LATIN CAPITAL LETTER Y WITH DIAERESIS


0000 h,  1000 h, 6C38 h, C6C6 h, 00FE h,   \ End of font marker, replacement glyph.

align decimal


: unicode>bitmap ( x -- c-addr ) \ Translates Unicode character to address of 8x8 bitmap.

  font ( x addr )
  begin
    2dup h@ = if nip 2 + exit then \ Character found, skip character number, give back bitmap data
  dup h@ while \ As long as there are more characters left in the glyph collection...
    10 + \ Not this one, skip it and its bitmap
  repeat

  nip 2 + \ Character not found within available collection of glyphs. Display replacement.

1-foldable ;

\ -------------------------------------------------------------
\  Write an Unicode character with 8x8 bitmap font
\ -------------------------------------------------------------

0 variable font-x   0 variable font-y

: drawbytepattern ( c -- )
  8 0 do dup 128 and if font-x @ font-y @ putpixel then shl 1 font-x +! loop
  drop -8 font-x +!
;

: drawcharacterbitmap ( c-addr -- )
  8 0 do dup c@ drawbytepattern 1 font-y +! 1+ loop
  drop -8 font-y +! 8 font-x +!
;

: drawunicode ( x -- ) unicode>bitmap drawcharacterbitmap ;

\ -------------------------------------------------------------
\  Unicode UTF-8 encoding decoder
\ -------------------------------------------------------------

0 variable utf8collection
0 variable utf8continuation

: utf8-character-length ( c -- c u )
  dup %11000000 and %11000000 = if dup 24 lshift not clz else 1 then ;

: drawcharacter ( c -- ) \ Handles a stream of UTF-8 bytes and translates this into Unicode letters.

  utf8continuation @
  if   \ Continue to receive an extended character into buffer

    %00111111 and utf8collection @ 6 lshift or utf8collection !  \ Six more bits
    -1 utf8continuation +!                                       \ One less continuation byte to expect
    utf8continuation @ 0= if utf8collection @ drawunicode then   \ Draw character if complete encoding was buffered.    

  else \ Begin of a new character

    utf8-character-length 1- ?dup

    if \ Start of a new character or a sequence
      dup utf8continuation !
      25 + tuck lshift swap rshift \ Remove the length encoding by shifting it out of the register temporarily
      utf8collection !
    else \ One byte characters are classic 7 bit ASCII and can be drawn immediately
      drawunicode
    then

  then
;

\ -------------------------------------------------------------
\  Write a string and split into individual characters
\ -------------------------------------------------------------

: get-first-char ( addr len -- addr   len c ) over c@ ;
: cut-first-char ( addr len -- addr+1 len-1 ) 1- swap 1+ swap ;

: drawstring ( addr u x y -- )
  font-y ! font-x !

  begin
    dup 0<>
  while
    get-first-char
    drawcharacter
    cut-first-char
  repeat
  2drop
;

\ -------------------------------------------------------------
\  A small demo
\ -------------------------------------------------------------

: demo ( -- )
  page
  50 14 32 10 ellipse
  50 14 34 12 ellipse
  s" Mecrisp" 22 10 drawstring
  2 4 12 24 line
  4 4 14 24 line
;
