### LCD NUMBER DISPLAY ENGINE ###

# The shapes of individual elements of a digit
array set lcdshape {
    a {3.0 5 5.2 3 7.0 5 6.0 15 3.8 17 2.0 15}
    b {6.3 2 8.5 0 18.5 0 20.3 2 18.1 4 8.1 4}
    c {19.0 5 21.2 3 23.0 5 22.0 15 19.8 17 18.0 15}
    d {17.4 21 19.6 19 21.4 21 20.4 31 18.2 33 16.4 31}
    e {3.1 34 5.3 32 15.3 32 17.1 34 14.9 36 4.9 36}
    f {1.4 21 3.6 19 5.4 21 4.4 31 2.2 33 0.4 31}
    g {4.7 18 6.9 16 16.9 16 18.7 18 16.5 20 6.5 20}
}
# Which elements are turned on for a given digit?
array set llcd {
    0 {a b c d e f}
    1 {c d}
    2 {b c e f g}
    3 {b c d e g}
    4 {a c d g}
    5 {a b d e g}
    6 {a b d e f g}
    7 {b c d}
    8 {a b c d e f g}
    9 {a b c d e g}
    - {g}
    { } {}
}
# Which elements are turned off for a given digit?
array set ulcd {
    0 {g}
    1 {a b e f g}
    2 {a d}
    3 {a f}
    4 {b e f}
    5 {c f}
    6 {c}
    7 {a e f g}
    8 {}
    9 {f}
    - {a b c d e f}
    { } {a b c d e f g}
}

# Displays a decimal number using LCD digits in the top-left of the canvas
proc showLCD {number {width 5} {colours {#ff8080 #ff0000 #404040 #303030}}} {
    global llcd ulcd lcdshape
    set lcdoffset 0
    .c delete lcd
    foreach {onRim onFill offRim offFill} $colours {break}
    foreach glyph [split [format %${width}d $number] {}] {
        foreach symbol $llcd($glyph) {
            .c move [eval .c create polygon $lcdshape($symbol) -tags lcd \
                    -outline $onRim -fill $onFill] $lcdoffset 0
        }
        foreach symbol $ulcd($glyph) {
            .c move [eval .c create polygon $lcdshape($symbol) -tags lcd \
                    -outline $offRim -fill $offFill] $lcdoffset 0
        }
        incr lcdoffset 22
    }
}

canvas .c -width 150 -height 60
button .exit -text "Quit" -command " exit "
pack .c -expand y
pack .exit -expand y
set numLCD 0
while {$numLCD <= 500} {
                after 100 ;# This takes the place of your loading code
		showLCD $numLCD 
                incr numLCD
                update
        }

