M109uk
27-03-2007, 10:47 PM
Hi all,
I have data stored in a memory stream, i am trying to use SDL_Image to load the image.
I currently have the following code:
var
SDLStream: TSDL_RWops;
SDLStream := StreamToRWops(_XPacks.Items[Index].GetStream(Filen ame).Stream);
Surface := IMG_Load_RW(@SDLStream, 1);
If Surface = Nil Then Exit;
function Seek(Context: PSDL_RWops; Offset: Integer; Whence: Integer): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Case Whence Of
SEEK_SET: Stream.Position := Offset;
SEEK_CUR: Stream.Position := Stream.Position+Offset;
SEEK_END: Stream.Position := Stream.Size+Offset;
End;
Result := Stream.Position;
end;
function Read(Context: PSDL_RWops; Ptr: Pointer; Size: Integer; Maxnum: Integer ): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Result := Stream.Read(Ptr^, Size*Maxnum) Div Size;
end;
function Write(Context: PSDL_RWops; Ptr: Pointer; Size: Integer; Num: Integer ): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Result := Stream.Write(Ptr^, Size*Num) Div Size;
end;
function Close(Context: PSDL_RWops): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
if Stream = nil then
begin
Result := -1;
Exit;
end;
Stream.Destroy;
context^.unknown.data1 := nil;
Result := 0;
end;
function StreamToRWops(Stream: TStream): TSDL_RWops;
begin
Result.type_ := 2;
Result.unknown.data1 := Stream;
Result.seek := @Seek;
Result.read := @Read;
Result.write := @Write;
Result.close := @Close;
end;
procedure RWopsToStream(RW: PSDL_RWops; Stream: TStream);
var
Buf: Pointer;
Read: Integer;
begin
If Stream = Nil Then Exit;
If RW = Nil Then Exit;
GetMem(Buf, 1024);
Try
Read := RW^.Read(RW, Buf, 1, 1024);
While Read > 0 Do
Begin
Stream.Write(Buf^, Read);
Read := RW^.Read(RW, Buf, 1, 1024);
End;
Finally
FreeMem(Buf);
End;
end;
Everytime i get to the stage of loading the data to IMG_Load_RW i get an access violation.
Does anyone know if im i missing something?
Many Thanks
I have data stored in a memory stream, i am trying to use SDL_Image to load the image.
I currently have the following code:
var
SDLStream: TSDL_RWops;
SDLStream := StreamToRWops(_XPacks.Items[Index].GetStream(Filen ame).Stream);
Surface := IMG_Load_RW(@SDLStream, 1);
If Surface = Nil Then Exit;
function Seek(Context: PSDL_RWops; Offset: Integer; Whence: Integer): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Case Whence Of
SEEK_SET: Stream.Position := Offset;
SEEK_CUR: Stream.Position := Stream.Position+Offset;
SEEK_END: Stream.Position := Stream.Size+Offset;
End;
Result := Stream.Position;
end;
function Read(Context: PSDL_RWops; Ptr: Pointer; Size: Integer; Maxnum: Integer ): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Result := Stream.Read(Ptr^, Size*Maxnum) Div Size;
end;
function Write(Context: PSDL_RWops; Ptr: Pointer; Size: Integer; Num: Integer ): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
If Stream = Nil Then
Begin
Result := -1;
Exit;
End;
Result := Stream.Write(Ptr^, Size*Num) Div Size;
end;
function Close(Context: PSDL_RWops): Integer;
var
Stream: TStream;
begin
Stream := TStream(Context^.unknown.data1);
if Stream = nil then
begin
Result := -1;
Exit;
end;
Stream.Destroy;
context^.unknown.data1 := nil;
Result := 0;
end;
function StreamToRWops(Stream: TStream): TSDL_RWops;
begin
Result.type_ := 2;
Result.unknown.data1 := Stream;
Result.seek := @Seek;
Result.read := @Read;
Result.write := @Write;
Result.close := @Close;
end;
procedure RWopsToStream(RW: PSDL_RWops; Stream: TStream);
var
Buf: Pointer;
Read: Integer;
begin
If Stream = Nil Then Exit;
If RW = Nil Then Exit;
GetMem(Buf, 1024);
Try
Read := RW^.Read(RW, Buf, 1, 1024);
While Read > 0 Do
Begin
Stream.Write(Buf^, Read);
Read := RW^.Read(RW, Buf, 1, 1024);
End;
Finally
FreeMem(Buf);
End;
end;
Everytime i get to the stage of loading the data to IMG_Load_RW i get an access violation.
Does anyone know if im i missing something?
Many Thanks