Browse Source

+ Added examples

michael 24 years ago
parent
commit
eaa64ab4ce
1 changed files with 264 additions and 50 deletions
  1. 264 50
      docs/video.tex

+ 264 - 50
docs/video.tex

@@ -37,7 +37,19 @@ size \var{ScreenWidth*ScreenHeight}, going from left to right and top to
 bottom when walking the array elements: \var{VideoBuf[0]} contains the 
 character and color code of the top-left character on the screen.
 \var{VideoBuf[ScreenWidth]} contains the data for the character in the
-first columnd of the second row on the screen, and so on.
+first column of the second row on the screen, and so on.
+
+The color attribute is a combination of the foreground and background color,
+plus the blink bit. The bits descrie the various color combinations:
+\begin{description}
+\item[bits 0-3] The foreground color. Can be set using all color constants. 
+\item[bits 4-6] The background color. Can be set using a subset of the
+color constants.
+\item[bit 7] The blinking bit. If this bit is set, the character will appear
+blinking.
+\end{description}
+Each possible color has a constant associated with it, see page
+\pageref{vidcolorconst} for a list of constants.
 
 The contents of the \var{VideoBuf} array may be modified: This is 'writing'
 to the screen. As soon as everything that needs to be written in the array
@@ -49,17 +61,24 @@ The updating of the screen can be prohibited to optimize performance; To
 this end, the \seep{LockScreenUpdate} function can be used: This will
 increment an internal counter. As long as the counter different from zero,
 calling \seep{UpdateScreen} will not do anything. The counter can be
-lowered with \seep{UnLockscreenUpdate}. When it reaches zero, the next call
+lowered with \seep{UnlockScreenUpdate}. When it reaches zero, the next call
 to \seep{UpdateScreen} will actually update the screen. This is useful when
 having nested procedures that do a lot of screen writing.
 
 The video unit also presents an interface for custom screen drivers, thus
 it is possible to override the default screen driver with a custom screen 
-driver, see the \seep{SetVideoDriver} call.
+driver, see the \seef{SetVideoDriver} call. The current video driver can
+be retrieved using the \seep{GetVideoDriver} call.
+
+\begin{remark}
+The video unit should {\em not} be used together with the \file{crt} unit.
+Doing so will result in very strange behaviour, possibly program crashes.
+\end{remark}
 
 \section{Constants, Type and variables }
 
 \subsection{Constants}
+\label{vidcolorconst}
 The following constants describe colors that can be used as 
 foreground and background colors.
 \begin{verbatim}
@@ -72,7 +91,7 @@ Magenta       = 5;
 Brown         = 6;
 LightGray     = 7;
 \end{verbatim}
-The following color constants can be used only as foreground colors:
+The following color constants can be used as foreground colors only:
 \begin{verbatim}
 DarkGray      = 8;
 LightBlue     = 9;
@@ -83,10 +102,18 @@ LightMagenta  = 13;
 Yellow        = 14;
 White         = 15;
 \end{verbatim}
-The foreground color can be logically or-ed with the blink attribute:
+The foreground and background color can be combined to a color attribute
+with the following code:
+\begin{verbatim}
+Attr:=ForeGroundColor + (BackGroundColor shr 4);
+\end{verbatim}
+The color attribute can be logically or-ed with the blink attribute to
+produce a blinking character:
 \begin{verbatim}
 Blink         = 128;
 \end{verbatim}
+But not all drivers may support this.
+
 The following constants describe the capabilities of a certain video mode:
 \begin{verbatim}
 cpUnderLine     = $0001;
@@ -129,7 +156,7 @@ 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.
+function. It is set by default to the \seep{DefaultErrorHandler} function.
 
 The \var{Modes} list contains the list of supported video modes:
 \begin{verbatim}
@@ -138,15 +165,15 @@ Modes: PVideoModeList = nil;
 
 \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.
+self-explaining: \var{Col,Row} describe the number of columns and 
+rows on the screen for this mode. \var{Color} is \var{True} if this mode
+supports colors, or \var{False} if not.
 \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,
@@ -161,18 +188,6 @@ screen.
 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);
@@ -210,9 +225,16 @@ equal to the product of the number of columns times the number of lines
 on the screen (\var{ScreenWidth*ScreenHeight}).
 \begin{verbatim}
 VideoBuf     : PVideoBuf;
+OldVideoBuf  : PVideoBuf;
 VideoBufSize : Longint;
-\end
 \end{verbatim}
+The \var{OldVideoBuf} contains the state of the video screen after the last
+screen update. The \seep{UpdateScreen} function uses this array to decide
+which characters on screen should be updated, and which not. 
+
+Note that the \var{OldVideoBuf} array may be ignored by some drivers, so
+it should not be used. The Array is in the interface section of the video
+unit mainly so drivers that need it can make use of it. 
 
 \section{Functions and Procedures}
 
@@ -221,13 +243,16 @@ VideoBufSize : Longint;
 procedure ClearScreen; 
 \Description
 \var{ClearScreen} clears the entire screen, and calls \seep{UpdateScreen}
-after that.
+after that. This is done by writing spaces to all character cells of the
+video buffer in the default color (lightgray on black, color attribute \$07).
 \Errors
 None.
 \SeeAlso
 \seep{InitVideo}, \seep{UpdateScreen}
 \end{procedure}
 
+\FPCexample{ex3}
+
 \begin{procedure}{DefaultErrorHandler}
 \Declaration
 function  DefaultErrorHandler(AErrorCode: Longint; AErrorInfo: Pointer): TErrorHandlerReturnValue; 
@@ -241,15 +266,6 @@ None.
 \SeeAlso
 \end{procedure}
 
-\begin{procedure}{DefaultVideoModeSelector}
-\Declaration
-function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
-\Description
-Needs to be removed from the API.
-\Errors
-\SeeAlso
-\end{procedure}
-
 \begin{procedure}{DoneVideo}
 \Declaration
 procedure DoneVideo; 
@@ -258,66 +274,207 @@ procedure DoneVideo;
 the videodriver was already disabled or not yet initialized, it does
 nothing. Disabling the driver means it will clean up any allocated
 resources, possibly restore the screen in the state it was before
-\var{InitVideo} was called.
+\var{InitVideo} was called. Particularly, the \var{VideoBuf} and
+\var{OldVideoBuf} arrays are no longer valid after a call to 
+\var{DoneVideo}.
+
+The \var{DoneVideo} should always be called if \var{InitVideo} was called.
+Failing to do so may leave the screen in an unusable state after the program
+exits.
 \Errors
+Normally none. If the driver reports an error, this is done through the
+\var{ErrorCode} variable.
 \SeeAlso
+\seep{InitVideo}
 \end{procedure}
 
+For an example, see most other functions.
+
 \begin{function}{GetCapabilities}
 \Declaration
-function  GetCapabilities: Word; 
+function GetCapabilities: Word; 
 \Description
-{ Return the capabilities of the current environment }
+\var{GetCapabilities} returns the capabilities of the current driver.
+environment. It is an or-ed combination of the following constants:
+\begin{description}
+\item[cpUnderLine] The driver supports underlined characters.
+\item[cpBlink] The driver supports blinking characters.
+\item[cpColor] The driver supports colors.
+\item[cpChangeFont] The driver supports the setting of a screen font.
+Note, however, that a font setting API is not supported by the video unit.
+\item[cpChangeMode] The driver supports the setting of screen modes. 
+\item[cpChangeCursor] The driver supports changing the cursor shape.
+\end{description}
+Note that the video driver should not yet be initialized to use this
+function. It is a property of the driver.
 \Errors
+None.
 \SeeAlso
+\seef{GetCursorType}, \seep{GetVideoDriver}
 \end{function}
 
+\FPCexample{ex4}
+
 \begin{function}{GetCursorType}
 \Declaration
 function GetCursorType: Word; 
 \Description
-{ Return the cursor type: Hidden, UnderLine or Block }
+\var{GetCursorType} returns the current cursor type. It is one of the
+following values: 
+\begin{description}
+\item[crHidden] The cursor is currently hidden.
+\item[crUnderLine] The cursor is currently the underline character.
+\item[crBlock] The cursor is currently the block character.
+\item[crHalfBlock] The cursur is currently a block with height of half the
+character cell height.
+\end{description}
+Note that not all drivers support all types of cursors.
+\Errors
+None.
+\SeeAlso
+\seep{SetCursorType}, \seef{GetCapabilities}
+\end{function}
+
+\FPCexample{ex5}
+
+\begin{function}{GetLockScreenCount}
+\Declaration
+Function GetLockScreenCount : integer;
+\Description
+\var{GetLockScreenCount} returns the current lock level. When the lock
+level is zero, a call to \seep{UpdateScreen} will actually update the
+screen.
 \Errors
+None.
 \SeeAlso
+\seep{LockScreenUpdate}, \seep{UnlockScreenUpdate}, \seep{UpdateScreen}
 \end{function}
 
+\FPCexample{ex6}
+
+\begin{procedure}{GetVideoDriver}
+\Declaration
+Procedure GetVideoDriver (Var Driver : TVideoDriver);
+\Declaration
+\var{GetVideoDriver} retrieves the current videodriver and returns it in
+\var{Driver}. This can be used to chain video drivers.
+\Errors
+None.
+\SeeAlso
+\seef{SetVideoDriver}
+\end{procedure}
+
+For an example, see the section on writing a custom video driver.
+
 \begin{procedure}{GetVideoMode}
 \Declaration
 procedure GetVideoMode(var Mode: TVideoMode); 
 \Description
-{ Return dimensions of the current video mode }
+\var{GetVideoMode} returns the settings of the currently active video mode.
+The \var{row,col} fields indicate the dimensions of the current video mode,
+and \var{Color} is true if the current video supports colors.
 \Errors
+None.
 \SeeAlso
+\seef{SetVideoMode}, \seef{GetVideoModeData}
 \end{procedure}
 
+\FPCexample{ex7}
+
+\begin{function}{GetVideoModeCount}
+\Declaration
+Function GetVideoModeCount : Word;
+\Description
+\var{GetVideoModeCount} returns the number of video modes that the current
+driver supports. If the driver does not support switching of modes, then 1
+is returned.
+
+This function can be used in conjunction with the \seef{GetVideoModeData}
+function to retrieve data for the supported video modes.
+\Errors
+None.
+\SeeAlso
+\seef{GetVideoModeData}, \seep{GetVideoMode}
+\end{function}
+
+\FPCexample{ex8}
+
+\begin{function}{GetVideoModeData}
+\Declaration
+Function GetVideoModeData(Index : Word; Var Data: TVideoMode) : Boolean;  
+\Description
+\var{GetVideoModeData} returns the characteristics of the \var{Index}-th
+video mode in \var{Data}. \var{Index} is zero based, and has a maximum value of
+\var{GetVideoModeCount-1}. If the current driver does not support setting of
+modes (\var{GetVideoModeCount=1}) and \var{Index} is zero, the current mode 
+is returned.
+
+The function returns \var{True} if the mode data was retrieved succesfully,
+\var{False} otherwise.
+\Errors
+In case \var{Index} has a wrong value, \var{False} is returned.
+\SeeAlso
+\seef{GetVideoModeCount}, \seef{SetVideoMode}, \seep{GetVideoMode}
+\end{function}
+
+For an example, see \seef{GetVideoModeCount}.
+
 \begin{procedure}{InitVideo}
 \Declaration
 procedure InitVideo; 
 \Description
-{ Initializes the video subsystem }
+\var{InitVideo} Initializes the video subsystem. If the video system was
+already initialized, it does nothing. If the video subsystem was not
+initialized, it initializes the video subsystem. It initializes the video
+driver, and assigns the \var{VideoBuf} and \var{OldVideoBuf} pointers. After
+that, the screen is cleared.
 \Errors
+if the driver fails to initialize, the \var{ErrorCode} variable is set.
 \SeeAlso
+\seep{DoneVideo}
 \end{procedure}
 
-\begin{procedure}{RegisterVideoMode}
+For an example, see most other functions.
+
+\begin{procedure}{LockScreenUpdate}
 \Declaration
-procedure RegisterVideoMode(Col, Row: Word; Color: Boolean; VideoModeSelector: TVideoModeSelector; Params: Longint); 
+Procedure LockScreenUpdate;
 \Description
-{ Registers a video mode to be selectable by SetVideoMode } 
-{ moved to interface because we need a way to retrieve the modes }
+\var{LockScreenUpdate} increments the screen update lock count with one.
+As long as the screen update lock count is not zero, \seep{UpdateScreen}
+will not actually update the screen.
+
+This function can be used to optimize screen updating: If a lot of writing
+on the screen needs to be done (by possibly unknown functions), calling
+\var{LockScreenUpdate} before the drawing, and \seep{UnlockScreenUpdate}
+after the drawing, followed by a \seep{UpdateScreen} call, all writing will
+be shown on screen at once.
 \Errors
+None.
 \SeeAlso
+\seep{UpdateScreen}, \seep{UnlockScreenUpdate}, \seef{GetLockScreenCount}
 \end{procedure}
 
+For an example, see \seef{GetLockScreenCount}.
+
 \begin{procedure}{SetCursorPos}
 \Declaration
 procedure SetCursorPos(NewCursorX, NewCursorY: Word); 
 \Description
-{ Position the cursor to the given position }
+\var{SetCursorPos} positions the cursor on the given position: Column 
+\var{NewCursorX} and row \var{NewCursorY}. The origin of the screen is the
+upper left corner, and has coordinates \var{(0,0)}.
+
+The current position is stored in the \var{CursorX} and \var{CursorY}
+variables.
 \Errors
+None.
 \SeeAlso
+\seep{SetCursorType}
 \end{procedure}
 
+\FPCexample{ex2}
+
 \begin{procedure}{SetCursorType}
 \Declaration
 procedure SetCursorType(NewType: Word); 
@@ -337,9 +494,30 @@ None.
 \seep{SetCursorPos}
 \end{procedure}
 
-\begin{procedure}{SetVideoMode}
+\begin{function}{SetVideoDriver}
+\Declaration
+Function SetVideoDriver (Const Driver : TVideoDriver) : Boolean;
+\Description
+\var{SetVideoDriver} sets the videodriver to be used to \var{Driver}. If
+the current videodriver is initialized (after a call to \var{InitVideo})
+then it does nothing and returns \var{False}.
+
+A new driver can only be installed if the previous driver was not yet
+activated (i.e. before a call to \seep{InitVideo}) or after it was
+deactivated (i.e after a call to \var{DoneVideo}).
+
+For more information about installing a videodriver, see \sees{viddriver}.
+\Errors
+If the current driver is initialized, then \var{False} is returned.
+\SeeAlso
+\sees{viddriver}
+\end{function}
+
+For an example, see the section on writing a custom video driver.
+
+\begin{function}{SetVideoMode}
 \Declaration
-procedure SetVideoMode(Mode: TVideoMode); 
+Function SetVideoMode(Mode: TVideoMode) : Boolean;
 \Description
 \var{SetVideoMode} sets the video mode to the mode specified in \var{Mode}:
 \begin{verbatim}
@@ -350,16 +528,48 @@ procedure SetVideoMode(Mode: TVideoMode);
 \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}.
+\var{True}. 
+
+The function returns \var{True} if the mode was set succesfully, \var{False}
+otherwise.
+
 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.
+
+To know which modes are valid, use the \seef{GetVideoModeCount} and
+\seef{GetVideoModeData} functions. To retrieve the current video mode, 
+use the \seep{GetVideoMode} procedure.
 \Errors
 If the specified mode cannot be set, then \var{errVioNoSuchMode} may be set
 in \var{ErrorCode}
 \SeeAlso
+\seef{GetVideoModeCount}
+\seef{GetVideoModeData}
+\seep{GetVideoMode}
+\end{function}
+
+\begin{procedure}{UnlockScreenUpdate}
+\Declaration
+Procedure UnlockScreenUpdate;
+\Description
+\var{UnlockScreenUpdate} decrements the screen update lock count with one if
+it is larger than zero. When the lock count reaches zero, the 
+\seep{UpdateScreen} will actually update the screen. No screen upate will 
+be performed as long as the screen update lock count is nonzero. This 
+mechanism can be used to increase screen performance in case a lot of 
+writing is done. 
+
+It is important to make sure that each call to \seep{LockScreenUpdate} is
+matched by exactly one call to \var{UnlockScreenUpdate}
+\Errors
+None.
+\SeeAlso
+\seep{LockScreenUpdate}, \seef{GetLockScreenCount}, \seep{UpdateScreen}
 \end{procedure}
 
+For an example, see \seef{GetLockScreenCount}.
+
 \begin{procedure}{UpdateScreen}
 \Declaration
 procedure UpdateScreen(Force: Boolean); 
@@ -370,13 +580,17 @@ 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.
+wrote it to the screen (in the \var{OldVideoBuf} array). 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}
 
+For an example, see most other functions.
+
+\section{Writing a custom video driver}
+\label{se:viddriver}