Blitz3D+ Command Reference

CopyPixel src_x,src_y,src_buffer,dest_x,dest_y[,dest_buffer]

Parameters

src_x - x coordinate of the pixel to read

src_y - y coordinate of the pixel to read

src_buffer - buffer to read from, for example ImageBuffer(pic)

dest_x - x coordinate to write to

dest_y - y coordinate to write to

dest_buffer (optional) - buffer to write to; 0 means the current drawing buffer (default)

Description

Copies a single pixel from one buffer to another.

This is the safe member of the pixel-copy pair. Both the source and destination coordinates are clipped: they are shifted by each buffer's Origin and tested against its Viewport, and a read or write that lands outside is quietly skipped rather than corrupting anything. That makes it fine to use with coordinates that come from gameplay maths and might wander off the edge.

Use it for the sort of per-pixel effect you cannot get from the drawing commands: melting or dissolving a title screen, a plasma or fire routine, sampling a heightmap image, or hand-rolled scaling and warping. For anything larger than a handful of pixels, though, prefer CopyRect or DrawImageRect, which move whole rectangles in one go.

Pixel-at-a-time work is slow. Wrap the loop in LockBuffer and UnlockBuffer on both buffers and you will get a useful speed-up, and if you have already locked the buffers and you know your coordinates are in range, CopyPixelFast skips the checks entirely.

See also: CopyPixelFast, ReadPixel, WritePixel, CopyRect, LockBuffer.

Example

; CopyPixel Example
; -----------------

Graphics 640,480,0,2
SetBuffer BackBuffer()

; Source photo and a blank destination image of the same size
logo=LoadImage("media/b3dlogo.jpg")     ; 400x197
dest=CreateImage(400,197)

row=0

While Not KeyDown(1)

    Cls

    ; Space restarts the copy from the top
    If KeyHit(57) Then
        row=0
        SetBuffer ImageBuffer(dest) : Cls : SetBuffer BackBuffer()
    End If

    ; Copy two rows per frame, one pixel at a time, image to image
    If row<197 Then
        For n=1 To 2
            If row<197 Then
                For x=0 To 399
                    CopyPixel x,row,ImageBuffer(logo),x,row,ImageBuffer(dest)
                Next
                row=row+1
            End If
        Next
    End If

    ; Source on top, the growing pixel-by-pixel copy below
    DrawImage logo,120,40
    DrawImage dest,120,260
    Color 255,255,0
    Rect 120,260,400,197,False

    Text 0,0,"Space: restart the copy   Esc: exit"
    Text 0,20,"CopyPixel has copied "+row+" of 197 rows so far"

    Flip

Wend

End

Index