Leptonica
1.73
Image processing and image analysis suite
src
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
105
#define USE_INLINE_ACCESSORS 1
106
107
#if USE_INLINE_ACCESSORS
108
109
/*=============================================================*/
110
/* Faster: use in line accessors */
111
/*=============================================================*/
112
113
/*--------------------------------------------------*
114
* 1 bit access *
115
*--------------------------------------------------*/
117
#define GET_DATA_BIT(pdata, n) \
118
((*((l_uint32 *)(pdata) + ((n) >> 5)) >> (31 - ((n) & 31))) & 1)
119
121
#define SET_DATA_BIT(pdata, n) \
122
*((l_uint32 *)(pdata) + ((n) >> 5)) |= (0x80000000 >> ((n) & 31))
123
125
#define CLEAR_DATA_BIT(pdata, n) \
126
*((l_uint32 *)(pdata) + ((n) >> 5)) &= ~(0x80000000 >> ((n) & 31))
127
129
#define SET_DATA_BIT_VAL(pdata, n, val) \
130
*((l_uint32 *)(pdata) + ((n) >> 5)) = \
131
((*((l_uint32 *)(pdata) + ((n) >> 5)) \
132
& (~(0x80000000 >> ((n) & 31)))) \
133
| ((val) << (31 - ((n) & 31))))
134
135
/*--------------------------------------------------*
136
* 2 bit access *
137
*--------------------------------------------------*/
139
#define GET_DATA_DIBIT(pdata, n) \
140
((*((l_uint32 *)(pdata) + ((n) >> 4)) >> (2 * (15 - ((n) & 15)))) & 3)
141
143
#define SET_DATA_DIBIT(pdata, n, val) \
144
*((l_uint32 *)(pdata) + ((n) >> 4)) = \
145
((*((l_uint32 *)(pdata) + ((n) >> 4)) \
146
& (~(0xc0000000 >> (2 * ((n) & 15))))) \
147
| (((val) & 3) << (30 - 2 * ((n) & 15))))
148
150
#define CLEAR_DATA_DIBIT(pdata, n) \
151
*((l_uint32 *)(pdata) + ((n) >> 4)) &= ~(0xc0000000 >> (2 * ((n) & 15)))
152
153
154
/*--------------------------------------------------*
155
* 4 bit access *
156
*--------------------------------------------------*/
158
#define GET_DATA_QBIT(pdata, n) \
159
((*((l_uint32 *)(pdata) + ((n) >> 3)) >> (4 * (7 - ((n) & 7)))) & 0xf)
160
162
#define SET_DATA_QBIT(pdata, n, val) \
163
*((l_uint32 *)(pdata) + ((n) >> 3)) = \
164
((*((l_uint32 *)(pdata) + ((n) >> 3)) \
165
& (~(0xf0000000 >> (4 * ((n) & 7))))) \
166
| (((val) & 15) << (28 - 4 * ((n) & 7))))
167
169
#define CLEAR_DATA_QBIT(pdata, n) \
170
*((l_uint32 *)(pdata) + ((n) >> 3)) &= ~(0xf0000000 >> (4 * ((n) & 7)))
171
172
173
/*--------------------------------------------------*
174
* 8 bit access *
175
*--------------------------------------------------*/
176
#ifdef L_BIG_ENDIAN
177
178
#define GET_DATA_BYTE(pdata, n) \
179
(*((l_uint8 *)(pdata) + (n)))
180
#else
/* L_LITTLE_ENDIAN */
181
182
#define GET_DATA_BYTE(pdata, n) \
183
(*(l_uint8 *)((l_uintptr_t)((l_uint8 *)(pdata) + (n)) ^ 3))
184
#endif
/* L_BIG_ENDIAN */
185
186
#ifdef L_BIG_ENDIAN
187
188
#define SET_DATA_BYTE(pdata, n, val) \
189
*((l_uint8 *)(pdata) + (n)) = (val)
190
#else
/* L_LITTLE_ENDIAN */
191
192
#define SET_DATA_BYTE(pdata, n, val) \
193
*(l_uint8 *)((l_uintptr_t)((l_uint8 *)(pdata) + (n)) ^ 3) = (val)
194
#endif
/* L_BIG_ENDIAN */
195
196
197
/*--------------------------------------------------*
198
* 16 bit access *
199
*--------------------------------------------------*/
200
#ifdef L_BIG_ENDIAN
201
202
#define GET_DATA_TWO_BYTES(pdata, n) \
203
(*((l_uint16 *)(pdata) + (n)))
204
#else
/* L_LITTLE_ENDIAN */
205
206
#define GET_DATA_TWO_BYTES(pdata, n) \
207
(*(l_uint16 *)((l_uintptr_t)((l_uint16 *)(pdata) + (n)) ^ 2))
208
#endif
/* L_BIG_ENDIAN */
209
210
#ifdef L_BIG_ENDIAN
211
212
#define SET_DATA_TWO_BYTES(pdata, n, val) \
213
*((l_uint16 *)(pdata) + (n)) = (val)
214
#else
/* L_LITTLE_ENDIAN */
215
216
#define SET_DATA_TWO_BYTES(pdata, n, val) \
217
*(l_uint16 *)((l_uintptr_t)((l_uint16 *)(pdata) + (n)) ^ 2) = (val)
218
#endif
/* L_BIG_ENDIAN */
219
220
221
/*--------------------------------------------------*
222
* 32 bit access *
223
*--------------------------------------------------*/
225
#define GET_DATA_FOUR_BYTES(pdata, n) \
226
(*((l_uint32 *)(pdata) + (n)))
227
229
#define SET_DATA_FOUR_BYTES(pdata, n, val) \
230
*((l_uint32 *)(pdata) + (n)) = (val)
231
232
233
#else
234
235
/*=============================================================*/
236
/* Slower: use function calls for all accessors */
237
/*=============================================================*/
238
239
#define GET_DATA_BIT(pdata, n) l_getDataBit(pdata, n)
240
#define SET_DATA_BIT(pdata, n) l_setDataBit(pdata, n)
241
#define CLEAR_DATA_BIT(pdata, n) l_clearDataBit(pdata, n)
242
#define SET_DATA_BIT_VAL(pdata, n, val) l_setDataBitVal(pdata, n, val)
243
244
#define GET_DATA_DIBIT(pdata, n) l_getDataDibit(pdata, n)
245
#define SET_DATA_DIBIT(pdata, n, val) l_setDataDibit(pdata, n, val)
246
#define CLEAR_DATA_DIBIT(pdata, n) l_clearDataDibit(pdata, n)
247
248
#define GET_DATA_QBIT(pdata, n) l_getDataQbit(pdata, n)
249
#define SET_DATA_QBIT(pdata, n, val) l_setDataQbit(pdata, n, val)
250
#define CLEAR_DATA_QBIT(pdata, n) l_clearDataQbit(pdata, n)
251
252
#define GET_DATA_BYTE(pdata, n) l_getDataByte(pdata, n)
253
#define SET_DATA_BYTE(pdata, n, val) l_setDataByte(pdata, n, val)
254
255
#define GET_DATA_TWO_BYTES(pdata, n) l_getDataTwoBytes(pdata, n)
256
#define SET_DATA_TWO_BYTES(pdata, n, val) l_setDataTwoBytes(pdata, n, val)
257
258
#define GET_DATA_FOUR_BYTES(pdata, n) l_getDataFourBytes(pdata, n)
259
#define SET_DATA_FOUR_BYTES(pdata, n, val) l_setDataFourBytes(pdata, n, val)
260
261
#endif
/* USE_INLINE_ACCESSORS */
262
263
264
#endif
/* LEPTONICA_ARRAY_ACCESS_H */
Generated by
1.8.14