fpc/rtl/dos/ppi/image.ppi
1998-03-25 11:18:12 +00:00

228 lines
6.9 KiB
Plaintext
Raw Blame History

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by the Free Pascal development team.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program 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.
**********************************************************************}
procedure GetImage(x1,y1,x2,y2 : integer;var BitMap);
var
i,linesize,target : longint;
ofs1,ofs2,bank1,bank2,diff : longint;
begin
_graphresult:=grOk;
if not isgraphmode then
begin
_graphresult:=grnoinitgraph;
exit;
end;
x1:=x1+aktviewport.x1;
y1:=y1+aktviewport.y1;
x2:=x2+aktviewport.x1;
y2:=y2+aktviewport.y1;
if (x1>_maxx) or (y1>_maxy) or (x2<0) or (y2<0) then exit;
target:=longint(@bitmap)+4;
pinteger(@bitmap)^:=x2-x1+1;
pinteger(@bitmap+2)^:=y2-y1+1;
linesize:=(x2-x1+1)*BytesPerPixel;
for i:=y1 to y2 do
begin
ofs1:=Y_ARRAY[i]+X_ARRAY[x1];
ofs2:=Y_ARRAY[i]+X_ARRAY[x2];
bank1:=ofs1 shr WinShift;
bank2:=ofs2 shr WinShift;
if bank1 <> AW_BANK then
begin
Switchbank(bank1);
AW_BANK:=bank1;
end;
if bank1=bank2
then ScreenToMem(ofs1 and WinLoMask,target,linesize)
else begin
diff:=(bank2 shl winshift)-ofs2;
ScreenToMem(ofs1 and WinLoMask,target,diff-BytesPerPixel);
Switchbank(bank2);
AW_BANK:=bank2;
ScreenToMem((ofs1+diff) and WinLoMask,target+diff,linesize-diff);
end;
target:=target+linesize;
end;
end;
procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
var
height,width : integer;
diff : integer;
increment,i : longint;
source,o1,o2 : longint;
offset : longint;
viewport : viewporttype;
begin
_graphresult:=grOk;
if not isgraphmode then
begin
_graphresult:=grnoinitgraph;
exit;
end;
source:=longint(@bitmap)+4;
Width:=pinteger(@bitmap)^;
Increment:=longint(Width);
height:=pinteger(@bitmap+2)^;
{ wenn ausserhalb des Screens Procedur verlassen }
x:=x+aktviewport.x1;
y:=y+aktviewport.y1;
if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
if (x > viewport.x2 ) or
(y > viewport.y2 ) or
(x+Increment < viewport.x1) or
(y+height < viewport.y1) then exit;
{ Clip oben }
if y < viewport.y1 then
begin
diff:=viewport.y1-y;
height:=height-diff;
source:=source+Increment*diff;
y:=viewport.y1;
end;
{ Clip unten }
if y+height > viewport.y2 then
height:=viewport.y2-y;
{ Clip links }
if x < viewport.x1 then
begin
diff:=viewport.x1-x;
Width:=Increment-diff;
source:=source+diff;
x:=viewport.x1;
end;
{ clip rechts }
if x+width > viewport.x2 then
begin
diff:=x+width-viewport.x2;
Width:=Increment-diff;
end;
Increment:=Increment*BytesPerPixel;
Width:=Width*BytesPerPixel;
for i:=y to y+height-1 do
begin
offset:=Y_ARRAY[i] + X_ARRAY[x];
o1:=offset shr winshift;
o2:=( offset + width ) shr winshift;
if o1 <> AW_BANK then
begin
Switchbank(o1);
AW_BANK:=o1;
end;
if o1 = o2 then
begin
case bitblt of
normalput : MemToScreen (source,offset and WinLoMask,width);
andput : MemAndScreen(source,offset and WinLoMask,width);
orput : MemOrScreen (source,offset and WinLoMask,width);
xorput : MemXorScreen(source,offset and WinLoMask,width);
notput : MemNotScreen(source,offset and WinLoMask,width);
end;
end else begin
{ Bankswitching }
diff:=((o2 shl winshift)-offset);
case bitblt of
normalput : begin
MemToScreen (source,offset and WinLoMask,diff-BytesPerPixel);
Switchbank(o2); AW_BANK:=o2;
MemToScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
end;
andput : begin
MemAndScreen (source,offset and WinLoMask,diff-BytesPerPixel);
Switchbank(o2); AW_BANK:=o2;
MemAndScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
end;
orput : begin
MemOrScreen (source,offset and WinLoMask,diff-BytesPerPixel);
Switchbank(o2); AW_BANK:=o2;
MemOrScreen (source++diff,(offset+diff) and WinLoMask,width-diff);
end;
xorput : begin
MemXorScreen(source,offset and WinLoMask,diff-BytesPerPixel);
Switchbank(o2); AW_BANK:=o2;
MemXorScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
end;
notput : begin
MemNotScreen(source,offset and WinLoMask,diff-BytesPerPixel);
Switchbank(o2); AW_BANK:=o2;
MemNotScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
end;
end; { case }
end; { else }
source:=source+Increment;
end; { for i }
{ clear the mmx state }
if is_mmx_cpu then
emms;
end;
function ImageSize(x1,y1,x2,y2 : integer) : word;
begin
_graphresult:=grOk;
ImageSize:=(x2-x1+1)*(y2-y1+1)*BytesPerPixel+4;
{ +4, da Breite und H<>he mit abgespeichert werden }
end;
{
$Log$
Revision 1.1 1998-03-25 11:18:42 root
Initial revision
Revision 1.5 1998/03/03 22:48:42 florian
+ graph.drawpoly procedure
+ putimage with xorput uses mmx if available
Revision 1.4 1998/01/26 11:58:14 michael
+ Added log at the end
Working file: rtl/dos/ppi/image.ppi
description:
----------------------------
revision 1.3
date: 1997/12/19 11:47:08; author: florian; state: Exp; lines: +3 -3
*** empty log message ***
----------------------------
revision 1.2
date: 1997/12/01 12:21:30; author: michael; state: Exp; lines: +13 -1
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:51; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:51; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}