Code archives/Graphics/Faster Pixelacces
This code has been declared by its author to be Public Domain code.
Download source code
| Hi! I have programmed 4 Function like BlitzPlus for Blitz3D(and maybe for Blitz2D if any person with Blitz2D can contact me) that allows you a faster acces of the pixel in a buffer. My function is 14,5 x faster than ReadPixelFast and 3,3 x faster than WritePixelFast. The bank must be greator or equal sized like the image. For example: A Image is 100 * 200 Pixel big, and - LockedFormat = 1 than is Banksize = 100*200*2 = 40000 byte - LockedFormat = 2 than is Banksize = 100*200*2 = 40000 byte - LockedFormat = 3 than is Banksize = 100*200*3 = 60000 byte - LockedFormat = 4 than is Banksize = 100*200*4 = 80000 byte To compute the offset by LockedFormat = 4 you can use this formel: offset = y*400+x*4 Kernel32.decls: .lib "kernel32.dll" apiRtlMoveMemory(Destination*,Source,Length):"RtlMoveMemory" apiRtlMoveMemory2(Destination,Source*,Length):"RtlMoveMemory" cu olli |
Function LockedFormat(buffer = 0) Local bnkFormat, format If buffer = 0 Then buffer = GraphicsBuffer() bnkFormat = CreateBank(4) apiRtlMoveMemory bnkFormat, buffer+104, 4 format = PeekInt(bnkFormat, 0) FreeBank bnkFormat Return format End Function Function LockedPitch(buffer = 0) Local bnkPitch, pitch If buffer=0 Then buffer = GraphicsBuffer() bnkPitch = CreateBank(12) apiRtlMoveMemory bnkPitch, buffer+92, 12 pitch = PeekInt(bnkPitch, 0)*PeekInt(bnkPitch, 8)/8 FreeBank bnkPitch Return pitch End Function Function CopyBufferToBank(bank, buffer = 0) Local bnkInfo, size If buffer=0 Then buffer = GraphicsBuffer() bnkInfo = CreateBank(32) apiRtlMoveMemory bnkInfo, buffer+72, 32 size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8 If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then FreeBank bnkInfo Return False Else apiRtlMoveMemory bank, PeekInt(bnkInfo, 0), size FreeBank bnkInfo Return True EndIf End Function Function CopyBankToBuffer(bank, buffer = 0) Local bnkInfo, size If buffer=0 Then buffer = GraphicsBuffer() bnkInfo = CreateBank(32) apiRtlMoveMemory bnkInfo, buffer+72, 32 size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8 If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then FreeBank bnkInfo Return False Else apiRtlMoveMemory2 PeekInt(bnkInfo, 0), bank, size FreeBank bnkInfo Return True EndIf End Function ; and for fun: Function BufferWidth(buffer = 0) Local bnkWidth, width If buffer = 0 Then Return GraphicsWidth() bnkWidth = CreateBank(4) apiRtlMoveMemory bnkWidth, buffer+92, 4 width = PeekInt(bnkWidth, 0) FreeBank bnkWidth Return width End Function Function BufferHeight(buffer = 0) Local bnkHeight, height If buffer = 0 Then Return GraphicsHeight() bnkHeight = CreateBank(4) apiRtlMoveMemory bnkHeight, buffer+96, 4 height = PeekInt(bnkHeight, 0) FreeBank bnkHeight Return height End Function |