Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ bitmap(X) — OpenDesktop 3.0.0

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

X(X)


 bitmap(X)                       19 June 1992                       bitmap(X)


 Name

    bitmap, bmtoa, atobm - bitmap editor and converter utilities for X

 Syntax

    bitmap [-options...] filename WIDTHxHEIGHT

    bmtoa [-chars...] [filename]

    atobm [chars cc] [-name variable] [-xhot number] [-yhot number]
    [filename]

 Description

    The bitmap program is a rudimentary tool for creating or editing rec-
    tangular images made up of 1's and 0's.  Bitmaps are used in X for defin-
    ing clipping regions, cursor shapes, icon shapes, and tile and stipple
    patterns.

    The bmtoa and atobm filters convert bitmap files (FILE FORMAT) to and
    from ASCII strings.  They are most commonly used to quickly print out
    bitmaps and to generate versions for including in text.

 Usage

    bitmap displays a grid in which each square represents a single bit in
    the picture being edited.  Squares can be set, cleared, or inverted
    directly with the buttons on the pointer and a menu of higher level
    operations such as draw line and fill circle is provided to the side of
    the grid.  Actual size versions of the bitmap as it would appear normally
    and inverted appear below the menu.

    If the bitmap is to be used for defining a cursor, one of the squares in
    the images may be designated as the hotspot.  This determines where the
    cursor is actually pointing.  For cursors with sharp tips (such as arrows
    or fingers), this is usually at the end of the tip; for symmetric cursors
    (such as crosses or bullseyes), this is usually at the center.

    Bitmaps are stored as small C code fragments suitable for including in
    applications.  They provide an array of bits as well as symbolic con-
    stants giving the width, height, and hotspot (if specified) that may be
    used in creating cursors, icons, and tiles.

    The WIDTHxHEIGHT argument gives the size to use when creating a new bit-
    map (the default is 16x16).  Existing bitmaps are always edited at their
    current size.

    If the bitmap window is resized by the window manager, the size of the
    squares in the grid will shrink or enlarge to fit.

 Options

    bitmap accepts the following options:

    -help       This option will cause a brief description of the allowable
                options and parameters to be printed.

    -display display
                This option specifies the name of the X server to used.

    -geometry geometry
                This option specifies the placement and size of the bitmap
                window on the screen.  See X for details.

    -nodashed   This option indicates that the grid lines in the work area
                should not be drawn using dashed lines.  Although dashed
                lines are prettier than solid lines, on some servers they are
                significantly slower.

    -name variablename
                This option specifies the variable name to be used when writ-
                ing out the bitmap file.  The default is to use the basename
                of the filename command line argument.

    -bw number  This option specifies the border width in pixels of the main
                window.

    -fn font    This option specifies the font to be used in the buttons.

    -fg color   This option specifies the color to be used for the fore-
                ground.

    -bg color   This option specifies the color to be used for the back-
                ground.

    -hl color   This option specifies the color to be used for highlighting.

    -bd color   This option specifies the color to be used for the window
                border.

    -ms color   This option specifies the color to be used for the pointer
                (mouse).

    bmtoa accepts the following option:

    -chars cc   This option specifies the pair of characters to use in the
                string version of the bitmap.  The first character is used
                for 0 bits and the second character is used for 1 bits.  The
                default is to use dashes (-) for 0's and sharp signs (#) for
                1's.

    atobm accepts the following options:

    -chars cc   This option specifies the pair of characters to use when con-
                verting string bitmaps into arrays of numbers.  The first
                character represents a 0 bit and the second character
                represents a 1 bit.  The default is to use dashes (-) for 0's
                and sharp signs (#) for 1's.

    -name variable
                This option specifies the variable name to be used when writ-
                ing out the bitmap file.  The default is to use the basename
                of the filename command line argument or leave it blank if
                the standard input is read.

    -xhot number
                This option specifies the X coordinate of the hotspot.  Only
                positive values are allowed.  By default, no hotspot informa-
                tion is included.

    -yhot number
                This option specifies the Y coordinate of the hotspot.  Only
                positive values are allowed.  By default, no hotspot informa-
                tion is included.


 Changing grid squares

    Grid squares may be set, cleared, or inverted by pointing to them and
    clicking one of the buttons indicated below.  Multiple squares can be
    changed at once by holding the button down and dragging the cursor across
    them.  Set squares are filled and represent 1's in the bitmap; clear
    squares are empty and represent 0's.

    Button 1    This button (usually leftmost on the pointer) is used to set
                one or more squares.  The corresponding bit or bits in the
                bitmap are turned on (set to 1) and the square or squares are
                filled.

    Button 2    This button (usually in the middle) is used to invert one or
                more squares.  The corresponding bit or bits in the bitmap
                are flipped (1's become 0's and 0's become 1's).

    Button 3    This button (usually on the right) is used to clear one or
                more squares.  The corresponding bit or bits in the bitmap
                are turned off (set to 0) and the square or squares are emp-
                tied.


 Menu commands

    To make defining shapes easier, bitmap provides 13 commands for drawing
    whole sections of the grid at once, 2 commands for manipulating the
    hotspot, and 2 commands for updating the bitmap file and exiting.  A com-
    mand button for each of these operations is located to the right of the
    grid.

    Several of the commands operate on rectangular portions of the grid.
    These areas are selected after the command button is pressed by moving
    the cursor to the upper left square of the desired area, pressing a
    pointer button, dragging the cursor to the lower right hand corner (with
    the button still pressed) , and then releasing the button.  The command
    may be aborted by pressing any other button while dragging or by releas-
    ing outside the grid.

    To invoke a command, move the pointer over that command and click any
    button.

    ClearAll    This command is used to clear all of the bits in the bitmap
                as if Button 3 had been dragged through every square in the
                grid.  It cannot be undone.

    SetAll      This command is used to set all of the bits in the bitmap as
                if Button 1 had been dragged through every square in the
                grid.  It cannot be undone.

    InvertAll   This command is used to invert all of the bits in the bitmap
                as if Button 2 had been dragged through every square in the
                grid.

    ClearArea   This command is used to clear a region of the grid as if But-
                ton 3 had been dragged through each of the squares in the
                region.  When this command is invoked, the cursor will change
                shape to indicate that the area to be cleared should be
                selected as outlined above.

    SetArea     This command is used to set a region of the grid as if Button
                1 had been dragged through each of the squares in the region.
                When this command is invoked, the cursor will change shape to
                indicate that the area to be set should be selected as out-
                lined above.

    InvertArea  This command is used to invert a region of the grid as if
                Button 2 had been dragged through each of the squares in the
                region.  When this command is invoked, the cursor will change
                shape to indicate that the area to be inverted should be
                selected as outlined above.

    CopyArea    This command is used to copy a region of the grid from one
                location to another.  When this command is invoked, the cur-
                sor will change shape to indicate that the area to be copied
                should be selected as outlined above.  The cursor should then
                be clicked on the square to which the upper left hand corner
                of the region should be copied.

    MoveArea    This command is used to move a region of the grid from one
                location to another.  When this command is invoked, the cur-
                sor will change shape to indicate that the area to be moved
                should be selected as outlined above.  The cursor should then
                be clicked on the square to which the upper left hand corner
                of the region should be moved.  Any squares in the region's
                old position that are not also in the new position are
                cleared.

    OverlayArea This command is used to copy all of the set squares in a
                region of the grid from one location to another.  When this
                command is invoked, the cursor will change shape to indicate
                that the area to be copied should be selected as outlined
                above.  The cursor should then be clicked on the square to
                which the upper left hand corner of the region should be
                overlaid.  Only the squares that are set in the region will
                be touched in the new location.

    Line        This command will set the squares in a line between two
                points.  When this command is invoked, the cursor will change
                shape to indicate that the pointer should be clicked on the
                two end points of the line.

    Circle      This command will set the squares on a circle specified by a
                center and a point on the curve.  When this command is
                invoked, the cursor will change shape to indicate that the
                pointer should be clicked on the center of the circle and
                then over a point on the curve.  Small circles may not look
                very round because of the size of the grid and the limits of
                having to work with discrete pixels.

    FilledCircle
                This command will set all of the squares in a circle speci-
                fied by a center and a point on the curve.  When this command
                is invoked, the cursor will change shape to indicate that the
                pointer should be clicked on the center of the circle and
                then over a point on the curve.  All squares side and includ-
                ing the circle are set.

    FloodFill   This command will set all clear squares in an enclosed shape.
                When this command is invoked, the cursor will change shape to
                indicate that the pointer should be clicked on any empty
                square inside the shape to be filled.  All empty squares that
                border horizontally or vertically with the indicated square
                are set out to the enclosing shape.  If the shape is not
                closed, the entire grid will be filled.

    Set Hot Spot
                This command designates one square in the grid as the hot
                spot if this bitmap is to be used for defining a cursor.
                When the command is invoked, the cursor will change indicat-
                ing that the pointer should be clicked on the square to con-
                tain the hot spot.

    Clear Hot Spot
                This command removes any designated hot spot from the bitmap.

    WriteOutput This command writes a small fragment of C code representing
                the bitmap to the filename specified on the command line.  If
                the file already exists, the original file will be renamed to
                filename before the new file is created.  If an error occurs
                in either the renaming or the writing of the bitmap file, a
                dialog box will appear asking whether or not bitmap should
                use /tmp/filename instead.

    Quit        This command causes bitmap to display a dialog box asking
                whether or not it should save the bitmap (if it has changed)
                and then exit.  Answering yes is the same as invoking Write
                Output; no causes bitmap to simply exit; and cancel will
                abort the Quit command so that more changes may be made.


 File format

    The Write Output command stores bitmaps as simple C program fragments
    that can be compiled into programs, referred to by X Toolkit pixmap
    resources, manipulated by other programs (see xsetroot), or read in using
    utility routines in the various programming libraries.  The width and
    height of the bitmap as well as the hotspot, if specified, are written as
    preprocessor symbols at the start of the file.  The bitmap image is then
    written out as an array of characters:

       #define name_width 11
       #define name_height 5
       #define name_x_hot 5
       #define name_y_hot 2

       static char name_bits[] = {
       0x91, 0x04, 0xca, 0x06, 0x84,
       0x04, 0x8a, 0x04, 0x91, 0x04
       };

    The name prefix to the preprocessor symbols and to the bits array is con-
    structed from the filename argument given on the command line.  Any
    directories are stripped off the front of the name and any suffix begin-
    ning with a period is stripped off the end.  Any remaining non-alphabetic
    characters are replaced with underscores.  The namexhot and nameyhot
    symbols will only be present if a hotspot has been designated using the
    Set Hot Spot command.

    Each character in the the array contains 8 bits from one row of the image
    (rows are padded out at the end to a multiple of 8 to make this possi-
    ble).  Rows are written out from left to right and top to bottom.  The
    first character of the array holds the leftmost 8 bits of top line, and
    the last character holds the right most 8 bits (including padding) of the
    bottom line.  Within each character, the leftmost bit in the bitmap is
    the least significant bit in the character.

    This process can be demonstrated visually by splitting a row into words
    containing 8 bits each, reversing the bits each word (since Arabic num-
    bers have the significant digit on the right and images have the least
    significant bit on the left), and translating each word from binary to
    hexadecimal.

    In the following example, the array of 1's and 0's on the left represents
    a bitmap containing 5 rows and 11 columns that spells X11.  To its right
    is the same array split into 8 bit words with each row padded with 0's so
    that it is a multiple of 8 in length (16):

       10001001001            10001001 00100000
       01010011011            01010011 01100000
       00100001001            00100001 00100000
       01010001001            01010001 00100000
       10001001001            10001001 00100000

    Reversing the bits in each word of the padded, split version of the bit-
    map yields the left hand figure below.  Interpreting each word as hexade-
    cimal number yields the array of numbers on the right:

       10010001 00000100            0x91 0x04
       11001010 00000110            0xca 0x06
       10000100 00000100            0x84 0x04
       10001010 00000100            0x8a 0x04
       10010001 00000100            0x91 0x04

    The character array can then be generated by reading each row from left
    to right, top to bottom:

       static char name_bits[] = {
          0x91, 0x04, 0xca, 0x06, 0x84,
          0x04, 0x8a, 0x04, 0x91, 0x04
       };

    The bmtoa program may be used to convert bitmap files into arrays of
    characters for printing or including in text files.  The atobm program
    can be used to convert strings back to bitmap format.

 Using bitmaps in programs

    The format of bitmap files is designed to make bitmaps and cursors easy
    to use within X programs.  The following code could be used to create a
    cursor from bitmaps defined in this.cursor and this_mask.cursor:

       #include "this.cursor"
       #include "this_mask.cursor"

       XColor foreground, background;
       /* fill in foreground and background color structures */
       Pixmap source = XCreateBitmapFromData (display, drawable,
               this_bits, this_width, this_height);
       Pixmap mask = XCreateBitmapFromData (display, drawable,
               this_mask_bits, this_mask_width, this_mask_height);
       Cursor cursor = XCreatePixmapCursor (display, source, mask,
               foreground, background, this_x_hot, this_y_hot);


    Additional routines are available for reading in bitmap files and return-
    ing the data in the file, in Bitmap (single-plane Pixmap for use with
    routines that require stipples), or full depth Pixmaps (often used for
    window backgrounds and borders).  Applications writers should be careful
    to understand the difference between Bitmaps and Pixmaps so that their
    programs function correctly on color and monochrome displays.

    For backward compatibility, bitmap will also accept X10 format bitmap
    files.  However, when the file is written out again it will be in X11
    format.

 X defaults

    bitmap uses the following resources:

    Background  The window's background color.  Bits which are 0 in the bit-
                map are displayed in this color.  This option is useful only
                on color displays.  The default value is ``white''.

    BorderColor The border color.  This option is useful only on color dis-
                plays. The default value is ``black''.

    BorderWidth The border width.  The default value is 2.

    BodyFont    The text font.  The default value is variable.

    Dashed      If ``off'', then bitmap will draw the grid lines with solid
                lines.  The default is ``on''.

    Foreground  The foreground color.  Bits which are 1 in the bitmap are
                displayed in this color.  This option is useful only on color
                displays. The default value is ``black''.

    Highlight   The highlight color.  bitmap uses this color to show the hot
                spot and to indicate rectangular areas that will be affected
                by the Move Area, Copy Area, Set Area, Clear Area, and Invert
                Area commands.  If a highlight color is not given, then bit-
                map will highlight by inverting.  This option is useful only
                on color displays.

    Mouse       The pointer (mouse) cursor's color.  This option is useful
                only on color displays.  The default value is ``black''.

    Geometry    The size and location of the bitmap window.

    Dimensions  The WIDTHxHEIGHT to use when creating a new bitmap.


 See also

    X(X), Xlib - C Language X Interface (particularly the section on ``Mani-
    pulating Bitmaps''), ``XmuReadBitmapDataFromFile''

 Known Limitations

    The old command line arguments are not consistent with other X programs.

    If you move the pointer too fast while holding a pointer button down,
    some squares may be missed.  This is caused by limitations in how fre-
    quently the X server can sample the pointer location.

    There is no way to write to a file other than the one specified on the
    command line.

    There is no way to change the size of the bitmap once the program has
    started.

    There is no undo command.


Typewritten Software • bear@typewritten.org • Edmonds, WA 98026