mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-23 18:36:05 +02:00
228 lines
6.9 KiB
Plaintext
228 lines
6.9 KiB
Plaintext
{
|
||
$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
|
||
=============================================================================
|
||
}
|