Function dither ( ByVal source_pixel As UInteger, ByVal destination_pixel As UInteger, ByVal parameter As Any Ptr ) As UInteger
    
    ''either returns the source pixel or the destination pixel, depending on the outcome of rnd
    
    Dim threshold As Single = 0.5
    If parameter <> 0 Then threshold = *CPtr(Single Ptr, parameter)
    
    If Rnd() < threshold Then
        Return source_pixel
    Else
        Return destination_pixel
    End If
    
End Function
Dim img As Any Ptr, threshold As Single
'' set up a screen
ScreenRes 320, 200, 16, 2
ScreenSet 0, 1
'' create an image
img = ImageCreate(32, 32)
Line img, ( 0,  0)-(15,  15), RGB(255,   0,   0), bf
Line img, (16,  0)-(31,  15), RGB(  0,   0, 255), bf
Line img, ( 0, 16)-(15,  31), RGB(  0, 255,   0), bf
Line img, (16, 16)-(31,  31), RGB(255,   0, 255), bf
'' dither the image with varying thresholds
Do Until Len(Inkey)
    
    Cls
    
    threshold = 0.2
    Put ( 80 - 16, 100 - 16), img, Custom, @dither, @threshold
    
    '' default threshold = 0.5
    Put (160 - 16, 100 - 16), img, Custom, @dither
    
    threshold = 0.8
    Put (240 - 16, 100 - 16), img, Custom, @dither, @threshold
    
    ScreenCopy
    Sleep 25
    
Loop
'' free the image memory
ImageDestroy img