Leptonica
1.82.0
Image processing and image analysis suite
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
183
184
#define GET_DATA_BYTE(pdata, n) \
185
(*((const l_uint8 *)(pdata) + (n)))
186
#else
/* L_LITTLE_ENDIAN */
187
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
193
194
#define SET_DATA_BYTE(pdata, n, val) \
195
*((l_uint8 *)(pdata) + (n)) = (val)
196
#else
/* L_LITTLE_ENDIAN */
197
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
207
208
#define GET_DATA_TWO_BYTES(pdata, n) \
209
(*((const l_uint16 *)(pdata) + (n)))
210
#else
/* L_LITTLE_ENDIAN */
211
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
217
218
#define SET_DATA_TWO_BYTES(pdata, n, val) \
219
*((l_uint16 *)(pdata) + (n)) = (val)
220
#else
/* L_LITTLE_ENDIAN */
221
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 */
src
arrayaccess.h
Generated by
1.8.15