30#define FT_COMPONENT stream
34 FT_Stream_OpenMemory( FT_Stream stream,
38 stream->base = (FT_Byte*) base;
41 stream->cursor = NULL;
48 FT_Stream_Close( FT_Stream stream )
50 if ( stream && stream->close )
51 stream->close( stream );
55 FT_BASE_DEF( FT_Error )
56 FT_Stream_Seek( FT_Stream stream,
59 FT_Error error = FT_Err_Ok;
64 if ( stream->read( stream, pos, NULL, 0 ) )
66 FT_ERROR((
"FT_Stream_Seek:"
67 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
70 error = FT_THROW( Invalid_Stream_Operation );
74 else if ( pos > stream->size )
76 FT_ERROR((
"FT_Stream_Seek:"
77 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
80 error = FT_THROW( Invalid_Stream_Operation );
90 FT_BASE_DEF( FT_Error )
91 FT_Stream_Skip( FT_Stream stream,
95 return FT_THROW( Invalid_Stream_Operation );
97 return FT_Stream_Seek( stream, stream->pos + (FT_ULong)distance );
101 FT_BASE_DEF( FT_ULong )
102 FT_Stream_Pos( FT_Stream stream )
108 FT_BASE_DEF( FT_Error )
109 FT_Stream_Read( FT_Stream stream,
113 return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
117 FT_BASE_DEF( FT_Error )
118 FT_Stream_ReadAt( FT_Stream stream,
123 FT_Error error = FT_Err_Ok;
127 if ( pos >= stream->size )
129 FT_ERROR((
"FT_Stream_ReadAt:"
130 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
131 pos, stream->size ));
133 return FT_THROW( Invalid_Stream_Operation );
137 read_bytes = stream->read( stream, pos, buffer, count );
140 read_bytes = stream->size - pos;
141 if ( read_bytes > count )
146 FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
149 stream->pos = pos + read_bytes;
151 if ( read_bytes < count )
153 FT_ERROR((
"FT_Stream_ReadAt:"
154 " invalid read; expected %lu bytes, got %lu\n",
155 count, read_bytes ));
157 error = FT_THROW( Invalid_Stream_Operation );
164 FT_BASE_DEF( FT_ULong )
165 FT_Stream_TryRead( FT_Stream stream,
169 FT_ULong read_bytes = 0;
172 if ( stream->pos >= stream->size )
176 read_bytes = stream->read( stream, stream->pos, buffer, count );
179 read_bytes = stream->size - stream->pos;
180 if ( read_bytes > count )
185 FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
188 stream->pos += read_bytes;
195 FT_BASE_DEF( FT_Error )
196 FT_Stream_ExtractFrame( FT_Stream stream,
203 error = FT_Stream_EnterFrame( stream, count );
206 *pbytes = (FT_Byte*)stream->cursor;
209 stream->cursor = NULL;
210 stream->limit = NULL;
218 FT_Stream_ReleaseFrame( FT_Stream stream,
221 if ( stream && stream->read )
223 FT_Memory memory = stream->memory;
226#ifdef FT_DEBUG_MEMORY
227 ft_mem_free( memory, *pbytes );
237 FT_BASE_DEF( FT_Error )
238 FT_Stream_EnterFrame( FT_Stream stream,
241 FT_Error error = FT_Err_Ok;
245 FT_TRACE7((
"FT_Stream_EnterFrame: %lu bytes\n", count ));
248 FT_ASSERT( stream && stream->cursor == 0 );
253 FT_Memory memory = stream->memory;
257 if ( count > stream->size )
259 FT_ERROR((
"FT_Stream_EnterFrame:"
260 " frame size (%lu) larger than stream size (%lu)\n",
261 count, stream->size ));
263 error = FT_THROW( Invalid_Stream_Operation );
267#ifdef FT_DEBUG_MEMORY
269 stream->base = (
unsigned char*)ft_mem_qalloc( memory,
275 if ( FT_QALLOC( stream->base, count ) )
279 read_bytes = stream->read( stream, stream->pos,
280 stream->base, count );
281 if ( read_bytes < count )
283 FT_ERROR((
"FT_Stream_EnterFrame:"
284 " invalid read; expected %lu bytes, got %lu\n",
285 count, read_bytes ));
287 FT_FREE( stream->base );
288 error = FT_THROW( Invalid_Stream_Operation );
291 stream->cursor = stream->base;
292 stream->limit = FT_OFFSET( stream->cursor, count );
293 stream->pos += read_bytes;
298 if ( stream->pos >= stream->size ||
299 stream->size - stream->pos < count )
301 FT_ERROR((
"FT_Stream_EnterFrame:"
302 " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
303 stream->pos, count, stream->size ));
305 error = FT_THROW( Invalid_Stream_Operation );
310 stream->cursor = stream->base + stream->pos;
311 stream->limit = stream->cursor + count;
312 stream->pos += count;
321 FT_Stream_ExitFrame( FT_Stream stream )
332 FT_TRACE7((
"FT_Stream_ExitFrame\n" ));
338 FT_Memory memory = stream->memory;
341#ifdef FT_DEBUG_MEMORY
342 ft_mem_free( memory, stream->base );
345 FT_FREE( stream->base );
349 stream->cursor = NULL;
350 stream->limit = NULL;
354 FT_BASE_DEF( FT_Byte )
355 FT_Stream_GetByte( FT_Stream stream )
360 FT_ASSERT( stream && stream->cursor );
363 if ( stream->cursor < stream->limit )
364 result = *stream->cursor++;
370 FT_BASE_DEF( FT_UInt16 )
371 FT_Stream_GetUShort( FT_Stream stream )
377 FT_ASSERT( stream && stream->cursor );
381 if ( p + 1 < stream->limit )
382 result = FT_NEXT_USHORT( p );
389 FT_BASE_DEF( FT_UInt16 )
390 FT_Stream_GetUShortLE( FT_Stream stream )
396 FT_ASSERT( stream && stream->cursor );
400 if ( p + 1 < stream->limit )
401 result = FT_NEXT_USHORT_LE( p );
408 FT_BASE_DEF( FT_UInt32 )
409 FT_Stream_GetUOffset( FT_Stream stream )
415 FT_ASSERT( stream && stream->cursor );
419 if ( p + 2 < stream->limit )
420 result = FT_NEXT_UOFF3( p );
426 FT_BASE_DEF( FT_UInt32 )
427 FT_Stream_GetULong( FT_Stream stream )
433 FT_ASSERT( stream && stream->cursor );
437 if ( p + 3 < stream->limit )
438 result = FT_NEXT_ULONG( p );
444 FT_BASE_DEF( FT_UInt32 )
445 FT_Stream_GetULongLE( FT_Stream stream )
451 FT_ASSERT( stream && stream->cursor );
455 if ( p + 3 < stream->limit )
456 result = FT_NEXT_ULONG_LE( p );
462 FT_BASE_DEF( FT_Byte )
463 FT_Stream_ReadByte( FT_Stream stream,
471 if ( stream->pos < stream->size )
475 if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
479 result = stream->base[stream->pos];
491 *error = FT_THROW( Invalid_Stream_Operation );
492 FT_ERROR((
"FT_Stream_ReadByte:"
493 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
494 stream->pos, stream->size ));
500 FT_BASE_DEF( FT_UInt16 )
501 FT_Stream_ReadUShort( FT_Stream stream,
506 FT_UInt16 result = 0;
511 if ( stream->pos + 1 < stream->size )
515 if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
521 p = stream->base + stream->pos;
524 result = FT_NEXT_USHORT( p );
536 *error = FT_THROW( Invalid_Stream_Operation );
537 FT_ERROR((
"FT_Stream_ReadUShort:"
538 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
539 stream->pos, stream->size ));
545 FT_BASE_DEF( FT_UInt16 )
546 FT_Stream_ReadUShortLE( FT_Stream stream,
551 FT_UInt16 result = 0;
556 if ( stream->pos + 1 < stream->size )
560 if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
566 p = stream->base + stream->pos;
569 result = FT_NEXT_USHORT_LE( p );
581 *error = FT_THROW( Invalid_Stream_Operation );
582 FT_ERROR((
"FT_Stream_ReadUShortLE:"
583 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
584 stream->pos, stream->size ));
590 FT_BASE_DEF( FT_ULong )
591 FT_Stream_ReadUOffset( FT_Stream stream,
601 if ( stream->pos + 2 < stream->size )
605 if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
611 p = stream->base + stream->pos;
614 result = FT_NEXT_UOFF3( p );
626 *error = FT_THROW( Invalid_Stream_Operation );
627 FT_ERROR((
"FT_Stream_ReadUOffset:"
628 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
629 stream->pos, stream->size ));
635 FT_BASE_DEF( FT_UInt32 )
636 FT_Stream_ReadULong( FT_Stream stream,
641 FT_UInt32 result = 0;
646 if ( stream->pos + 3 < stream->size )
650 if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
656 p = stream->base + stream->pos;
659 result = FT_NEXT_ULONG( p );
671 *error = FT_THROW( Invalid_Stream_Operation );
672 FT_ERROR((
"FT_Stream_ReadULong:"
673 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
674 stream->pos, stream->size ));
680 FT_BASE_DEF( FT_UInt32 )
681 FT_Stream_ReadULongLE( FT_Stream stream,
686 FT_UInt32 result = 0;
691 if ( stream->pos + 3 < stream->size )
695 if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
701 p = stream->base + stream->pos;
704 result = FT_NEXT_ULONG_LE( p );
716 *error = FT_THROW( Invalid_Stream_Operation );
717 FT_ERROR((
"FT_Stream_ReadULongLE:"
718 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
719 stream->pos, stream->size ));
725 FT_BASE_DEF( FT_Error )
726 FT_Stream_ReadFields( FT_Stream stream,
727 const FT_Frame_Field* fields,
731 FT_Bool frame_accessed = 0;
736 return FT_THROW( Invalid_Argument );
739 return FT_THROW( Invalid_Stream_Handle );
741 cursor = stream->cursor;
751 switch ( fields->value )
754 error = FT_Stream_EnterFrame( stream, fields->offset );
759 cursor = stream->cursor;
766 FT_Offset len = fields->size;
769 if ( len > (FT_Offset)( stream->limit - cursor ) )
771 error = FT_THROW( Invalid_Stream_Operation );
775 if ( fields->value == ft_frame_bytes )
777 p = (FT_Byte*)structure + fields->offset;
778 FT_MEM_COPY( p, cursor, len );
787 value = FT_NEXT_BYTE( cursor );
791 case ft_frame_short_be:
792 case ft_frame_ushort_be:
793 value = FT_NEXT_USHORT( cursor );
797 case ft_frame_short_le:
798 case ft_frame_ushort_le:
799 value = FT_NEXT_USHORT_LE( cursor );
803 case ft_frame_long_be:
804 case ft_frame_ulong_be:
805 value = FT_NEXT_ULONG( cursor );
809 case ft_frame_long_le:
810 case ft_frame_ulong_le:
811 value = FT_NEXT_ULONG_LE( cursor );
815 case ft_frame_off3_be:
816 case ft_frame_uoff3_be:
817 value = FT_NEXT_UOFF3( cursor );
821 case ft_frame_off3_le:
822 case ft_frame_uoff3_le:
823 value = FT_NEXT_UOFF3_LE( cursor );
829 stream->cursor = cursor;
834 if ( fields->value & FT_FRAME_OP_SIGNED )
835 value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
839 p = (FT_Byte*)structure + fields->offset;
840 switch ( fields->size )
842 case ( 8 / FT_CHAR_BIT ):
843 *(FT_Byte*)p = (FT_Byte)value;
846 case ( 16 / FT_CHAR_BIT ):
847 *(FT_UShort*)p = (FT_UShort)value;
850 case ( 32 / FT_CHAR_BIT ):
851 *(FT_UInt32*)p = (FT_UInt32)value;
855 *(FT_ULong*)p = (FT_ULong)value;
865 if ( frame_accessed )
866 FT_Stream_ExitFrame( stream );