{{fbdoc item="title" value="PCOPY"}}----
Copies one graphical or text page onto another

{{fbdoc item="syntax"}}##
	[[KeyPgDeclare|declare]] [[KeyPgFunction|function]] **Pcopy** ( [[KeyPgByval|byval]] //source// [[KeyPgAs|as]] [[KeyPgLong|long]] = -1, [[KeyPgByval|byval]] //destination// [[KeyPgAs|as]] [[KeyPgLong|long]] = -1 ) [[KeyPgAs|as]] [[KeyPgLong|long]]
##
{{fbdoc item="usage"}}##
	**Pcopy** [ //source// ] [, //destination// ]
##
{{fbdoc item="param"}}
	##//source//##
		page to copy from
	##//destination//##
		page to copy to

{{fbdoc item="ret"}}
	Returns zero (##0##) if successful, or a non-zero error code to indicate a failure.

{{fbdoc item="desc"}}
	Copies one graphical or text video page to another. Useful for drawing all graphics on one invisible page and copying it to the active visible page - creating smooth graphics and animation. Known as 'double buffering' or 'page flipping'.
	
	##//source//## and ##//destination//## refer to page numbers. The 'source' page is copied over the 'destination' page when pcopy is called.
	
	If the ##//source//## argument is omitted, the current working page is assumed.  If the ##//destination//## page is omitted, the current visible page is assumed.
	
	##**Pcopy**## is inactive if the ##//destination//## page is locked.
	
	The error code returned by ##**Pcopy**## can be checked using ##[[KeyPgErr|Err]]## in the next line. The function version of  ##**Pcopy**## returns directly the error code as a 32 bit ##[[KeyPgLong|Long]]##.
	
{{fbdoc item="ex"}}

	{{fbdoc item="filename" value="examples/manual/gfx/pcopy.bas"}}%%(freebasic)
'Sets up the screen to be 320x200 in 8-bit color with 2 video pages.
ScreenRes 320, 200, 8, 2

'Sets the working page to 1 and the displayed page to 0
ScreenSet 1, 0

'Draws a circle moving across the top of the screen
for x as integer = 50 to 269
	Cls                    'Clears the screen so we can start fresh
	Circle (x, 50), 50, 14 'Draws a yellow circle with a 50 pixel radius on page 1
	PCopy 1, 0             'Copies our image from page 1 to page 0
	Sleep 25               'Waits for 25 milliseconds.
next x

'Wait for a keypress before the screen closes
Sleep
%%
	
	{{fbdoc item="filename" value="examples/manual/gfx/pcopy_cons.bas"}}%%(freebasic)
'' Compile with -lang fblite or qb

#lang "fblite"

'' Console mode example:

'' Set the working page number to 0, and the visible page number to 1
#if __FB_LANG__ = "QB"
Screen ,, 0, 1
#else
Screen , 0, 1
#endif

Dim As Integer i, frames, fps
Dim As Double t

t = Timer

Do
	'' Fill working page with a certain color and character
	Cls
	Locate 1, 1
	Color (i And 15), 0
	Print String$(80 * 25, Hex$(i, 1));
	i += 1

	'' Show frames per second
	Color 15, 0
	Locate 1, 1
	Print "fps: " & fps,
	If Int(t) <> Int(Timer) Then
		t = Timer
		fps = frames
		frames = 0
	End If
	frames += 1

	'' Copy working page to visible page
	PCopy

	'' Sleep 50ms per frame to free up cpu time
	Sleep 50, 1

	'' Run loop until the user presses a key
Loop Until Len(Inkey$)
%%

{{fbdoc item="target"}}
	- Maximum number of text pages in Windows is 4.
	- Maximum number of text pages in DOS is 8.
	- Maximum number of text pages in all other targets is 1.
	- Maximum number of graphics pages depends on what was specified when the ##[[KeyPgScreengraphics|Screen]]## or ##[[KeyPgScreenres|Screenres]]## statement was called.

{{fbdoc item="diff"}}
	- None

{{fbdoc item="see"}}
	- ##[[KeyPgScreencopy|Screencopy]]##
	- ##[[KeyPgFlip|Flip]]##
	- ##[[KeyPgScreengraphics|Screen]]##


{{fbdoc item="back" value="CatPgGfxScreen|Screen Functions"}}