; $$$$$$$$$$$$$$$$$$$ ABAKIS $$$$$$$$$$$$$$$$$$$$$
; *************** STAR^2 SOFTWARE ****************
; ?????????????????? FONT.INC ????????????????????

; 100% portable font

;;;;;;;;;;;;;;;;;;;; SYMBOLS ;;;;;;;;;;;;;;;;;;;;;

; my default character arrangement: 95 symbols.
; includes all standard visible characters

; 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I
; J K L M N O P Q R S T U V W X Y Z a b
; c d e f g h i j k l m n o p q r s t u
; v w x y z _	. ? ; : ' " , ~ ! @ # $
; % ^ & * ( ) [ ] { } = + - < > / \ | `

; symbol lookup table to convert 7BIT ASCII
; character to index. 63=ignore (spaces, etc)

align 4

FONT.SYMBOLS: db \
63,63,63,63,63,63,63,63, 63,63,63,63,63,63,63,63,\
63,63,63,63,63,63,63,63, 63,63,63,63,63,63,63,63,\
63,72,69,74,75,76,78,68, 80,81,79,87,70,88,64,91,\
00,01,02,03,04,05,06,07, 08,09,67,66,89,86,90,65,\
73,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,82,92,83,77,62,\
94,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,84,93,85,71,63
NO.C=63

macro FONT [p] { common IMAGE p }

align

void font.image.p
integer font.image.w, font.w, font.h
integer font.color=WHITE

macro set.font i {
  . font.image.p=i#.p, r0=i#.w
  . font.image.w=r0, r1=95, r0/r1
  . font.w=r0, font.h=i#.h
}

;;;;;;;;;;;;;;;;; DRAW CHARACTER ;;;;;;;;;;;;;;;;;

function draw.c, c, x, y
  locals i, p, iw
  try visible x, y, font.w, font.h
  . r0=FONT.SYMBOLS, r0+c, r0=*r0
  if r0=NO.C, return, end
  . r0*font.w, r0*4, r0+font.image.p
  . p=r0, iw=font.image.w, iw*4, i=font.h
  loop i, r0=i
    if r0>=font.h, break, end
    draw.scanline p, x, y, font.w
    . r1=iw, p+r1, y++
  endl
endf

;;;;;;;;;;;;;;;;;;; DRAW TEXT ;;;;;;;;;;;;;;;;;;;;

align
integer clip.tx=-1, clip.ty=-1

function draw.text, t, x, y
  locals i, n, p
  . r0=t, p=r0, i=0
  while true		  ; draw all characters
    . r1=i, r1*font.w	  ; x=i*font.w+x
    . r1+x, r0=p, r0=*r0  ; get c
    if r0=0Dh		  ; return?
      . i=0, r1=font.h	  ; reset x
      . y+r1, p++	  ; y+font.h
      go .next
    end
    . r2=y, r2-font.h	  ; clipping
    if r2>screen.h
      return
    end
    . r2=clip.tx
    if r2<>-1, r2-font.w
      if r1>=r2, return, end
    end
    . r2=clip.ty
    if r2<>-1, r2-font.h
      if r1>=r2, return, end
    end
    draw.c r0, r1, y	  ; draw
    . i++
    .next:
    . p++, r0=p, r0=*r0
  endw
endf

; get width of text=a1 with insets

function get.text.w, t
  text.n t
  . r1=r0, r1+2, r0=font.w, r0*r1
endf