pixmaploader.monkey2 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. Namespace std.graphics.pixmaploader
  2. Private
  3. Using stb.image
  4. Using std.stream
  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. #rem monkeydoc @hidden
  21. #end
  22. Class StbPixmap Extends Pixmap
  23. Method New( width:Int,height:Int,format:PixelFormat,data:UByte Ptr,pitch:Int )
  24. Super.New( width,height,format,data,pitch )
  25. _data=data
  26. End
  27. Private
  28. Field _data:UByte Ptr
  29. Method OnDiscard() Override
  30. Super.OnDiscard()
  31. stbi_image_free( _data )
  32. _data=Null
  33. End
  34. Method OnFinalize() Override
  35. stbi_image_free( _data )
  36. End
  37. End
  38. Public
  39. #rem monkeydoc @hidden
  40. #end
  41. Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
  42. Local x:Int,y:Int,comp:Int,req_comp:Int
  43. If format<>PixelFormat.Unknown req_comp=PixelFormatDepth( format )
  44. Local stream:=Stream.Open( path,"r" )
  45. If Not stream Return Null
  46. Local user:stbi_user
  47. user.stream=stream
  48. Local clbks:stbi_io_callbacks
  49. clbks.read=stbi_read
  50. clbks.skip=stbi_skip
  51. clbks.eof=stbi_eof
  52. Local data:=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
  53. stream.Close()
  54. If Not data Return Null
  55. If format=PixelFormat.Unknown
  56. Select comp
  57. Case 1 format=PixelFormat.I8
  58. Case 2 format=PixelFormat.IA16
  59. Case 3 format=PixelFormat.RGB24
  60. Case 4 format=PixelFormat.RGBA32
  61. Default Assert( False )
  62. End
  63. End
  64. Local pixmap:=New StbPixmap( x,y,format,data,x*PixelFormatDepth( format ) )
  65. Return pixmap
  66. End