| /* ----------------------------------------------------------------------------- |
| * pixmap.c |
| * |
| * Pixel maps (i.e., bitmaps) |
| * |
| * Author(s) : David Beazley (beazley@cs.uchicago.edu) |
| * Copyright (C) 1995-1996 |
| * |
| * See the file LICENSE for information on usage and redistribution. |
| * ----------------------------------------------------------------------------- */ |
| |
| #define PIXMAP |
| #include "gifplot.h" |
| |
| /* ----------------------------------------------------------------------- |
| PixMap *new_PixMap(int width, int height, int centerx, int centery) |
| |
| Create a new pixmap of given size |
| ----------------------------------------------------------------------- */ |
| PixMap *new_PixMap(int width, int height, int centerx, int centery) { |
| PixMap *pm; |
| if ((width > 0) && (height > 0)) { |
| pm = (PixMap *) malloc(sizeof(PixMap)); |
| pm->width = width; |
| pm->height = height; |
| pm->centerx = centerx; |
| pm->centery = centery; |
| pm->map = (int *) malloc(height*width*sizeof(int)); |
| return pm; |
| } |
| return (PixMap *) 0; |
| } |
| |
| /* -------------------------------------------------------------------------- |
| void delete_PixMap(PixMap *pm) |
| |
| Destroy a pixmap |
| -------------------------------------------------------------------------- */ |
| |
| void delete_PixMap(PixMap *pm) { |
| if (pm) { |
| free((char *) pm->map); |
| free((char *) pm); |
| } |
| } |
| |
| /* --------------------------------------------------------------------------- |
| void PixMap_set(PixMap *pm, int x, int y, int pix) |
| |
| Set a pixel in the bitmap |
| --------------------------------------------------------------------------- */ |
| void |
| PixMap_set(PixMap *pm, int x, int y, int pix) { |
| if ((x < 0) || (x>=pm->width)) return; |
| if ((y < 0) || (y>=pm->height)) return; |
| |
| pm->map[pm->width*y + x] = pix; |
| } |
| |
| /* ----------------------------------------------------------------------------- |
| void FrameBuffer_drawpixmap(FrameBuffer *f, PixMap *pm, int x, int y, int fgcolor, int bgcolor) |
| |
| Draw a pixmap onto the framebuffer. This is somewhat optimized for speed. |
| ------------------------------------------------------------------------------ */ |
| |
| void |
| FrameBuffer_drawpixmap(FrameBuffer *f, PixMap *pm, int x, int y, int fgcolor, int bgcolor) { |
| |
| int startx, starty; /* Starting location on framebuffer */ |
| int startpixx = 0, startpixy = 0; /* Starting location in pixmap */ |
| int endx, endy; /* Ending location on framebuffer */ |
| int i,j, px, py; |
| int c; |
| |
| startx = x - pm->centerx; |
| starty = y + pm->centery; |
| endx = startx + pm->width; |
| endy = starty - pm->height; |
| |
| /* Figure out if we need to clip */ |
| |
| if (startx < f->xmin) { |
| startpixx = f->xmin - startx; |
| startx = f->xmin; |
| } |
| if (starty >= f->ymax) { |
| startpixy = starty - f->ymax; |
| starty = f->ymax-1; |
| } |
| if (endx >= f->xmax) { |
| endx = f->xmax-1; |
| } |
| if (endy < f->ymin) { |
| endy = f->ymin; |
| } |
| py = startpixy; |
| for (j = starty; j >= endy; j--) { |
| px = startpixx; |
| for (i = startx; i < endx; i++) { |
| c = pm->map[py*pm->width + px]; |
| switch (c) { |
| case GIFPLOT_FOREGROUND: |
| f->pixels[j][i] = fgcolor; |
| break; |
| case GIFPLOT_BACKGROUND: |
| f->pixels[j][i] = bgcolor; |
| break; |
| default: |
| break; |
| } |
| px++; |
| } |
| py++; |
| } |
| } |
| |
| /************************************************************************** |
| * Some common PixMaps (for plotting) |
| * |
| **************************************************************************/ |
| |
| int _SQUARE_MAP[] = { |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,1,1,1,1,1,1,1, |
| 0,0,0,0,0,0,0,0 }; |
| |
| PixMap PixMap_SQUARE = { 8,8,4,4, _SQUARE_MAP}; |
| |
| int _TRIANGLE_MAP[] = { |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,1,0,0,0,0, |
| 0,0,1,1,1,0,0,0, |
| 0,0,1,1,1,0,0,0, |
| 0,1,1,1,1,1,0,0, |
| 0,1,1,1,1,1,0,0, |
| 1,1,1,1,1,1,1,0, |
| 0,0,0,0,0,0,0,0 }; |
| |
| PixMap PixMap_TRIANGLE = { 8,8,4,4,_TRIANGLE_MAP}; |
| |
| int _CROSS_MAP[] = { |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,1,0,0,0,0, |
| 1,1,1,1,1,1,1,0, |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,1,0,0,0,0, |
| 0,0,0,0,0,0,0,0 }; |
| |
| PixMap PixMap_CROSS = { 8,8,4,4,_CROSS_MAP}; |
| |
| |
| |