Leptonica 1.85.0
Image processing and image analysis suite
Loading...
Searching...
No Matches
arrayaccess.h
Go to the documentation of this file.
1/*====================================================================*
2 - Copyright (C) 2001 Leptonica. All rights reserved.
3 -
4 - Redistribution and use in source and binary forms, with or without
5 - modification, are permitted provided that the following conditions
6 - are met:
7 - 1. Redistributions of source code must retain the above copyright
8 - notice, this list of conditions and the following disclaimer.
9 - 2. Redistributions in binary form must reproduce the above
10 - copyright notice, this list of conditions and the following
11 - disclaimer in the documentation and/or other materials
12 - provided with the distribution.
13 -
14 - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18 - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *====================================================================*/
26
27#ifndef LEPTONICA_ARRAY_ACCESS_H
28#define LEPTONICA_ARRAY_ACCESS_H
29
111#define USE_INLINE_ACCESSORS 1
112
113#if USE_INLINE_ACCESSORS
114
115 /*=============================================================*/
116 /* Faster: use in line accessors */
117 /*=============================================================*/
118
119 /*--------------------------------------------------*
120 * 1 bit access *
121 *--------------------------------------------------*/
123#define GET_DATA_BIT(pdata, n) \
124 ((*((const l_uint32 *)(pdata) + ((n) >> 5)) >> (31 - ((n) & 31))) & 1)
125
127#define SET_DATA_BIT(pdata, n) \
128 *((l_uint32 *)(pdata) + ((n) >> 5)) |= (0x80000000 >> ((n) & 31))
129
131#define CLEAR_DATA_BIT(pdata, n) \
132 *((l_uint32 *)(pdata) + ((n) >> 5)) &= ~(0x80000000 >> ((n) & 31))
133
135#define SET_DATA_BIT_VAL(pdata, n, val) \
136 *((l_uint32 *)(pdata) + ((n) >> 5)) = \
137 ((*((l_uint32 *)(pdata) + ((n) >> 5)) \
138 & (~(0x80000000 >> ((n) & 31)))) \
139 | ((l_uint32)(val) << (31 - ((n) & 31))))
140
141 /*--------------------------------------------------*
142 * 2 bit access *
143 *--------------------------------------------------*/
145#define GET_DATA_DIBIT(pdata, n) \
146 ((*((const l_uint32 *)(pdata) + ((n) >> 4)) >> (2 * (15 - ((n) & 15)))) & 3)
147
149#define SET_DATA_DIBIT(pdata, n, val) \
150 *((l_uint32 *)(pdata) + ((n) >> 4)) = \
151 ((*((l_uint32 *)(pdata) + ((n) >> 4)) \
152 & (~(0xc0000000 >> (2 * ((n) & 15))))) \
153 | ((l_uint32)((val) & 3) << (30 - 2 * ((n) & 15))))
154
156#define CLEAR_DATA_DIBIT(pdata, n) \
157 *((l_uint32 *)(pdata) + ((n) >> 4)) &= ~(0xc0000000 >> (2 * ((n) & 15)))
158
159
160 /*--------------------------------------------------*
161 * 4 bit access *
162 *--------------------------------------------------*/
164#define GET_DATA_QBIT(pdata, n) \
165 ((*((const l_uint32 *)(pdata) + ((n) >> 3)) >> (4 * (7 - ((n) & 7)))) & 0xf)
166
168#define SET_DATA_QBIT(pdata, n, val) \
169 *((l_uint32 *)(pdata) + ((n) >> 3)) = \
170 ((*((l_uint32 *)(pdata) + ((n) >> 3)) \
171 & (~(0xf0000000 >> (4 * ((n) & 7))))) \
172 | ((l_uint32)((val) & 15) << (28 - 4 * ((n) & 7))))
173
175#define CLEAR_DATA_QBIT(pdata, n) \
176 *((l_uint32 *)(pdata) + ((n) >> 3)) &= ~(0xf0000000 >> (4 * ((n) & 7)))
177
178
179 /*--------------------------------------------------*
180 * 8 bit access *
181 *--------------------------------------------------*/
182#ifdef L_BIG_ENDIAN
184#define GET_DATA_BYTE(pdata, n) \
185 (*((const l_uint8 *)(pdata) + (n)))
186#else /* L_LITTLE_ENDIAN */
188#define GET_DATA_BYTE(pdata, n) \
189 (*(l_uint8 *)((l_uintptr_t)((const l_uint8 *)(pdata) + (n)) ^ 3))
190#endif /* L_BIG_ENDIAN */
191
192#ifdef L_BIG_ENDIAN
194#define SET_DATA_BYTE(pdata, n, val) \
195 *((l_uint8 *)(pdata) + (n)) = (val)
196#else /* L_LITTLE_ENDIAN */
198#define SET_DATA_BYTE(pdata, n, val) \
199 *(l_uint8 *)((l_uintptr_t)((l_uint8 *)(pdata) + (n)) ^ 3) = (val)
200#endif /* L_BIG_ENDIAN */
201
202
203 /*--------------------------------------------------*
204 * 16 bit access *
205 *--------------------------------------------------*/
206#ifdef L_BIG_ENDIAN
208#define GET_DATA_TWO_BYTES(pdata, n) \
209 (*((const l_uint16 *)(pdata) + (n)))
210#else /* L_LITTLE_ENDIAN */
212#define GET_DATA_TWO_BYTES(pdata, n) \
213 (*(l_uint16 *)((l_uintptr_t)((const l_uint16 *)(pdata) + (n)) ^ 2))
214#endif /* L_BIG_ENDIAN */
215
216#ifdef L_BIG_ENDIAN
218#define SET_DATA_TWO_BYTES(pdata, n, val) \
219 *((l_uint16 *)(pdata) + (n)) = (val)
220#else /* L_LITTLE_ENDIAN */
222#define SET_DATA_TWO_BYTES(pdata, n, val) \
223 *(l_uint16 *)((l_uintptr_t)((l_uint16 *)(pdata) + (n)) ^ 2) = (val)
224#endif /* L_BIG_ENDIAN */
225
226
227 /*--------------------------------------------------*
228 * 32 bit access *
229 *--------------------------------------------------*/
231#define GET_DATA_FOUR_BYTES(pdata, n) \
232 (*((const l_uint32 *)(pdata) + (n)))
233
235#define SET_DATA_FOUR_BYTES(pdata, n, val) \
236 *((l_uint32 *)(pdata) + (n)) = (val)
237
238
239#else
240
241 /*=============================================================*/
242 /* Slower: use function calls for all accessors */
243 /*=============================================================*/
244
245#define GET_DATA_BIT(pdata, n) l_getDataBit(pdata, n)
246#define SET_DATA_BIT(pdata, n) l_setDataBit(pdata, n)
247#define CLEAR_DATA_BIT(pdata, n) l_clearDataBit(pdata, n)
248#define SET_DATA_BIT_VAL(pdata, n, val) l_setDataBitVal(pdata, n, val)
249
250#define GET_DATA_DIBIT(pdata, n) l_getDataDibit(pdata, n)
251#define SET_DATA_DIBIT(pdata, n, val) l_setDataDibit(pdata, n, val)
252#define CLEAR_DATA_DIBIT(pdata, n) l_clearDataDibit(pdata, n)
253
254#define GET_DATA_QBIT(pdata, n) l_getDataQbit(pdata, n)
255#define SET_DATA_QBIT(pdata, n, val) l_setDataQbit(pdata, n, val)
256#define CLEAR_DATA_QBIT(pdata, n) l_clearDataQbit(pdata, n)
257
258#define GET_DATA_BYTE(pdata, n) l_getDataByte(pdata, n)
259#define SET_DATA_BYTE(pdata, n, val) l_setDataByte(pdata, n, val)
260
261#define GET_DATA_TWO_BYTES(pdata, n) l_getDataTwoBytes(pdata, n)
262#define SET_DATA_TWO_BYTES(pdata, n, val) l_setDataTwoBytes(pdata, n, val)
263
264#define GET_DATA_FOUR_BYTES(pdata, n) l_getDataFourBytes(pdata, n)
265#define SET_DATA_FOUR_BYTES(pdata, n, val) l_setDataFourBytes(pdata, n, val)
266
267#endif /* USE_INLINE_ACCESSORS */
268
269
270#endif /* LEPTONICA_ARRAY_ACCESS_H */