/tags/rel-1.3.32/Examples/GIFPlot/Lib/pixmap.c
# · C · 159 lines · 102 code · 22 blank · 35 comment · 14 complexity · 85fd84860c04aaba20171c494cda13af MD5 · raw file
- /* -----------------------------------------------------------------------------
- * 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};