tkImgUtil.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkImgUtil.c --
  3.  *
  4.  * This file contains image related utility functions.
  5.  *
  6.  * Copyright (c) 1995 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkImgUtil.c,v 1.2 1998/09/14 18:23:13 stanton Exp $
  12.  */
  13. #include "tkInt.h"
  14. #include "tkPort.h"
  15. #include "xbytes.h"
  16. /*
  17.  *----------------------------------------------------------------------
  18.  *
  19.  * TkAlignImageData --
  20.  *
  21.  * This function takes an image and copies the data into an
  22.  * aligned buffer, performing any necessary bit swapping.
  23.  *
  24.  * Results:
  25.  * Returns a newly allocated buffer that should be freed by the
  26.  * caller.
  27.  *
  28.  * Side effects:
  29.  * None.
  30.  *
  31.  *----------------------------------------------------------------------
  32.  */
  33. char *
  34. TkAlignImageData(image, alignment, bitOrder)
  35.     XImage *image; /* Image to be aligned. */
  36.     int alignment; /* Number of bytes to which the data should
  37.  * be aligned (e.g. 2 or 4) */
  38.     int bitOrder; /* Desired bit order: LSBFirst or MSBFirst. */
  39. {
  40.     long dataWidth;
  41.     char *data, *srcPtr, *destPtr;
  42.     int i, j;
  43.     if (image->bits_per_pixel != 1) {
  44. panic("TkAlignImageData: Can't handle image depths greater than 1.");
  45.     }
  46.     /*
  47.      * Compute line width for output data buffer.
  48.      */
  49.     dataWidth = image->bytes_per_line;
  50.     if (dataWidth % alignment) {
  51. dataWidth += (alignment - (dataWidth % alignment));
  52.     }
  53.     data = ckalloc(dataWidth * image->height);
  54.     destPtr = data;
  55.     for (i = 0; i < image->height; i++) {
  56. srcPtr = &image->data[i * image->bytes_per_line];
  57. for (j = 0; j < dataWidth; j++) {
  58.     if (j >= image->bytes_per_line) {
  59. *destPtr = 0;
  60.     } else if (image->bitmap_bit_order != bitOrder) {
  61. *destPtr = xBitReverseTable[(unsigned char)(*(srcPtr++))];
  62.     } else {
  63. *destPtr = *(srcPtr++);
  64.     }
  65.     destPtr++;
  66. }
  67.     }
  68.     return data;
  69. }