|
@@ -0,0 +1,357 @@
|
|
|
+%
|
|
|
+% $Id$
|
|
|
+% This file is part of the FPC documentation.
|
|
|
+% Copyright (C) 1997, by Michael Van Canneyt
|
|
|
+%
|
|
|
+% The FPC documentation is free text; you can redistribute it and/or
|
|
|
+% modify it under the terms of the GNU Library General Public License as
|
|
|
+% published by the Free Software Foundation; either version 2 of the
|
|
|
+% License, or (at your option) any later version.
|
|
|
+%
|
|
|
+% The FPC Documentation is distributed in the hope that it will be useful,
|
|
|
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+% Library General Public License for more details.
|
|
|
+%
|
|
|
+% You should have received a copy of the GNU Library General Public
|
|
|
+% License along with the FPC documentation; see the file COPYING.LIB. If not,
|
|
|
+% write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
+% Boston, MA 02111-1307, USA.
|
|
|
+%
|
|
|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
+%
|
|
|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
+% The Video unit
|
|
|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
+\chapter{The VIDEO unit}
|
|
|
+\FPCexampledir{videoex}
|
|
|
+
|
|
|
+The \file{Video} unit implements a screen access layer which is system
|
|
|
+independent. It can be used to write on the screen in a system-independent
|
|
|
+way, which should be optimal on all platforms for which the unit is
|
|
|
+implemented.
|
|
|
+
|
|
|
+\section{Constants, Type and variables }
|
|
|
+
|
|
|
+\subsection{Constants}
|
|
|
+The following constants describe colors that can be used as
|
|
|
+foreground and background colors.
|
|
|
+\begin{verbatim}
|
|
|
+Black = 0;
|
|
|
+Blue = 1;
|
|
|
+Green = 2;
|
|
|
+Cyan = 3;
|
|
|
+Red = 4;
|
|
|
+Magenta = 5;
|
|
|
+Brown = 6;
|
|
|
+LightGray = 7;
|
|
|
+\end{verbatim}
|
|
|
+The following color constants can be used only as foreground colors:
|
|
|
+\begin{verbatim}
|
|
|
+DarkGray = 8;
|
|
|
+LightBlue = 9;
|
|
|
+LightGreen = 10;
|
|
|
+LightCyan = 11;
|
|
|
+LightRed = 12;
|
|
|
+LightMagenta = 13;
|
|
|
+Yellow = 14;
|
|
|
+White = 15;
|
|
|
+\end{verbatim}
|
|
|
+The foreground color can be logically or-ed with the blink attribute:
|
|
|
+\begin{verbatim}
|
|
|
+Blink = 128;
|
|
|
+\end{verbatim}
|
|
|
+The following constants describe the capabilities of a certain video mode:
|
|
|
+\begin{verbatim}
|
|
|
+cpUnderLine = $0001;
|
|
|
+cpBlink = $0002;
|
|
|
+cpColor = $0004;
|
|
|
+cpChangeFont = $0008;
|
|
|
+cpChangeMode = $0010;
|
|
|
+cpChangeCursor = $0020;
|
|
|
+\end{verbatim}
|
|
|
+The following constants describe the various supported cursor modes:
|
|
|
+\begin{verbatim}
|
|
|
+crHidden = 0;
|
|
|
+crUnderLine = 1;
|
|
|
+crBlock = 2;
|
|
|
+crHalfBlock = 3;
|
|
|
+\end{verbatim}
|
|
|
+When a video function needs to report an error condition, the following
|
|
|
+constants are used:
|
|
|
+\begin{verbatim}
|
|
|
+vioOK = 0;
|
|
|
+errVioBase = 1000;
|
|
|
+errVioInit = errVioBase + 1; { Initialization error}
|
|
|
+errVioNotSupported = errVioBase + 2; { Unsupported function }
|
|
|
+errVioNoSuchMode = errVioBase + 3; { No such video mode }
|
|
|
+\end{verbatim}
|
|
|
+The following constants can be read to get some information about the
|
|
|
+current screen:
|
|
|
+\begin{verbatim}
|
|
|
+ScreenWidth : Word = 0;
|
|
|
+ScreenHeight : Word = 0;
|
|
|
+LowAscii : Boolean = true;
|
|
|
+NoExtendedFrame : Boolean = false;
|
|
|
+FVMaxWidth = 132;
|
|
|
+\end{verbatim}
|
|
|
+The error-handling code uses the following constants:
|
|
|
+\begin{verbatim}
|
|
|
+errOk = 0;
|
|
|
+ErrorCode: Longint = ErrOK;
|
|
|
+ErrorInfo: Pointer = nil;
|
|
|
+ErrorHandler: TErrorHandler = DefaultErrorHandler;
|
|
|
+\end{verbatim}
|
|
|
+The \var{ErrorHandler} variable can be set to a custom-error handling
|
|
|
+function. It is set by default to the \seef{DefaultErrorHandler} function.
|
|
|
+
|
|
|
+The \var{Modes} list contains the list of supported video modes:
|
|
|
+\begin{verbatim}
|
|
|
+Modes: PVideoModeList = nil;
|
|
|
+\end{verbatim}
|
|
|
+
|
|
|
+\subsection{Types}
|
|
|
+The \var{TVideoMode} record describes a videomode. Its fields are
|
|
|
+self-explaining. The \var{TVideoModeSelector} procedural variable
|
|
|
+is used to select a video mode.
|
|
|
+\begin{verbatim}
|
|
|
+ PVideoMode = ^TVideoMode;
|
|
|
+ TVideoMode = record
|
|
|
+ Col,Row : Word;
|
|
|
+ Color : Boolean;
|
|
|
+ end;
|
|
|
+ TVideoModeSelector = function (const VideoMode: TVideoMode; Params: Longint): Boolean;
|
|
|
+\end{verbatim}
|
|
|
+\var{TVideoCell} describes one character on the screen. The high byte
|
|
|
+contains the color attribute with which the character is drawn on the screen,
|
|
|
+and the low byte contains the ASCII code of the character to be drawn.
|
|
|
+\begin{verbatim}
|
|
|
+TVideoCell = Word;
|
|
|
+PVideoCell = ^TVideoCell;
|
|
|
+\end{verbatim}
|
|
|
+The \var{TVideoBuf} and \var{PVideoBuf} are two types used to represent the
|
|
|
+screen.
|
|
|
+\begin{verbatim}
|
|
|
+TVideoBuf = array[0..32759] of TVideoCell;
|
|
|
+PVideoBuf = ^TVideoBuf;
|
|
|
+\end{verbatim}
|
|
|
+When registering video modes, the following typed are used to store the
|
|
|
+registered modes:
|
|
|
+\begin{verbatim}
|
|
|
+PVideoModeList = ^TVideoModeList;
|
|
|
+TVideoModeList = record
|
|
|
+ Col, Row: Word;
|
|
|
+ Color: Boolean;
|
|
|
+ VideoModeSelector: TVideoModeSelector;
|
|
|
+ Params: Longint;
|
|
|
+ Next: PVideoModeList;
|
|
|
+end;
|
|
|
+\end{verbatim}
|
|
|
+The following type is used when reporting error conditions:
|
|
|
+\begin{verbatim}
|
|
|
+TErrorHandlerReturnValue = (errRetry, errAbort, errContinue);
|
|
|
+\end{verbatim}
|
|
|
+Here, \var{errRetry} means retry the operation, \var{errAbort}
|
|
|
+abort and return error code and \var{errContinue} means abort
|
|
|
+without returning an errorcode.
|
|
|
+
|
|
|
+The \var{TErrorHandler} function is used to register an own error
|
|
|
+handling function. It should be used when installing a custom error
|
|
|
+handling function, and must return one of the above values.
|
|
|
+\begin{verbatim}
|
|
|
+TErrorHandler =
|
|
|
+ function (Code: Longint; Info: Pointer): TErrorHandlerReturnValue;
|
|
|
+\end{verbatim}
|
|
|
+\var{Code} should contain the error code for the error condition,
|
|
|
+and the \var{Info} parameter may contain any data type specific to
|
|
|
+the error code passed to the function.
|
|
|
+
|
|
|
+\subsection{Variables}
|
|
|
+The following variables contain information about the current screen
|
|
|
+status:
|
|
|
+\begin{verbatim}
|
|
|
+ScreenColor : Boolean;
|
|
|
+CursorX, CursorY : Word;
|
|
|
+\end{verbatim}
|
|
|
+\var{ScreenColor} indicates whether the current screen supports colors.
|
|
|
+\var{CursorX,CursorY} contain the current cursor position.
|
|
|
+
|
|
|
+The \var{LockUpdateScreen} variable can be incremented to prevent the
|
|
|
+\seep{UpdateScreen} procedure from actually updating the screen. The
|
|
|
+\var{UpdateScreen} procedure will only update the screen when the
|
|
|
+\var{LockUpdateScreen} variable is zero. This mechanism can be used
|
|
|
+to optimize the screen updating routines when various updates are
|
|
|
+performed at once.
|
|
|
+\begin{verbatim}
|
|
|
+LockUpdateScreen : Word;
|
|
|
+CursorLines : Byte;
|
|
|
+\end{verbatim}
|
|
|
+The following variables form the heart of the \file{Video} unit: The
|
|
|
+\var{VideoBuf} array represents the physical screen. Writing to this
|
|
|
+array and calling \seep{UpdateScreen} will write the actual characters
|
|
|
+to the screen. \var{VideoBufSize} contains the actual screen size, and is
|
|
|
+equal to the product of the number of columns times the number of lines
|
|
|
+on the screen (\var{ScreenWidth*ScreenHeight}).
|
|
|
+\begin{verbatim}
|
|
|
+VideoBuf : PVideoBuf;
|
|
|
+VideoBufSize : Longint;
|
|
|
+\end
|
|
|
+\end{verbatim}
|
|
|
+
|
|
|
+\section{Functions and Procedures}
|
|
|
+
|
|
|
+\begin{procedure}{ClearScreen}
|
|
|
+\Declaration
|
|
|
+procedure ClearScreen;
|
|
|
+\Description
|
|
|
+\var{ClearScreen} clears the entire screen, and calls \seep{UpdateScreen}
|
|
|
+after that.
|
|
|
+\Errors
|
|
|
+None.
|
|
|
+\SeeAlso
|
|
|
+\seep{InitVideo}, \seep{UpdateScreen}
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{DefaultErrorHandler}
|
|
|
+\Declaration
|
|
|
+function DefaultErrorHandler(AErrorCode: Longint; AErrorInfo: Pointer): TErrorHandlerReturnValue;
|
|
|
+\Description
|
|
|
+{ Default error handler, simply sets error code, and returns errContinue }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{DefaultVideoModeSelector}
|
|
|
+\Declaration
|
|
|
+function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
|
|
|
+\Description
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{DoneVideo}
|
|
|
+\Declaration
|
|
|
+procedure DoneVideo;
|
|
|
+\Description
|
|
|
+{ Deinitializes the video subsystem }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{function}{GetCapabilities}
|
|
|
+\Declaration
|
|
|
+function GetCapabilities: Word;
|
|
|
+\Description
|
|
|
+{ Return the capabilities of the current environment }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{function}
|
|
|
+
|
|
|
+\begin{function}{GetCursorType}
|
|
|
+\Declaration
|
|
|
+function GetCursorType: Word;
|
|
|
+\Description
|
|
|
+{ Return the cursor type: Hidden, UnderLine or Block }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{function}
|
|
|
+
|
|
|
+\begin{procedure}{GetVideoMode}
|
|
|
+\Declaration
|
|
|
+procedure GetVideoMode(var Mode: TVideoMode);
|
|
|
+\Description
|
|
|
+{ Return dimensions of the current video mode }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{InitVideo}
|
|
|
+\Declaration
|
|
|
+procedure InitVideo;
|
|
|
+\Description
|
|
|
+{ Initializes the video subsystem }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{RegisterVideoMode}
|
|
|
+\Declaration
|
|
|
+procedure RegisterVideoMode(Col, Row: Word; Color: Boolean; VideoModeSelector: TVideoModeSelector; Params: Longint);
|
|
|
+\Description
|
|
|
+{ Registers a video mode to be selectable by SetVideoMode }
|
|
|
+{ moved to interface because we need a way to retrieve the modes }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{SetCursorPos}
|
|
|
+\Declaration
|
|
|
+procedure SetCursorPos(NewCursorX, NewCursorY: Word);
|
|
|
+\Description
|
|
|
+{ Position the cursor to the given position }
|
|
|
+\Errors
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{SetCursorType}
|
|
|
+\Declaration
|
|
|
+procedure SetCursorType(NewType: Word);
|
|
|
+\Description
|
|
|
+\var{SetCursorType} sets the cursor to the type specified in \var{NewType}.
|
|
|
+\begin{description}
|
|
|
+\item[crHidden] the cursor is not visible.
|
|
|
+\item[crUnderLine] the cursor is a small underline character (usually
|
|
|
+denoting insert mode).
|
|
|
+\item[crBlock] the cursor is a block the size of a screen cell (usually
|
|
|
+denoting overwrite mode).
|
|
|
+\item[crHalfBlock] the cursor is a block half the size of a screen cell.
|
|
|
+\end{description}
|
|
|
+\Errors
|
|
|
+None.
|
|
|
+\SeeAlso
|
|
|
+\seep{SetCursorPos}
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{SetVideoMode}
|
|
|
+\Declaration
|
|
|
+procedure SetVideoMode(Mode: TVideoMode);
|
|
|
+\Description
|
|
|
+\var{SetVideoMode} sets the video mode to the mode specified in \var{Mode}:
|
|
|
+\begin{verbatim}
|
|
|
+ TVideoMode = record
|
|
|
+ Col,Row : Word;
|
|
|
+ Color : Boolean;
|
|
|
+ end;
|
|
|
+\end{verbatim}
|
|
|
+If the call was succesful, then the screen will have \var{Col} columns and
|
|
|
+\var{Row} rows, and will be displaying in color if \var{Color} is
|
|
|
+\var{True}.
|
|
|
+Note that the video mode may not always be set. E.g. a console on Linux
|
|
|
+or a telnet session cannot always set the mode. It is important to check
|
|
|
+the error value returned by this function if it was not succesful.
|
|
|
+\Errors
|
|
|
+If the specified mode cannot be set, then \var{errVioNoSuchMode} may be set
|
|
|
+in \var{ErrorCode}
|
|
|
+\SeeAlso
|
|
|
+\end{procedure}
|
|
|
+
|
|
|
+\begin{procedure}{UpdateScreen}
|
|
|
+\Declaration
|
|
|
+procedure UpdateScreen(Force: Boolean);
|
|
|
+\Description
|
|
|
+\var{UpdateScreen} synchronizes the actual screen with the contents
|
|
|
+of the \var{VideoBuf} internal buffer. The parameter \var{Force}
|
|
|
+specifies whether the whole screen has to be redrawn (\var{Force=True})
|
|
|
+or only parts that have changed since the last update of the screen.
|
|
|
+
|
|
|
+The \var{Video} unit keeps an internal copy of the screen as it last
|
|
|
+wrote it to the screen. The current contents of \var{VideoBuf} are examined
|
|
|
+to see what locations on the screen need to be updated. On slow terminals
|
|
|
+(e.g. a \linux telnet session) this mechanism can speed up the screen redraw
|
|
|
+considerably.
|
|
|
+\Errors
|
|
|
+None.
|
|
|
+\SeeAlso
|
|
|
+\seep{ClearScreen}
|
|
|
+\end{procedure}
|
|
|
+
|