How to overlay
Posted: Wed Feb 21, 2007 3:54 pm
What API should I use to establish the effect in the picture (overlay so that the background takes the color of the transparant foreground)


Code: Select all
DrawingMode(#PB_2DDrawing_XOr)
Code: Select all
oldrop=SetROP2_(hdc, #R2_XORPEN)
Code: Select all
; ***********************************************
; * *
; * 'Overlay Selection' *
; * *
; * Author: Christian Kemna *
; * Created: Febuary 21, 2007 *
; * Updated: Febuary 21, 2007 *
; * Version: PureBasic V4.02 *
; * *
; * Web: http://codedreality.purearea.net/ *
; * eMail: ckemna@t-online.de *
; * *
; ***********************************************
; // SETUP //
DisableDebugger
#OVRL_WIDTH = 400
#OVRL_HEIGHT = 180
#OVRL_BACKSDWCY = 30
#OVRL_BACKAMPCX = 4
#OVRL_BACKAMPCY = 10
#OVRL_BACKAMPSTEP = 16
Global lpPrevFunc.l
Global clrSelect.l
clrBackgnd1 = RGB(33,33,57)
clrBackgnd2 = RGB(41,41,66)
clrGraph = RGB(214,214,239)
clrSelect = RGB(130,10,25)
; // GRAPH IMAGE //
CreateImage(0,#OVRL_WIDTH,#OVRL_HEIGHT)
hdc = StartDrawing(ImageOutput(0))
Box(0,0,#OVRL_WIDTH,#OVRL_HEIGHT,clrBackgnd1)
Box(0,0,#OVRL_WIDTH,#OVRL_BACKSDWCY,clrBackgnd2)
Box(0,#OVRL_HEIGHT-#OVRL_BACKSDWCY,#OVRL_WIDTH,#OVRL_BACKSDWCY,clrBackgnd2)
For i=0 To #OVRL_WIDTH-1 Step #OVRL_BACKAMPSTEP
Box(i,#OVRL_BACKSDWCY,#OVRL_BACKAMPCX,#OVRL_BACKAMPCY,clrBackgnd2)
Box(i,#OVRL_HEIGHT-#OVRL_BACKSDWCY-#OVRL_BACKAMPCY,#OVRL_BACKAMPCX,#OVRL_BACKAMPCY,clrBackgnd2)
Next
For i=0 To #OVRL_WIDTH-1
Peak = Random(40)
Box(i,85,1,-Random(Peak),clrGraph)
Box(i,85,1,15 + (Random(Peak)),clrGraph)
Next
StopDrawing()
; // OVERLAY IMAGE //
CreateImage(1,#OVRL_WIDTH,#OVRL_HEIGHT)
; // APPLICATION WINDOW //
OpenWindow(0,0,0,#OVRL_WIDTH + 24,#OVRL_HEIGHT + 24,"Audio Graph Selection",#WS_SYSMENU | #WS_CAPTION | 1)
CreateGadgetList(WindowID(0))
ImageGadget(0,10,10,0,0,ImageID(0),#PB_Image_Border)
; // SUBCLASS PROCEDURE //
Procedure ImageProc(hWnd.l,uMsg.l,wParam.l,lParam.l)
Static bClicked.b, MTX.w
Select uMsg
Case #WM_LBUTTONDOWN
MTX = lParam & $FFFF : MTY = lParam >> 16
bClicked = #True
Case #WM_MOUSEMOVE
If bClicked
MX = lParam & $FFFF : MY = lParam >> 16
; // OVERLAY MASK //
StartDrawing(ImageOutput(1))
Box(0,0,#OVRL_WIDTH,#OVRL_HEIGHT,$FF00FF)
Box(MTX,0,MX-MTX,#OVRL_HEIGHT,clrSelect)
StopDrawing()
CopyImage(0,2)
; // COMBINE COLORS //
bmi.BITMAPINFO
hdc = StartDrawing(ImageOutput(0))
; ->> Color Data of Image #1
lpvBits1 = AllocateMemory(#OVRL_WIDTH * #OVRL_HEIGHT * 4)
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = #OVRL_WIDTH
bmi\bmiHeader\biHeight = #OVRL_HEIGHT
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
GetDIBits_(hdc,ImageID(0),0,#OVRL_HEIGHT,lpvBits1,bmi,#DIB_RGB_COLORS)
*pxData1.LONG = lpvBits1
; ->> Color Data of Image #2
lpvBits2 = AllocateMemory(#OVRL_WIDTH * #OVRL_HEIGHT * 4)
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = #OVRL_WIDTH
bmi\bmiHeader\biHeight = #OVRL_HEIGHT
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
GetDIBits_(hdc,ImageID(1),0,#OVRL_HEIGHT,lpvBits2,bmi,#DIB_RGB_COLORS)
*pxData2.LONG = lpvBits2
; ->> Combine Color Data (50% Opacity)
For i=1 To (#OVRL_WIDTH * #OVRL_HEIGHT)
R1 = *pxData1\l & $FF
G1 = *pxData1\l >> 8 & $FF
B1 = *pxData1\l >> 16
R2 = *pxData2\l & $FF
G2 = *pxData2\l >> 8 & $FF
B2 = *pxData2\l >> 16
R = (R1 + R2) / 2 : G = (G1 + G2) / 2 : B = (B1 + B2) / 2
If *pxData2\l ! $FF00FF
*pxData1\l = R | G << 8 | B << 16
EndIf
*pxData2 + 4 : *pxData1 + 4
Next
SetDIBits_(hdc,ImageID(2),0,#OVRL_HEIGHT,lpvBits1,bmi,#DIB_RGB_COLORS)
; ->> Clean Up
FreeMemory(lpvBits1)
FreeMemory(lpvBits2)
StopDrawing()
; // GADGET REFRESH //
SetGadgetState(0,ImageID(2))
FreeImage(2)
EndIf
Case #WM_LBUTTONUP
bClicked = #False
EndSelect
ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd.l,uMsg,wParam,lParam)
EndProcedure
lpPrevFunc = SetWindowLong_(GadgetID(0),#GWL_WNDPROC,@ImageProc())
; // EVENT LOOP //
While WaitWindowEvent() ! 16 : Wend