#!/bin/env tclsh
proc char2n {char} {
binary scan $char c n
expr {($n&0x7F)-0x3F}
}
proc chars2bytes {sixels} {
foreach sixel $sixels { lappend nums [char2n $sixel] }
for {set i 0} {$i < 6} {incr i} {
set s ""
foreach n $nums {
append s [expr {($n>>$i)&1}]
}
append s [string repeat "0" [expr {7 - (([string length $s] + 7) % 8)}]]
binary scan [binary format b* $s] c* bytes
foreach byte $bytes {
lappend ret [format "%02x" [expr {$byte&0xff}]]
}
}
return $ret
}
proc splitsixels {str} {
set ret {}
set row {}
foreach c [split $str {}] {
switch -regexp -- $c {
- {
lappend ret $row
set row {}
}
[?-~] {
lappend row $c
}
default { # ignored }
}
}
if {$row != {}} { lappend ret $row }
return $ret
}
proc sixels2xbm {sixels} {
set rows [splitsixels $sixels]
set ba {}
if {[llength $rows] == 0} { return {} }
if {[llength $rows] > 3} { set rows [lrange $rows 0 2] }
set height [expr {min(16, [llength $rows]*6)}]
set width 0
foreach row $rows {
set width [expr {max($width, [llength $row])}]
}
if {$width == 0} { return {} }
foreach row $rows {
append row [string repeat " ?" [expr {$width - [llength $row]}]]
lappend bytes {*}[chars2bytes $row]
}
set nbytes [expr {int(ceil($width / 8.0)) * $height}]
set bytes [lrange $bytes 0 $nbytes-1]
set ret "#define img_width $width\n#define img_height $height\n"
append ret "static unsigned char img_bits\[\] = {\n\t"
foreach byte $bytes {
append ret "0x" $byte ", "
}
set ret [string range $ret 0 end-2]
append ret "\n\t};\n"
return $ret
}
puts [sixels2xbm "o{}^}{{{}^}{o???-F^^zvvvvvz^^F???"]