Code archives/Graphics/Faster Pixelacces

This code has been declared by its author to be Public Domain code.

Download source code

Faster Pixelacces by Vertex
(Posted 22 years ago)
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