123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- Namespace std.graphics.pixmaploader
- Using stb.image
- Using std.stream
- Internal
- Struct stbi_user
- Field stream:Stream
- End
- Function stbi_read:Int( user:Void Ptr,data:stbi_char Ptr,count:Int )
- Local stream:=Cast<stbi_user Ptr>( user )[0].stream
- Return stream.Read( data,count )
- End
- Function stbi_skip:Void( user:Void Ptr,count:Int )
- Local stream:=Cast<stbi_user Ptr>( user )[0].stream
- stream.Seek( stream.Position+count )
- End
- Function stbi_eof:Int( user:Void Ptr )
- Local stream:=Cast<stbi_user Ptr>( user )[0].stream
- Return stream.Eof
- End
- Class StbPixmap Extends Pixmap
-
- Method New( width:Int,height:Int,format:PixelFormat,data:UByte Ptr,pitch:Int )
- Super.New( width,height,format,data,pitch )
-
- _data=data
- End
-
- Private
-
- Field _data:UByte Ptr
-
- Method OnDiscard() Override
-
- If Not _data Return
-
- stbi_image_free( _data )
-
- Super.OnDiscard()
-
- _data=Null
- End
-
- Method OnFinalize() Override
-
- stbi_image_free( _data )
- End
- End
- Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
-
- Local stream:=Stream.Open( path,"r" )
- If Not stream Return Null
- Local user:stbi_user
- user.stream=stream
-
- Local clbks:stbi_io_callbacks
- clbks.read=stbi_read
- clbks.skip=stbi_skip
- clbks.eof=stbi_eof
- Local req_comp:Int,isfloat:Bool
-
- Select format
- Case PixelFormat.I8,PixelFormat.IA8,PixelFormat.RGB8,PixelFormat.RGBA8
- isfloat=False
- req_comp=PixelFormatDepth( format )
- Case PixelFormat.RGB32F
- isfloat=True
- req_comp=3
- Case PixelFormat.RGBA32F
- isfloat=True
- req_comp=4
- Case PixelFormat.Unknown
- Local pos:=stream.Position
- isfloat=stbi_is_hdr_from_callbacks( Varptr clbks,Varptr user )
- stream.Seek( pos )
- req_comp=0
- Default
- stream.Close()
- Return Null
- End
-
- Local x:Int,y:Int,comp:Int,data:UByte Ptr
-
- If isfloat
-
- stbi_ldr_to_hdr_gamma( 1.0 )
- stbi_hdr_to_ldr_gamma( 1.0 )
-
- data=Cast<UByte Ptr>( stbi_loadf_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp ) )
-
- If format=PixelFormat.Unknown
- Select comp
- Case 1 format=PixelFormat.I32F
- Case 2 format=PixelFormat.IA32F
- Case 3 format=PixelFormat.RGB32F
- Case 4 format=PixelFormat.RGBA32F
- End
- Endif
- Else
-
- data=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
-
- If format=PixelFormat.Unknown
- Select comp
- Case 1 format=PixelFormat.I8
- Case 2 format=PixelFormat.IA8
- Case 3 format=PixelFormat.RGB8
- Case 4 format=PixelFormat.RGBA8
- End
- Endif
- Endif
-
- stream.Close()
-
- If format=PixelFormat.Unknown
- Print "Unknown format for image at '"+path+"'"
- Return Null
- endif
-
- Local pixmap:=New StbPixmap( x,y,format,data,x*PixelFormatDepth( format ) )
-
- Return pixmap
- End
- #rem
- #rem monkeydoc @hidden
- #end
- Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
-
- If ExtractExt( path )=".hdr"
-
- Local file:=filesystem.OpenCFile( path,"rb" )
- If Not file Return Null
-
- Local width:=0,height:=0
-
- If RGBE_ReadHeader( file,Varptr width,Varptr height,Null )<>0
- libc.fclose( file )
- Return Null
- Endif
-
- Local pixmap:=New Pixmap( width,height,PixelFormat.RGB32F )
-
- RGBE_ReadPixels_RLE( file,Cast<Float Ptr>( pixmap.Data ),width,height )
-
- If format<>PixelFormat.Unknown And format<>PixelFormat.RGB32F
- pixmap=pixmap.Convert( format )
- Endif
-
- libc.fclose( file )
- Return pixmap
- Endif
- Local x:Int,y:Int,comp:Int,req_comp:Int
-
- If format<>PixelFormat.Unknown req_comp=PixelFormatDepth( format )
-
- Local stream:=Stream.Open( path,"r" )
- If Not stream Return Null
- Local user:stbi_user
- user.stream=stream
-
- Local clbks:stbi_io_callbacks
- clbks.read=stbi_read
- clbks.skip=stbi_skip
- clbks.eof=stbi_eof
-
- Local data:=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
-
- stream.Close()
-
- If Not data Return Null
-
- If format=PixelFormat.Unknown
- Select comp
- Case 1 format=PixelFormat.I8
- Case 2 format=PixelFormat.IA16
- Case 3 format=PixelFormat.RGB24
- Case 4 format=PixelFormat.RGBA32
- Default Assert( False )
- End
- End
-
- Local pixmap:=New StbPixmap( x,y,format,data,x*PixelFormatDepth( format ) )
-
- Return pixmap
- End
- #End
|