pixmaploader.monkey2 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. Public
  21. #rem monkeydoc @hidden
  22. #end
  23. Function LoadPixmap:Pixmap( path:String,format:PixelFormat )
  24. Local x:Int,y:Int,comp:Int,req_comp:Int
  25. If format<>PixelFormat.Unknown req_comp=PixelFormatDepth( format )
  26. Local stream:=Stream.Open( path,"r" )
  27. If Not stream Return Null
  28. Local user:stbi_user
  29. user.stream=stream
  30. Local clbks:stbi_io_callbacks
  31. clbks.read=stbi_read
  32. clbks.skip=stbi_skip
  33. clbks.eof=stbi_eof
  34. Local data:=stbi_load_from_callbacks( Varptr clbks,Varptr user,Varptr x,Varptr y,Varptr comp,req_comp )
  35. stream.Close()
  36. If Not data Return Null
  37. If format=PixelFormat.Unknown
  38. Select comp
  39. Case 1 format=PixelFormat.I8
  40. Case 2 format=PixelFormat.IA16
  41. Case 3 format=PixelFormat.RGB24
  42. Case 4 format=PixelFormat.RGBA32
  43. Default Assert( False )
  44. End
  45. End
  46. Local pixmap:=New Pixmap( x,y,format,data,x*PixelFormatDepth( format ) )
  47. pixmap.OnDiscarded+=Lambda()
  48. stbi_image_free( data )
  49. End
  50. Return pixmap
  51. End