I'm really busy so I just hacked this quickly, but I can optimize it later and remove the DrawAlphaImage for speed. But here it is in raw form (and probably leaking) for a pattern:
Code: Select all
;==============================================================
; Program: Alpha Image Gadget Demo
; Author: Lloyd Gallant (netmaestro)
; Date: September 9, 2007
; Target OS: Microsoft Windows 2000/XP +
; Target Compiler: PureBasic 4.xx +
; License: Free, unrestricted, credit appreciated
; but not required
;==============================================================
Enumeration
#ImgSource
#ImgMask
#ImgOutput
EndEnumeration
Prototype AlphaBlend(hdcDest,nXOriginDest,nYOriginDest,nWDest,nHDest,hdcSrc,nXOriginSrc,nYOriginSrc,nWSrc,nHSrc,Blendfunction)
msimg32 = OpenLibrary(#PB_Any, "msimg32.dll")
If msimg32
Global AlphaBlend_.AlphaBlend = GetFunction(msimg32, "AlphaBlend")
Else
MessageRequester("Error!","Can't open msimg32.lib",#MB_ICONERROR)
EndIf
; Source Image
UsePNGImageDecoder():UseJPEGImageDecoder()
Global loadedimage = LoadImage(#PB_Any, "flower.png")
CreateImage(#ImgSource, ImageWidth(loadedimage),ImageHeight(loadedimage), 32)
; Mask Image
maskimage = LoadImage(#PB_Any, "rattan.jpg")
CreateImage(#imgMask, GetSystemMetrics_(#SM_CXSCREEN), GetSystemMetrics_(#SM_CYSCREEN), 32)
ScreenDC = GetWindowDC_(#Null)
hdcMask = CreateCompatibleDC_(ScreenDC)
ReleaseDC_(#Null, ScreenDC)
SelectObject_(hdcMask, ImageID(#imgMask))
patternBrush = CreatePatternBrush_(ImageID(maskimage))
SelectObject_(hdcMask, patternBrush)
SelectObject_(hdcMask, GetStockObject_(#NULL_PEN))
Rectangle_(hdcMask, 0,0,ImageWidth(#imgMask),ImageHeight(#imgMask))
DeleteDC_(hdcMask)
; Output Image
CreateImage(#ImgOutput, ImageWidth(loadedimage),ImageHeight(loadedimage), 32)
Procedure SetAlphaImageGadgetState(gadget, imagenumber, outputnumber, alphalevel)
Protected W = ImageWidth(imagenumber)
Protected H = ImageHeight(imagenumber)
Protected X = GadgetX(gadget)
Protected Y = GadgetY(gadget)
Protected Blendmode
Protected *bf.BLENDFUNCTION = @Blendmode
With *bf
\BlendOp = 0
\BlendFlags = 0
\SourceConstantAlpha = alphalevel
\AlphaFormat = 0
EndWith
mask = GrabImage(#imgMask, #PB_Any, X,Y,W,H)
StartDrawing(ImageOutput(#imgSource))
DrawImage(ImageID(mask),0,0)
DrawAlphaImage(ImageID(loadedimage),0,0)
StopDrawing()
ScreenDC = GetWindowDC_(#Null)
hdcSrc = CreateCompatibleDC_(ScreenDC)
ReleaseDC_(#Null, ScreenDC)
SelectObject_(hdcSrc, ImageID(imagenumber))
hdcDest = StartDrawing(ImageOutput(outputnumber))
DrawImage(ImageID(mask),0,0)
AlphaBlend_(hdcDest, 0,0,W,H, hdcSrc,0,0,W,H, BlendMode)
DeleteDC_(hdcSrc)
StopDrawing()
FreeImage(mask)
SetGadgetState(gadget, ImageID(outputnumber))
EndProcedure
OpenWindow(0,0,0,640,480,"Alphablended Image Gadget", $CA0001)
CreateGadgetList(WindowID(0))
ImageGadget(0,160,100,0,0,0)
TrackBarGadget(1,100,400,400,20,0,255)
SetGadgetState(1,128) : SetAlphaImageGadgetState(0, #imgSource, #imgOutput, 128)
SetClassLong_(WindowID(0),#GCL_HBRBACKGROUND, patternBrush)
InvalidateRect_(WindowID(0),0,1)
Repeat
ev = WaitWindowEvent()
If ev = #PB_Event_Gadget
If EventGadget() = 1
SetAlphaImageGadgetState(0, #imgSource, #imgOutput, GetGadgetState(1))
EndIf
EndIf
Until ev = #WM_CLOSE
CloseLibrary(msimg32)