X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Fyppsc-ocr-resolver;h=2ba7c01655246745e45679d8d4f59e883318eddb;hp=ec4473d2205ed19f7c114ad81775701490266916;hb=554e97659330463f4dc7e26c8a63537fc53fed1e;hpb=b4e128efc860c4416fe913abe97b190404e866dd diff --git a/pctb/yppsc-ocr-resolver b/pctb/yppsc-ocr-resolver index ec4473d..2ba7c01 100755 --- a/pctb/yppsc-ocr-resolver +++ b/pctb/yppsc-ocr-resolver @@ -82,8 +82,12 @@ static unsigned char csr_bits[] = { frame .d.mi.csr_0 -bg white -width 1 frame .d.mi.csr_1 -bg white -width 1 + frame .d.pe + frame .d.pe.grid + button .d.pe.ok -text OK + pack .d.pe.grid .d.pe.ok -side left - pack .d.csr .d.mi .d.got .d.ctx -side top + pack .d.mi .d.ctx -side top pack .d frame .help @@ -101,26 +105,15 @@ proc show_context {maxhv x ctxs} { if {$wh > $maxh} { set maxh $wh } } -proc resize_widgets {} { +proc resize_widgets_core {} { global mulcols mulrows csrh gotsh ctxh glyphsdone global unk_l unk_contexts foreach w {.d.csr .d.got .d.ctx} { $w configure -width $mulcols } - #.d configure -height [expr {$csrh+$mulrows+$gotsh+$ctxh}] - foreach w {0 1} { - .d.mi.csr_$w configure -height $mulrows - } eval destroy [winfo children .d.ctx] - - set maxh 0 - foreach {min max contexts got} $glyphsdone { - show_context maxh $min $contexts - } - show_context maxh $unk_l $unk_contexts - .d.ctx configure -height $maxh } @@ -260,7 +253,6 @@ proc startup_cursor {} { set cur_0 $unk_l set cur_1 [expr {$unk_r+1}] - set last_ht {} recursor } @@ -268,6 +260,8 @@ proc startup_cursor {} { #---------- runtime display and keystroke handling ---------- +set last_ht {} + proc helptext {t} { global last_ht if {![string compare $t $last_ht]} return @@ -402,63 +396,49 @@ proc recursor {} { recursor/$cur_mode } - -#---------- database read and write ---------- - -# OUT OF DATE -# database format: -# series of glyphs: -# ... -# width -# - -# $database($context 0x 0x...) = $hex - -set database_header {# ypp-sc-tools pctb font v1} +#---------- database read and write common wrapper ---------- proc db_getsl {f} { if {[gets $f l] < 0} { error "unexpected db eof" } return $l } - -proc read_database {} { - global database database_header rows database_fn + +proc read_database {fn} { + global reqkind database database_fn + upvar #0 database_magic/$reqkind magic catch { unset database } - set database_fn ./charset-$rows.txt + + set database_fn $fn if {![file exists $database_fn]} return set f [open $database_fn r] - if {[string compare [db_getsl $f] $database_header]} { error "$l ?" } - if {([db_getsl $f])+0 != $rows} { error "wrong h ?" } + if {[string compare [db_getsl $f] $magic]} { error "$l $reqkind ?" } + + read_database_header/$reqkind $f while 1 { - set context [db_getsl $f] - if {![string length $context]} continue - if {[regexp {^\#} $context]} continue - if {![string compare . $context]} break - - set bm $context - set strq [db_getsl $f] - while 1 { - set l [db_getsl $f] - if {![string length $l]} break - lappend bm [format %x 0x$l] - } - set database($bm) $strq + set l1 [db_getsl $f] + + if {![string length $l1]} continue + if {[regexp {^\#} $l1]} continue + if {![string compare . $l1]} break + + read_database_entry/$reqkind $f $l1 } close $f } proc write_database {} { - global database rows database_fn database_header + global reqkind database_fn database + upvar #0 database_magic/$reqkind magic + + set f [open $database_fn.new w] + puts $f $magic + + write_database_header/$reqkind $f + set ol {} foreach bm [array names database] { - set strq $database($bm) - set o "[lindex $bm 0]\n$strq\n" - foreach x [lrange $bm 1 end] { append o "$x\n" } - - lappend ol $o + append ol [format_database_entry/$reqkind $bm $database($bm)] } - set f [open $database_fn.new w] - puts $f "$database_header\n$rows\n" foreach o [lsort $ol] { puts $f $o } @@ -467,6 +447,71 @@ proc write_database {} { file rename -force $database_fn.new $database_fn } +#---------- pixmap database read and write ---------- + +set database_magic/pixmap {# ypp-sc-tools pctb pixmaps v1} + +proc read_database_header/pixmap {f} { } +proc read_database_entry/pixmap {f def} { + global database + + set im "" + + set p3 [db_getsl $f]; append im $p3 "\n" + if {[string compare $p3 P3]} { error "$p3 ?" } + + set wh [db_getsl $f]; append im $wh "\n"; manyset $wh w h + set depth [db_getsl $f]; append im $depth "\n" + + for {set y 0} {$y < $h} {incr y} { + set line [db_getsl $f]; append im $line "\n" + } + set database($im) $def +} +proc write_database_header/pixmap {f} { } +proc format_database_entry/pixmap {im def} { + return "$im\n$def" +} + +#---------- character database read and write ---------- + +# OUT OF DATE +# database format: +# series of glyphs: +# ... +# width +# + +# $database($context 0x 0x...) = $hex + +set database_magic/char {# ypp-sc-tools pctb font v1} + +proc read_database_header/char {f} { + global rows + if {([db_getsl $f])+0 != $rows} { error "wrong h ?" } +} +proc read_database_entry/char {f context} { + global database + set bm $context + set strq [db_getsl $f] + while 1 { + set l [db_getsl $f] + if {![string length $l]} break + lappend bm [format %x 0x$l] + } + set database($bm) $strq +} + +proc write_database_header/char {f} { + puts $f "$rows\n" +} +proc format_database_entry/char {bm strq} { + global database rows + set o "[lindex $bm 0]\n$strq\n" + foreach x [lrange $bm 1 end] { append o "$x\n" } + return $o +} + proc dbkey {ctx l r} { global wordmap set bm $ctx @@ -520,66 +565,152 @@ proc RETURN_RESULT {how what} { done/$mainkind } -#---------- main progrm ---------- +#---------- main program ---------- proc main/default {} { puts stderr "Do not run this program directly." exit 12 - - global glyphsdone unk_l unk_r unk_contexts - - set glyphsdone { - 7 11 1 M - 13 17 0 a - 19 23 0 n - } - set unk_l 25 - set unk_r 29 - set unk_contexts Test - - set f [open text.xpm] - read_xpm $f - close $f - - read_database - resize_widgets - draw_glyphsdone - startup_cursor } proc done/default {} { } proc required {} { - global glyphsdone unk_l unk_r unk_contexts + global reqkind + + fileevent stdin readable {} + fconfigure stdin -blocking yes - if {[gets stdin l]<0} { + if {[gets stdin reqkind]<0} { if {[eof stdin]} { fconfigure stdin -blocking yes; exit 0 } return } init_widgets - required/$l + required/$reqkind +} + + +proc foreach_pixmap_col {var body} { + global alloptions + upvar 1 $var col + for {set col 0} {$col < [llength $alloptions]/3} {incr col} { + uplevel 1 $body + } +} + +proc pixmap_select {ncol} { + global alloptions + debug "PIX SELECT $ncol [llength $alloptions]" + foreach_pixmap_col col { + if {$col==$ncol} continue + .d.pe.grid.l$col selection clear 0 end + } + pixmap_maybe_ok +} +proc pixmap_maybe_ok {} { + global alloptions pixmap_selcol pixmap_selrow + set nsel 0 + foreach_pixmap_col col { + set cs [.d.pe.grid.l$col curselection] + incr nsel [llength $cs] + set pixmap_selcol $col + set pixmap_selrow [lindex $cs 0] + } + if {$nsel==1} { + .d.pe.ok configure -state normal -command pixmap_ok + } else { + .d.pe.ok configure -state disabled -command {} + } +} +proc pixmap_ok {} { + global database ppm pixmap_selcol pixmap_selrow mainkind alloptions + foreach_pixmap_col col { + .d.pe.grid.l$col configure -state disabled + } + .d.pe.ok configure -state disabled + helptext {{{ Processing }}} + manyset [lrange $alloptions [expr {$pixmap_selcol*3}] end] \ + colname coldesc rows + manyset [lrange $rows [expr {$pixmap_selrow*2}] end] \ + rowname rowdesc + set database($ppm) "$colname - $coldesc" + write_database + done/$mainkind } proc required/pixmap {} { - global unk_what + global unk_what ppm mulcols alloptions must_gets stdin unk_what - error nyi + debug "GOT pixmap $unk_what" + set ppm {} + while 1 { + must_gets stdin ppml + if {![string length $ppml]} break + append ppm $ppml "\n" + } + set data [exec pnmscale 2 << $ppm] + image create photo image/main -data $data + + set alloptions [exec ./yppsc-resolver-pixoptions $unk_what] + + read_database ./pixmaps.txt + + set mulcols [image width image/main] + set mulrows [image height image/main] + resize_widgets_core + place forget .d.mi.csr_0 + place forget .d.mi.csr_1 + + pack forget .d.csr .d.got + pack .d.pe -side top -before .d.mi -pady 10 + + eval destroy [winfo children .d.pe.grid] + set col 0; foreach {colname coldesc rows} $alloptions { + debug "INIT $col $colname \"$coldesc\"" + label .d.pe.grid.t$col -text $colname + listbox .d.pe.grid.l$col + foreach {rowname rowdesc} $rows { + debug "INIT $col $colname \"$coldesc\" $rowname \"$rowdesc\"" + .d.pe.grid.l$col insert end $rowdesc + } + bind .d.pe.grid.l$col <> [list pixmap_select $col] + grid .d.pe.grid.t$col -column $col -row 0 + grid .d.pe.grid.l$col -column $col -row 1 + incr col + } + pixmap_maybe_ok + + helptext { + {{Indicate the correct parse of this image, and click OK.}} + } } proc required/char {} { + global mulrows glyphsdone unk_l unk_r unk_contexts rows + must_gets stdin l manyset [lrange $l 0 3] unk_l unk_r unk_contexts set glyphsdone [lrange $l 3 end] debug "GOT $l" - fileevent stdin readable {} - fconfigure stdin -blocking yes - read_xpm stdin - resize_widgets - read_database + + resize_widgets_core + foreach w {0 1} { + .d.mi.csr_$w configure -height $mulrows + } + set maxh 0 + foreach {min max contexts got} $glyphsdone { + show_context maxh $min $contexts + } + show_context maxh $unk_l $unk_contexts + .d.ctx configure -height $maxh + pack forget .d.pe + pack .d.csr -side top -before .d.mi + pack .d.got .d.ctx -side top -after .d.mi + + read_database ./charset-$rows.txt draw_glyphsdone startup_cursor }