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