JMeh 13 Jul 2017 - Test-Picture Generator
The test picture generator helps calibrating old CRT monitors and is a nice example using the canvas widget. It displays a full sized window on the main screen and shows up a little menu by pressing the left button.
PO 2017/07/30 -
Test-Image Generator is a slightly modified version of the Test-Picture Generator. Instead of displaying the test-picture on the screen, it is saved into an image file.
Here are some screenshots:
And here is the source:
#!/bin/sh
#\
exec wish "$0"
wm withdraw .
set Pattern {}
set ForeColor white
set BackColor black
set DrawPos(x) 0
set DrawPos(y) 0
set PenSize 1
set Font {Arial -13}
set SenderKennung "Farb-Testbild Generator - J.Mehring 1.2"
proc hsv2rgb { hue sat value } {
set v $value
if {$sat == 0} {
set v [format %04X [expr $v * 65535]]
return "#$v$v$v"
} else {
set hue [expr $hue * 6.0]
if {$hue >= 6.0} {
set hue 0.0
}
scan $hue. %d i
set f [expr $hue - $i]
set p [expr $value * (1 - $sat)]
set q [expr $value * (1 - ($sat * $f))]
set t [expr $value * (1 - ($sat * (1 - $f)))]
switch -exact $i {
0 { set r $v; set g $t; set b $p }
1 { set r $q; set g $v; set b $p }
2 { set r $p; set g $v; set b $t }
3 { set r $p; set g $q; set b $v }
4 { set r $t; set g $p; set b $v }
5 { set r $v; set g $p; set b $q }
default {
error "hsv2rgb: i value $i is out of range"
}
}
set r [format %04X [expr int($r * 65535)]]
set g [format %04X [expr int($g * 65535)]]
set b [format %04X [expr int($b * 65535)]]
return "#$r$g$b"
}
}
proc transform { x a1 a2 b1 b2 } {
expr ((double($x) - double($a1)) / (double($a2) - double($a1))) * \
(double($b2) - double($b1)) + double($b1)
}
proc Transform { x a1 a2 b1 b2 } {
expr round(((double($x) - double($a1)) / (double($a2) - double($a1))) * \
(double($b2) - double($b1)) + double($b1))
}
proc XPos { p } {
upvar prc rc
expr round($p * ($rc(right) - $rc(left)) + $rc(left))
}
proc XPos1 { p } {
upvar prc rc
expr round($p * ($rc(right) - $rc(left)) + $rc(left)) +1
}
proc YPos { p } {
upvar prc rc
expr round($p * ($rc(bottom) - $rc(top)) + $rc(top))
}
proc YPos1 { p } {
upvar prc rc
expr round($p * ($rc(bottom) - $rc(top)) + $rc(top)) +1
}
proc SetRect { v_rc x0 y0 x1 y1 } {
upvar $v_rc rc
set rc(top) $y0
set rc(left) $x0
set rc(bottom) $y1
set rc(right) $x1
}
proc GetFontInfo { v_finfo } {
upvar $v_finfo finfo
global Font
set finfo(ascent) [font metrics $Font -ascent]
set finfo(descent) [font metrics $Font -descent]
set finfo(linespace) [font metrics $Font -linespace]
}
proc StringWidth { str } {
global Font
return [font measure $Font $str]
}
proc TextFont { which } {
global Font
set Font $which
}
proc DrawString { str {anchor w} } {
global DrawPos Font ForeColor cv
$cv create text $DrawPos(x) $DrawPos(y) -font $Font -fill $ForeColor \
-anchor $anchor -text $str
}
proc SetPenSize { width } {
global PenSize
set PenSize $width
}
proc FillRect { v_rc } {
upvar $v_rc rc
global Pattern ForeColor cv
if {$Pattern != {}} {
$cv create rect $rc(left) $rc(top) $rc(right) $rc(bottom) \
-fill $ForeColor -stipple $Pattern -width 0
} else {
$cv create rect $rc(left) $rc(top) $rc(right) $rc(bottom) \
-fill $ForeColor -width 0
}
}
proc ClearPoly3 { x0 y0 x1 y1 x2 y2 } {
global BackColor cv
$cv create poly $x0 $y0 $x1 $y1 $x2 $y2 -fill $BackColor -width 0
}
proc FrameRect { v_rc } {
upvar $v_rc rc
MoveTo $rc(left) $rc(top)
LineTo $rc(right) $rc(top)
LineTo $rc(right) $rc(bottom)
LineTo $rc(left) $rc(bottom)
LineTo $rc(left) $rc(top)
}
proc EraseRect { v_rc } {
upvar $v_rc rc
global Pattern BackColor cv
$cv create rect $rc(left) $rc(top) $rc(right) $rc(bottom) -fill $BackColor
}
proc FrameCircle { v_rc } {
upvar $v_rc rc
global Pattern ForeColor PenSize cv
$cv create oval $rc(left) $rc(top) $rc(right) $rc(bottom) \
-outline $ForeColor -width $PenSize
}
proc MoveTo { x0 y0 } {
global DrawPos
set DrawPos(x) $x0
set DrawPos(y) $y0
}
proc LineTo { x1 y1 } {
global DrawPos ForeColor PenSize cv
$cv create line $DrawPos(x) $DrawPos(y) $x1 $y1 \
-fill $ForeColor -width $PenSize
set DrawPos(x) $x1
set DrawPos(y) $y1
}
proc RGBForeColor { color } {
global ForeColor
set ForeColor $color
}
proc RGBBackColor { color } {
global BackColor
set BackColor $color
}
proc PenPattern { id } {
global Pattern
set Pattern $id
}
proc Color { which } {
switch $which {
gray { return #C000C000C000 }
yellow { return #FF00EA000000 }
cyan { return #0000A400DE00 }
green { return #0000FFFF0000 }
magenta { return #CE0000006800 }
red { return #FFFF00000000 }
blue { return #00000000FFFF }
black { return #000000000000 }
white_25 { return #400040004000 }
white_50 { return #800080008000 }
white_75 { return #C000C000C000 }
white { return #FFFFFFFFFFFF }
}
}
proc Draw4Rects { x0 x1 x2 x3 y0 y1 y2 y3 } {
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x2 $y0 $x3 $y1
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
FillRect rc
SetRect rc $x2 $y2 $x3 $y3
FillRect rc
}
proc DrawBalken { v_prc } {
upvar $v_prc prc
array set rc [array get prc]
set x1 [XPos 0]
set pos 0.125
foreach color {gray yellow cyan green magenta red blue black} {
set x0 $x1
set x1 [XPos $pos]
set rc(left) $x0
set rc(right) $x1
RGBForeColor [Color $color]
FillRect rc
set pos [expr $pos + 0.125]
}
}
proc DrawFuBK { v_prc } {
upvar $v_prc prc
global SenderKennung
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
RGBForeColor [Color black]
FillRect prc
# 14 horizontale Linien
RGBForeColor [Color white]
array set rc [array get prc]
set pos 0.033333333
for {set idx 0} {$idx < 15} {incr idx} {
set y0 [YPos $pos]
MoveTo $rc(left) $y0
LineTo $rc(right) $y0
set pos [expr $pos + 0.066666666]
}
# 18 verticale Linien
RGBForeColor [Color white]
array set rc [array get prc]
set pos 0.026315789
for {set idx 0} {$idx < 19} {incr idx} {
set x0 [XPos $pos]
MoveTo $x0 $rc(top)
LineTo $x0 $rc(bottom)
set pos [expr $pos + 0.052631578]
}
# die inneren 12x3 Kästchen ausblenden
RGBForeColor [Color black]
SetRect rc [XPos1 0.1842105263] [YPos1 0.1666666667] \
[XPos1 0.8157894737] [YPos1 0.8333333333]
FillRect rc
# 8 Farbbalken in die oberen 12x3 Kästchen
set rc(top) [YPos1 0.1666666667]
set rc(bottom) [YPos 0.3666666667]
set x1 [XPos 0.1842105263]
set pos 0.263157894
foreach color {gray yellow cyan green magenta red blue black} {
set x0 $x1
set x1 [XPos $pos]
set rc(left) $x0
set rc(right) $x1
RGBForeColor [Color $color]
FillRect rc
set pos [expr $pos + 0.078947368]
}
# 5 Graustufen in die darunter liegenden 12x2 Kästchen
set rc(top) [YPos1 0.3666666667]
set rc(bottom) [YPos 0.5]
set x1 [XPos 0.1842105263]
set pos 0.310526315
foreach color {black white_25 white_50 white_75 white} {
set x0 $x1
set x1 [XPos $pos]
set rc(left) $x0
set rc(right) $x1
RGBForeColor [Color $color]
FillRect rc
set pos [expr $pos + 0.126315789]
}
# die "Senderkennung" umrahmt von 2 Weißkästchen in die Zeile darunter
RGBForeColor [Color black]
SetRect rc [XPos 0.1842105263] [YPos 0.5] \
[XPos 0.2894736840] [YPos 0.5526315789]
FillRect rc
RGBForeColor [Color white]
SetRect rc [XPos 0.1842105263] [YPos 0.5] \
[XPos 0.2894736842] [YPos 0.5666666667]
FillRect rc
SetRect rc [XPos 0.7105263158] [YPos 0.5] \
[XPos 0.8157894737] [YPos 0.5666666667]
FillRect rc
# Pattern in die nächste Zeile
set y0 [YPos 0.5666666667]
set y1 [YPos 0.6333333333]
RGBForeColor [Color white]
SetRect rc [XPos 0.1842105263] $y0 [XPos 0.2631578947] $y1
FillRect rc
SetRect rc [XPos 0.2631578947] $y0 [XPos 0.3815789474] $y1
PenPattern gray12
FillRect rc
SetRect rc [XPos 0.3815789474] $y0 [XPos 0.5000000000] $y1
PenPattern gray25
FillRect rc
SetRect rc [XPos 0.5000000000] $y0 [XPos 0.6184210530] $y1
PenPattern gray50
FillRect rc
SetRect rc [XPos 0.6184210530] $y0 [XPos 0.7631578947] $y1
PenPattern gray75
FillRect rc
PenPattern {}
RGBForeColor [Color white_50]
SetRect rc [XPos 0.7631578947] $y0 [XPos 0.8157894737] $y1
FillRect rc
# ein weißes Kreuz in die Mitte
RGBForeColor [Color white]
set x0 [XPos 0.5]
set y0 [YPos1 0.3666666667]
set y1 [YPos 0.6333333333]
SetPenSize 3
MoveTo $x0 $y0
LineTo $x0 $y1
set y0 [YPos 0.5]
set x0 [XPos 0.1842105263]
set x1 [XPos 0.8157894737]
MoveTo $x0 $y0
LineTo $x1 $y0
SetPenSize 1
# den Text der "Senderkennung" anzeigen
set len [XPos 0.3684210526]
TextFont "Arial -24 bold"
if {[StringWidth $SenderKennung] > $len} { TextFont "Arial -18 bold" }
if {[StringWidth $SenderKennung] > $len} { TextFont "Arial -14 bold" }
if {[StringWidth $SenderKennung] > $len} { TextFont "Arial -12 bold" }
if {[StringWidth $SenderKennung] > $len} { TextFont "Arial -10 bold" }
if {[StringWidth $SenderKennung] > $len} { TextFont "Arial -8 bold" }
set x0 [XPos 0.5]
set y0 [YPos 0.5333333333]
GetFontInfo fInfo
set len [StringWidth $SenderKennung]
SetRect rc \
[expr $x0 - $len / 2] \
[expr $y0 - $fInfo(ascent) / 2 -1] \
[expr $x0 + $len / 2] \
[expr $y0 + $fInfo(ascent) / 2 + $fInfo(descent) +1]
EraseRect rc
MoveTo [expr $x0 - $len / 2] [expr $y0 + $fInfo(ascent) / 2]
RGBForeColor [Color white]
DrawString $SenderKennung
# Weißbalken mit kurzem Schwarzimpuls in die nächste Zeile
RGBForeColor [Color white]
set y0 [YPos 0.6333333333]
set y1 [YPos 0.7]
SetRect rc [XPos 0.1842105263] $y0 [XPos 0.49] $y1
FillRect rc
SetRect rc [XPos 0.51] $y0 [XPos 0.8157894737] $y1
FillRect rc
# Graukeile
set x0 [XPos 0.1842105263]
set x1 [XPos 0.6052631579]
set y0 [YPos 0.7000000000]
set y1 [YPos 0.8333333333]
for {set x $x0} {$x <= $x1} {incr x} {
set color [format %04X [Transform $x $x0 $x1 0 65535]]
RGBForeColor #$color$color$color
MoveTo $x $y0
LineTo $x $y1
}
# RGB-Farbkeil
set x0 [XPos 0.6052631579]
set x1 [XPos 0.8157894737]
set y0 [YPos 0.7000000000]
set y1 [YPos 0.8333333333]
for {set x $x0} {$x <= $x1} {incr x} {
set hue [transform $x $x0 $x1 0 1]
set rgb [hsv2rgb $hue 1.0 0.9]
RGBForeColor $rgb
MoveTo $x $y0
LineTo $x $y1
}
# den inneren Rahmen neu zeichnen
RGBForeColor [Color white]
SetRect rc [XPos 0.1842105263] [YPos 0.1666666667] \
[XPos1 0.8157894737] [YPos1 0.8333333333]
FrameRect rc
# ein Kreis in die Mitte
RGBForeColor [Color white]
set x0 [XPos 0.5]
set y0 [YPos 0.5]
set r [YPos 0.45]
SetRect rc [expr $x0 - $r] [expr $y0 - $r] [expr $x0 + $r] [expr $y0 + $r]
SetPenSize 2
FrameCircle rc
SetPenSize 1
# vier Kreise für die Ecken
SetRect rc [XPos 0.028947368] [YPos 0.036666667] \
[XPos 0.181578947] [YPos 0.230000000]
FrameCircle rc
SetRect rc [XPos 0.818421052] [YPos 0.036666667] \
[XPos 0.971052631] [YPos 0.230000000]
FrameCircle rc
SetRect rc [XPos 0.028947368] [YPos 0.770000000] \
[XPos 0.181578947] [YPos 0.963333333]
FrameCircle rc
SetRect rc [XPos 0.818421052] [YPos 0.770000000] \
[XPos 0.971052631] [YPos 0.963333333]
FrameCircle rc
}
proc DrawCt { v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
# schwarzer Hintergrund
RGBForeColor [Color black]
FillRect prc
# weißer Rahmen
array set rc [array get prc]
RGBForeColor [Color white]
FrameRect rc
# weiße horizontale Linien
set pos 0.0625
for {set idx 0} {$idx < 16} {incr idx} {
set x0 [XPos $pos]
MoveTo $x0 [expr $prc(top) +2]
LineTo $x0 [expr $prc(bottom) -3]
set pos [expr $pos + 0.0625]
}
# weiße vertikale Linien
set pos 0.0833333333
for {set idx 0} {$idx < 16} {incr idx} {
set y0 [YPos $pos]
MoveTo [expr $prc(left) +2] $y0
LineTo [expr $prc(right) -3] $y0
set pos [expr $pos + 0.0833333333]
}
# weiße Balken (n x 24) an die Ränder
set y0 [expr $prc(top) +2]
set y1 [expr $y0 +24]
set y3 [expr $prc(bottom) -2]
set y2 [expr $y3 -24]
set x0 [XPos 0.1250]
set x1 [XPos 0.3125]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
FillRect rc
set x0 [XPos 0.4375]
set x1 [XPos 0.5625]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
FillRect rc
set x0 [XPos 0.6875]
set x1 [XPos 0.8750]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
FillRect rc
set x0 [expr $prc(left) +2]
set x1 [expr $x0 +24]
set x3 [expr $prc(right) -2]
set x2 [expr $x3 - 24]
set y0 [YPos 0.1666666666]
set y1 [YPos 0.4166666666]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x2 $y0 $x3 $y1
FillRect rc
set y0 [YPos 0.5833333333]
set y1 [YPos 0.8333333333]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
SetRect rc $x2 $y0 $x3 $y1
FillRect rc
# einen dicken weißen Balken links
SetRect rc [expr $prc(left) +2 +24 +1] [YPos 0.4166666666] \
[XPos 0.21875] [YPos 0.5833333333]
FillRect rc
# vier kleine weiße Balken innen
set x0 [XPos 0.3125]
set x1 [XPos 0.34375]
set x2 [XPos 0.65625]
set x3 [XPos 0.6875]
set y0 [YPos 0.3333333333]
set y1 [YPos 0.375]
set y2 [YPos 0.625]
set y3 [YPos 0.6666666666]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
# verschiedene Pattern (24 x 24) in die Ecken
PenPattern gray12
set y0 [expr $prc(top) + 2]
set y1 [expr $y0 + 24]
set y3 [expr $prc(bottom) - 2]
set y2 [expr $y3 - 24]
set x0 [expr $prc(left) + 2]
set x1 [expr $x0 + 24]
set x3 [expr $prc(right) - 2]
set x2 [expr $x3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
PenPattern gray25
set x0 [expr $x1]
set x1 [expr $x0 + 24]
set x3 [expr $x2]
set x2 [expr $x3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
PenPattern gray50
set x0 [expr $x1]
set x1 [expr $x0 + 24]
set x3 [expr $x2]
set x2 [expr $x3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
PenPattern gray75
set x0 [expr $prc(left) + 2]
set x1 [expr $x0 + 24]
set x3 [expr $prc(right) - 2]
set x2 [expr $x3 - 24]
set y0 [expr $prc(top) + 2 + 24]
set y1 [expr $y0 + 24]
set y3 [expr $prc(bottom) - 2 - 24]
set y2 [expr $y3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
PenPattern {}
set y0 [expr $y1]
set y1 [expr $y0 + 24]
set y3 [expr $y2]
set y2 [expr $y3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
# farbige (R,G,B) Kästchen in die Ecken der Pattern
RGBForeColor [Color blue]
set x0 [expr $prc(left) + 2 + 25]
set x1 [expr $x0 + 24]
set x3 [expr $prc(right) - 2 - 25]
set x2 [expr $x3 - 24]
set y0 [expr $prc(top) + 2 + 25]
set y1 [expr $y0 + 24]
set y3 [expr $prc(bottom) - 2 - 25]
set y2 [expr $y3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
RGBForeColor [Color green]
set x0 [expr $x1]
set x1 [expr $x0 + 24]
set x3 [expr $x2]
set x2 [expr $x3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
RGBForeColor [Color red]
set x0 [expr $x0 - 24]
set x1 [expr $x1 - 24]
set x2 [expr $x2 + 24]
set x3 [expr $x3 + 24]
set y0 [expr $y1]
set y1 [expr $y0 + 24]
set y3 [expr $y2]
set y2 [expr $y3 - 24]
Draw4Rects $x0 $x1 $x2 $x3 $y0 $y1 $y2 $y3
# mit Pattern die inneren Felder umrahmen
RGBForeColor [Color white]
set x1 [XPos 0.25]
set y0 [YPos 0.25]
set y1 [YPos 0.3333333333]
set pos 0.3125
set pats {gray12 gray25 gray50 gray75 gray12 gray25 gray50 gray75}
for {set idx 0} {$idx < 8} {incr idx} {
# HexPenPat [expr $idx + 6]
PenPattern [lindex $pats $idx]
set x0 $x1
set x1 [XPos $pos]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
set pos [expr $pos + 0.0625]
}
set x0 [XPos 0.25]
set x1 [XPos 0.3125]
set x2 [XPos 0.6875]
set x3 [XPos 0.75]
set y1 [YPos 0.3333333333]
set pos 0.4166666666
set pats {gray12 gray12 gray25 gray25 gray50 gray50 gray75 gray75}
for {set idx 0} {$idx < 8} {incr idx 2} {
# HexPenPat [expr $idx + 14]
PenPattern [lindex $pats $idx]
set y0 $y1
set y1 [YPos $pos]
SetRect rc $x0 $y0 $x1 $y1
FillRect rc
# HexPenPat [expr $idx + 14 +1]
PenPattern [lindex $pats $idx]
SetRect rc $x2 $y0 $x3 $y1
FillRect rc
set pos [expr $pos + 0.0833333333]
}
PenPattern {}
# RGB-Farbkeil
set x0 [XPos 0.25]
set x1 [XPos 0.75]
set y0 [YPos 0.6666666666]
set y1 [YPos 0.75]
for {set x $x0} {$x <= $x1} {incr x} {
set hue [transform $x $x0 $x1 0 0.6666666667]
set rgb [hsv2rgb $hue 1.0 0.9]
RGBForeColor $rgb
MoveTo $x $y0
LineTo $x $y1
}
RGBForeColor [Color white]
# Strahlen, die von der Mitte ausgehen
set x0 [XPos 0.5]
set y0 [YPos 0.5]
set x1 [XPos 0.6875]
ClearPoly3 $x0 $y0 $x1 [YPos 0.416666666] $x1 [YPos 0.583333333]
set pos 0.416666666
while {$pos <= 0.583333333} {
MoveTo $x0 $y0
LineTo $x1 [YPos $pos]
set pos [expr $pos + 0.005555555]
}
set x1 [XPos 0.3125]
ClearPoly3 $x0 $y0 $x1 [YPos 0.416666666] $x1 [YPos 0.583333333]
set pos 0.416666666
while {$pos <= 0.583333333} {
MoveTo $x0 $y0
LineTo $x1 [YPos $pos]
set pos [expr $pos + 0.005555555]
}
set y1 [YPos 0.333333333]
ClearPoly3 $x0 $y0 [XPos 0.4375] $y1 [XPos 0.5625] $y1
set pos 0.4375
while {$pos <= 0.5625} {
MoveTo $x0 $y0
LineTo [XPos $pos] $y1
set pos [expr $pos + 0.004166666]
}
set y1 [YPos 0.666666666]
ClearPoly3 $x0 $y0 [XPos 0.4375] $y1 [XPos 0.5625] $y1
set pos 0.4375
while {$pos <= 0.5625} {
MoveTo $x0 $y0
LineTo [XPos $pos] $y1
set pos [expr $pos + 0.004166666]
}
# zwei Kreise in die Mitte
SetRect rc [XPos1 0.1875] [YPos1 0.0833333333] \
[XPos 0.8125] [YPos 0.9166666666]
FrameCircle rc
SetRect rc [XPos1 0.4375] [YPos1 0.4166666666] \
[XPos 0.5625] [YPos 0.5833333333]
FrameCircle rc
# einen Kreis in die jede Ecke
SetRect rc [XPos1 0.0625] [YPos1 0.0833333333] \
[XPos 0.1875] [YPos 0.2500000000]
FrameCircle rc
SetRect rc [XPos1 0.0625] [YPos1 0.7500000000] \
[XPos 0.1875] [YPos 0.9166666666]
FrameCircle rc
SetRect rc [XPos1 0.8125] [YPos1 0.0833333333] \
[XPos 0.9375] [YPos 0.2500000000]
FrameCircle rc
SetRect rc [XPos1 0.8125] [YPos1 0.7500000000] \
[XPos 0.9375] [YPos 0.9166666666]
FrameCircle rc
# farbige Kästchen in die Mitte
set y0 [YPos 0.3333333333]
set y1 [YPos 0.375]
set y2 [YPos 0.625]
set y3 [YPos 0.6666666666]
set x0 [XPos 0.375]
set x1 [XPos 0.4375]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color blue]
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
RGBForeColor [Color cyan]
FillRect rc
set x0 $x1
set x1 [XPos 0.5]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color green]
FillRect rc
set x0 $x1
set x1 [XPos 0.5625]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color red]
FillRect rc
set x0 $x1
set x1 [XPos 0.625]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color yellow]
FillRect rc
SetRect rc $x0 $y2 $x1 $y3
RGBForeColor [Color magenta]
FillRect rc
}
proc DrawPattern { v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color white]
RGBForeColor [Color black]
EraseRect prc
# 2 Pattern (links und rechts)
array set rc [array get prc]
set rc(right) [XPos 0.5]
PenPattern gray25
FillRect rc
array set rc [array get prc]
set rc(left) [XPos 0.5]
PenPattern gray75
FillRect rc
PenPattern {}
}
proc DrawTestText { v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color white]
RGBForeColor [Color black]
EraseRect prc
# Text
RGBForeColor [Color black]
set testText [concat "Das ist ein Test-Text zur Bestimmung von " \
"Konvergenzfehlern mittels kleiner Schrift. "]
TextFont {Courier 8}
set l [StringWidth "D"]
set len [StringWidth $testText]
GetFontInfo fInfo
set x0 [expr $prc(left) - $l / 2]
set y0 [expr $prc(top) + $fInfo(ascent) / 2]
set h [expr $fInfo(ascent) + $fInfo(descent)]
while {$y0 < [expr $prc(bottom) + $h]} {
for {set x1 $x0} {$x1 < $prc(right)} {incr x1 $len} {
MoveTo $x1 $y0
DrawString $testText
}
incr x0 -$l
incr y0 $h
}
}
proc Draw100Pixel { v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
# schwarzer Hintergrund
RGBForeColor [Color black]
FillRect prc
# weißer Rahmen
array set rc [array get prc]
RGBForeColor [Color white]
FrameRect rc
parray rc
RGBForeColor [Color white_25]
# dunkelgraue horizontale Linien alle 10 Pixel
for {set x 10} {$x < $rc(right)} {incr x 10} {
MoveTo $x [expr $prc(top) +2]
LineTo $x [expr $prc(bottom) -3]
}
# dunkelgraue vertikale Linien alle 10 Pixel
for {set y 10} {$y < $rc(bottom)} {incr y 10} {
MoveTo [expr $prc(left) +2] $y
LineTo [expr $prc(right) -3] $y
}
RGBForeColor [Color white_50]
# graue horizontale Linien alle 50+100 Pixel
for {set x 50} {$x < $rc(right)} {incr x 100} {
MoveTo $x [expr $prc(top) +2]
LineTo $x [expr $prc(bottom) -3]
}
# graue vertikale Linien alle 50+100 Pixel
for {set y 50} {$y < $rc(bottom)} {incr y 100} {
MoveTo [expr $prc(left) +2] $y
LineTo [expr $prc(right) -3] $y
}
RGBForeColor [Color white]
# weiße horizontale Linien alle 100 Pixel
for {set x 100} {$x < $rc(right)} {incr x 100} {
MoveTo $x [expr $prc(top) +2]
LineTo $x [expr $prc(bottom) -3]
}
# weiße vertikale Linien alle 100 Pixel
for {set y 100} {$y < $rc(bottom)} {incr y 100} {
MoveTo [expr $prc(left) +2] $y
LineTo [expr $prc(right) -3] $y
}
TextFont "Courier 18 bold"
set xm [XPos 0.5]
set ym [YPos 0.5]
MoveTo $xm $ym
set txt "$rc(right) x $rc(bottom) Pixel"
set l [StringWidth $txt]
SetRect crc [expr {$xm - $l / 2 - 25}] [expr {$ym - 25}] \
[expr {$xm + $l / 2 + 25}] [expr {$ym + 25}]
EraseRect crc
DrawString $txt center
}
proc DrawUniColor { v_prc color } {
upvar $v_prc prc
RGBForeColor [Color $color]
FillRect prc
}
proc Draw { which } {
global cv cvrc
set cursor [$cv cget -cursor]
$cv configure -cursor watch
update
foreach item [winfo children $cv] { destroy $item }
switch $which {
Weiß { DrawUniColor cvrc white }
Schwarz { DrawUniColor cvrc black }
Rot { DrawUniColor cvrc red }
Grün { DrawUniColor cvrc green }
Blau { DrawUniColor cvrc blue }
Cyan { DrawUniColor cvrc cyan }
Magenta { DrawUniColor cvrc magenta }
Gelb { DrawUniColor cvrc yellow }
Balken { DrawBalken cvrc }
FuBK { DrawFuBK cvrc }
ct { DrawCt cvrc }
Pattern { DrawPattern cvrc }
100Pixel { Draw100Pixel cvrc }
Text { DrawTestText cvrc }
}
$cv configure -cursor $cursor
}
proc Testbild {} {
global cv cvrc tcl_platform
set win .testbild
toplevel $win -bg black -bd 0
wm withdraw $win
bind $win <Key-Escape> "exit 0"
wm overrideredirect $win 1
set dy [winfo screenheight .]
set dx [winfo screenwidth .]
wm geometry $win ${dx}x${dy}+0+0
set cv $win.cv
pack [canvas $cv -bd 0 -bg black] -expand 1 -fill both -padx 0 -pady 0
wm deiconify $win
focus -force $win
menu .popup -tearoff 0
.popup add command -label "Weiß" -command "Draw Weiß"
.popup add command -label "Schwarz" -command "Draw Schwarz"
.popup add command -label "Rot" -command "Draw Rot"
.popup add command -label "Grün" -command "Draw Grün"
.popup add command -label "Blau" -command "Draw Blau"
.popup add command -label "Cyan" -command "Draw Cyan"
.popup add command -label "Magenta" -command "Draw Magenta"
.popup add command -label "Gelb" -command "Draw Gelb"
.popup add separator
.popup add command -label "Farb-Balken" -command "Draw Balken"
.popup add command -label "FuBK (ARD)" -command "Draw FuBK"
.popup add command -label "c't" -command "Draw ct"
.popup add command -label "Pattern" -command "Draw Pattern"
.popup add command -label "Test-Text" -command "Draw Text"
.popup add command -label "100 Pixel" -command "Draw 100Pixel"
.popup add separator
.popup add command -label "Beenden" -command "exit 0"
foreach btn {1 2 3} { bind $cv <Button-$btn> "tk_popup .popup %X %Y" }
if {$tcl_platform(platform) == "windows"} {
bind all <Control-Alt-c> { console show }
}
SetRect cvrc 0 0 $dx $dy
Draw FuBK
}
Testbild