home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tk42r2s.zip / tk4.2 / os2 / tkOS2Image.c < prev    next >
C/C++ Source or Header  |  1999-07-26  |  3KB  |  128 lines

  1. /* 
  2.  * tkOS2Image.c --
  3.  *
  4.  *    This file contains routines for manipulation full-color images.
  5.  *
  6.  * Copyright (c) 1996-1998 Illya Vaes
  7.  * Copyright (c) 1995 Sun Microsystems, Inc.
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  */
  12.  
  13.  
  14. #include "tkOS2Int.h"
  15.  
  16. static int        PutPixel (XImage *image, int x, int y,
  17.                 unsigned long pixel);
  18.  
  19. /*
  20.  *----------------------------------------------------------------------
  21.  *
  22.  * PutPixel --
  23.  *
  24.  *    Set a single pixel in an image.
  25.  *
  26.  * Results:
  27.  *    None.
  28.  *
  29.  * Side effects:
  30.  *    None.
  31.  *
  32.  *----------------------------------------------------------------------
  33.  */
  34.  
  35. static int
  36. PutPixel(image, x, y, pixel)
  37.     XImage *image;
  38.     int x, y;
  39.     unsigned long pixel;
  40. {
  41.     char *destPtr;
  42.  
  43.     destPtr = &(image->data[(y * image->bytes_per_line)
  44.         + (x * (image->bits_per_pixel >> 3))]);
  45.  
  46.     destPtr[0] = destPtr[1] = destPtr[2] = destPtr[3] = 0;
  47.     destPtr[0] = GetRValue(pixel);
  48.     destPtr[1] = GetGValue(pixel);
  49.     destPtr[2] = GetBValue(pixel);
  50.     return 0;
  51. }
  52.  
  53. /*
  54.  *----------------------------------------------------------------------
  55.  *
  56.  * XCreateImage --
  57.  *
  58.  *    Allocates storage for a new XImage.
  59.  *
  60.  * Results:
  61.  *    Returns a newly allocated XImage.
  62.  *
  63.  * Side effects:
  64.  *    None.
  65.  *
  66.  *----------------------------------------------------------------------
  67.  */
  68.  
  69. XImage *
  70. XCreateImage(display, visual, depth, format, offset, data, width, height,
  71.     bitmap_pad, bytes_per_line)
  72.     Display* display;
  73.     Visual* visual;
  74.     unsigned int depth;
  75.     int format;
  76.     int offset;
  77.     char* data;
  78.     unsigned int width;
  79.     unsigned int height;
  80.     int bitmap_pad;
  81.     int bytes_per_line;
  82. {
  83.     XImage* imagePtr = (XImage *) ckalloc(sizeof(XImage));
  84.  
  85.     if (imagePtr) {
  86.         imagePtr->width = width;
  87.         imagePtr->height = height;
  88.         imagePtr->xoffset = offset;
  89.         imagePtr->format = format;
  90.         imagePtr->data = data;
  91.         imagePtr->byte_order = MSBFirst;
  92.         imagePtr->bitmap_unit = 32;
  93.         imagePtr->bitmap_bit_order = MSBFirst;
  94.         imagePtr->bitmap_pad = bitmap_pad;
  95.         imagePtr->depth = depth;
  96.  
  97.         /*
  98.          * Round to the nearest word boundary.
  99.          */
  100.     
  101.         imagePtr->bytes_per_line = bytes_per_line ? bytes_per_line
  102.          : ((depth * width + 31) >> 3) & ~3;
  103.  
  104.         /*
  105.          * Non-palette systems (StaticColor, TrueColor) have RGB table,
  106.          * 3 bytes per pixel, and we have to install our own pixel routine.
  107.          */
  108.  
  109.         if (visual->class == TrueColor || visual->class == StaticColor) {
  110.             imagePtr->bits_per_pixel = 24;
  111.             imagePtr->f.put_pixel = PutPixel;
  112.         } else {
  113.             imagePtr->bits_per_pixel = 8;
  114.             imagePtr->f.put_pixel = NULL;
  115.         }
  116.         imagePtr->red_mask = visual->red_mask;
  117.         imagePtr->green_mask = visual->green_mask;
  118.         imagePtr->blue_mask = visual->blue_mask;
  119.         imagePtr->f.create_image = NULL;
  120.         imagePtr->f.destroy_image = NULL;
  121.         imagePtr->f.get_pixel = NULL;
  122.         imagePtr->f.sub_image = NULL;
  123.         imagePtr->f.add_pixel = NULL;
  124.     }
  125.     
  126.     return imagePtr;
  127. }
  128.