DefineBitmap

DefineBitmap generates bitmaps at runtime. It expects four parameters: the bitmap name, the bitmap width and height, and a static area of packed characters, where a “1” indicates an on bit and a “.” indicates an off bit. This idiom, directly from the Perl/Tk distribution, is common:

my $bits = pack("b8" x 5,
    "........",
    "...11...",
    "..1111..",
    ".111111.",
    "........");
$mw->DefineBitmap('increment' => 8, 5, $bits);

The 'increment' bitmap is an “up arrow” eight bits wide and five bits high and is usable anywhere a built-in bitmap name is valid. It’s important to note the DefineBitmap keeps a reference to $bits, so you must not redefine it, or else the original bitmap pattern is lost.

Canvas and Text widgets have stipple options useful for producing mottled effects and dashed lines. The following program dynamically produces a series of stipples, numbered 1 through 8, which we can use to draw various dashed lines. Note that the eight stipple bit patterns are stored in an anonymous array. Each stipple is 1 bit wider than the previous, so we can select dashes of varying widths. We first draw a solid reference line, then eight stippled lines for comparison.

my $stipple_bits = []; # important foreach my $b (1 .. 8) { push @$stipple_bits, pack('b8', '1' x $b . '.' x (8 - $b)); $mw->DefineBitmap("stipple$b" => 8, 1, $stipple_bits->[$b-1]); }; my $c = $mw->Canvas(qw/-width 200/)->grid; $c->createLine(qw/20 20 180 20/); my $y = 40; for my $b (1 .. 8) { $c->createText(10, $y, -text ...

Get Mastering Perl/Tk now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.