mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 10:11:27 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			183 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| {
 | |
|     $Id$
 | |
|     This file is part of the Free Pascal run time library.
 | |
|     Copyright (c) 1999-2000 by the Free Pascal development team
 | |
| 
 | |
|     This include implements the different clipping algorithms
 | |
| 
 | |
|     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.
 | |
| 
 | |
|  **********************************************************************}
 | |
| const
 | |
|   LEFT   = 1;    { Left window   }
 | |
|   RIGHT  = 2;    { Right window  }
 | |
|   BOTTOM = 4;    { Bottom window }
 | |
|   TOP    = 8;    { Top window    }
 | |
|                  { 0 = in window }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   function LineClipped(var x1, y1,x2,y2: smallint; xmin, ymin,
 | |
|       xmax, ymax:smallint): boolean;
 | |
|   {********************************************************}
 | |
|   { Function LineClipped()                                 }
 | |
|   {--------------------------------------------------------}
 | |
|   { This routine clips the line coordinates to the         }
 | |
|   { min. and max. values of the window. Returns TRUE if    }
 | |
|   { the ENTIRE line was clipped.  Updated                  }
 | |
|   { clipped line endpoints are also returned.              }
 | |
|   { This algorithm is the classic Cohen-Sutherland line    }
 | |
|   { clipping algorithm.                                    }
 | |
|   {--------------------------------------------------------}
 | |
|   var
 | |
|    code1, code2: longint;
 | |
|    done:boolean;
 | |
|    code: longint;
 | |
|    newx,newy: word;
 | |
| 
 | |
| 
 | |
|     function outcode(x,y:smallint): longint;
 | |
|     {********************************************************}
 | |
|     { Function OutCode()                                     }
 | |
|     {--------------------------------------------------------}
 | |
|     { This routine determines if the specified end point     }
 | |
|     { of a line lies within the visible window, if not it    }
 | |
|     { determines in which window the point is.               }
 | |
|     {--------------------------------------------------------}
 | |
| 
 | |
|     var
 | |
|      code: longint;
 | |
|     begin
 | |
|       code := 0;
 | |
|       if (x<xmin) then
 | |
|         code:=code or LEFT
 | |
|       else if (x>xmax) then
 | |
|         code:=code or RIGHT;
 | |
|       if (y>ymax) then
 | |
|         code:=code or BOTTOM
 | |
|       else if (y<ymin) then
 | |
|         code:=code or TOP;
 | |
| 
 | |
|       outcode:=code;
 | |
|     end;
 | |
| 
 | |
|   begin
 | |
|     done:=false;
 | |
|     code1:= OutCode(x1,y1);
 | |
|     code2:= OutCode(x2,y2);
 | |
| 
 | |
|     while not done do
 | |
|      begin
 | |
|        { Accept trivially }
 | |
|        { both points are in window }
 | |
|        if ((code1=0) and (code2=0)) then
 | |
|          begin
 | |
|            done:=TRUE;
 | |
|            LineClipped:=FALSE;
 | |
|                exit;
 | |
|              end
 | |
|        else
 | |
|        { Reject trivially }
 | |
|        { Neither points are in window }
 | |
|        if (code1 and code2) <> 0 then
 | |
|          begin
 | |
|            done:=true;
 | |
|            LineClipped:=TRUE;
 | |
|            exit;
 | |
|          end
 | |
|        else
 | |
|           begin
 | |
|             { Some points are partially out of the window }
 | |
|             { find the new end point of the lines...      }
 | |
|             if code1 = 0 then
 | |
|              code:=code2
 | |
|             else
 | |
|              code:=code1;
 | |
|             if (code and LEFT) <> 0 then
 | |
|               begin
 | |
|                 newy:=y1+((y2-y1)*(xmin-x1)) div (x2-x1);
 | |
|                 newx:=xmin;
 | |
|               end
 | |
|             else
 | |
|             if (code and RIGHT) <> 0 then
 | |
|               begin
 | |
|                 newy:=y1+((y2-y1)*(xmax-x1)) div (x2-x1);
 | |
|                 newx:=xmax;
 | |
|               end
 | |
|             else
 | |
|             if (code and BOTTOM) <> 0 then
 | |
|               begin
 | |
|                 newx:=x1+((x2-x1)*(ymax-y1)) div (y2-y1);
 | |
|                 newy:=ymax;
 | |
|               end
 | |
|             else
 | |
|             if (code and TOP) <> 0 then
 | |
|               begin
 | |
|                 newx:=x1+((x2-x1)*(ymin-y1)) div (y2-y1);
 | |
|                 newy:=ymin;
 | |
|               end;
 | |
|            if (code1 = code) then
 | |
|             begin
 | |
|               x1 := newx;  y1:= newy;
 | |
|               code1:=outcode(x1,y1)
 | |
|             end
 | |
|                else
 | |
|             begin
 | |
|               x2:= newx; y2:= newy;
 | |
|               code2:=outcode(x2,y2);
 | |
|             end
 | |
|          end;
 | |
|       end;
 | |
|   LineClipped:=FALSE;
 | |
| end;
 | |
| 
 | |
| {
 | |
| $Log$
 | |
| Revision 1.9  2000-01-07 16:41:37  daniel
 | |
|   * copyright 2000
 | |
| 
 | |
| Revision 1.8  2000/01/07 16:32:25  daniel
 | |
|   * copyright 2000 added
 | |
| 
 | |
| Revision 1.7  1999/12/20 11:22:35  peter
 | |
|   * integer -> smallint to overcome -S2 switch needed for ggi version
 | |
| 
 | |
| Revision 1.6  1999/09/27 12:35:27  jonas
 | |
|   * execute multiplications before divisions in lineclipped to avoid rounding errors
 | |
| 
 | |
| Revision 1.5  1999/09/18 22:21:09  jonas
 | |
|   + hlinevesa256 and vlinevesa256
 | |
|   + support for not/xor/or/andput in vesamodes with 32k/64k colors
 | |
|   * lots of changes to avoid warnings under FPC
 | |
| 
 | |
| Revision 1.4  1999/09/12 17:28:59  jonas
 | |
|   * several changes to internalellipse to make it faster
 | |
|     and to make sure it updates the ArcCall correctly
 | |
|     (not yet done for width = 3)
 | |
|   * Arc mostly works now, only sometimes an endless loop, don't know
 | |
|     why
 | |
| 
 | |
| Revision 1.3  1999/07/12 13:27:09  jonas
 | |
|   + added Log and Id tags
 | |
|   * added first FPC support, only VGA works to some extend for now
 | |
|   * use -dasmgraph to use assembler routines, otherwise Pascal
 | |
|     equivalents are used
 | |
|   * use -dsupportVESA to support VESA (crashes under FPC for now)
 | |
|   * only dispose vesainfo at closegrph if a vesa card was detected
 | |
|   * changed int32 to longint (int32 is not declared under FPC)
 | |
|   * changed the declaration of almost every procedure in graph.inc to
 | |
|     "far;" becquse otherwise you can't assign them to procvars under TP
 | |
|     real mode (but unexplainable "data segnment too large" errors prevent
 | |
|     it from working under real mode anyway)
 | |
| 
 | |
| }
 | 
