Browse Source

+ fast GetImage, PutImage and GetScanLine implementations, based on a patch by James Richters

git-svn-id: trunk@37586 -
nickysn 7 years ago
parent
commit
f35c28e3c0
1 changed files with 574 additions and 0 deletions
  1. 574 0
      packages/graph/src/ptcgraph/ptcgraph.pp

+ 574 - 0
packages/graph/src/ptcgraph/ptcgraph.pp

@@ -1362,6 +1362,457 @@ begin
   BlueValue := VGAPalette[ColorNum, 2] shl 2;
   BlueValue := VGAPalette[ColorNum, 2] shl 2;
 end;
 end;
 
 
+{**********************************************************}
+{ Procedure PutImage()                                     }
+{----------------------------------------------------------}
+{ Displays the image contained in a bitmap starting at X,Y }
+{ the first 2 bytes of the bitmap structure define the     }
+{ width and height of the bitmap                           }
+{ note: This optomized version does not use PutPixel       }
+{   Which would be checking the viewport for every pixel   }
+{   Instead it just does it's own viewport check once then }
+{   puts all the pixels within the veiwport without further}
+{   checking.  Also instead of checking BitBlt every pixel }
+{   it is only checked once before all the pixels are      }
+{   displayed at once   (JMR)                              }
+{**********************************************************}
+
+Procedure ptc_PutImageproc_8bpp(X,Y: smallint; var Bitmap; BitBlt: Word);
+type
+  pt = array[0..{$ifdef cpu16}16382{$else}$fffffff{$endif}] of word;
+  ptw = array[0..2] of longint;
+var
+  pixels:Pbyte;
+  k: longint;
+  i, j, y1, x1, deltaX, deltaX1, deltaY: smallint;
+  JxW, I_JxW: Longword;
+Begin
+  inc(x,startXViewPort);
+  inc(y,startYViewPort);
+  { width/height are 1-based, coordinates are zero based }
+  x1 := ptw(Bitmap)[0]+x-1; { get width and adjust end coordinate accordingly }
+  y1 := ptw(Bitmap)[1]+y-1; { get height and adjust end coordinate accordingly }
+  deltaY := 0;
+  deltaX := 0;
+  deltaX1 := 0;
+  k := 3 * sizeOf(Longint) div sizeOf(Word); { Three reserved longs at start of bitmap }
+ { check which part of the image is in the viewport }
+  if clipPixels then
+    begin
+      if y < startYViewPort then
+        begin
+          deltaY := startYViewPort - y;
+          inc(k,(x1-x+1)*deltaY);
+          y := startYViewPort;
+         end;
+      if y1 > startYViewPort+viewHeight then
+        y1 := startYViewPort+viewHeight;
+      if x < startXViewPort then
+        begin
+          deltaX := startXViewPort-x;
+          x := startXViewPort;
+        end;
+      if x1 > startXViewPort + viewWidth then
+        begin
+          deltaX1 := x1 - (startXViewPort + viewWidth);
+          x1 := startXViewPort + viewWidth;
+        end;
+    end;
+  pixels := ptc_surface_lock;
+  case BitBlt of
+    XORPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] xor (pt(bitmap)[k] and ColorMask);
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    ORPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] or (pt(bitmap)[k] and ColorMask);
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    AndPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] and (pt(bitmap)[k] and ColorMask);
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    NotPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                pixels[i+JxW] := (pt(bitmap)[k] and ColorMask) xor ColorMask;
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    Else
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                pixels[i+JxW] := pt(bitmap)[k] and ColorMask;
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+  End; {case}
+  ptc_surface_unlock;
+  ptc_update;
+end;
+Procedure ptc_PutImageproc_16bpp(X,Y: smallint; var Bitmap; BitBlt: Word);
+type
+  pt = array[0..{$ifdef cpu16}16382{$else}$fffffff{$endif}] of word;
+  ptw = array[0..2] of longint;
+var
+  pixels:Pword;
+  k: longint;
+  i, j, y1, x1, deltaX, deltaX1, deltaY: smallint;
+  JxW, I_JxW: Longword;
+Begin
+  inc(x,startXViewPort);
+  inc(y,startYViewPort);
+  { width/height are 1-based, coordinates are zero based }
+  x1 := ptw(Bitmap)[0]+x-1; { get width and adjust end coordinate accordingly }
+  y1 := ptw(Bitmap)[1]+y-1; { get height and adjust end coordinate accordingly }
+  deltaY := 0;
+  deltaX := 0;
+  deltaX1 := 0;
+  k := 3 * sizeOf(Longint) div sizeOf(Word); { Three reserved longs at start of bitmap }
+ { check which part of the image is in the viewport }
+  if clipPixels then
+    begin
+      if y < startYViewPort then
+        begin
+          deltaY := startYViewPort - y;
+          inc(k,(x1-x+1)*deltaY);
+          y := startYViewPort;
+         end;
+      if y1 > startYViewPort+viewHeight then
+        y1 := startYViewPort+viewHeight;
+      if x < startXViewPort then
+        begin
+          deltaX := startXViewPort-x;
+          x := startXViewPort;
+        end;
+      if x1 > startXViewPort + viewWidth then
+        begin
+          deltaX1 := x1 - (startXViewPort + viewWidth);
+          x1 := startXViewPort + viewWidth;
+        end;
+    end;
+  pixels := ptc_surface_lock;
+  case BitBlt of
+    XORPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] xor pt(bitmap)[k];
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    ORPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] or pt(bitmap)[k];
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    AndPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                I_JxW:=i+JxW;
+                pixels[I_JxW] := pixels[I_JxW] and pt(bitmap)[k];
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    NotPut:
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                pixels[i+JxW] := pt(bitmap)[k] xor $FFFF;
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+    Else
+      Begin
+        for j:=Y to Y1 do
+          Begin
+            JxW:=j*PTCWidth;
+            inc(k,deltaX);
+            for i:=X to X1 do
+              begin
+                pixels[i+JxW] := pt(bitmap)[k];
+                inc(k);
+              end;
+            inc(k,deltaX1);
+          End;
+      End;
+  End; {case}
+  ptc_surface_unlock;
+  ptc_update;
+end;
+
+{**********************************************************}
+{ Procedure GetScanLine()                                  }
+{----------------------------------------------------------}
+{ Returns the full scanline of the video line of the Y     }
+{ coordinate. The values are returned in a WORD array      }
+{ each WORD representing a pixel of the specified scanline }
+{ note: we only need the pixels inside the ViewPort! (JM)  }
+{ note2: extended so you can specify start and end X coord }
+{   so it is usable for GetImage too (JM)                  }
+{ note3: This optomized version does not use GetPixel,     }
+{   Whcih would be checking the viewport for every pixel.  }
+{   Instead it just does it's own viewport check once then }
+{   gets all the pixels on the scan line without further   }
+{   checking  (JMR)                                        }
+{**********************************************************}
+
+Procedure PTC_GetScanlineProc_8bpp (X1, X2, Y : smallint; Var Data);
+Var
+  pixels        : Pbyte;
+  x,vpx1,vpx2   : smallint;
+Begin
+   vpx1:=X1+StartXViewPort;
+   vpx2:=X2+StartXViewPort;
+   Y:=Y+StartYViewPort;
+    { constrain to the part of the scanline that is in the viewport }
+    if clipPixels then
+       begin
+          if vpx1 <  startXViewPort then
+             vpx1 := startXViewPort;
+          if vpx2 >  startXViewPort + viewWidth then
+             vpx2 := startXViewPort + viewWidth;
+       end;
+    { constrain to the part of the scanline that is on the screen }
+    if vpx1 <  0 then
+       vpx1 := 0;
+    if vpx2 >= PTCwidth then
+       vpx2 := PTCwidth-1;
+    If (ClipPixels AND (y <= startYViewPort+viewHeight) and (y >= startYViewPort) and (y>=0) and (y<PTCheight)) or Not(ClipPixels) then
+       Begin
+          pixels := ptc_surface_lock;
+          For x:=vpx1 to vpx2 Do
+             WordArray(Data)[x-StartXViewPort-x1]:=pixels[x+y*PTCWidth] and ColorMask;
+          ptc_surface_unlock;
+       End;
+End;
+
+Procedure PTC_GetScanlineProc_16bpp (X1, X2, Y : smallint; Var Data);
+Var
+  pixels        : Pword;
+  x,vpx1,vpx2   : smallint;
+Begin
+   vpx1:=X1+StartXViewPort;
+   vpx2:=X2+StartXViewPort;
+   Y:=Y+StartYViewPort;
+    { constrain to the part of the scanline that is in the viewport }
+    if clipPixels then
+       begin
+          if vpx1 <  startXViewPort then
+             vpx1 := startXViewPort;
+          if vpx2 >  startXViewPort + viewWidth then
+             vpx2 := startXViewPort + viewWidth;
+       end;
+    { constrain to the part of the scanline that is on the screen }
+    if vpx1 <  0 then
+       vpx1 := 0;
+    if vpx2 >= PTCwidth then
+       vpx2 := PTCwidth-1;
+    If (ClipPixels AND (y <= startYViewPort+viewHeight) and (y >= startYViewPort) and (y>=0) and (y<PTCheight)) or Not(ClipPixels) then
+       Begin
+          pixels := ptc_surface_lock;
+          For x:=vpx1 to vpx2 Do
+             WordArray(Data)[x-StartXViewPort-x1]:=pixels[x+y*PTCWidth];
+          ptc_surface_unlock;
+       End;
+End;
+
+{**********************************************************}
+{ Procedure GetImage()                                     }
+{----------------------------------------------------------}
+{ Returns a bitmap full the video specified by a rectagle  }
+{ defined by X1,Y1 to X2,Y2                                }
+{ the first 2 bytes of the bitmap structure define the     }
+{ width and height of the rectangle                        }
+{ These are later used by PutImage() so the bitmap is      }
+{ properly represented                                     }
+{ there is a 3rd reserved byte before data starts          }
+{ note: This optomized version does not use GetScanLine or }
+{   GetPixel, Whcih would be checking the viewport for     }
+{   every pixel. Instead it just does it's own viewport    }
+{   check once then gets all the pixels within the veiwport}
+{   without further checking  (JMR)                        }
+{**********************************************************}
+
+Procedure PTC_GetImageProc_8bpp(X1,Y1,X2,Y2: smallint; Var Bitmap);
+type
+  pt = array[0..{$ifdef cpu16}16382{$else}$fffffff{$endif}] of word;
+  ptw = array[0..2] of longint;
+var
+  pixels                       : Pbyte;
+  x,y,i,j,vpx1,vpx2,vpy1,vpy2  : smallint;
+  k      : longint;
+Begin
+  ptw(Bitmap)[0] := X2-X1+1;   { First longint  is width  }
+  ptw(Bitmap)[1] := Y2-Y1+1;   { Second longint is height }
+  ptw(bitmap)[2] := 0;         { Third longint is reserved}
+  k:= 3 * Sizeof(longint) div sizeof(word); { Three reserved longs at start of bitmap }
+  vpx1:=x1+StartXViewPort;
+  vpx2:=x2+StartXViewPort;
+  vpy1:=y1+StartYViewPort;
+  vpy2:=y2+StartYViewPort;
+  { check which part of the image is in the viewport }
+  if clipPixels then
+    begin
+      if vpx1 < startXViewPort then
+        vpx1 := startXViewPort;
+      if vpx2 > startXViewPort + viewWidth then
+        vpx2 := startXViewPort + viewWidth;
+      if vpy1 < startYViewPort then
+        vpy1 := startYViewPort;
+      if vpy2 > startYViewPort+viewHeight then
+        vpy2 := startYViewPort+viewHeight;
+    end;
+  { check if coordinates are on the screen}
+  if vpx1 < 0 then
+    vpx1 := 0;
+  if vpx2 >= PTCwidth then
+    vpx2 := PTCwidth-1;
+  if vpy1 < 0 then
+    vpy1 := 0;
+  if vpy2 >= PTCheight then
+    vpy2 := PTCheight-1;
+  i := (x2 - x1 + 1);
+  j := i * (vpy1 - StartYViewPort - y1);
+  inc(k,j);
+  pixels := ptc_surface_lock;
+  for y:=vpy1 to vpy2 do
+   Begin
+     For x:=vpx1 to vpx2 Do
+       pt(Bitmap)[k+(x-StartXViewPort-x1)]:=pixels[x+y*PTCWidth] and ColorMask;
+     inc(k,i);
+   end;
+   ptc_surface_unlock;
+end;
+
+Procedure PTC_GetImageProc_16bpp(X1,Y1,X2,Y2: smallint; Var Bitmap);
+type
+  pt = array[0..{$ifdef cpu16}16382{$else}$fffffff{$endif}] of word;
+  ptw = array[0..2] of longint;
+var
+  pixels : Pword;
+  x,y,i,j,vpx1,vpx2,vpy1,vpy2  : smallint;
+  k      : longint;
+Begin
+  ptw(Bitmap)[0] := X2-X1+1;   { First longint  is width  }
+  ptw(Bitmap)[1] := Y2-Y1+1;   { Second longint is height }
+  ptw(bitmap)[2] := 0;         { Third longint is reserved}
+  k:= 3 * Sizeof(longint) div sizeof(word); { Three reserved longs at start of bitmap }
+  vpx1:=x1+StartXViewPort;
+  vpx2:=x2+StartXViewPort;
+  vpy1:=y1+StartYViewPort;
+  vpy2:=y2+StartYViewPort;
+  { check which part of the image is in the viewport }
+  if clipPixels then
+    begin
+      if vpx1 < startXViewPort then
+        vpx1 := startXViewPort;
+      if vpx2 > startXViewPort + viewWidth then
+        vpx2 := startXViewPort + viewWidth;
+      if vpy1 < startYViewPort then
+        vpy1 := startYViewPort;
+      if vpy2 > startYViewPort+viewHeight then
+        vpy2 := startYViewPort+viewHeight;
+    end;
+  { check if coordinates are on the screen}
+  if vpx1 < 0 then
+    vpx1 := 0;
+  if vpx2 >= PTCwidth then
+    vpx2 := PTCwidth-1;
+  if vpy1 < 0 then
+    vpy1 := 0;
+  if vpy2 >= PTCheight then
+    vpy2 := PTCheight-1;
+  i := (x2 - x1 + 1);
+  j := i * (vpy1 - StartYViewPort - y1);
+  inc(k,j);
+  pixels := ptc_surface_lock;
+  for y:=vpy1 to vpy2 do
+   Begin
+     For x:=vpx1 to vpx2 Do
+       pt(Bitmap)[k+(x-StartXViewPort-x1)]:=pixels[x+y*PTCWidth];
+      inc(k,i);
+   end;
+   ptc_surface_unlock;
+end;
+
 {************************************************************************}
 {************************************************************************}
 {*                       General routines                               *}
 {*                       General routines                               *}
 {************************************************************************}
 {************************************************************************}
@@ -1522,7 +1973,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC0;
        InitMode       := @ptc_Init320x200x4cgaC0;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1555,7 +2009,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC1;
        InitMode       := @ptc_Init320x200x4cgaC1;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1588,7 +2045,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC2;
        InitMode       := @ptc_Init320x200x4cgaC2;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1621,7 +2081,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC3;
        InitMode       := @ptc_Init320x200x4cgaC3;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1654,7 +2117,10 @@ end;
        InitMode       := @ptc_Init640x200x2;
        InitMode       := @ptc_Init640x200x2;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1687,7 +2153,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC0;
        InitMode       := @ptc_Init320x200x4cgaC0;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1720,7 +2189,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC1;
        InitMode       := @ptc_Init320x200x4cgaC1;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1753,7 +2225,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC2;
        InitMode       := @ptc_Init320x200x4cgaC2;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1786,7 +2261,10 @@ end;
        InitMode       := @ptc_Init320x200x4cgaC3;
        InitMode       := @ptc_Init320x200x4cgaC3;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1819,7 +2297,10 @@ end;
        InitMode       := @ptc_Init640x200x2;
        InitMode       := @ptc_Init640x200x2;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1852,7 +2333,10 @@ end;
        InitMode       := @ptc_Init640x480x2;
        InitMode       := @ptc_Init640x480x2;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1887,7 +2371,10 @@ end;
          InitMode       := @ptc_Init720x348x2;
          InitMode       := @ptc_Init720x348x2;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_8bpp;
          HLine          := @ptc_HLineProc_8bpp;
@@ -1917,7 +2404,10 @@ end;
        InitMode       := @ptc_Init640x200x16;
        InitMode       := @ptc_Init640x200x16;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1947,7 +2437,10 @@ end;
        InitMode       := @ptc_Init640x350x16;
        InitMode       := @ptc_Init640x350x16;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -1977,7 +2470,10 @@ end;
        InitMode       := @ptc_Init640x200x16;
        InitMode       := @ptc_Init640x200x16;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2007,7 +2503,10 @@ end;
        InitMode       := @ptc_Init640x350x16;
        InitMode       := @ptc_Init640x350x16;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2037,7 +2536,10 @@ end;
        InitMode       := @ptc_Init640x480x16;
        InitMode       := @ptc_Init640x480x16;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2067,7 +2569,10 @@ end;
        InitMode       := @ptc_Init320x200x256;
        InitMode       := @ptc_Init320x200x256;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2098,7 +2603,10 @@ end;
        InitMode       := @ptc_Init320x200x256;
        InitMode       := @ptc_Init320x200x256;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2129,7 +2637,10 @@ end;
        InitMode       := @ptc_Init640x400x256;
        InitMode       := @ptc_Init640x400x256;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2160,7 +2671,10 @@ end;
        InitMode       := @ptc_Init640x480x256;
        InitMode       := @ptc_Init640x480x256;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        DirectPutPixel := @ptc_DirectPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
        PutPixel       := @ptc_PutPixelProc_8bpp;
+       PutImage       := @ptc_PutImageProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
        GetPixel       := @ptc_GetPixelProc_8bpp;
+       GetScanLine    := @ptc_GetScanLineProc_8bpp;
+       GetImage       := @ptc_GetImageProc_8bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
        //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2191,7 +2705,10 @@ end;
        InitMode       := @ptc_Init320x200x32k;
        InitMode       := @ptc_Init320x200x32k;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
+       PutImage       := @ptc_PutImageProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
+       GetScanLine    := @ptc_GetScanLineProc_16bpp;
+       GetImage       := @ptc_GetImageProc_16bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        HLine          := @ptc_HLineProc_16bpp;
        HLine          := @ptc_HLineProc_16bpp;
@@ -2219,7 +2736,10 @@ end;
        InitMode       := @ptc_Init640x480x32k;
        InitMode       := @ptc_Init640x480x32k;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
+       PutImage       := @ptc_PutImageProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
+       GetScanLine    := @ptc_GetScanLineProc_16bpp;
+       GetImage       := @ptc_GetImageProc_16bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        HLine          := @ptc_HLineProc_16bpp;
        HLine          := @ptc_HLineProc_16bpp;
@@ -2247,7 +2767,10 @@ end;
        InitMode       := @ptc_Init320x200x64k;
        InitMode       := @ptc_Init320x200x64k;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
+       PutImage       := @ptc_PutImageProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
+       GetScanLine    := @ptc_GetScanLineProc_16bpp;
+       GetImage       := @ptc_GetImageProc_16bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        HLine          := @ptc_HLineProc_16bpp;
        HLine          := @ptc_HLineProc_16bpp;
@@ -2275,7 +2798,10 @@ end;
        InitMode       := @ptc_Init640x480x64k;
        InitMode       := @ptc_Init640x480x64k;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        DirectPutPixel := @ptc_DirectPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
        PutPixel       := @ptc_PutPixelProc_16bpp;
+       PutImage       := @ptc_PutImageProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
        GetPixel       := @ptc_GetPixelProc_16bpp;
+       GetScanLine    := @ptc_GetScanLineProc_16bpp;
+       GetImage       := @ptc_GetImageProc_16bpp;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        SetRGBPalette  := @ptc_SetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        GetRGBPalette  := @ptc_GetRGBPaletteProc;
        HLine          := @ptc_HLineProc_16bpp;
        HLine          := @ptc_HLineProc_16bpp;
@@ -2305,7 +2831,10 @@ end;
          InitMode       := @ptc_Init800x600x16;
          InitMode       := @ptc_Init800x600x16;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2335,7 +2864,10 @@ end;
          InitMode       := @ptc_Init800x600x256;
          InitMode       := @ptc_Init800x600x256;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2366,7 +2898,10 @@ end;
          InitMode       := @ptc_Init800x600x32k;
          InitMode       := @ptc_Init800x600x32k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2394,7 +2929,10 @@ end;
          InitMode       := @ptc_Init800x600x64k;
          InitMode       := @ptc_Init800x600x64k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2425,7 +2963,10 @@ end;
          InitMode       := @ptc_Init1024x768x16;
          InitMode       := @ptc_Init1024x768x16;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2455,7 +2996,10 @@ end;
          InitMode       := @ptc_Init1024x768x256;
          InitMode       := @ptc_Init1024x768x256;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2486,7 +3030,10 @@ end;
          InitMode       := @ptc_Init1024x768x32k;
          InitMode       := @ptc_Init1024x768x32k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2514,7 +3061,10 @@ end;
          InitMode       := @ptc_Init1024x768x64k;
          InitMode       := @ptc_Init1024x768x64k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2545,7 +3095,10 @@ end;
          InitMode       := @ptc_Init1280x1024x16;
          InitMode       := @ptc_Init1280x1024x16;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2575,7 +3128,10 @@ end;
          InitMode       := @ptc_Init1280x1024x256;
          InitMode       := @ptc_Init1280x1024x256;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          DirectPutPixel := @ptc_DirectPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
          PutPixel       := @ptc_PutPixelProc_8bpp;
+         PutImage       := @ptc_PutImageProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
          GetPixel       := @ptc_GetPixelProc_8bpp;
+         GetScanLine    := @ptc_GetScanLineProc_8bpp;
+         GetImage       := @ptc_GetImageProc_8bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
          //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2606,7 +3162,10 @@ end;
          InitMode       := @ptc_Init1280x1024x32k;
          InitMode       := @ptc_Init1280x1024x32k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2634,7 +3193,10 @@ end;
          InitMode       := @ptc_Init1280x1024x64k;
          InitMode       := @ptc_Init1280x1024x64k;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          DirectPutPixel := @ptc_DirectPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
          PutPixel       := @ptc_PutPixelProc_16bpp;
+         PutImage       := @ptc_PutImageProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
          GetPixel       := @ptc_GetPixelProc_16bpp;
+         GetScanLine    := @ptc_GetScanLineProc_16bpp;
+         GetImage       := @ptc_GetImageProc_16bpp;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          SetRGBPalette  := @ptc_SetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          GetRGBPalette  := @ptc_GetRGBPaletteProc;
          HLine          := @ptc_HLineProc_16bpp;
          HLine          := @ptc_HLineProc_16bpp;
@@ -2670,7 +3232,10 @@ end;
              InitMode       := @ptc_InitNonStandard16;
              InitMode       := @ptc_InitNonStandard16;
              DirectPutPixel := @ptc_DirectPixelProc_8bpp;
              DirectPutPixel := @ptc_DirectPixelProc_8bpp;
              PutPixel       := @ptc_PutPixelProc_8bpp;
              PutPixel       := @ptc_PutPixelProc_8bpp;
+             PutImage       := @ptc_PutImageProc_8bpp;
              GetPixel       := @ptc_GetPixelProc_8bpp;
              GetPixel       := @ptc_GetPixelProc_8bpp;
+             GetScanLine    := @ptc_GetScanLineProc_8bpp;
+             GetImage       := @ptc_GetImageProc_8bpp;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
 
 
@@ -2703,7 +3268,10 @@ end;
              InitMode       := @ptc_InitNonStandard256;
              InitMode       := @ptc_InitNonStandard256;
              DirectPutPixel := @ptc_DirectPixelProc_8bpp;
              DirectPutPixel := @ptc_DirectPixelProc_8bpp;
              PutPixel       := @ptc_PutPixelProc_8bpp;
              PutPixel       := @ptc_PutPixelProc_8bpp;
+             PutImage       := @ptc_PutImageProc_8bpp;
              GetPixel       := @ptc_GetPixelProc_8bpp;
              GetPixel       := @ptc_GetPixelProc_8bpp;
+             GetScanLine    := @ptc_GetScanLineProc_8bpp;
+             GetImage       := @ptc_GetImageProc_8bpp;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
              //SetAllPalette  := @ptc_SetRGBAllPaletteProc;
@@ -2737,7 +3305,10 @@ end;
              InitMode       := @ptc_InitNonStandard32k;
              InitMode       := @ptc_InitNonStandard32k;
              DirectPutPixel := @ptc_DirectPixelProc_16bpp;
              DirectPutPixel := @ptc_DirectPixelProc_16bpp;
              PutPixel       := @ptc_PutPixelProc_16bpp;
              PutPixel       := @ptc_PutPixelProc_16bpp;
+             PutImage       := @ptc_PutImageProc_16bpp;
              GetPixel       := @ptc_GetPixelProc_16bpp;
              GetPixel       := @ptc_GetPixelProc_16bpp;
+             GetScanLine    := @ptc_GetScanLineProc_16bpp;
+             GetImage       := @ptc_GetImageProc_16bpp;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              HLine          := @ptc_HLineProc_16bpp;
              HLine          := @ptc_HLineProc_16bpp;
@@ -2768,7 +3339,10 @@ end;
              InitMode       := @ptc_InitNonStandard64k;
              InitMode       := @ptc_InitNonStandard64k;
              DirectPutPixel := @ptc_DirectPixelProc_16bpp;
              DirectPutPixel := @ptc_DirectPixelProc_16bpp;
              PutPixel       := @ptc_PutPixelProc_16bpp;
              PutPixel       := @ptc_PutPixelProc_16bpp;
+             PutImage       := @ptc_PutImageProc_16bpp;
              GetPixel       := @ptc_GetPixelProc_16bpp;
              GetPixel       := @ptc_GetPixelProc_16bpp;
+             GetScanLine    := @ptc_GetScanLineProc_16bpp;
+             GetImage       := @ptc_GetImageProc_16bpp;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              SetRGBPalette  := @ptc_SetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              GetRGBPalette  := @ptc_GetRGBPaletteProc;
              HLine          := @ptc_HLineProc_16bpp;
              HLine          := @ptc_HLineProc_16bpp;