head     56.3;
access   paws bayes jws quist brad dew jwh cfb;
symbols  ;
locks    ; strict;
comment  @# @;


56.3
date     93.01.27.13.28.30;  author jwh;  state Exp;
branches ;
next     56.2;

56.2
date     93.01.27.12.06.19;  author jwh;  state Exp;
branches ;
next     56.1;

56.1
date     91.11.05.09.49.33;  author jwh;  state Exp;
branches ;
next     55.2;

55.2
date     91.10.10.09.00.14;  author cfb;  state Exp;
branches ;
next     55.1;

55.1
date     91.08.25.10.25.48;  author jwh;  state Exp;
branches ;
next     54.3;

54.3
date     91.07.11.08.57.59;  author cfb;  state Exp;
branches ;
next     54.2;

54.2
date     91.07.09.09.47.04;  author cfb;  state Exp;
branches ;
next     54.1;

54.1
date     91.03.18.15.28.55;  author jwh;  state Exp;
branches ;
next     53.1;

53.1
date     91.03.11.19.29.20;  author jwh;  state Exp;
branches ;
next     52.1;

52.1
date     91.02.19.09.13.21;  author jwh;  state Exp;
branches ;
next     51.1;

51.1
date     91.01.30.16.13.09;  author jwh;  state Exp;
branches ;
next     50.1;

50.1
date     90.10.29.16.27.42;  author jwh;  state Exp;
branches ;
next     49.1;

49.1
date     90.08.14.14.11.59;  author jwh;  state Exp;
branches ;
next     48.1;

48.1
date     90.07.26.11.18.14;  author jwh;  state Exp;
branches ;
next     47.1;

47.1
date     90.05.14.11.01.43;  author dew;  state Exp;
branches ;
next     46.1;

46.1
date     90.05.07.08.48.47;  author jwh;  state Exp;
branches ;
next     45.1;

45.1
date     90.04.19.15.56.42;  author jwh;  state Exp;
branches ;
next     44.1;

44.1
date     90.04.01.22.13.48;  author jwh;  state Exp;
branches ;
next     43.1;

43.1
date     90.03.20.14.05.45;  author jwh;  state Exp;
branches ;
next     42.1;

42.1
date     90.01.23.17.50.32;  author jwh;  state Exp;
branches ;
next     41.1;

41.1
date     89.12.22.11.32.27;  author jwh;  state Exp;
branches ;
next     40.1;

40.1
date     89.09.29.11.54.13;  author jwh;  state Exp;
branches ;
next     39.1;

39.1
date     89.09.26.16.38.43;  author dew;  state Exp;
branches ;
next     38.1;

38.1
date     89.08.29.11.30.37;  author jwh;  state Exp;
branches ;
next     37.1;

37.1
date     89.05.12.11.43.36;  author dew;  state Exp;
branches ;
next     36.1;

36.1
date     89.02.06.10.21.39;  author dew;  state Exp;
branches ;
next     35.1;

35.1
date     89.02.02.13.36.53;  author dew;  state Exp;
branches ;
next     34.1;

34.1
date     89.01.23.16.12.02;  author jwh;  state Exp;
branches ;
next     33.1;

33.1
date     89.01.16.11.43.47;  author dew;  state Exp;
branches ;
next     32.1;

32.1
date     89.01.10.11.52.37;  author bayes;  state Exp;
branches ;
next     31.1;

31.1
date     88.12.14.18.13.42;  author bayes;  state Exp;
branches ;
next     30.1;

30.1
date     88.12.09.13.50.37;  author dew;  state Exp;
branches ;
next     29.1;

29.1
date     88.10.31.15.35.32;  author bayes;  state Exp;
branches ;
next     28.1;

28.1
date     88.10.06.11.02.00;  author dew;  state Exp;
branches ;
next     27.1;

27.1
date     88.09.29.11.40.48;  author bayes;  state Exp;
branches ;
next     26.1;

26.1
date     88.09.28.13.18.56;  author bayes;  state Exp;
branches ;
next     25.2;

25.2
date     88.03.30.09.08.30;  author bayes;  state Exp;
branches ;
next     25.1;

25.1
date     88.03.02.09.35.25;  author bayes;  state Exp;
branches ;
next     24.1;

24.1
date     87.08.31.09.59.07;  author jws;  state Exp;
branches ;
next     23.1;

23.1
date     87.08.26.10.37.27;  author bayes;  state Exp;
branches ;
next     22.1;

22.1
date     87.08.17.11.22.58;  author bayes;  state Exp;
branches ;
next     21.1;

21.1
date     87.08.12.14.05.37;  author bayes;  state Exp;
branches ;
next     20.1;

20.1
date     87.07.30.11.19.07;  author bayes;  state Exp;
branches ;
next     19.1;

19.1
date     87.06.01.08.33.02;  author jws;  state Exp;
branches ;
next     18.1;

18.1
date     87.05.20.15.33.31;  author bayes;  state Exp;
branches ;
next     17.1;

17.1
date     87.04.30.10.43.51;  author jws;  state Exp;
branches ;
next     16.1;

16.1
date     87.04.26.15.55.35;  author jws;  state Exp;
branches ;
next     15.1;

15.1
date     87.04.13.09.32.11;  author jws;  state Exp;
branches ;
next     14.1;

14.1
date     87.04.01.15.39.00;  author jws;  state Exp;
branches ;
next     13.1;

13.1
date     87.02.28.18.40.05;  author jws;  state Exp;
branches ;
next     12.1;

12.1
date     87.02.02.13.31.31;  author jws;  state Exp;
branches ;
next     11.1;

11.1
date     87.01.19.09.58.00;  author jws;  state Exp;
branches ;
next     10.1;

10.1
date     86.12.24.11.07.26;  author jws;  state Exp;
branches ;
next     9.1;

9.1
date     86.12.12.14.51.19;  author bayes;  state Exp;
branches ;
next     8.1;

8.1
date     86.11.27.12.05.53;  author jws;  state Exp;
branches ;
next     7.1;

7.1
date     86.11.20.14.00.58;  author hal;  state Exp;
branches ;
next     6.1;

6.1
date     86.11.04.18.09.51;  author paws;  state Exp;
branches ;
next     5.2;

5.2
date     86.10.29.13.52.26;  author geli;  state Exp;
branches ;
next     5.1;

5.1
date     86.10.28.16.58.20;  author hal;  state Exp;
branches ;
next     4.1;

4.1
date     86.09.30.19.55.20;  author hal;  state Exp;
branches ;
next     3.1;

3.1
date     86.09.01.12.05.40;  author hal;  state Exp;
branches ;
next     2.1;

2.1
date     86.07.30.14.54.17;  author hal;  state Exp;
branches ;
next     1.1;

1.1
date     86.06.30.15.42.30;  author danm;  state tmp;
branches ;
next     ;


desc
@Base file for PWS 3.2 release.

@


56.3
log
@
pws2rcs automatic delta on Wed Jan 27 13:14:25 MST 1993
@
text
@{                                                                           }
{ Pascal work station graphics library                                      }
{                                                                           }
{ Module    = DGL_GEN                                                       }
{ Programer = BJS                                                           }
{ Date      = 2/1/81                                                        }

{ Purpose:  To hold most internal routines                                  }

{ Rev history                                                               }
{   6-15-82  BJS - Added moonunit dump graphics stuff                       }
{   7-05-82  BJS - Removed HPGL clipping, now uses ASM_RAS clipping         }
{   7-05-82  BJS - Changes to add 9836C proto support                       }
{   8-25-82  BJS - Major mods for GLE                                       }
{  12-20-84  SFB - Added dglfix/dglfloat                                    }

{     (c) Copyright Hewlett-Packard Company, 1985.
      All rights are reserved.  Copying or other
      reproduction of this program except for archival
      purposes is prohibited without the prior
      written consent of Hewlett-Packard Company.


		  RESTRICTED RIGHTS LEGEND

      Use, duplication, or disclosure by the Government
      is subject to restrictions as set forth in
      paragraph (b) (3) (B) of the Rights in Technical
      Data and Computer Software clause in
      DAR 7-104.9(a).

      HEWLETT-PACKARD COMPANY
      Fort Collins, Colorado                              }

$modcal$
$ref 50$

$include 'OPTIONS'$
$linenum 3000$

$search 'TYPES',
	'DGL_VARS',
	'GLE_LIB'$

module DGL_GEN;

import DGL_TYPES;

export

procedure error ( error_number : integer );

function min(p1,p2:integer) : integer;

function max(p1,p2:integer) : integer;

procedure locator_limits (lxmin, lxmax,
			  lymin, lymax : real);

procedure calculate_viewing;

procedure display_limits ( dxmin, dxmax,
			   dymin, dymax : real);

procedure convert_intwtod (x, y : gshortint;
		   var  dx, dy : integer );

procedure convert_wtod (x, y : real;
		   var  dx, dy : integer );

procedure convert_ltod (lx, ly : integer;
		   var  dx, dy : integer );

procedure convert_dtow (dx, dy : integer;
		   var  wx, wy : real);

procedure ck_system_init;

procedure ck_display_init;

procedure ck_locator_init;

procedure adjust_return_echo ( var rx,ry : real );

function opcode_ck(opcode,num_integer,num_real : integer) : integer;

procedure convert_hsl_to_rgb ( hue,sat,lite : real; var r,g,b : real);
procedure convert_rgb_to_hsl (r,g,b : real; var hue,sat,lite : real);

function dglfloat(anyvar color : gshortint) : real;
function dglfix(color : real) : gshortint;
function realmap : boolean;


implement

import asm,
       dgl_vars,
       gle_gen,
       GLE_TYPES;

{ ************************************************************************** }
{                                                                            }
{                 General procedures and functions                           }
{                                                                            }
{ ************************************************************************** }

procedure error ( error_number : integer);

{ Purpose : To log a graphics error, and perform a graphics error escape }

begin
  graphics_error := error_number;
  escape(graphics_error_number);
end; { error }

procedure ck_system_init;

{ Purpose : To report an error if the system is not initialized        }

begin
  if not system_init then error (err_sys_int);
end; { ck_sytem_init }

procedure ck_display_init;

{ Purpose : To report an error if the display is not initialized        }

begin
  if not disp_init then error (err_dis_int);
end; { ck_display_init }

procedure ck_locator_init;

{ Purpose : To report an error if the locator is not initialized        }

begin
  if not loc_init then error (err_loc_int);
end; { ck_locator_init }

function min(p1,p2:integer):integer;

{ Purpose : To return the minimum of two integers                      }

begin
  if (p1 >= p2) then min := p2
    else min := p1;
end; { min }

function max(p1,p2:integer):integer;

{ Purpose : To return the maximum of two integers                      }


begin
  if (p1 <= p2) then max := p2
    else max := p1;
end; { max }

procedure order_values (    p1,p2 : real;
			var rp1, rp2 : real);

{ Purpose : To return the passed in values ordered such that the smaller
	    value is in rp1.                                                }

begin
  if p1 <= p2 then
    begin
      rp1 := p1;
      rp2 := p2;
    end
  else
    begin
      rp2 := p1;
      rp1 := p2;
    end;
end; { order_values }


function opcode_ck(opcode,num_integer,num_real : integer) : integer;

{ Purpose:  To ck for a valid opcode passed.  Opcodes are all defined such   }
{           that:
	      the hundreds digit = # of reals passed
	      the 1000's digit = # of integers passed

	    This function returns values as follows:

	      = 0 ; ok
	      = 2 ; wrong i size
	      = 3 ; wrong r size                                            }


var
  digit : array [0..4] of gbyte;
  i : gshortint;

begin
  for i := 0 to 4 do
    begin
      digit[i] := opcode - (opcode div 10) * 10;
      opcode := opcode div 10;
    end;

  opcode_ck := 0;
  if digit[2] <> num_real then opcode_ck := 3;
  if digit[3] <> num_integer then opcode_ck := 2;
end;

procedure convert_hsl_to_rgb ( hue,sat,lite : real; var r,g,b : real);

var
  lx,ly,lz,frac,h : real;
  j : integer;

begin
  h := 6*hue;
  j := trunc(h);
  frac := h-j;
  lx := lite*(1.0-sat);
  ly := lite*(1.0-sat*frac);
  lz := lite*(1.0-sat*(1-frac));

  case j of
    0,6 : begin r := lite; g := lz;   b := lx;   end;
      1 : begin r := ly;   g := lite; b := lx;   end;
      2 : begin r := lx;   g := lite; b := lz;   end;
      3 : begin r := lx;   g := ly;   b := lite; end;
      4 : begin r := lz;   g := lx;   b := lite; end;
      5 : begin r := lite; g := lx;   b := ly;   end;
  end; { of case }
end;

procedure convert_rgb_to_hsl (r,g,b : real; var hue,sat,lite : real);

  var x : real;
  tr,tg,tb : real;

  function max3(a,b,c : real) : real;

  begin
    if (a >= b) and (a >= c) then max3 := a
    else
    if (b >= a) and (b >= c) then max3 := b
    else
    max3 := c;
  end;

  function min3(a,b,c : real) : real;

  begin
    if (a <= b) and (a <= c) then min3 := a
    else
    if (b <= a) and (b <= c) then min3 := b
    else
    min3 := c;
  end;

begin
  hue := 0;                 { init values given, since values may be undefined }
  sat := 1;

  lite := max3(r,g,b);
  x    := min3(r,g,b);
  if lite <> 0 then { calc hue and sat only if defined }
    begin
      sat  := (lite - x) / lite;
      if sat <> 0 then { calc hue only if defined, other wise defaults to old }
	begin

	  tr := (lite-r)/(lite-x);
	  tg := (lite-g)/(lite-x);
	  tb := (lite-b)/(lite-x);

	  if r=lite then
	    begin
	      if g=x then hue := 5+tb
		     else hue := 1-tg;
	    end
	  else
	  if g=lite then
	    begin
	      if b=x then hue := 1+tr
		     else hue := 3-tb;
	    end
	  else
	    begin
	      if r=x then hue := 3+tg
		     else hue := 5-tr;
	    end;
	  hue := hue/6;
	end;
    end;
end;

procedure adjust_return_echo ( var rx,ry : real );

{ Purpose : adjust return echo values for the effects of rubber band snap }

begin
  case current_echo_type of
    5: ry := w_loc_echo_y;      { Horizontal rubber band}
    6: rx := w_loc_echo_x;      { Vertical rubber band   }
    7:                          { snap horz / vert rubber band }
       if abs(rx-w_loc_echo_x) >= abs(ry-w_loc_echo_y) then
	 ry := w_loc_echo_y
       else rx := w_loc_echo_x;
    otherwise ;                 { no adjustment needed for others }
  end;  { of case }
end; { adjust_return_echo }

{ ************************************************************************** }
{                                                                            }
{              General Viewing transformation routines                       }
{                                                                            }
{ ************************************************************************** }

procedure convert_intwtod(    x,y: gshortint;
		       var dx,dy: integer);

{ Purpose : To convert form world to display cord   }

var
  tx, ty : integer;
  lx,ly : gshortint;

begin
  if short_defaults then
    begin
      dx := x;
      dy := y;
    end
  else
    with scalef do
      begin
	tx := x * x_display_delta;
	lx := tx div x_window_delta + x_display_offset;
	ty := y * y_display_delta;
	ly := ty div y_window_delta + y_display_offset;
	dx := lx;
	dy := ly;
      end;

end; { convert_intwtod }

procedure convert_wtod(    x,y:real;
		       var dx,dy:integer);

{ Purpose : To convert form world to display cord   }

begin
  dx := trunc(x * xwtod_scale + xwtod_offset);
  dy := trunc(y * ywtod_scale + ywtod_offset);
  {WRITELN('WTOD (',X:8:5,Y:8:5,')=',DX:8,DY:8);}
end; { convert_wtod }

procedure convert_ltod(    lx,ly : integer;
		       var dx,dy : integer );

{ Purpose : To convert from locator to display units }

begin
  with gcb^ do
    begin
      dx := trunc( ((lx - log_loc_lim.xmin) * xltod_scale) +
	      cur_disp_lim.xmin + 0.5);
      dy := trunc( ((ly - log_loc_lim.ymin) * yltod_scale) +
	      cur_disp_lim.ymin + 0.5);
    end;
end; { convert_ltod }

procedure convert_dtow(    dx,dy : integer;
		       var wx,wy : real);

{ Purpose : To convert from display to world units }

begin

  wx := (dx + xdtow_offset) * xdtow_scale;
  wy := (dy + ydtow_offset) * ydtow_scale;
end; { convert_dtow }


procedure locator_limits (lxmin,lxmax,
			  lymin,lymax : real);

{ Purpose : To set the locator limits ( in device units )               }
{ Note: This routine does not perform error cking    }

begin
  with gcb^ do
    begin
      { set the logical limits }
      with log_loc_lim do
	begin
	  xmin := lxmin;
	  xmax := lxmax;
	  ymin := lymin;
	  ymax := lymax;
	end;

      { calculate the display / locator xforms }

      xltod_scale := (cur_disp_lim.xmax - cur_disp_lim.xmin) /
		       (log_loc_lim.xmax - log_loc_lim.xmin);

      yltod_scale := (cur_disp_lim.ymax - cur_disp_lim.ymin) /
		       (log_loc_lim.ymax - log_loc_lim.ymin);


      { set the locator echo position to the center of the window }

      with window_lim do
	begin
	  w_loc_echo_x := ((xmax - xmin) / 2.0) + xmin;
	  w_loc_echo_y := ((ymax - ymin) / 2.0) + ymin;
	end;

      { convert to device units }

      convert_wtod ( w_loc_echo_x, w_loc_echo_y,
		     d_loc_echo_x, d_loc_echo_y );

    end;

end; { locator_limits }


procedure calculate_viewing;

{ Purpose : To calculate a new viewing transformation                   }

var
  temp : real;           { temp work var }

  procedure int_test;

  { Purpose : To see if conditions are right, and setup if so, for int_move
	      and int_line to call fast integer device routines             }

  var
    sxmin : integer;
    sxmax : integer;
    symin : integer;
    symax : integer;
    gsxmin : gshortint;
    gsxmax : gshortint;
    gsymin : gshortint;
    gsymax : gshortint;

    window_delta_x : integer;
    window_delta_y : integer;

  begin
    short_flag := false;

      with gcb^ do
	begin
	  if disp_init then
	    try
 $range on$         { range cking done here }

	      { find device points for the corners of the window }
	      convert_wtod(window_lim.xmin,window_lim.ymin,sxmin,symin);
	      convert_wtod(window_lim.xmax,window_lim.ymax,sxmax,symax);

	      { convert to non-fix point form }
	      gsxmin := sxmin;
	      gsxmax := sxmax;
	      gsymin := symin;
	      gsymax := symax;

	      {set up scale info }
	      with window_lim do
		begin
		  window_delta_x := trunc(xmax) - trunc(xmin);
		  window_delta_y := trunc(ymax) - trunc(ymin);

		  { ck delta window values in range }
		  if (abs(window_delta_x) > 32767) or
		     (abs(window_delta_y) > 32767) then
		     escape(-4); { force integer overflow }

		  with scalef do
		    begin
		      x_display_delta := gsxmax - gsxmin;
		      x_window_delta := window_delta_x;
		      x_display_offset :=
			((-trunc(xmin) * x_display_delta) div x_window_delta) + gsxmin;
		      y_display_delta := gsymax - gsymin;
		      y_window_delta := window_delta_y;
		      y_display_offset :=
			((-trunc(ymin) * y_display_delta) div y_window_delta) + gsymin;


		      if (x_display_offset = 0) and
			 (x_window_delta = x_display_delta) and
			 (y_display_offset = 0) and
			 (y_window_delta = y_display_delta) then
			short_defaults := true
		      else
			short_defaults := false;

		    end;
		end;
	      short_flag := true;

	    recover { can't use int_move / int_line internal routines }
	      if (escapecode > -4) or { igonor all math and range errors }
		 (escapecode < -8) then escape(escapecode);
$range off$
	end;
  end;      { of procedure int_test }


begin
  with gcb^ do
    begin
      { set view surface limits to the logical display limits               }
      cur_disp_lim := log_disp_lim;

      { if desired aspect = aspect of logical limits then we don't need to
	redefine the limits as set above                                    }
      if (aspect_ratio <> log_aspect) then
	begin

	  {determine which device limits to change}
	  if (aspect_ratio <= log_aspect) then
	    begin

	      {check display justification}
	      if (disp_just = centered) then

		{set vertical limits for device on which view space is
		 centered within the logical display limits            }
		begin
		  temp := 0.5 * (dyunits - (dxunits * aspect_ratio) );
		  cur_disp_lim.ymin := log_disp_lim.ymin + temp;
		  cur_disp_lim.ymax := log_disp_lim.ymax - temp;
		end

	      else  { not centered }

		{set vertical limits for device on which view space is
		 lower left justified within the logical display limits   }
		begin
		  cur_disp_lim.ymax :=
		    log_disp_lim.ymin + (dxunits * aspect_ratio);
		end;
	    end

	  else  { current aspect ratio > aspect ratio of logical limits   }
	    begin

	      {check display justification}
	      if (disp_just = centered) then

		{set horizontal limits for device on which view space is
		 centered within the logical display limits              }
		begin
		  temp := 0.5 * (dxunits - (dyunits / aspect_ratio) );
		  cur_disp_lim.xmin := log_disp_lim.xmin + temp;
		  cur_disp_lim.xmax := log_disp_lim.xmax - temp;
		end

	      else  { not centered }

		{set horizontal limits for device on which view space is
		 lower left justified within the logical display limits    }
		begin
		  cur_disp_lim.xmax :=
		    log_disp_lim.xmin + (dyunits / aspect_ratio);
		end;
	    end;
	end;


      { set clipping limits here }
      if disp_init then
	 with gle_gcb^,cur_disp_lim do
	   begin
	     {WRITELN('C =',XMIN:19:18,XMAX:19:18,YMIN:19:18,YMAX:19:18);
	     WRITELN('CI=',TRUNC(XMIN+0.5):19,TRUNC(XMAX+0.5):19,
	     TRUNC(YMIN+0.5):19,TRUNC(YMAX+0.5):19);}
	     info1 := trunc(xmin+0.5);
	     info2 := trunc(xmax+0.5);
	     info3 := trunc(ymin+0.5);
	     info4 := trunc(ymax+0.5);
	     gle_clip_limits (gle_gcb);
	   end;

      { recalculate the world to display transformation constants           }

      { x scale and offset                                                  }
      with cur_disp_lim do
	temp := (xmax - xmin ) / cur_vir_lim.xlim;

      xwtod_scale := temp * ((viewport_lim.xmax - viewport_lim.xmin) /
		       (window_lim.xmax - window_lim.xmin));

      xwtod_offset := cur_disp_lim.xmin + (viewport_lim.xmin * temp) -
		       (window_lim.xmin * xwtod_scale);

      xdtow_scale := 1.0 / xwtod_scale;

      xdtow_offset := - xwtod_offset;
      xwtod_offset := xwtod_offset + 0.5 {0.00000001};

      { y scale and offset                                                 }
      with cur_disp_lim do
	temp := (ymax - ymin ) / cur_vir_lim.ylim;

      ywtod_scale := temp * ((viewport_lim.ymax - viewport_lim.ymin) /
		       (window_lim.ymax - window_lim.ymin));


      ywtod_offset := cur_disp_lim.ymin + (viewport_lim.ymin * temp) -
		       (window_lim.ymin * ywtod_scale);

      ydtow_scale := 1.0 / ywtod_scale;

      ydtow_offset := - ywtod_offset;
      ywtod_offset := ywtod_offset + 0.5 {0.00000001};

      if disp_eq_loc then
	begin
	  {if display and locator are the same physical device then set
	  the locator limits to the display limits                      }

	  with cur_disp_lim do
	    locator_limits(xmin,xmax,ymin,ymax);
	end
      else
	begin
	  {set the locator limits to current locator limits             }

	  with log_loc_lim do
	    locator_limits(xmin,xmax,ymin,ymax);
	end;

      { set up for int_move / int_line scale }
      int_test;
    end;
end; { calculate_viewing }


procedure display_limits ( dxmin, dxmax, dymin, dymax : real );

{ Purpose : To set the logical display limits in device units }

begin
  {WRITELN('NEW DISPLAY LIM = ',DXMIN:19:18,DXMAX:19:18,DYMIN:19:18,DYMAX:19:18);
  }
  with gcb^ do
    begin
      { set new log limits }
      with log_disp_lim do
	begin
	  xmin := dxmin;
	  xmax := dxmax;
	  ymin := dymin;
	  ymax := dymax;
	end;

      { set the display width and height }

      dxunits := dxmax - dxmin;
      dyunits := dymax - dymin;

      { calculate aspect ratio of new log lim }

      log_aspect := dyunits / dxunits;

      { set up new viewing transformation }
      calculate_viewing;

    end;

end; { display_limits }

function realmap : boolean;
begin
 realmap := true;
 with gle_gcb^ do
  if   (display_name = '98700A')
    or (display_name = '98542A') or (display_name = '98543A')
    or (display_name = '98544A') or (display_name = '98545A')
    or (display_name = '98547A') or (display_name = '98548A')      {SFB 2/2/88}
    or (display_name = '98549A') or (display_name = '98550A')      {SFB 2/2/88}
    or (display_name = 'E640  ') or (display_name = 'E1024 ')      {CFB 30JUL91}
    or (display_name = 'E1280 ') or (display_name = 'E640G ')      {CFB 30JUL91}
    or (display_name = 'E1280G') then                              {CFB 30JUL91}
 realmap := false;
end;

function dglfloat(anyvar color : gshortint) : real;
var temp : ^real;
begin
 if not realmap then
  dglfloat := color / 32767
 else
  begin
   temp := addr(color);
   dglfloat := temp^;
  end;
end;

function dglfix(color : real) : gshortint;
begin
 dglfix := ROUND(color * 32767);
end;

end.  { of module DGL_GEN }
@


56.2
log
@
pws2rcs automatic delta on Wed Jan 27 11:57:27 MST 1993
@
text
@d1 713
@


56.1
log
@Automatic bump of revision number for PWS version 3.25
@
text
@a0 713
{                                                                           }
{ Pascal work station graphics library                                      }
{                                                                           }
{ Module    = DGL_GEN                                                       }
{ Programer = BJS                                                           }
{ Date      = 2/1/81                                                        }

{ Purpose:  To hold most internal routines                                  }

{ Rev history                                                               }
{   6-15-82  BJS - Added moonunit dump graphics stuff                       }
{   7-05-82  BJS - Removed HPGL clipping, now uses ASM_RAS clipping         }
{   7-05-82  BJS - Changes to add 9836C proto support                       }
{   8-25-82  BJS - Major mods for GLE                                       }
{  12-20-84  SFB - Added dglfix/dglfloat                                    }

{     (c) Copyright Hewlett-Packard Company, 1985.
      All rights are reserved.  Copying or other
      reproduction of this program except for archival
      purposes is prohibited without the prior
      written consent of Hewlett-Packard Company.


		  RESTRICTED RIGHTS LEGEND

      Use, duplication, or disclosure by the Government
      is subject to restrictions as set forth in
      paragraph (b) (3) (B) of the Rights in Technical
      Data and Computer Software clause in
      DAR 7-104.9(a).

      HEWLETT-PACKARD COMPANY
      Fort Collins, Colorado                              }

$modcal$
$ref 50$

$include 'OPTIONS'$
$linenum 3000$

$search 'TYPES',
	'DGL_VARS',
	'GLE_LIB'$

module DGL_GEN;

import DGL_TYPES;

export

procedure error ( error_number : integer );

function min(p1,p2:integer) : integer;

function max(p1,p2:integer) : integer;

procedure locator_limits (lxmin, lxmax,
			  lymin, lymax : real);

procedure calculate_viewing;

procedure display_limits ( dxmin, dxmax,
			   dymin, dymax : real);

procedure convert_intwtod (x, y : gshortint;
		   var  dx, dy : integer );

procedure convert_wtod (x, y : real;
		   var  dx, dy : integer );

procedure convert_ltod (lx, ly : integer;
		   var  dx, dy : integer );

procedure convert_dtow (dx, dy : integer;
		   var  wx, wy : real);

procedure ck_system_init;

procedure ck_display_init;

procedure ck_locator_init;

procedure adjust_return_echo ( var rx,ry : real );

function opcode_ck(opcode,num_integer,num_real : integer) : integer;

procedure convert_hsl_to_rgb ( hue,sat,lite : real; var r,g,b : real);
procedure convert_rgb_to_hsl (r,g,b : real; var hue,sat,lite : real);

function dglfloat(anyvar color : gshortint) : real;
function dglfix(color : real) : gshortint;
function realmap : boolean;


implement

import asm,
       dgl_vars,
       gle_gen,
       GLE_TYPES;

{ ************************************************************************** }
{                                                                            }
{                 General procedures and functions                           }
{                                                                            }
{ ************************************************************************** }

procedure error ( error_number : integer);

{ Purpose : To log a graphics error, and perform a graphics error escape }

begin
  graphics_error := error_number;
  escape(graphics_error_number);
end; { error }

procedure ck_system_init;

{ Purpose : To report an error if the system is not initialized        }

begin
  if not system_init then error (err_sys_int);
end; { ck_sytem_init }

procedure ck_display_init;

{ Purpose : To report an error if the display is not initialized        }

begin
  if not disp_init then error (err_dis_int);
end; { ck_display_init }

procedure ck_locator_init;

{ Purpose : To report an error if the locator is not initialized        }

begin
  if not loc_init then error (err_loc_int);
end; { ck_locator_init }

function min(p1,p2:integer):integer;

{ Purpose : To return the minimum of two integers                      }

begin
  if (p1 >= p2) then min := p2
    else min := p1;
end; { min }

function max(p1,p2:integer):integer;

{ Purpose : To return the maximum of two integers                      }


begin
  if (p1 <= p2) then max := p2
    else max := p1;
end; { max }

procedure order_values (    p1,p2 : real;
			var rp1, rp2 : real);

{ Purpose : To return the passed in values ordered such that the smaller
	    value is in rp1.                                                }

begin
  if p1 <= p2 then
    begin
      rp1 := p1;
      rp2 := p2;
    end
  else
    begin
      rp2 := p1;
      rp1 := p2;
    end;
end; { order_values }


function opcode_ck(opcode,num_integer,num_real : integer) : integer;

{ Purpose:  To ck for a valid opcode passed.  Opcodes are all defined such   }
{           that:
	      the hundreds digit = # of reals passed
	      the 1000's digit = # of integers passed

	    This function returns values as follows:

	      = 0 ; ok
	      = 2 ; wrong i size
	      = 3 ; wrong r size                                            }


var
  digit : array [0..4] of gbyte;
  i : gshortint;

begin
  for i := 0 to 4 do
    begin
      digit[i] := opcode - (opcode div 10) * 10;
      opcode := opcode div 10;
    end;

  opcode_ck := 0;
  if digit[2] <> num_real then opcode_ck := 3;
  if digit[3] <> num_integer then opcode_ck := 2;
end;

procedure convert_hsl_to_rgb ( hue,sat,lite : real; var r,g,b : real);

var
  lx,ly,lz,frac,h : real;
  j : integer;

begin
  h := 6*hue;
  j := trunc(h);
  frac := h-j;
  lx := lite*(1.0-sat);
  ly := lite*(1.0-sat*frac);
  lz := lite*(1.0-sat*(1-frac));

  case j of
    0,6 : begin r := lite; g := lz;   b := lx;   end;
      1 : begin r := ly;   g := lite; b := lx;   end;
      2 : begin r := lx;   g := lite; b := lz;   end;
      3 : begin r := lx;   g := ly;   b := lite; end;
      4 : begin r := lz;   g := lx;   b := lite; end;
      5 : begin r := lite; g := lx;   b := ly;   end;
  end; { of case }
end;

procedure convert_rgb_to_hsl (r,g,b : real; var hue,sat,lite : real);

  var x : real;
  tr,tg,tb : real;

  function max3(a,b,c : real) : real;

  begin
    if (a >= b) and (a >= c) then max3 := a
    else
    if (b >= a) and (b >= c) then max3 := b
    else
    max3 := c;
  end;

  function min3(a,b,c : real) : real;

  begin
    if (a <= b) and (a <= c) then min3 := a
    else
    if (b <= a) and (b <= c) then min3 := b
    else
    min3 := c;
  end;

begin
  hue := 0;                 { init values given, since values may be undefined }
  sat := 1;

  lite := max3(r,g,b);
  x    := min3(r,g,b);
  if lite <> 0 then { calc hue and sat only if defined }
    begin
      sat  := (lite - x) / lite;
      if sat <> 0 then { calc hue only if defined, other wise defaults to old }
	begin

	  tr := (lite-r)/(lite-x);
	  tg := (lite-g)/(lite-x);
	  tb := (lite-b)/(lite-x);

	  if r=lite then
	    begin
	      if g=x then hue := 5+tb
		     else hue := 1-tg;
	    end
	  else
	  if g=lite then
	    begin
	      if b=x then hue := 1+tr
		     else hue := 3-tb;
	    end
	  else
	    begin
	      if r=x then hue := 3+tg
		     else hue := 5-tr;
	    end;
	  hue := hue/6;
	end;
    end;
end;

procedure adjust_return_echo ( var rx,ry : real );

{ Purpose : adjust return echo values for the effects of rubber band snap }

begin
  case current_echo_type of
    5: ry := w_loc_echo_y;      { Horizontal rubber band}
    6: rx := w_loc_echo_x;      { Vertical rubber band   }
    7:                          { snap horz / vert rubber band }
       if abs(rx-w_loc_echo_x) >= abs(ry-w_loc_echo_y) then
	 ry := w_loc_echo_y
       else rx := w_loc_echo_x;
    otherwise ;                 { no adjustment needed for others }
  end;  { of case }
end; { adjust_return_echo }

{ ************************************************************************** }
{                                                                            }
{              General Viewing transformation routines                       }
{                                                                            }
{ ************************************************************************** }

procedure convert_intwtod(    x,y: gshortint;
		       var dx,dy: integer);

{ Purpose : To convert form world to display cord   }

var
  tx, ty : integer;
  lx,ly : gshortint;

begin
  if short_defaults then
    begin
      dx := x;
      dy := y;
    end
  else
    with scalef do
      begin
	tx := x * x_display_delta;
	lx := tx div x_window_delta + x_display_offset;
	ty := y * y_display_delta;
	ly := ty div y_window_delta + y_display_offset;
	dx := lx;
	dy := ly;
      end;

end; { convert_intwtod }

procedure convert_wtod(    x,y:real;
		       var dx,dy:integer);

{ Purpose : To convert form world to display cord   }

begin
  dx := trunc(x * xwtod_scale + xwtod_offset);
  dy := trunc(y * ywtod_scale + ywtod_offset);
  {WRITELN('WTOD (',X:8:5,Y:8:5,')=',DX:8,DY:8);}
end; { convert_wtod }

procedure convert_ltod(    lx,ly : integer;
		       var dx,dy : integer );

{ Purpose : To convert from locator to display units }

begin
  with gcb^ do
    begin
      dx := trunc( ((lx - log_loc_lim.xmin) * xltod_scale) +
	      cur_disp_lim.xmin + 0.5);
      dy := trunc( ((ly - log_loc_lim.ymin) * yltod_scale) +
	      cur_disp_lim.ymin + 0.5);
    end;
end; { convert_ltod }

procedure convert_dtow(    dx,dy : integer;
		       var wx,wy : real);

{ Purpose : To convert from display to world units }

begin

  wx := (dx + xdtow_offset) * xdtow_scale;
  wy := (dy + ydtow_offset) * ydtow_scale;
end; { convert_dtow }


procedure locator_limits (lxmin,lxmax,
			  lymin,lymax : real);

{ Purpose : To set the locator limits ( in device units )               }
{ Note: This routine does not perform error cking    }

begin
  with gcb^ do
    begin
      { set the logical limits }
      with log_loc_lim do
	begin
	  xmin := lxmin;
	  xmax := lxmax;
	  ymin := lymin;
	  ymax := lymax;
	end;

      { calculate the display / locator xforms }

      xltod_scale := (cur_disp_lim.xmax - cur_disp_lim.xmin) /
		       (log_loc_lim.xmax - log_loc_lim.xmin);

      yltod_scale := (cur_disp_lim.ymax - cur_disp_lim.ymin) /
		       (log_loc_lim.ymax - log_loc_lim.ymin);


      { set the locator echo position to the center of the window }

      with window_lim do
	begin
	  w_loc_echo_x := ((xmax - xmin) / 2.0) + xmin;
	  w_loc_echo_y := ((ymax - ymin) / 2.0) + ymin;
	end;

      { convert to device units }

      convert_wtod ( w_loc_echo_x, w_loc_echo_y,
		     d_loc_echo_x, d_loc_echo_y );

    end;

end; { locator_limits }


procedure calculate_viewing;

{ Purpose : To calculate a new viewing transformation                   }

var
  temp : real;           { temp work var }

  procedure int_test;

  { Purpose : To see if conditions are right, and setup if so, for int_move
	      and int_line to call fast integer device routines             }

  var
    sxmin : integer;
    sxmax : integer;
    symin : integer;
    symax : integer;
    gsxmin : gshortint;
    gsxmax : gshortint;
    gsymin : gshortint;
    gsymax : gshortint;

    window_delta_x : integer;
    window_delta_y : integer;

  begin
    short_flag := false;

      with gcb^ do
	begin
	  if disp_init then
	    try
 $range on$         { range cking done here }

	      { find device points for the corners of the window }
	      convert_wtod(window_lim.xmin,window_lim.ymin,sxmin,symin);
	      convert_wtod(window_lim.xmax,window_lim.ymax,sxmax,symax);

	      { convert to non-fix point form }
	      gsxmin := sxmin;
	      gsxmax := sxmax;
	      gsymin := symin;
	      gsymax := symax;

	      {set up scale info }
	      with window_lim do
		begin
		  window_delta_x := trunc(xmax) - trunc(xmin);
		  window_delta_y := trunc(ymax) - trunc(ymin);

		  { ck delta window values in range }
		  if (abs(window_delta_x) > 32767) or
		     (abs(window_delta_y) > 32767) then
		     escape(-4); { force integer overflow }

		  with scalef do
		    begin
		      x_display_delta := gsxmax - gsxmin;
		      x_window_delta := window_delta_x;
		      x_display_offset :=
			((-trunc(xmin) * x_display_delta) div x_window_delta) + gsxmin;
		      y_display_delta := gsymax - gsymin;
		      y_window_delta := window_delta_y;
		      y_display_offset :=
			((-trunc(ymin) * y_display_delta) div y_window_delta) + gsymin;


		      if (x_display_offset = 0) and
			 (x_window_delta = x_display_delta) and
			 (y_display_offset = 0) and
			 (y_window_delta = y_display_delta) then
			short_defaults := true
		      else
			short_defaults := false;

		    end;
		end;
	      short_flag := true;

	    recover { can't use int_move / int_line internal routines }
	      if (escapecode > -4) or { igonor all math and range errors }
		 (escapecode < -8) then escape(escapecode);
$range off$
	end;
  end;      { of procedure int_test }


begin
  with gcb^ do
    begin
      { set view surface limits to the logical display limits               }
      cur_disp_lim := log_disp_lim;

      { if desired aspect = aspect of logical limits then we don't need to
	redefine the limits as set above                                    }
      if (aspect_ratio <> log_aspect) then
	begin

	  {determine which device limits to change}
	  if (aspect_ratio <= log_aspect) then
	    begin

	      {check display justification}
	      if (disp_just = centered) then

		{set vertical limits for device on which view space is
		 centered within the logical display limits            }
		begin
		  temp := 0.5 * (dyunits - (dxunits * aspect_ratio) );
		  cur_disp_lim.ymin := log_disp_lim.ymin + temp;
		  cur_disp_lim.ymax := log_disp_lim.ymax - temp;
		end

	      else  { not centered }

		{set vertical limits for device on which view space is
		 lower left justified within the logical display limits   }
		begin
		  cur_disp_lim.ymax :=
		    log_disp_lim.ymin + (dxunits * aspect_ratio);
		end;
	    end

	  else  { current aspect ratio > aspect ratio of logical limits   }
	    begin

	      {check display justification}
	      if (disp_just = centered) then

		{set horizontal limits for device on which view space is
		 centered within the logical display limits              }
		begin
		  temp := 0.5 * (dxunits - (dyunits / aspect_ratio) );
		  cur_disp_lim.xmin := log_disp_lim.xmin + temp;
		  cur_disp_lim.xmax := log_disp_lim.xmax - temp;
		end

	      else  { not centered }

		{set horizontal limits for device on which view space is
		 lower left justified within the logical display limits    }
		begin
		  cur_disp_lim.xmax :=
		    log_disp_lim.xmin + (dyunits / aspect_ratio);
		end;
	    end;
	end;


      { set clipping limits here }
      if disp_init then
	 with gle_gcb^,cur_disp_lim do
	   begin
	     {WRITELN('C =',XMIN:19:18,XMAX:19:18,YMIN:19:18,YMAX:19:18);
	     WRITELN('CI=',TRUNC(XMIN+0.5):19,TRUNC(XMAX+0.5):19,
	     TRUNC(YMIN+0.5):19,TRUNC(YMAX+0.5):19);}
	     info1 := trunc(xmin+0.5);
	     info2 := trunc(xmax+0.5);
	     info3 := trunc(ymin+0.5);
	     info4 := trunc(ymax+0.5);
	     gle_clip_limits (gle_gcb);
	   end;

      { recalculate the world to display transformation constants           }

      { x scale and offset                                                  }
      with cur_disp_lim do
	temp := (xmax - xmin ) / cur_vir_lim.xlim;

      xwtod_scale := temp * ((viewport_lim.xmax - viewport_lim.xmin) /
		       (window_lim.xmax - window_lim.xmin));

      xwtod_offset := cur_disp_lim.xmin + (viewport_lim.xmin * temp) -
		       (window_lim.xmin * xwtod_scale);

      xdtow_scale := 1.0 / xwtod_scale;

      xdtow_offset := - xwtod_offset;
      xwtod_offset := xwtod_offset + 0.5 {0.00000001};

      { y scale and offset                                                 }
      with cur_disp_lim do
	temp := (ymax - ymin ) / cur_vir_lim.ylim;

      ywtod_scale := temp * ((viewport_lim.ymax - viewport_lim.ymin) /
		       (window_lim.ymax - window_lim.ymin));


      ywtod_offset := cur_disp_lim.ymin + (viewport_lim.ymin * temp) -
		       (window_lim.ymin * ywtod_scale);

      ydtow_scale := 1.0 / ywtod_scale;

      ydtow_offset := - ywtod_offset;
      ywtod_offset := ywtod_offset + 0.5 {0.00000001};

      if disp_eq_loc then
	begin
	  {if display and locator are the same physical device then set
	  the locator limits to the display limits                      }

	  with cur_disp_lim do
	    locator_limits(xmin,xmax,ymin,ymax);
	end
      else
	begin
	  {set the locator limits to current locator limits             }

	  with log_loc_lim do
	    locator_limits(xmin,xmax,ymin,ymax);
	end;

      { set up for int_move / int_line scale }
      int_test;
    end;
end; { calculate_viewing }


procedure display_limits ( dxmin, dxmax, dymin, dymax : real );

{ Purpose : To set the logical display limits in device units }

begin
  {WRITELN('NEW DISPLAY LIM = ',DXMIN:19:18,DXMAX:19:18,DYMIN:19:18,DYMAX:19:18);
  }
  with gcb^ do
    begin
      { set new log limits }
      with log_disp_lim do
	begin
	  xmin := dxmin;
	  xmax := dxmax;
	  ymin := dymin;
	  ymax := dymax;
	end;

      { set the display width and height }

      dxunits := dxmax - dxmin;
      dyunits := dymax - dymin;

      { calculate aspect ratio of new log lim }

      log_aspect := dyunits / dxunits;

      { set up new viewing transformation }
      calculate_viewing;

    end;

end; { display_limits }

function realmap : boolean;
begin
 realmap := true;
 with gle_gcb^ do
  if   (display_name = '98700A')
    or (display_name = '98542A') or (display_name = '98543A')
    or (display_name = '98544A') or (display_name = '98545A')
    or (display_name = '98547A') or (display_name = '98548A')      {SFB 2/2/88}
    or (display_name = '98549A') or (display_name = '98550A')      {SFB 2/2/88}
    or (display_name = 'E640  ') or (display_name = 'E1024 ')      {CFB 30JUL91}
    or (display_name = 'E1280 ') or (display_name = 'E640G ')      {CFB 30JUL91}
    or (display_name = 'E1280G') then                              {CFB 30JUL91}
 realmap := false;
end;

function dglfloat(anyvar color : gshortint) : real;
var temp : ^real;
begin
 if not realmap then
  dglfloat := color / 32767
 else
  begin
   temp := addr(color);
   dglfloat := temp^;
  end;
end;

function dglfix(color : real) : gshortint;
begin
 dglfix := ROUND(color * 32767);
end;

end.  { of module DGL_GEN }
@


55.2
log
@Added support for High-res and Greyscale - CFB
@
text
@@


55.1
log
@Automatic bump of revision number for PWS version 3.25A
@
text
@d690 3
a692 1
    or (display_name = 'VGA   ') or (display_name = 'MEDIUM') then {CFB 12JUN91}
@


54.3
log
@removed . from include file names - CFB
@
text
@@


54.2
log
@Added support for WOODCUT graphics hardware - CFB
@
text
@d38 1
a38 1
$include 'OPTIONS.'$
d43 1
a43 1
	'GLE_LIB.'$
@


54.1
log
@Automatic bump of revision number for PWS version 3.24
@
text
@d38 1
a38 1
$include 'OPTIONS'$
d43 1
a43 1
	'GLE_LIB'$
d689 2
a690 1
    or (display_name = '98549A') or (display_name = '98550A') then {SFB 2/2/88}
@


53.1
log
@Automatic bump of revision number for PWS version 3.24B
@
text
@@


52.1
log
@Automatic bump of revision number for PWS version 3.24A
@
text
@@


51.1
log
@Automatic bump of revision number for PWS version 3.24d
@
text
@@


50.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


49.1
log
@Automatic bump of revision number for PWS version 3.24b
@
text
@@


48.1
log
@Automatic bump of revision number for PWS version 3.24a
@
text
@@


47.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


46.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


45.1
log
@Automatic bump of revision number for PWS version 3.23C
@
text
@@


44.1
log
@Automatic bump of revision number for PWS version 3.23B
@
text
@@


43.1
log
@Automatic bump of revision number for PWS version 3.23aA
@
text
@@


42.1
log
@Automatic bump of revision number for PWS version 3.23e
@
text
@@


41.1
log
@Automatic bump of revision number for PWS version 3.23d
@
text
@@


40.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


39.1
log
@Automatic bump of revision number for PWS version 3.23b
@
text
@@


38.1
log
@Automatic bump of revision number for PWS version 3.23a
@
text
@@


37.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


36.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


35.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


34.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


33.1
log
@Automatic bump of revision number for PWS version 3.22D
@
text
@@


32.1
log
@Automatic bump of revision number for PWS version 3.22C
@
text
@@


31.1
log
@Automatic bump of revision number for PWS version 3.22B
@
text
@@


30.1
log
@Automatic bump of revision number for PWS version 3.22A
@
text
@@


29.1
log
@Automatic bump of revision number for PWS version 3.22b
@
text
@@


28.1
log
@Automatic bump of revision number for PWS version 3.3b
@
text
@@


27.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


26.1
log
@Automatic bump of revision number for PWS version 3.3 Synch
@
text
@@


25.2
log
@For CATSEYE support
@
text
@@


25.1
log
@Automatic bump of revision number for PWS version 3.2Y
@
text
@d688 2
a689 1
    or (display_name = '98547A') or (display_name = '98549A') then
@


24.1
log
@Automatic bump of revision number for PWS version 3.2
@
text
@@


23.1
log
@Automatic bump of revision number for PWS version 3.2P
@
text
@@


22.1
log
@Automatic bump of revision number for PWS version 3.2N
@
text
@@


21.1
log
@Automatic bump of revision number for PWS version 3.2M
@
text
@@


20.1
log
@Automatic bump of revision number for PWS version 3.2L
@
text
@@


19.1
log
@Automatic bump of revision number for PWS version 3.2K
@
text
@@


18.1
log
@Automatic bump of revision number for PWS version 3.2J
@
text
@@


17.1
log
@Automatic bump of revision number for PWS version 3.2I+
@
text
@@


16.1
log
@Automatic bump of revision number for PWS version 3.2I
@
text
@@


15.1
log
@Automatic bump of revision number for PWS version 3.2H
@
text
@@


14.1
log
@Automatic bump of revision number for PWS version 3.2G
@
text
@@


13.1
log
@Automatic bump of revision number for PWS version 3.2F
@
text
@@


12.1
log
@Automatic bump of revision number for PWS version 3.2E
@
text
@@


11.1
log
@Automatic bump of revision number for PWS version 3.2D
@
text
@@


10.1
log
@Automatic bump of revision number for PWS version 3.2C
@
text
@@


9.1
log
@Automatic bump of revision number for PWS version 3.2B
@
text
@@


8.1
log
@Automatic bump of revision number for PWS version 3.2A
@
text
@@


7.1
log
@Automatic bump of revision number for PWS version 3.2l
@
text
@@


6.1
log
@Automatic bump of revision number for PWS version 3.2k
@
text
@@


5.2
log
@Changes from Scott Bayes
@
text
@@


5.1
log
@Automatic bump of revision number for PWS version 3.2j
@
text
@d687 2
a688 1
    or (display_name = '98544A') or (display_name = '98545A') then
@


4.1
log
@Automatic bump of revision number for PWS version 3.2i
@
text
@@


3.1
log
@Automatic bump of revision number for PWS version 3.2h
@
text
@@


2.1
log
@Auto bump rev number to 2.1 for sys 3.2e.
@
text
@@


1.1
log
@Initial revision
@
text
@@
