1 // special stream classes
9 SysUtils
, Classes
, xstreams
;
13 // ïîòîê-îá¸ðòêà äëÿ SDL_RWops
14 TSFSSDLStream
= class(TStream
)
16 fRW
: PSDL_RWops
; // SDL-íàÿ ïðîêëàäêà
17 fFreeSource
: Boolean; // óáèâàòü èñõîäíèê ïðè ïîìèðàíèè?
20 constructor Create (aSrc
: PSDL_RWops
; aFreeSource
: Boolean=true);
21 destructor Destroy (); override;
23 function Read (var buffer
; count
: LongInt): LongInt; override;
24 function Write (const buffer
; count
: LongInt): LongInt; override;
25 function Seek (const offset
: Int64; origin
: TSeekOrigin
): Int64; override;
33 constructor TSFSSDLStream
.Create (aSrc
: PSDL_RWops
; aFreeSource
: Boolean=true);
36 //ASSERT(aSrc <> nil);
38 fFreeSource
:= aFreeSource
;
41 destructor TSFSSDLStream
.Destroy ();
43 if fFreeSource
and (fRW
<> nil) then SDL_FreeRW(fRW
);
47 function TSFSSDLStream
.Read (var buffer
; count
: LongInt): LongInt;
49 if (fRW
= nil) or (count
<= 0) then begin result
:= 0; exit
; end;
50 result
:= SDL_RWread(fRW
, @buffer
, 1, count
);
53 function TSFSSDLStream
.Write (const buffer
; count
: LongInt): LongInt;
55 if (fRW
= nil) or (count
<= 0) then begin result
:= 0; exit
; end;
56 result
:= SDL_RWwrite(fRW
, @buffer
, 1, count
);
59 function TSFSSDLStream
.Seek (const offset
: Int64; origin
: TSeekOrigin
): Int64;
63 if fRW
= nil then begin result
:= 0; exit
; end;
65 soBeginning
: ss
:= RW_SEEK_SET
;
66 soCurrent
: ss
:= RW_SEEK_CUR
;
67 soEnd
: ss
:= RW_SEEK_END
;
68 else raise XStreamError
.Create('invalid Seek() call');
69 // äðóãèõ íå áûâàåò. à ó êîãî áûâàåò, òîìó ÿ íå äîêòîð.
71 result
:= SDL_RWseek(fRW
, offset
, ss
);
72 if result
= -1 then raise XStreamError
.Create('Seek() error');