pixmaploader.monkey2 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. Namespace std.graphics.pixmaploader
  2. Using stb.image
  3. Using std.stream
  4. Internal
  5. Struct stbi_user
  6. Field stream:Stream
  7. End
  8. Function stbi_read:Int( user:Void Ptr,data:stbi_char Ptr,count:Int )
  9. Local stream:=Cast<stbi_user Ptr>( user )[0].stream
  10. Return stream.Read( data,count )
  11. End
  12. Function stbi_skip:Void( user:Void Ptr,count:Int )
  13. Local stream:=Cast<stbi_user Ptr>( user )[0].stream
  14. stream.Seek( stream.Position+count )
  15. End
  16. Function stbi_eof:Int( user:Void Ptr )
  17. Local stream:=Cast<stbi_user Ptr>( user )[0].stream
  18. Return stream.Eof
  19. End
  20. Class StbPixmap Extends Pixmap
  21. Method New( width:Int,height:Int,format:PixelFormat,data:UByte Ptr,pitch:Int )
  22. Super.New( width,height,format,data,pitch )
  23. _data=data
  24. End
  25. Private
  26. Field _data:UByte Ptr
  27. Method OnDiscard() Override
  28. If Not _data Return
  29. stbi_image_free( _data )
  30. Super.OnDiscard()
  31. _data=Null
  32. End
  33. Method OnFinalize() Override
  34. stbi_image_free( _data )
  35. End
  36. End
  37. Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
  38. Local stream:=Stream.Open( path,"r" )
  39. If Not stream Return Null
  40. Local user:stbi_user
  41. user.stream=stream
  42. Local clbks:stbi_io_callbacks
  43. clbks.read=stbi_read
  44. clbks.skip=stbi_skip
  45. clbks.eof=stbi_eof
  46. Local req_comp:Int,isfloat:Bool
  47. Select format
  48. Case PixelFormat.I8,PixelFormat.IA8,PixelFormat.RGB8,PixelFormat.RGBA8
  49. isfloat=False
  50. req_comp=PixelFormatDepth( format )
  51. Case PixelFormat.RGB32F
  52. isfloat=True
  53. req_comp=3
  54. Case PixelFormat.RGBA32F
  55. isfloat=True
  56. req_comp=4
  57. Case PixelFormat.Unknown
  58. Local pos:=stream.Position
  59. isfloat=stbi_is_hdr_from_callbacks( Varptr clbks,Varptr user )
  60. stream.Seek( pos )
  61. req_comp=0
  62. Default
  63. stream.Close()
  64. Return Null
  65. End
  66. Local x:Int,y:Int,comp:Int,data:UByte Ptr
  67. If isfloat
  68. stbi_ldr_to_hdr_gamma( 1.0 )
  69. stbi_hdr_to_ldr_gamma( 1.0 )
  70. data=Cast<UByte Ptr>( stbi_loadf_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp ) )
  71. If format=PixelFormat.Unknown
  72. Select comp
  73. Case 1 format=PixelFormat.I32F
  74. Case 2 format=PixelFormat.IA32F
  75. Case 3 format=PixelFormat.RGB32F
  76. Case 4 format=PixelFormat.RGBA32F
  77. End
  78. Endif
  79. Else
  80. data=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
  81. If format=PixelFormat.Unknown
  82. Select comp
  83. Case 1 format=PixelFormat.I8
  84. Case 2 format=PixelFormat.IA8
  85. Case 3 format=PixelFormat.RGB8
  86. Case 4 format=PixelFormat.RGBA8
  87. End
  88. Endif
  89. Endif
  90. stream.Close()
  91. If format=PixelFormat.Unknown
  92. Print "Unknown format for image at '"+path+"'"
  93. Return Null
  94. endif
  95. Local pixmap:=New StbPixmap( x,y,format,data,x*PixelFormatDepth( format ) )
  96. Return pixmap
  97. End
  98. #rem
  99. #rem monkeydoc @hidden
  100. #end
  101. Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
  102. If ExtractExt( path )=".hdr"
  103. Local file:=filesystem.OpenCFile( path,"rb" )
  104. If Not file Return Null
  105. Local width:=0,height:=0
  106. If RGBE_ReadHeader( file,Varptr width,Varptr height,Null )<>0
  107. libc.fclose( file )
  108. Return Null
  109. Endif
  110. Local pixmap:=New Pixmap( width,height,PixelFormat.RGB32F )
  111. RGBE_ReadPixels_RLE( file,Cast<Float Ptr>( pixmap.Data ),width,height )
  112. If format<>PixelFormat.Unknown And format<>PixelFormat.RGB32F
  113. pixmap=pixmap.Convert( format )
  114. Endif
  115. libc.fclose( file )
  116. Return pixmap
  117. Endif
  118. Local x:Int,y:Int,comp:Int,req_comp:Int
  119. If format<>PixelFormat.Unknown req_comp=PixelFormatDepth( format )
  120. Local stream:=Stream.Open( path,"r" )
  121. If Not stream Return Null
  122. Local user:stbi_user
  123. user.stream=stream
  124. Local clbks:stbi_io_callbacks
  125. clbks.read=stbi_read
  126. clbks.skip=stbi_skip
  127. clbks.eof=stbi_eof
  128. Local data:=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
  129. stream.Close()
  130. If Not data Return Null
  131. If format=PixelFormat.Unknown
  132. Select comp
  133. Case 1 format=PixelFormat.I8
  134. Case 2 format=PixelFormat.IA16
  135. Case 3 format=PixelFormat.RGB24
  136. Case 4 format=PixelFormat.RGBA32
  137. Default Assert( False )
  138. End
  139. End
  140. Local pixmap:=New StbPixmap( x,y,format,data,x*PixelFormatDepth( format ) )
  141. Return pixmap
  142. End
  143. #End