PO 2017/07/30
This is a modified version of the
Test-Picture Generator. Instead of displaying the test-picture on the screen, it is saved into an image file.
namespace eval tig {
namespace ensemble create
namespace export Draw
variable Pattern {}
variable ForeColor white
variable BackColor black
variable PenSize 1
variable Font {Courier 12}
variable DrawPos
set DrawPos(x) 0
set DrawPos(y) 0
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
variable 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 } {
variable Font
return [font measure $Font $str]
}
proc TextFont { which } {
variable Font
set Font $which
}
proc DrawString { canvasId str {anchor w} } {
variable DrawPos
variable Font
variable ForeColor
$canvasId create text $DrawPos(x) $DrawPos(y) -font $Font -fill $ForeColor \
-anchor $anchor -text $str
}
proc SetPenSize { width } {
variable PenSize
set PenSize $width
}
proc FillRect { canvasId v_rc } {
upvar $v_rc rc
variable Pattern
variable ForeColor
if {$Pattern != {}} {
$canvasId create rect $rc(left) $rc(top) $rc(right) $rc(bottom) \
-fill $ForeColor -stipple $Pattern -width 0
} else {
$canvasId create rect $rc(left) $rc(top) $rc(right) $rc(bottom) \
-fill $ForeColor -width 0
}
}
proc ClearPoly3 { canvasId x0 y0 x1 y1 x2 y2 } {
variable BackColor
$canvasId create poly $x0 $y0 $x1 $y1 $x2 $y2 -fill $BackColor -width 0
}
proc FrameRect { canvasId v_rc } {
upvar $v_rc rc
MoveTo $rc(left) $rc(top)
LineTo $canvasId $rc(right) $rc(top)
LineTo $canvasId $rc(right) $rc(bottom)
LineTo $canvasId $rc(left) $rc(bottom)
LineTo $canvasId $rc(left) $rc(top)
}
proc EraseRect { canvasId v_rc } {
upvar $v_rc rc
variable Pattern
variable BackColor
$canvasId create rect $rc(left) $rc(top) $rc(right) $rc(bottom) -fill $BackColor
}
proc FrameCircle { canvasId v_rc } {
upvar $v_rc rc
variable Pattern
variable ForeColor
variable PenSize
$canvasId create oval $rc(left) $rc(top) $rc(right) $rc(bottom) \
-outline $ForeColor -width $PenSize
}
proc MoveTo { x0 y0 } {
variable DrawPos
set DrawPos(x) $x0
set DrawPos(y) $y0
}
proc LineTo { canvasId x1 y1 } {
variable DrawPos
variable ForeColor
variable PenSize
$canvasId create line $DrawPos(x) $DrawPos(y) $x1 $y1 \
-fill $ForeColor -width $PenSize
set DrawPos(x) $x1
set DrawPos(y) $y1
}
proc RGBForeColor { color } {
variable ForeColor
set ForeColor $color
}
proc RGBBackColor { color } {
variable BackColor
set BackColor $color
}
proc PenPattern { id } {
variable 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 { canvasId x0 x1 x2 x3 y0 y1 y2 y3 } {
SetRect rc $x0 $y0 $x1 $y1
FillRect $canvasId rc
SetRect rc $x2 $y0 $x3 $y1
FillRect $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
FillRect $canvasId rc
SetRect rc $x2 $y2 $x3 $y3
FillRect $canvasId rc
}
proc DrawBalken { canvasId 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 $canvasId rc
set pos [expr $pos + 0.125]
}
}
proc DrawFuBK { canvasId v_prc { testText "" } } {
upvar $v_prc prc
if { $testText eq "" } {
set testText "Farb-Testbild Generator - J.Mehring 1.2"
}
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
RGBForeColor [Color black]
FillRect $canvasId 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 $canvasId $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 $canvasId $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 $canvasId 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 $canvasId 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 $canvasId 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 $canvasId rc
RGBForeColor [Color white]
SetRect rc [XPos 0.1842105263] [YPos 0.5] \
[XPos 0.2894736842] [YPos 0.5666666667]
FillRect $canvasId rc
SetRect rc [XPos 0.7105263158] [YPos 0.5] \
[XPos 0.8157894737] [YPos 0.5666666667]
FillRect $canvasId 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 $canvasId rc
SetRect rc [XPos 0.2631578947] $y0 [XPos 0.3815789474] $y1
PenPattern gray12
FillRect $canvasId rc
SetRect rc [XPos 0.3815789474] $y0 [XPos 0.5000000000] $y1
PenPattern gray25
FillRect $canvasId rc
SetRect rc [XPos 0.5000000000] $y0 [XPos 0.6184210530] $y1
PenPattern gray50
FillRect $canvasId rc
SetRect rc [XPos 0.6184210530] $y0 [XPos 0.7631578947] $y1
PenPattern gray75
FillRect $canvasId rc
PenPattern {}
RGBForeColor [Color white_50]
SetRect rc [XPos 0.7631578947] $y0 [XPos 0.8157894737] $y1
FillRect $canvasId 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 $canvasId $x0 $y1
set y0 [YPos 0.5]
set x0 [XPos 0.1842105263]
set x1 [XPos 0.8157894737]
MoveTo $x0 $y0
LineTo $canvasId $x1 $y0
SetPenSize 1
# den Text der "Senderkennung" anzeigen
set len [XPos 0.3684210526]
TextFont "Courier 24 bold"
if {[StringWidth $testText] > $len} { TextFont "Courier 18 bold" }
if {[StringWidth $testText] > $len} { TextFont "Courier 14 bold" }
if {[StringWidth $testText] > $len} { TextFont "Courier 12 bold" }
if {[StringWidth $testText] > $len} { TextFont "Courier 10 bold" }
if {[StringWidth $testText] > $len} { TextFont "Courier 8 bold" }
set x0 [XPos 0.5]
set y0 [YPos 0.5333333333]
GetFontInfo fInfo
set len [StringWidth $testText]
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 $canvasId rc
MoveTo [expr $x0 - $len / 2] [expr $y0 + $fInfo(ascent) / 2]
RGBForeColor [Color white]
DrawString $canvasId $testText
# 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 $canvasId rc
SetRect rc [XPos 0.51] $y0 [XPos 0.8157894737] $y1
FillRect $canvasId 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 $canvasId $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 $canvasId $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 $canvasId 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 $canvasId rc
SetPenSize 1
# vier Kreise für die Ecken
SetRect rc [XPos 0.028947368] [YPos 0.036666667] \
[XPos 0.181578947] [YPos 0.230000000]
FrameCircle $canvasId rc
SetRect rc [XPos 0.818421052] [YPos 0.036666667] \
[XPos 0.971052631] [YPos 0.230000000]
FrameCircle $canvasId rc
SetRect rc [XPos 0.028947368] [YPos 0.770000000] \
[XPos 0.181578947] [YPos 0.963333333]
FrameCircle $canvasId rc
SetRect rc [XPos 0.818421052] [YPos 0.770000000] \
[XPos 0.971052631] [YPos 0.963333333]
FrameCircle $canvasId rc
}
proc DrawCt { canvasId v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
# schwarzer Hintergrund
RGBForeColor [Color black]
FillRect $canvasId prc
# weißer Rahmen
array set rc [array get prc]
RGBForeColor [Color white]
FrameRect $canvasId 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 $canvasId $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 $canvasId [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 $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
FillRect $canvasId rc
set x0 [XPos 0.4375]
set x1 [XPos 0.5625]
SetRect rc $x0 $y0 $x1 $y1
FillRect $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
FillRect $canvasId rc
set x0 [XPos 0.6875]
set x1 [XPos 0.8750]
SetRect rc $x0 $y0 $x1 $y1
FillRect $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
FillRect $canvasId 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 $canvasId rc
SetRect rc $x2 $y0 $x3 $y1
FillRect $canvasId rc
set y0 [YPos 0.5833333333]
set y1 [YPos 0.8333333333]
SetRect rc $x0 $y0 $x1 $y1
FillRect $canvasId rc
SetRect rc $x2 $y0 $x3 $y1
FillRect $canvasId 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 $canvasId 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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId $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 $canvasId 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 $canvasId rc
# HexPenPat [expr $idx + 14 +1]
PenPattern [lindex $pats $idx]
SetRect rc $x2 $y0 $x3 $y1
FillRect $canvasId 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 $canvasId $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 $canvasId $x0 $y0 $x1 [YPos 0.416666666] $x1 [YPos 0.583333333]
set pos 0.416666666
while {$pos <= 0.583333333} {
MoveTo $x0 $y0
LineTo $canvasId $x1 [YPos $pos]
set pos [expr $pos + 0.005555555]
}
set x1 [XPos 0.3125]
ClearPoly3 $canvasId $x0 $y0 $x1 [YPos 0.416666666] $x1 [YPos 0.583333333]
set pos 0.416666666
while {$pos <= 0.583333333} {
MoveTo $x0 $y0
LineTo $canvasId $x1 [YPos $pos]
set pos [expr $pos + 0.005555555]
}
set y1 [YPos 0.333333333]
ClearPoly3 $canvasId $x0 $y0 [XPos 0.4375] $y1 [XPos 0.5625] $y1
set pos 0.4375
while {$pos <= 0.5625} {
MoveTo $x0 $y0
LineTo $canvasId [XPos $pos] $y1
set pos [expr $pos + 0.004166666]
}
set y1 [YPos 0.666666666]
ClearPoly3 $canvasId $x0 $y0 [XPos 0.4375] $y1 [XPos 0.5625] $y1
set pos 0.4375
while {$pos <= 0.5625} {
MoveTo $x0 $y0
LineTo $canvasId [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 $canvasId rc
SetRect rc [XPos1 0.4375] [YPos1 0.4166666666] \
[XPos 0.5625] [YPos 0.5833333333]
FrameCircle $canvasId rc
# einen Kreis in die jede Ecke
SetRect rc [XPos1 0.0625] [YPos1 0.0833333333] \
[XPos 0.1875] [YPos 0.2500000000]
FrameCircle $canvasId rc
SetRect rc [XPos1 0.0625] [YPos1 0.7500000000] \
[XPos 0.1875] [YPos 0.9166666666]
FrameCircle $canvasId rc
SetRect rc [XPos1 0.8125] [YPos1 0.0833333333] \
[XPos 0.9375] [YPos 0.2500000000]
FrameCircle $canvasId rc
SetRect rc [XPos1 0.8125] [YPos1 0.7500000000] \
[XPos 0.9375] [YPos 0.9166666666]
FrameCircle $canvasId 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 $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
RGBForeColor [Color cyan]
FillRect $canvasId rc
set x0 $x1
set x1 [XPos 0.5]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color green]
FillRect $canvasId rc
set x0 $x1
set x1 [XPos 0.5625]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color red]
FillRect $canvasId rc
set x0 $x1
set x1 [XPos 0.625]
SetRect rc $x0 $y0 $x1 $y1
RGBForeColor [Color yellow]
FillRect $canvasId rc
SetRect rc $x0 $y2 $x1 $y3
RGBForeColor [Color magenta]
FillRect $canvasId rc
}
proc DrawPattern { canvasId v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color white]
RGBForeColor [Color black]
EraseRect $canvasId prc
# 2 Pattern (links und rechts)
array set rc [array get prc]
set rc(right) [XPos 0.5]
PenPattern gray25
FillRect $canvasId rc
array set rc [array get prc]
set rc(left) [XPos 0.5]
PenPattern gray75
FillRect $canvasId rc
PenPattern {}
}
proc DrawTestText { canvasId v_prc { testText "" } } {
upvar $v_prc prc
if { $testText eq "" } {
set testText "Das ist ein Test-Text zur Bestimmung von Konvergenzfehlern mittels kleiner Schrift. "
}
# Hintergrundfarbe schwarz
RGBBackColor [Color white]
RGBForeColor [Color black]
EraseRect $canvasId prc
# Text
RGBForeColor [Color black]
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 $canvasId $testText
}
incr x0 -$l
incr y0 $h
}
}
proc Draw100Pixel { canvasId v_prc } {
upvar $v_prc prc
# Hintergrundfarbe schwarz
RGBBackColor [Color black]
# schwarzer Hintergrund
RGBForeColor [Color black]
FillRect $canvasId prc
# weißer Rahmen
array set rc [array get prc]
RGBForeColor [Color white]
FrameRect $canvasId 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 $canvasId $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 $canvasId [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 $canvasId $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 $canvasId [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 $canvasId $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 $canvasId [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 $canvasId crc
DrawString $canvasId $txt center
}
proc DrawUniColor { canvasId v_prc color } {
upvar $v_prc prc
RGBForeColor [Color $color]
FillRect $canvasId prc
}
proc Draw { which { xsize -1 } { ysize -1 } { testText "" } } {
variable cvrc
if { $xsize < 0 } {
set xsize [winfo screenwidth .]
}
if { $ysize < 0 } {
set ysize [winfo screenheight .]
}
set win .tig
toplevel $win -bg black -bd 0
ttk::frame $win.fr
pack $win.fr -expand 1 -fill both
set canvasId [CreateScrolledCanvas $win.fr -bd 0 -bg black -highlightthickness 0]
$canvasId configure -width 512 -height 512
$canvasId configure -scrollregion "0 0 $xsize $ysize"
tig::SetRect tig::cvrc 0 0 $xsize $ysize
switch $which {
white { DrawUniColor $canvasId cvrc white }
black { DrawUniColor $canvasId cvrc black }
red { DrawUniColor $canvasId cvrc red }
green { DrawUniColor $canvasId cvrc green }
blue { DrawUniColor $canvasId cvrc blue }
cyan { DrawUniColor $canvasId cvrc cyan }
magenta { DrawUniColor $canvasId cvrc magenta }
yellow { DrawUniColor $canvasId cvrc yellow }
colorbar { DrawBalken $canvasId cvrc }
fubk { DrawFuBK $canvasId cvrc $testText }
ct { DrawCt $canvasId cvrc }
pattern { DrawPattern $canvasId cvrc }
100 { Draw100Pixel $canvasId cvrc }
text { DrawTestText $canvasId cvrc $testText }
}
update
raise $win
after 1000
set phImg [Canvas2Img $canvasId]
destroy $win
return $phImg
}
proc CreateScrolledWidget { wType w args } {
if { [winfo exists $w.par] } {
destroy $w.par
}
ttk::frame $w.par
pack $w.par -side top -fill both -expand 1
$wType $w.par.widget \
-xscrollcommand "$w.par.xscroll set" \
-yscrollcommand "$w.par.yscroll set" {*}$args
ttk::scrollbar $w.par.xscroll -command "$w.par.widget xview" -orient horizontal
ttk::scrollbar $w.par.yscroll -command "$w.par.widget yview" -orient vertical
set rowNo 0
grid $w.par.widget $w.par.yscroll -sticky news
grid $w.par.xscroll -sticky ew
grid rowconfigure $w.par $rowNo -weight 1
grid columnconfigure $w.par 0 -weight 1
return $w.par.widget
}
proc CreateScrolledCanvas { w args } {
return [CreateScrolledWidget canvas $w {*}$args]
}
proc Canvas2Img { canvasId } {
set region [$canvasId cget -scrollregion]
set xsize [lindex $region 2]
set ysize [lindex $region 3]
set img [image create photo -width $xsize -height $ysize]
$canvasId xview moveto 0
$canvasId yview moveto 0
update
set xr 0.0
set yr 0.0
set px 0
set py 0
while { $xr < 1.0 } {
while { $yr < 1.0 } {
set tmpImg [image create photo -format window -data $canvasId]
$img copy $tmpImg -to $px $py
image delete $tmpImg
set yr [lindex [$canvasId yview] 1]
$canvasId yview moveto $yr
set py [expr round ($ysize * [lindex [$canvasId yview] 0])]
update
}
$canvasId yview moveto 0
set yr 0.0
set py 0
set xr [lindex [$canvasId xview] 1]
$canvasId xview moveto $xr
set px [expr round ($xsize * [lindex [$canvasId xview] 0])]
update
}
return $img
}
}
if { [file tail [info script]] eq [file tail $::argv0] } {
package require Tk
package require Img
proc PrintUsage { progName } {
global gOpt
puts "$progName: Generate test image"
puts "Options:"
puts "--help: Print this usage message"
puts "--x : Horizontal size of test image. Default: Screen resolution."
puts "--y : Vertical size of test image. Default: Screen resolution."
puts "--out : Name of test image file. Default: $gOpt(file)."
puts "--type: Type of test image. Default: $gOpt(type)."
puts " Possible values: black white red green blue cyan magenta yellow"
puts " colorbar fubk ct pattern 100 text"
puts "--text: Name of test string for types text and fubk. Default: Builtin."
exit 1
}
set gOpt(xsize) -1
set gOpt(ysize) -1
set gOpt(type) "colorbar"
set gOpt(file) "out.png"
set gOpt(text) ""
set curArg 0
while { $curArg < $argc } {
set curParam [lindex $argv $curArg]
if { [string compare -length 1 $curParam "-"] == 0 || \
[string compare -length 2 $curParam "--"] == 0 } {
set curOpt [string tolower [string trimleft $curParam "-"]]
if { $curOpt eq "help" } {
PrintUsage $argv0
} elseif { $curOpt eq "x" } {
incr curArg
set gOpt(xsize) [lindex $argv $curArg]
} elseif { $curOpt eq "y" } {
incr curArg
set gOpt(ysize) [lindex $argv $curArg]
} elseif { $curOpt eq "type" } {
incr curArg
set gOpt(type) [lindex $argv $curArg]
} elseif { $curOpt eq "text" } {
incr curArg
set gOpt(text) [lindex $argv $curArg]
} elseif { $curOpt eq "out" } {
incr curArg
set gOpt(file) [lindex $argv $curArg]
} else {
PrintUsage $argv0
}
incr curArg
}
}
if { $gOpt(xsize) < 0 && $gOpt(ysize) < 0 } {
puts "Drawing test image $gOpt(type) with screen resolution"
} else {
puts "Drawing test image $gOpt(type) with size $gOpt(xsize) x $gOpt(ysize)"
}
set phImg [tig Draw $gOpt(type) $gOpt(xsize) $gOpt(ysize) $gOpt(text)]
puts "Saving image as $gOpt(file)"
$phImg write $gOpt(file)
exit 0
} else {
package provide tig 1.2
}