/* * image.c - handler for loading and storing 2D images. */ /** * Images can be used to efficiently store per-room area information. * Two current uses are for height maps (ie, third coordinate) and * exit maps (eg, a maze). Along a row represents W-E (left to right), * and along a column represents N-S (top to bottom). (0,0) in the image * corresponds to the northwestern-most room of the area.<p> * Currently, the only supported image type is RAW. */ #include <image.h> /** * This method reads in the given image file, and returns a two-dimensional * array of integers representing the data in the file. The 'rle' * flag is currently unused; in the future, it will be used to return * the array in a "run-length encoded" format, where each group of identical * elements in a row will be represented as a count/value pair. This * may be more efficient for large arrays with sparse data. * @param image_file the pathname of the file containing the image * @rle optional (currently unused) * @return a 2-D array of ints, representing the image */ varargs class IMAGE_INFO load_image(string image_file, int rle) { int i, j, n, size_x, size_y; string image_type, l; mixed vals; class IMAGE_INFO ret; image_type = read_file(image_file, 1, 1); image_type = replace_string(image_type, " ", ""); image_type = replace_string(image_type, "\n", ""); if (image_type != "RAW") { error("Only image type RAW is currently supported.\n"); } l = read_file(image_file, 2, 1); if (sscanf(l, "%d%d", size_x, size_y) != 2) { error("Image size(s) not found.\n"); } ret = new(class IMAGE_INFO); ret->size = ({ size_x, size_y }); // Read the rest of the file. vals = read_file(image_file, 3); // Take out newlines & explode into number strings //vals = explode(replace_string(vals, "\n", " "), " "); vals = reg_assoc(vals, ({ "[0-9]+" }), ({ 1 })); n = 0; while (vals[1][n] != 1) n++; // Save in image as ints. ret->image = allocate(size_x); // TODO: put the run-length encoding stuff in here, both on reading // and on storing in image. for (i = 0; i < size_x; i++) { ret->image[i] = allocate(size_y); for (j = 0; j < size_y; j++) { if (n >= sizeof(vals[0])) { error("Ran out of values for image at " + i + ", " + j + ".\n"); } ret->image[i][j] = to_int(vals[0][n++]); while ((n < sizeof(vals[0])) && (vals[1][n] != 1)) n++; } } return ret; } /* load_image() */ /** * @ignore */ // Debugging function void print_image(class IMAGE_INFO im) { int i, j; printf("size: %d x %d, %s, ", im->size[0], im->size[1], (im->rle?"rle":"no rle")); if (arrayp(im->nw_coord)) printf("@ ({ %d, %d, %d })\n", im->nw_coord[0], im->nw_coord[1], im->nw_coord[2]); else printf("(not placed)\n"); printf("Image:\n "); for (i = 0; i < sizeof(im->image); i++) { for (j = 0; j < sizeof(im->image[i]); j++) { printf("% 4d", im->image[i][j]); } printf("\n "); } printf("\n"); } /* print_image() */