/src/freeimage-svn/FreeImage/trunk/Source/FreeImage/PixelAccess.cpp
Line | Count | Source |
1 | | // ========================================================== |
2 | | // Pixel access functions |
3 | | // |
4 | | // Design and implementation by |
5 | | // - Floris van den Berg (flvdberg@wxs.nl) |
6 | | // - Hervé Drolon (drolon@infonie.fr) |
7 | | // - Ryan Rubley (ryan@lostreality.org) |
8 | | // - Riley McNiff (rmcniff@marexgroup.com) |
9 | | // |
10 | | // This file is part of FreeImage 3 |
11 | | // |
12 | | // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY |
13 | | // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES |
14 | | // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE |
15 | | // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED |
16 | | // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT |
17 | | // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY |
18 | | // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL |
19 | | // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER |
20 | | // THIS DISCLAIMER. |
21 | | // |
22 | | // Use at your own risk! |
23 | | // ========================================================== |
24 | | |
25 | | #include "FreeImage.h" |
26 | | #include "Utilities.h" |
27 | | |
28 | | // ---------------------------------------------------------- |
29 | | |
30 | | BYTE * DLL_CALLCONV |
31 | 7.64M | FreeImage_GetScanLine(FIBITMAP *dib, int scanline) { |
32 | 7.64M | if(!FreeImage_HasPixels(dib)) { |
33 | 0 | return NULL; |
34 | 0 | } |
35 | 7.64M | return CalculateScanLine(FreeImage_GetBits(dib), FreeImage_GetPitch(dib), scanline); |
36 | 7.64M | } |
37 | | |
38 | | BOOL DLL_CALLCONV |
39 | 0 | FreeImage_GetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value) { |
40 | 0 | BYTE shift; |
41 | |
|
42 | 0 | if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP)) |
43 | 0 | return FALSE; |
44 | | |
45 | 0 | if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) { |
46 | 0 | BYTE *bits = FreeImage_GetScanLine(dib, y); |
47 | |
|
48 | 0 | switch(FreeImage_GetBPP(dib)) { |
49 | 0 | case 1: |
50 | 0 | *value = (bits[x >> 3] & (0x80 >> (x & 0x07))) != 0; |
51 | 0 | break; |
52 | 0 | case 4: |
53 | 0 | shift = (BYTE)((1 - x % 2) << 2); |
54 | 0 | *value = (bits[x >> 1] & (0x0F << shift)) >> shift; |
55 | 0 | break; |
56 | 0 | case 8: |
57 | 0 | *value = bits[x]; |
58 | 0 | break; |
59 | 0 | default: |
60 | 0 | return FALSE; |
61 | 0 | } |
62 | | |
63 | 0 | return TRUE; |
64 | 0 | } |
65 | | |
66 | 0 | return FALSE; |
67 | 0 | } |
68 | | |
69 | | BOOL DLL_CALLCONV |
70 | 0 | FreeImage_GetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value) { |
71 | 0 | if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP)) |
72 | 0 | return FALSE; |
73 | | |
74 | 0 | if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) { |
75 | 0 | BYTE *bits = FreeImage_GetScanLine(dib, y); |
76 | |
|
77 | 0 | switch(FreeImage_GetBPP(dib)) { |
78 | 0 | case 16: |
79 | 0 | { |
80 | 0 | bits += 2*x; |
81 | 0 | WORD *pixel = (WORD *)bits; |
82 | 0 | if((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) { |
83 | 0 | value->rgbBlue = (BYTE)((((*pixel & FI16_565_BLUE_MASK) >> FI16_565_BLUE_SHIFT) * 0xFF) / 0x1F); |
84 | 0 | value->rgbGreen = (BYTE)((((*pixel & FI16_565_GREEN_MASK) >> FI16_565_GREEN_SHIFT) * 0xFF) / 0x3F); |
85 | 0 | value->rgbRed = (BYTE)((((*pixel & FI16_565_RED_MASK) >> FI16_565_RED_SHIFT) * 0xFF) / 0x1F); |
86 | 0 | value->rgbReserved = 0; |
87 | 0 | } else { |
88 | 0 | value->rgbBlue = (BYTE)((((*pixel & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F); |
89 | 0 | value->rgbGreen = (BYTE)((((*pixel & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F); |
90 | 0 | value->rgbRed = (BYTE)((((*pixel & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F); |
91 | 0 | value->rgbReserved = 0; |
92 | 0 | } |
93 | 0 | break; |
94 | 0 | } |
95 | 0 | case 24: |
96 | 0 | bits += 3*x; |
97 | 0 | value->rgbBlue = bits[FI_RGBA_BLUE]; // B |
98 | 0 | value->rgbGreen = bits[FI_RGBA_GREEN]; // G |
99 | 0 | value->rgbRed = bits[FI_RGBA_RED]; // R |
100 | 0 | value->rgbReserved = 0; |
101 | 0 | break; |
102 | 0 | case 32: |
103 | 0 | bits += 4*x; |
104 | 0 | value->rgbBlue = bits[FI_RGBA_BLUE]; // B |
105 | 0 | value->rgbGreen = bits[FI_RGBA_GREEN]; // G |
106 | 0 | value->rgbRed = bits[FI_RGBA_RED]; // R |
107 | 0 | value->rgbReserved = bits[FI_RGBA_ALPHA]; // A |
108 | 0 | break; |
109 | 0 | default: |
110 | 0 | return FALSE; |
111 | 0 | } |
112 | | |
113 | 0 | return TRUE; |
114 | 0 | } |
115 | | |
116 | 0 | return FALSE; |
117 | 0 | } |
118 | | |
119 | | BOOL DLL_CALLCONV |
120 | 0 | FreeImage_SetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value) { |
121 | 0 | BYTE shift; |
122 | |
|
123 | 0 | if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP)) |
124 | 0 | return FALSE; |
125 | | |
126 | 0 | if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) { |
127 | 0 | BYTE *bits = FreeImage_GetScanLine(dib, y); |
128 | |
|
129 | 0 | switch(FreeImage_GetBPP(dib)) { |
130 | 0 | case 1: |
131 | 0 | *value ? bits[x >> 3] |= (0x80 >> (x & 0x7)) : bits[x >> 3] &= (0xFF7F >> (x & 0x7)); |
132 | 0 | break; |
133 | 0 | case 4: |
134 | 0 | shift = (BYTE)((1 - x % 2) << 2); |
135 | 0 | bits[x >> 1] &= ~(0x0F << shift); |
136 | 0 | bits[x >> 1] |= ((*value & 0x0F) << shift); |
137 | 0 | break; |
138 | 0 | case 8: |
139 | 0 | bits[x] = *value; |
140 | 0 | break; |
141 | 0 | default: |
142 | 0 | return FALSE; |
143 | 0 | } |
144 | | |
145 | 0 | return TRUE; |
146 | 0 | } |
147 | | |
148 | 0 | return FALSE; |
149 | 0 | } |
150 | | |
151 | | BOOL DLL_CALLCONV |
152 | 0 | FreeImage_SetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value) { |
153 | 0 | if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP)) |
154 | 0 | return FALSE; |
155 | | |
156 | 0 | if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) { |
157 | 0 | BYTE *bits = FreeImage_GetScanLine(dib, y); |
158 | |
|
159 | 0 | switch(FreeImage_GetBPP(dib)) { |
160 | 0 | case 16: |
161 | 0 | { |
162 | 0 | bits += 2*x; |
163 | 0 | WORD *pixel = (WORD *)bits; |
164 | 0 | if((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) { |
165 | 0 | *pixel = ((value->rgbBlue >> 3) << FI16_565_BLUE_SHIFT) | |
166 | 0 | ((value->rgbGreen >> 2) << FI16_565_GREEN_SHIFT) | |
167 | 0 | ((value->rgbRed >> 3) << FI16_565_RED_SHIFT); |
168 | 0 | } else { |
169 | 0 | *pixel = ((value->rgbBlue >> 3) << FI16_555_BLUE_SHIFT) | |
170 | 0 | ((value->rgbGreen >> 3) << FI16_555_GREEN_SHIFT) | |
171 | 0 | ((value->rgbRed >> 3) << FI16_555_RED_SHIFT); |
172 | 0 | } |
173 | 0 | break; |
174 | 0 | } |
175 | 0 | case 24: |
176 | 0 | bits += 3*x; |
177 | 0 | bits[FI_RGBA_BLUE] = value->rgbBlue; // B |
178 | 0 | bits[FI_RGBA_GREEN] = value->rgbGreen; // G |
179 | 0 | bits[FI_RGBA_RED] = value->rgbRed; // R |
180 | 0 | break; |
181 | 0 | case 32: |
182 | 0 | bits += 4*x; |
183 | 0 | bits[FI_RGBA_BLUE] = value->rgbBlue; // B |
184 | 0 | bits[FI_RGBA_GREEN] = value->rgbGreen; // G |
185 | 0 | bits[FI_RGBA_RED] = value->rgbRed; // R |
186 | 0 | bits[FI_RGBA_ALPHA] = value->rgbReserved; // A |
187 | 0 | break; |
188 | 0 | default: |
189 | 0 | return FALSE; |
190 | 0 | } |
191 | | |
192 | 0 | return TRUE; |
193 | 0 | } |
194 | | |
195 | 0 | return FALSE; |
196 | 0 | } |
197 | | |