Code: Select all
Procedure GrabSprite_I32(image, sprite, x, y, w, h)
; netmaestro December 2008
; Grabs an alphablended sprite located at x,y
; and with specified width=w And height=h
; from a 32bit image in memory
Protected tmp,Bmp.BITMAP,BmiInfo.BITMAPV5HEADER,sz_colorbits
Protected sz_image,*rawimage,*fileheader.BITMAPFILEHEADER
Protected *header.BITMAPV5HEADER,result
tmp = GrabImage(image, #PB_Any, x,y,w,h)
If tmp And GetObject_(ImageID(tmp), SizeOf(BITMAP), Bmp)
With BmiInfo
\bV5Size = SizeOf(BITMAPV5HEADER)
\bV5Width = Bmp\bmWidth
\bV5Height = Bmp\bmHeight
\bV5Planes = 1
\bV5BitCount = 32
\bV5Compression = #BI_RGB
EndWith
Else
ProcedureReturn 0
EndIf
sz_colorbits = w*h*4
sz_image = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPV5HEADER) + sz_colorbits
*rawimage = AllocateMemory(sz_image)
*fileheader = *rawimage
*header = *rawimage + SizeOf(BITMAPFILEHEADER)
With *fileheader
\bfType = PeekW(@"BM")
\bfSize = sz_image
\bfOffBits = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPV5HEADER)
EndWith
CopyMemory(BmiInfo, *header, SizeOf(BITMAPV5HEADER))
CopyMemory(Bmp\bmBits, *rawimage + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPV5HEADER), sz_colorbits)
result = CatchSprite(sprite,*rawimage,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
FreeMemory(*rawimage) : FreeImage(tmp)
ProcedureReturn result
EndProcedure