Code: Select all
UsePNGImageDecoder()
Global Dim Lookup.f(255)
For I = 0 To 255
Lookup(I) = 0.0+I/255
Next
Procedure Min(A, B)
If A > B
ProcedureReturn B
EndIf
ProcedureReturn A
EndProcedure
Structure RGBTRIPLECRUDE
rgbBlue.c
rgbGreen.c
rgbRed.c
EndStructure
Procedure BlitImageTranlucent(Img1, Img2, Alpha)
Protected Mem1, Mem2
Protected Bmp.BITMAP
Protected X, Y
Protected *OldVal1.RGBTRIPLECRUDE ; Haha this is the trick
Protected *OldVal2.RGBTRIPLECRUDE
GetObject_(ImageID(Img1), SizeOf(BITMAP), @Bmp)
Mem1 = Bmp\bmBits
GetObject_(ImageID(Img2), SizeOf(BITMAP), @Bmp)
Mem2 = Bmp\bmBits
Target2 = Mem2 + Bmp\bmWidthBytes * Bmp\bmHeight-3
For *OldVal2 = Mem2 To Target2 Step 3
*OldVal1 = Mem1
Mem1 + 3
*OldVal1\rgbRed = *OldVal1\rgbRed * Lookup(255-Alpha) + *OldVal2\rgbRed * Lookup(Alpha)
*OldVal1\rgbGreen = *OldVal1\rgbGreen * Lookup(255-Alpha) + *OldVal2\rgbGreen * Lookup(Alpha)
*OldVal1\rgbBlue = *OldVal1\rgbBlue * Lookup(255-Alpha) + *OldVal2\rgbBlue * Lookup(Alpha)
Next
EndProcedure
OpenWindow(0, 0, 0, 512, 384, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_BorderLess)
CreateGadgetList(WindowID(0))
; Note, my png images are 24-bit
LoadImage(0, "Terragen___Astounding_by_tigaer.PNG")
LoadImage(1, "gallery_2_0_255974.png")
CreateImage(2, 512, 384, 24)
ResizeImage(0, 512, 384)
ResizeImage(1, 512, 384)
Debug "starting fade"
#Step = 25
For I = 0 To #Step
StartDrawing(ImageOutput(2))
DrawImage(ImageID(0), 0, 0)
StopDrawing()
BlitImageTranlucent(2, 1, 255/#Step*I)
StartDrawing(WindowOutput(0))
DrawImage(ImageID(2), 0, 0)
StopDrawing()
Next
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver