I did a speed test on this today, capturing my whole screen. Here is the code:
Code: Select all
;*************** TURN OFF THE DEBUGGER! ****************
Procedure.d TicksHQ(init=0)
Static freq.q, lastcount.q
If init
QueryPerformanceFrequency_(@freq.q)
QueryPerformanceCounter_(@lastcount.q)
lastcount/(freq/1000)
Else
QueryPerformanceCounter_(@thiscount.q)
thiscount/(freq/1000)
result.d = (thiscount-lastcount)
lastcount=thiscount
ProcedureReturn result
EndIf
EndProcedure
#CAPTUREBLT = $40000000 ; Necessary for BitBlt to get layered windows if present on screen
ExamineDesktops()
width=DesktopWidth(0)
height = DesktopHeight(0)
tickshq(1)
dc = CreateDC_("DISPLAY",0,0,0)
ndc = CreateCompatibleDC_(0)
bmi.BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = width
bmi\bmiHeader\biHeight = -height ; Otherwise colors in the buffer will be backwards, "bottom-up" which we don't want
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
hImage = CreateDIBSection_(ndc, bmi, #DIB_RGB_COLORS, @*buffer1, 0, 0)
If hImage
DeleteObject_(SelectObject_(ndc, hImage))
BitBlt_(ndc, 0,0,width,height,dc,0,0,#SRCCOPY|#CAPTUREBLT)
DeleteDC_(dc)
DeleteDC_(ndc)
EndIf
result1 = TicksHQ()
*buffer2 = AllocateMemory(width*SizeOf(RGBQUAD)*height)
*readptr.long = *buffer2
dc = CreateDC_("DISPLAY",0,0,0)
For j=0 To height-1
For i=0 To width-1
*readptr\l = GetPixel_(dc, i, j)
*readptr + SizeOf(Long)
Next
Next
DeleteDC_(dc)
result2 = TicksHQ()
; Verify that both methods worked and show the result
CreateImage(0,width,height,24)
StartDrawing(ImageOutput(0))
*readptr.Long = *buffer1
For j=0 To height-1
For i=0 To width-1
Plot(i,j, RGB(Blue(*readptr\l), Green(*readptr\l), Red(*readptr\l)))
*readptr+SizeOf(Long)
Next
Next
StopDrawing()
ResizeImage(0,400,300)
CreateImage(1,width,height,24)
StartDrawing(ImageOutput(1))
*readptr.Long = *buffer2
For j=0 To height-1
For i=0 To width-1
Plot(i,j, RGB(Red(*readptr\l), Green(*readptr\l), Blue(*readptr\l)))
*readptr+SizeOf(Long)
Next
Next
StopDrawing()
ResizeImage(1,400,300)
OpenWindow(0,0,0,820,340,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(0,0,0,0,0,ImageID(0))
ImageGadget(1,420,0,0,0,ImageID(1))
TextGadget(10,0,310,300,20,"BitBlt: "+result1+" ms",#SS_CENTER)
TextGadget(11,420,310,300,20,"GetPixel: "+result2+" ms",#SS_CENTER)
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
While I was prepared for a speed improvement by moving to BitBlt from GetPixel, this was my (rather shocking) result:
Read 'em and weep, GetPixel. You've just been