skin.monkey2 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. Namespace mojo.app
  2. #rem monkeydoc @hidden
  3. #end
  4. Class Skin
  5. Property Image:Image()
  6. Return _image
  7. End
  8. Property Bounds:Recti()
  9. Return _bounds
  10. End
  11. Method Draw( canvas:Canvas,rect:Recti )
  12. Local x0:=rect.Left
  13. Local x1:=rect.Left+_x1
  14. Local x2:=rect.Right-(_x3-_x2)
  15. Local x3:=rect.Right
  16. Local y0:=rect.Top
  17. Local y1:=rect.Top+_y1
  18. Local y2:=rect.Bottom-(_y3-_y2)
  19. Local y3:=rect.Bottom
  20. canvas.DrawRect( x0,y0,x1-x0,y1-y0,_image,_x0,_y0,_x1-_x0,_y1-_y0 )
  21. canvas.DrawRect( x1,y0,x2-x1,y1-y0,_image,_x1,_y0,_x2-_x1,_y1-_y0 )
  22. canvas.DrawRect( x2,y0,x3-x2,y1-y0,_image,_x2,_y0,_x3-_x2,_y1-_y0 )
  23. canvas.DrawRect( x0,y1,x1-x0,y2-y1,_image,_x0,_y1,_x1-_x0,_y2-_y1 )
  24. canvas.DrawRect( x1,y1,x2-x1,y2-y1,_image,_x1,_y1,_x2-_x1,_y2-_y1 )
  25. canvas.DrawRect( x2,y1,x3-x2,y2-y1,_image,_x2,_y1,_x3-_x2,_y2-_y1 )
  26. canvas.DrawRect( x0,y2,x1-x0,y3-y2,_image,_x0,_y2,_x1-_x0,_y3-_y2 )
  27. canvas.DrawRect( x1,y2,x2-x1,y3-y2,_image,_x1,_y2,_x2-_x1,_y3-_y2 )
  28. canvas.DrawRect( x2,y2,x3-x2,y3-y2,_image,_x2,_y2,_x3-_x2,_y3-_y2 )
  29. End
  30. Function Load:Skin( path:String )
  31. Local pixmap:=Pixmap.Load( path )
  32. If Not pixmap Return Null
  33. pixmap.PremultiplyAlpha()
  34. Return New Skin( pixmap )
  35. End
  36. Private
  37. Field _image:Image
  38. Field _bounds:Recti
  39. Field _rect:Recti
  40. Field _x0:Int,_x1:Int,_x2:Int,_x3:Int
  41. Field _y0:Int,_y1:Int,_y2:Int,_y3:Int
  42. Method New( pixmap:Pixmap )
  43. Local _scale:Recti
  44. Local _fill:Recti
  45. For Local x:=1 Until pixmap.Width-1
  46. Local p:=pixmap.GetPixelARGB( x,0 )
  47. If p=UInt( $ff000000 )
  48. If Not _scale.min.x _scale.min.x=x
  49. _scale.max.x=x+1
  50. Endif
  51. p=pixmap.GetPixelARGB( x,pixmap.Height-1 )
  52. If p=UInt( $ff000000 )
  53. If Not _fill.min.x _fill.min.x=x
  54. _fill.max.x=x+1
  55. Endif
  56. Next
  57. For Local y:=1 Until pixmap.Height-1
  58. Local p:=pixmap.GetPixelARGB( 0,y )
  59. If p=UInt( $ff000000 )
  60. If Not _scale.min.y _scale.min.y=y
  61. _scale.max.y=y+1
  62. Endif
  63. p=pixmap.GetPixelARGB( pixmap.Width-1,y )
  64. If p=UInt( $ff000000 )
  65. If Not _fill.min.y _fill.min.y=y
  66. _fill.max.y=y+1
  67. Endif
  68. Next
  69. If _scale.min.x And _scale.min.y
  70. pixmap=pixmap.Window( 1,1,pixmap.Width-2,pixmap.Height-2 )
  71. If Not _fill.min.x Or Not _fill.min.y _fill=_scale
  72. _scale-=New Vec2i( 1,1 )
  73. _fill-=New Vec2i( 1,1 )
  74. Else
  75. _scale=New Recti( pixmap.Width/3,pixmap.Height/3,pixmap.Width*2/3,pixmap.Height*2/3 )
  76. _fill=_scale
  77. Endif
  78. _rect=New Recti( 0,0,pixmap.Width,pixmap.Height )
  79. _x0=0
  80. _x1=_scale.min.x
  81. _x2=_scale.max.x
  82. _x3=_rect.max.x
  83. _y0=0
  84. _y1=_scale.min.y
  85. _y2=_scale.max.y
  86. _y3=_rect.max.y
  87. _image=New Image( pixmap )
  88. _bounds=New Recti( -_fill.min,_rect.max-_fill.max )
  89. End
  90. End