### 18.3 Device Independent Bitmap Utilities

The Device Independent Bitmap (DIB) utilities library `DIBUTILS.DLL` and the associated procedures in `dib.scm` in the Win32 system source is an example of how to use the foreign function interface to access and manipulate non-Scheme objects.

windows type: dib ¶

  In the C world a DIB is a handle to a piece of memory containing the bits that represent information about the image and the pixels of the image. The handle is a machine-word sized piece of data which may be thought of as a 32 bit integer. The handle may be null (i.e. zero), indicating that there is no block of memory describing the DIB. The null value is usually returned by C functions that are supposed to create a DIB but failed, for some reason like the memory could not be allocated or a file could not be opened.

  In the Scheme world a DIB is a structure containing information about the bitmap (specifically the integer that represents the handle). We also include `#f` in the `dib` windows type to mirror the null handle error value.

      (define dib-result
        (lambda (handle)
          (if (= handle 0)
              #f
              (make-dib handle))))

      (define dib-arg
        (lambda (dib)
          (if dib
              (cell-contents (dib-handle dib))
              0)))

      (define-windows-type dib
        (lambda (thing) (or (dib? thing) (eq? thing #f)))
        dib-arg
        dib-result)