diff options
author | dos-reis <gdr@axiomatics.org> | 2007-08-14 05:14:52 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2007-08-14 05:14:52 +0000 |
commit | ab8cc85adde879fb963c94d15675783f2cf4b183 (patch) | |
tree | c202482327f474583b750b2c45dedfc4e4312b1d /src/hyper/ReadBitmap.pamphlet | |
download | open-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz |
Initial population.
Diffstat (limited to 'src/hyper/ReadBitmap.pamphlet')
-rw-r--r-- | src/hyper/ReadBitmap.pamphlet | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/src/hyper/ReadBitmap.pamphlet b/src/hyper/ReadBitmap.pamphlet new file mode 100644 index 00000000..9712f0e6 --- /dev/null +++ b/src/hyper/ReadBitmap.pamphlet @@ -0,0 +1,296 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/ReadBitmap} +\author{The Axiom Team} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +\section{ReadBitmap.c} +\subsection{zzopen change} +The [[zzopen]] function used to be called [[zopen]] but this name has +been picked up by Unix so we change it globally. +<<zzopen change>>= + if (!(fd = zzopen(filename, "r"))) { + fprintf(stderr, "ReadBitmapFile: File >%s< not found\n", filename); + exit(-1); + } + +@ +\subsection{ReadBitmap.c} +<<ReadBitmap.c>>= +#define _READBITMAP_C + +#include "axiom-c-macros.h" +#include "useproto.h" +#include "debug.h" +#include "hyper.h" + +#include "all_hyper_proto.H1" +#include "pixmap.H1" + +#define MAXLINE 256 + +/* + * This file was produced by J.M. Wiley with some help from the bitmap editor + * routine. It reads in a bitmap file, and calls XCreatePixmapFromBitmapData + * to transform it into a Pixmap. He did this because the routine + * XReadBitmapFile does not seeem to work to well (whatecer that means). + */ + +XImage * +HTReadBitmapFile(Display *display,int screen,char * filename, + int *width, int *height) +{ + XImage *image; + FILE *fd; + char Line[256], Buff[256]; + int num_chars; + char *ptr; + int rch; + int version; + int padding, chars_line, file_chars_line, file_chars; + int bytes; + int x_hot, y_hot; + + + image = XCreateImage(display, DefaultVisual(display, screen), 1, + XYBitmap, 0, NULL, 0, 0, 8, 0); + + + (image)->byte_order = LSBFirst; /* byte_order */ + (image)->bitmap_unit = 8; /* bitmap-unit */ + (image)->bitmap_bit_order = LSBFirst; /* bitmap-bit-order */ + +<<zzopen change>> + /* + * Once it is open, lets get the width and height + */ + + if ((read_w_and_h(fd, (unsigned int *)width,(unsigned int *) height)) < 0) { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + + + /* + * Now get the next line, and see if it is hot spots or bits + */ + if (fgets(Line, MAXLINE, fd) == NULL) { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + + /* + * Now check the first character to see if it is a # or an s + */ + + if (Line[0] == '#') { + if ((read_hot(fd, Line, &x_hot, &y_hot)) < 0) { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + } + + (image)->width = *width; + (image)->height = *height; + + /* + * figure out what version + */ + + if (sscanf(Line, "static short %s = {", Buff) == 1) + version = 10; + else if (sscanf(Line, "static unsigned char %s = {", Buff) == 1) + version = 11; + else if (sscanf(Line, "static char %s = {", Buff) == 1) + version = 11; + else { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + + padding = 0; + if ((*width % 16) && ((*width % 16) < 9) && (version == 10)) + padding = 1; + + (image)->bytes_per_line = chars_line = (*width + 7) / 8; + file_chars_line = chars_line + padding; + + num_chars = chars_line * (*height); + file_chars = file_chars_line * (*height); + (image)->data = (char *) halloc((image)->bytes_per_line * (image)->height, + "Read Pixmap--Image data"); + + /* + * Since we are just holding the first line of the declaration, we can + * just start reading from fd + */ + + if (version == 10) + for (bytes = 0, ptr = (image)->data; bytes < file_chars; (bytes += 2)) { + if (fscanf(fd, " 0x%x%*[,}]%*[ \n]", &rch) != 1) { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + *(ptr++) = rch & 0xff; + if (!padding || ((bytes + 2) % file_chars_line)) + *(ptr++) = rch >> 8; + } + else + for (bytes = 0, ptr = (image)->data; bytes < file_chars; bytes++, ptr++) { + if (fscanf(fd, " 0x%x%*[,}]%*[ \n]", &rch) != 1) { + fprintf(stderr, "ReadBitmapFile: Bad file format in %s\n", filename); + exit(-1); + } + *ptr = rch; + } + + fclose(fd); + + return image; +} + +static int +read_hot(FILE *fd,char Line[],int *x_hot,int *y_hot) +{ + char Buff[256]; + + /* + * Works much the same as get width and height, just new variables + */ + + if (sscanf(Line, "#define %s %d", Buff, x_hot) != 2) + return -1; + + if (fgets(Line, MAXLINE, fd) == NULL) + return -1; + + if (sscanf(Line, "#define %s %d", Buff, y_hot) != 2) + return -1; + + if (fgets(Line, MAXLINE, fd) == NULL) + return -1; + return 1; +} + +static int +read_w_and_h(FILE *fd,unsigned int *width,unsigned int *height) +{ + char Line[256], Buff[256]; + + if (fgets(Line, MAXLINE, fd) == NULL) + return -1; + + /* + * Once we have the line, scan it for the width + */ + + if (sscanf(Line, "#define %s %d", Buff, width) != 2) + return -1; + + /* + * Hopefully we have the width, now get the height the same way + */ + + if (fgets(Line, MAXLINE, fd) == NULL) + return -1; + + + /* + * Once we have the line, scan it for the height + */ + + if (sscanf(Line, "#define %s %d", Buff, height) != 2) + return -1; + + return 1; +} + + +/* read a bitmap file into memory */ + +ImageStruct * +insert_image_struct(char *filename) +{ + int bm_width, bm_height; + XImage *im; + ImageStruct *image; + + if (*filename == ' ') + filename++; + if ((image = (ImageStruct *) hash_find(&gImageHashTable, filename)) == NULL) { + im = HTReadBitmapFile(gXDisplay, gXScreenNumber, filename, + &bm_width, &bm_height); + + /* + * now add the image to the gImageHashTable + */ + + image = (ImageStruct *) halloc(sizeof(ImageStruct), "ImageStruct"); + image->image.xi = im; + image->width = image->image.xi->width; + image->height = image->image.xi->height; + image->filename = (char *) halloc(sizeof(char) * strlen(filename) +1, + "insert_image--filename"); + + /* strcpy(image->filename, filename); */ + + sprintf(image->filename, "%s", filename); + hash_insert(&gImageHashTable,(char *) image, image->filename); + } + return image; +} +@ +\section{License} +<<license>>= +/* +Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of The Numerical ALgorithms Group Ltd. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +@ +<<*>>= +<<license>> +<<ReadBitmap.c>> +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document} + + + + |