Re: Using images to hold MUD data.

From: Daniel A. Koepke (dkoepke@circlemud.org)
Date: 04/01/01


On Fri, 30 Mar 2001, Tony Robbins wrote:

> I ended up going with the TIFF image format (uncompressed), but I'm
> running into some major problems.

TIFF is a complex graphics file format.  I would recommend against this
choice, not only because writing a proper reader for the format will be
difficult and time-consuming, but also because its overkill for what you
need.

PPM is incredibly simple, especially with raw bits mode.  A simple reader:

  struct PpmImage {
    ulong width;
    ulong height;
    char *bitmap;
  };

  struct PpmImage *load_ppm_bitmap(const char *fname)
  {
    struct PpmImage *ppm;
    ush_int magic;
    int bmpsize;
    int cols;
    int rows;
    FILE *fp;
    char c;
    int mv;

    if (!(fp = fopen(fname, "r"))) {
      perror(fname);
      return (NULL);
    } else if (fscanf("%hu %d %d %d\n", &magic, &cols, &rows, &mv) != 4) {
      log("SYSERR: %s: corrupt header", fname);
      fclose(fp);
      return (NULL);
    } else if (magic != 0x3650) { /* "P6" */
      log("SYSERR: %s: not a rawbits ppm file", fname);
      fclose(fp);
      return (NULL);
    } else if (mv > 255) {
      /* The file is corrupt -- it's not in the format it says it is. */
      log("SYSERR: %s: header is P6 but max color value implies P3",
          fname);
      fclose(fp);
      return (NULL);
    }

    bpmsize = cols * rows;
    CREATE(ppm, sizeof(struct PpmImage), 1);
    CREATE(ppm->bitmap, char, bmpsize);
    ppm->width = cols;
    ppm->height = rows;

    /* ppm(5) says no whitespace in pixel area, so this should suffice */
    if ((mv = fread(ppm->bitmap, sizeof(char), bmpsize, fp)) != bmpsize)
      log("WARNING: %s: expected %d bytes, got %d", bmpsize, mv);

    return (ppm);
  }

This doesn't support comments, isn't very robust, blah, blah.  But I think
it should work.  YMMV -- it's Mailer Code(tm).  More information on PPM
can be found by typing 'man ppm' on most UNIX machines -- this
documentation is what I used to write the above.

Most programs should be capable of outputting raw bits PPM.  Writing a
reader for the color triplet version of PPM (magic number would be "P3",
or 0x3350 encoded as a short) is not much more difficult (i.e., it's
nothing that couldn't be accomplished by just adding a loop that does
fscanf for the RGB pixel values), but is left as an exercise to the reader
if he really wants/needs it.

-dak

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/05/01 PST