Code: Select all
DeclareModule patch
#Patch_Copy = 1 ;Repeat the sprite to the size
#Patch_Stretch = 2 ;Stretch the sprite to the size
Declare Image(Image,Width,Height,Corner,Flag = #Patch_Stretch) ;The imageID to 9Patch, Width & Height to reach, Corner width/heigh of the 9patch, Flag can be #9Patch_Copy or #9Patch_Stretch
Declare Sprite(Image,Width,Height,Corner,Flag = #Patch_Stretch)
EndDeclareModule
Module patch
EnableExplicit
Structure Patch
Sprite.i
Width.i
Height.i
Corner.i
Horizontal.i
Vertical.i
EndStructure
Declare Create(Image,*data.patch,flag,Type)
Declare DrawCorner(Image,*data.patch)
Procedure Image(Image,Width,Height,Corner,Flag = #Patch_Stretch)
Protected Patch.patch
Patch\Width = Width : Patch\Height = Height : Patch\Corner = Corner
Patch\Sprite = CreateImage(#PB_Any,Width,Height)
If Patch\Sprite
Create(Image,@Patch,Flag,0)
ProcedureReturn Patch\Sprite
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure Sprite(Image,Width,Height,Corner,Flag = #Patch_Stretch)
Protected Patch.patch
Patch\Width = Width : Patch\Height = Height : Patch\Corner = Corner
Patch\Sprite = CreateSprite(#PB_Any,Width,Height,#PB_Sprite_AlphaBlending)
If Patch\Sprite
Create(Image,@Patch,Flag,1)
ProcedureReturn Patch\Sprite
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure Create(Image,*data.patch,flag,Type)
Protected HLoop=1, VLoop=1, TempImage, Width, Heigt, Hresult, VResult
*data\Horizontal = ImageWidth(Image)
*data\Vertical = ImageHeight(Image)
If Type
StartDrawing(SpriteOutput(*data\Sprite))
Else
StartDrawing(ImageOutput(*data\Sprite))
EndIf
DrawCorner(Image,*data)
Select flag
Case #Patch_Copy ;Repeat the original image's patern to the new Width and Height
width = ImageWidth(Image)-*data\Corner*2
Heigt = ImageHeight(Image)-*data\Corner*2
For HLoop = 0 To (*data\Width - *data\Corner*2) / Width
For VLoop = 0 To (*data\Height - *data\Corner*2) / Heigt
Select VLoop
Case 0 ;================================Top horizontal========================
If HLoop - (*data\Width - *data\Corner*2) / Width
TempImage = GrabImage(Image,#PB_Any,*data\Corner,0,Width,*data\Corner)
Else
TempImage = GrabImage(Image,#PB_Any,*data\Corner,0,*data\Width -*data\Corner*2 - Width * HLoop,*data\Corner)
EndIf
If TempImage
DrawImage(ImageID(TempImage),*data\Corner+Width*HLoop,0)
EndIf
Case (*data\Height - *data\Corner*2) / Width ;=======================Bottom horizontal=========================
If HLoop - (*data\Width - *data\Corner*2) / Width
TempImage = GrabImage(Image,#PB_Any,*data\Corner,ImageHeight(Image)-*data\Corner,Width,*data\Corner)
Else
TempImage = GrabImage(Image,#PB_Any,*data\Corner,ImageHeight(Image)-*data\Corner,*data\Width -*data\Corner*2 - Width * HLoop,*data\Corner)
EndIf
If TempImage
DrawImage(ImageID(TempImage),*data\Corner+Width*HLoop,*data\Height-*data\Corner)
EndIf
EndSelect
Select HLoop
Case 0 ;===================================Left vertical=================================
If VLoop - (*data\Height - *data\Corner*2) / Heigt
TempImage = GrabImage(Image,#PB_Any,0,*data\Corner,*data\Corner,Heigt)
Else
TempImage = GrabImage(Image,#PB_Any,0,*data\Corner,*data\Corner,*data\Height -*data\Corner*2 - Heigt * VLoop)
EndIf
If TempImage
DrawImage(ImageID(TempImage),0,*data\Corner+Heigt*VLoop)
EndIf
Case (*data\Width - *data\Corner*2) / Width ;===============================right vertical=============================
If VLoop - (*data\Height - *data\Corner*2) / Heigt
TempImage = GrabImage(Image,#PB_Any,ImageWidth(Image)-*data\Corner,*data\Corner,*data\Corner,Heigt)
Else
TempImage = GrabImage(Image,#PB_Any,ImageWidth(Image)-*data\Corner,*data\Corner,*data\Corner,*data\Height -*data\Corner*2 - Heigt * VLoop)
EndIf
If TempImage
DrawImage(ImageID(TempImage),*data\Width-*data\Corner,*data\Corner+Heigt*VLoop)
EndIf
EndSelect
;Repeat middle's patern to fill the new image with
If HLoop - (*data\Width - *data\Corner*2) / Width
Hresult = Width
Else
Hresult = *data\Width -*data\Corner*2 - Width * HLoop
EndIf
If VLoop - (*data\Height - *data\Corner*2) / Heigt
VResult = Heigt
Else
VResult = *data\Height -*data\Corner*2 - Heigt * VLoop
EndIf
TempImage = GrabImage(Image,#PB_Any,*data\Corner,*data\Corner,Hresult,VResult)
If TempImage
DrawImage(ImageID(TempImage),*data\Corner+Width*HLoop,*data\Corner+Heigt*VLoop)
EndIf
Next VLoop
Next HLoop
Case #Patch_Stretch ;Stretch the original image to the new Width and Height
TempImage = GrabImage(Image,#PB_Any,*data\Corner,0,ImageWidth(Image)-*data\Corner*2,*data\Corner) ;Top horizontal
DrawImage(ImageID(TempImage),*data\Corner,0,*data\Width-*data\Corner*2,*data\Corner)
TempImage = GrabImage(Image,#PB_Any,*data\Corner,ImageHeight(Image)-*data\Corner,ImageWidth(Image)-*data\Corner*2,*data\Corner) ;Bottom horizontal
DrawImage(ImageID(TempImage),*data\Corner,*data\Height-*data\Corner,*data\Width-*data\Corner*2,*data\Corner)
TempImage = GrabImage(Image,#PB_Any,0,*data\Corner,*data\Corner,ImageHeight(Image)-*data\Corner*2) ;Left vertical
DrawImage(ImageID(TempImage),0,*data\Corner,*data\Corner,*data\Height-*data\Corner*2)
TempImage = GrabImage(Image,#PB_Any,ImageWidth(Image)-*data\Corner,*data\Corner,*data\Corner,ImageHeight(Image)-*data\Corner*2) ;Right vertial
DrawImage(ImageID(TempImage),*data\Width-*data\Corner,*data\Corner,*data\Corner,*data\Height-*data\Corner*2)
TempImage = GrabImage(Image,#PB_Any,*data\Corner,*data\Corner,ImageWidth(Image)-*data\Corner*2,ImageHeight(Image)-*data\Corner*2) ;Middle
DrawImage(ImageID(TempImage),*data\Corner,*data\Corner,*data\Width-*data\Corner*2,*data\Height-*data\Corner*2)
EndSelect
StopDrawing()
EndProcedure
Procedure DrawCorner(Image,*data.patch)
Protected TempImage
;Draw the 4 corners of the original image with no modification
TempImage = GrabImage(Image,#PB_Any,0,0,*data\Corner,*data\Corner) ;Top left
DrawImage(ImageID(TempImage),0,0)
TempImage = GrabImage(Image,#PB_Any,ImageWidth(Image)-*data\Corner,0,*data\Corner,*data\Corner) ;Top right
DrawImage(ImageID(TempImage),*data\Width-*data\Corner,0)
TempImage = GrabImage(Image,#PB_Any,0,ImageHeight(Image)-*data\Corner,*data\Corner,*data\Corner) ;Bottom left
DrawImage(ImageID(TempImage),0,*data\Height-*data\Corner)
TempImage = GrabImage(Image,#PB_Any,ImageWidth(Image)-*data\Corner,ImageHeight(Image)-*data\Corner,*data\Corner,*data\Corner) ;Bottom right
DrawImage(ImageID(TempImage),*data\Width-*data\Corner,*data\Height-*data\Corner)
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
InitSprite()
Global Image1, Image2, Sprite1,Sprite2
Image1 = CreateImage(#PB_Any,20,20)
StartDrawing(ImageOutput(Image1))
DrawingMode(#PB_2DDrawing_Outlined)
Box(0,0,19,19,$FF0000)
Circle(9,9,5,$FFFF00)
Line(4,1,6,1,$00FF00)
Line(10,1,6,1,$0000FF)
StopDrawing()
OpenWindow(0,0,0,100,200,"9 Patch Sample",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,100,200)
Image2 = patch::Image(Image1,60,60,4,patch::#Patch_Copy)
Sprite1 = patch::Sprite(Image1,40,40,4)
Sprite2 = patch::Sprite(Image1,80,30,4,patch::#Patch_Copy)
StartDrawing(ScreenOutput())
DrawImage(ImageID(Image1),10,0) ;Original image
DrawImage(ImageID(Image2),10,30)
StopDrawing()
DisplaySprite(Sprite1,10,100)
DisplaySprite(Sprite2,10,150)
FlipBuffers()
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
CompilerEndIf