Older Version Newer Version

Alyce Alyce Oct 6, 2011

Transferring Bits
- Alyce Alyce

Bit Transfer | PatBlt | Transferring Bits with BitBlt | ROP | Demo
Some text below is copied from the Microsoft Developers Network Library.

For an eBook or printed book on using the API with Liberty BASIC, see:
APIs for Liberty BASIC

Bit Transfer

We've discussed memory device context and memory bitmaps in previous lessons. We need a way to display the image in memory on the screen. We can do that with one of the bit transfer functions. The bit transfer functions transfer image bits on device contexts. Some bit transfer functions specify a source DC and a destination DC. These can be the same DC or different DCs.

PatBlt

PatBlt is the simplest of the bit transfer functions available. It alters the pixels contained within the specified area according to the drawing rule that is designated by the raster operation argument. It works on a single DC. The syntax for the call is:

 CallDll #gdi32, "PatBlt",_ 
hdc as ulong,_ 'device context
xDest as long,_ 'x origin for transfer
yDest as long,_ 'y origin for transfer
xWidth as long,_ 'width of area to access
yHeight as long,_'height of area to access
ROP as ulong,_ 'type of transfer
result as boolean

NOTE: The operation performed is determined by the Raster Operation (ROP) argument. Here are the ROP values available:

_BLACKNESS
Set the area to Black
_WHITENESS
Set the area to White
_DSTINVERT
Inverts the colors in the rectangle
_PATCOPY
Copies the specified pattern into the destination bitmap
_PATINVERT
Combines the colors of the specified pattern with the colors of the
destination rectangle by using the Boolean OR operator

Use PatBlt to make simple transformations on an area of an image. For instance, using _BLACKNESS causes the specified area to be black, and _DSTINVERT causes the specified area to look like a photographic negative of itself.

Transferring Bits with BitBlt


BitBlt modifies a rectangle within the destination DC by using bits from within a rectangle on the Source DC. The source and destination DCs can be the same DC, or different DCs. It combines the colors using the ROP specified. Possible ROP values are described below.

 CallDll #gdi32, "BitBlt", _ 
hDCdest as ulong,_ 'The destination DC
xDest as long,_ 'x location on destination
yDest as long,_ 'y location on destination
xWidth as long,_ 'width to transfer
yHeight as long,_ 'height to transfer
hDCsource as ulong,_ 'The source DC
xSrc as long,_ 'x location in source
ySrc as long,_ 'y location in source
ROP as ulong,_ 'The operation to be performed
result as boolean 'nonzero if successful

BitBlt performs a logical combination of three elements: the BRUSH selected in the Destination DC, the PIXELS from the rectangle defined in the Source DC, and the PIXELs in the Destination DC. The combination of these three elements is used to create the resulting image in the Destination DC. The way these elements are combined is determined by the ROP (Raster OPeration) code. There are 256 different ROP codes that can be used. 15 of these are defined and have a Windows constant name.

ROP

The simplest operation that can be performed is a COPY command. The Liberty BASIC name for this Windows constant is _SRCCOPY. This will simply copy the source to the destination, ignoring the settings of the Brush and the Pixels in the destination DC. Here are the other common commands, and a description of the way they work:

_BLACKNESS
Turns all output black.
_DSTINVERT
Inverts the destination bitmap.
_MERGECOPY
Combines the pattern and the source bitmap by using the Boolean AND operator.
_MERGEPAINT
Combines the inverted source bitmap with the destination bitmap by using the Boolean OR operator.
_NOTSRCCOPY
Copies the inverted source bitmap to the destination.
_NOTSRCERASE
Inverts the result of combining the destination and source bitmaps by using the Boolean OR operator.
_PATCOPY
Copies the pattern to the destination bitmap.
_PATINVERT
Combines the destination bitmap with the pattern by using the Boolean XOR operator.
_PATPAINT
Combines the inverted source bitmap with the pattern by using the Boolean OR operator. Combines the result of this operation with the destination bitmap by using the Boolean OR operator.
_SRCAND
Combines pixels of the destination and source bitmaps by using the Boolean AND operator.
_SRCCOPY
Copies the source bitmap to the destination bitmap.
_SRCERASE
Inverts the destination bitmap and combines the result with the source bitmap by using the Boolean AND operator.
_SRCINVERT
Combines pixels of the destination and source bitmaps by using the Boolean XOR operator.
_SRCPAINT
Combines pixels of the destination and source bitmaps by using the Boolean OR operator.
_WHITENESS
Turns all output white.

Demo

We can now transfer an image in memory to our Liberty BASIC graphicbox.


Run the code and you will see this:

bitblt.jpg

 
nomainwin
winWide=700:winHigh=500
WindowWidth=winWide+50:WindowHeight=winHigh+50
UpperLeftX=1:UpperLeftY=1

graphicbox #1.g, 0,0,winWide,winHigh
open "GDI Demo" for window as #1
#1 "trapclose [quit]"
#1.g "down;fill yellow;flush"

h=hwnd(#1.g) 'graphicbox handle

'get device context for window:
calldll #user32, "GetDC",_
h as ulong,_ 'graphicbox handle
hdc as ulong 'returns handle to device context

calldll #gdi32, "CreateCompatibleDC",_
hdc as ulong,_ 'graphicbox DC
hMemDC as ulong 'memory DC

nWidth=100 : nHeight=200
calldll #gdi32, "CreateCompatibleBitmap",_
hdc AS ulong,_ 'window DC, NOT memory DC
winWide AS long,_ 'width of created bitmap
winHigh AS long,_ 'height of created bitmap
handleBmp AS ulong 'returns handle if successful

CallDLL #gdi32,"SelectObject",_
hMemDC as uLong,_ 'memory DC
handleBmp as uLong,_ 'handle of bmp
oldBmp as uLong 'returns previously selected bitmap

'PatBlt to change the memory bitmap
'when created, memory bitmap is all black
'place white rectangle on memory bmp
CallDll #gdi32, "PatBlt",_
hMemDC as ulong,_ 'memory device context
30 as long,_ 'x origin for transfer
50 as long,_ 'y origin for transfer
300 as long,_ 'width of area to access
120 as long,_ 'height of area to access
_WHITENESS as ulong,_ 'make specified area white
result as boolean

'transfer a rectangular area of memory bmp to graphicbox
CallDll #gdi32, "BitBlt", _
hdc as ulong,_ 'The destination DC = graphicbox
0 as long,_ 'x location on destination
0 as long,_ 'y location on destination
400 as long,_ 'width to transfer
300 as long,_ 'height to transfer
hMemDC as ulong,_ 'The source DC = memory
0 as long,_ 'x location in source
0 as long,_ 'y location in source
_SRCCOPY as ulong,_'The operation to be performed
result as boolean 'nonzero if successful
wait

[quit]
'select default bmp back into DC
CallDLL #gdi32,"SelectObject",_
hMemDC as uLong,_ 'memory DC
oldBmp as uLong,_ 'handle of original, default bmp
handle as uLong 'returns previously selected bitmap

CallDLL #gdi32,"DeleteObject",_
handleBmp as uLong,_ 'handle of bmp
r As Boolean

calldll #gdi32, "DeleteDC",_
hMemDC as ulong,_ 'DC to delete
re as long 'nonzero=success

calldll #user32, "ReleaseDC",_
h as ulong,_ 'window handle
hdc as ulong,_ 'device context
ret as long

close #1:end

GDI Tutorials Home