2 * Copyright 2004-2008, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
12 #include <ByteOrder.h>
17 byte_swap(T
&/*data*/)
19 // Specialize for data types which actually swap
20 // printf("DEAD MEAT!\n");
27 byte_swap(float &data
)
29 data
= __swap_float(data
);
35 byte_swap(int32
&data
)
37 data
= __swap_int32(data
);
43 byte_swap(uint32
&data
)
45 data
= __swap_int32(data
);
51 byte_swap(int16
&data
)
53 data
= __swap_int16(data
);
59 byte_swap(uint16
&data
)
61 data
= __swap_int16(data
);
67 TReadHelper(BPositionIO
& stream
)
69 fStream(&stream
, 65536, false),
75 template<class T
> inline void
78 fError
= fStream
.Read((void *)&data
, sizeof(T
));
90 template<class T
> inline void
91 operator()(T data
, size_t length
)
93 fError
= fStream
.Read((void *)data
, length
);
94 if (fError
< (ssize_t
)length
)
103 template<class T
> inline T
107 fError
= fStream
.Read((void *)&value
, sizeof(T
));
122 if (type
== TIFF_UINT16_TYPE
|| type
== TIFF_INT16_TYPE
)
123 return Next
<uint16
>();
125 return Next
<uint32
>();
129 NextDouble(uint16 type
)
132 case TIFF_UINT16_TYPE
:
133 return Next
<uint16
>();
134 case TIFF_UINT32_TYPE
:
135 return Next
<uint32
>();
136 case TIFF_UFRACTION_TYPE
:
138 double value
= Next
<uint32
>();
139 return value
/ Next
<uint32
>();
141 case TIFF_INT16_TYPE
:
142 return Next
<int16
>();
143 case TIFF_INT32_TYPE
:
144 return Next
<int32
>();
145 case TIFF_FRACTION_TYPE
:
147 double value
= Next
<int32
>();
148 return value
/ Next
<int32
>();
150 case TIFF_FLOAT_TYPE
:
151 return Next
<float>();
152 case TIFF_DOUBLE_TYPE
:
153 return Next
<double>();
156 return Next
<uint8
>();
161 NextShorts(uint16
* data
, size_t length
)
163 fError
= fStream
.Read(data
, length
* 2);
164 if (fError
< (ssize_t
)length
* 2)
167 if (fError
>= B_OK
) {
169 swap_data(B_INT16_TYPE
, data
, length
* 2, B_SWAP_ALWAYS
);
176 status_t
Status() const
177 { return fError
>= B_OK
? B_OK
: fError
; };
179 off_t
Seek(off_t offset
, int32 mode
)
180 { return fStream
.Seek(offset
, mode
); }
181 off_t
Position() const
182 { return fStream
.Position(); }
184 void SetSwap(bool yesNo
) { fSwap
= yesNo
; };
185 bool IsSwapping() const { return fSwap
; };
187 BPositionIO
& Stream() { return fStream
; }
195 #endif // READ_HELPER_H