/*
 * $RCSfile: TextWraps.psw,v $
 *
 * (c) Copyright 1992-1994 Adobe Systems Incorporated.
 * All rights reserved.
 * 
 * Permission to use, copy, modify, distribute, and sublicense this software
 * and its documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notices appear in all copies and that
 * both those copyright notices and this permission notice appear in
 * supporting documentation and that the name of Adobe Systems Incorporated
 * not be used in advertising or publicity pertaining to distribution of the
 * software without specific, written prior permission.  No trademark license
 * to use the Adobe trademarks is hereby granted.  If the Adobe trademark
 * "Display PostScript"(tm) is used to describe this software, its
 * functionality or for any other purpose, such use shall be limited to a
 * statement that this software works in conjunction with the Display
 * PostScript system.  Proper trademark attribution to reflect Adobe's
 * ownership of the trademark shall be given whenever any such reference to
 * the Display PostScript system is made.
 * 
 * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
 * ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
 * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON- INFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO EVENT SHALL ADOBE BE LIABLE
 * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  ADOBE WILL NOT
 * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
 * 
 * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
 * Incorporated which may be registered in certain jurisdictions
 * 
 * Author:  Adobe Systems Incorporated
 */

/***************************************************************
**
** FUNCTION:	PSWGetTransform
**
** DESCRIPTION:	Gets the current transform matrices and offset
**				coordinates.
**
** PARAMETERS:	None
**
** RETURN:	Ctm		array of current transform matrix
**		Invctm		array of inverted matrix
**		XOffset		X offset value
**		YOffset		Y offset value
**
***************************************************************/
defineps PSWGetTransform (| float Ctm[6], Invctm[6]; 
			int *XOffset, *YOffset)
	matrix currentmatrix dup Ctm
	matrix invertmatrix Invctm
	currentXoffset YOffset XOffset
endps

/***************************************************************
**
** FUNCTION:	PSWCachestatus
**
** DESCRIPTION:	Gets the font cache status measurements.
**
** PARAMETERS:	None
**
** RETURN:	Array		array to hold font cache status
**
***************************************************************/
defineps PSWCachestatus(|int Array[7])
	cachestatus 7 -1 1 {1 roll} for 7 {Array} repeat
endps

/***************************************************************
**
** FUNCTION:	PSWCurrentcacheparams
**
** DESCRIPTION:	Gets the current font cache parameters.
**
** PARAMETERS:	None
**
** RETURN:	Size		size of the font cache in bytes
**		Lower		threshold at which characters may
**				be stored in compressed form
**		Upper		maximum bytes for one character
**
***************************************************************/
defineps PSWCurrentcacheparams(|int *Size, *Lower, *Upper)
	currentcacheparams Upper Lower Size
endps

/***************************************************************
**
** FUNCTION:	PSWSetcacheparams
**
** DESCRIPTION:	Sets the current font cache parameters.
**
** PARAMETERS:	Ctxt		DPS context
**
** RETURN:	Size		size of the font cache in bytes
**		Lower		threshold at which characters may
**				be stored in compressed form
**		Upper		maximum bytes for one character
**
***************************************************************/
defineps PSWSetcacheparams(int Size, Lower, Upper)
	mark Size Lower Upper  setcacheparams
%%	Upper setcachelimit
endps

/***************************************************************
**
** FUNCTION:	PSWrmovetoShow
**
** DESCRIPTION:	Move relative to a position and draw the string
**		using the 'show' operator.
**
** PARAMETERS:	X	X offset from current location
**		Str	string to be drawn
**		Num	length of the string
**
** RETURN:	None
**
***************************************************************/
defineps PSWrmovetoShow(float X;  char Str[Num]; int  Num)
	X 0 rmoveto  (Str) show
endps

/***************************************************************
**
** FUNCTION:	PSWshow
**
** DESCRIPTION:	Draw string using the 'show' operator.  Differs from PSshow
**		in taking a counted string, so can be used to show sections
**		from the middle of a string
**
** PARAMETERS:	Str	string to be drawn
**		Num	length of the string
**
** RETURN:	None
**
***************************************************************/
defineps PSWshow(char Str[Num]; int  Num)
	(Str) show
endps

/***************************************************************
**
** FUNCTION:	PSWashow
**
** DESCRIPTION:	Draw string using the 'ashow' operator.
**
** PARAMETERS:	Ax	X width adjustment for each char
** 		Ay	Y width adjustment for each char
**		Str	string to be drawn
**		Num	length of the string
**
** RETURN:	None
**
***************************************************************/
defineps PSWashow(float Ax, Ay; char Str[Num]; int  Num)
	Ax Ay (Str) ashow
endps

/***************************************************************
**
** FUNCTION:	PSWwidthshow
**
** DESCRIPTION:	Draw string using the 'widthshow' operator.
**
** PARAMETERS:	Cx	X character width adjustment
** 		Cy	Y character width adjustment
**		C	character for width adjustment
**		Str	string to be drawn
**		Num	length of the string
**
** RETURN:	None
**
***************************************************************/
defineps PSWwidthshow(float Cx, Cy; int C; char Str[Num]; int  Num)
	Cx Cy C (Str) widthshow
endps

/***************************************************************
**
** FUNCTION:	PSWawidthshow
**
** DESCRIPTION:	Draw string using the 'awidthshow' operator.
**
** PARAMETERS:	Cx	X character width adjustment
** 		Cy	Y character width adjustment
**		C	character for width adjustment
** 		Ax	X width adjustment for each char
** 		Ay	Y width adjustment for each char
**		Str	string to be drawn
**		Num	length of the string
**
** RETURN:	None
**
***************************************************************/
defineps PSWawidthshow(float Cx, Cy; int C; float Ax, Ay;
		       char Str[Num]; int  Num)
	Cx Cy C Ax Ay (Str) awidthshow
endps

/***************************************************************
**
** FUNCTION:	PSWCopyFont
**
** DESCRIPTION:	Reencode the font adding BitmapWidths, ExactSize,
**		InBetweenSize, and TransformedChar entries set to
**		vary the font characteristics.
**
** PARAMETERS:	F1		Original font name
**		F2		New font name
**		BMWValue	use bit map widths flag
**		CopyUniqueID	whether to copy UniqueID
**		ESValue		what to do on exact size match
**		IBSValue	what to do on in between sizes
**		TCValue		what to do for transformed chars
**
** RETURN:	None
**
***************************************************************/
defineps PSWCopyFont(char *F1, *F2; boolean BMWValue, CopyUniqueID;
		     int ESValue, IBSValue, TCValue)
    /F1 findfont
    dup length 4 add dict begin
	{
	    1 index /FID eq 2 index /UniqueID eq CopyUniqueID not and or
	    { pop pop } { def } ifelse
	} forall

	/BitmapWidths    BMWValue def
	/ExactSize       ESValue  def
	/InBetweenSize   IBSValue def
	/TransformedChar TCValue  def

	/F2 currentdict
    end
    definefont pop
endps

/***************************************************************
**
** FUNCTION:	PSWGetStringWidth
**
** DESCRIPTION:	Gets the width of each character in a string string.
**
** PARAMETERS:	String	string to measure
**		Size	number of characters in the string
**
** RETURN:	Width	width of characters
**
***************************************************************/
defineps PSWGetStringWidth (char String[Size]; int Size | float Width[Size])
    /str 1 string def
    0 1 Size 1 sub {
	(String) exch get str 0 3 -1 roll put 
	str stringwidth pop Width
    } for	
    /str where pop /str undef
endps

/***************************************************************
**
** FUNCTION:	PSWdrawFrame
**
** DESCRIPTION:	Draw frame around the displayable page.
**
** PARAMETERS:	Ox	X coordinate of lower left corner.
**		Oy	Y coordinate of lower left corner.
**		Dx	width
**		Dy	height
**
** RETURN:	None
**
***************************************************************/
defineps PSWdrawFrame(int Ox; int Oy; int Dx; int Dy)
	gsave

	newpath
	Ox Oy moveto
	0 Dy rlineto
	Dx 0 rlineto
	0 Dy neg rlineto
	closepath
	-32768 -32768 moveto
	32767 -32768 lineto
	32767 32767 lineto
	-32768 32767 lineto
	closepath
	0.8 setgray fill

	newpath
	10 -10 translate
	Ox Oy moveto
	Dx 0 rlineto
	0 Dy rlineto
	-10 0 rlineto
	0 Dy neg 10 add rlineto
	Dx neg 10 add 0 rlineto
	closepath
	0 setgray fill
	-10 10 translate

	4 setlinewidth
	0 setgray
	Ox Oy Dx Dy rectstroke
	1 setgray
	Ox Oy Dx Dy rectfill

	grestore
endps

/***************************************************************
**
** FUNCTION:    PSWClearWindow
**
** DESCRIPTION: Fills window with white
**
** PARAMETERS:  Width, Height	window dimensions
**
** RETURN:      None
**
***************************************************************/

defineps PSWClearWindow(float Width, Height)
    currentgray 1 setgray 0 0 Width Height rectfill setgray
endps

/***************************************************************
**
** FUNCTION:    PSWSetOffset
**
** DESCRIPTION: Sets the x and y offset, maintaining current matrix
**
** PARAMETERS:  X	    X offset value
**		Y	    Y offset value
**
** RETURN:	None
**
***************************************************************/
defineps PSWSetOffset(int x, y)
    matrix currentmatrix
    x y setXoffset
    setmatrix
endps

/***************************************************************
**
** FUNCTION:    PSWSetRectViewClip
**
** DESCRIPTION: Sets the view clip to the rectangles
**
** PARAMETERS:  Rect		List of rectangles
**		NumRect		Number of points in Rect
**
** RETURN:      None
**
***************************************************************/

defineps PSWSetRectViewClip(float numstring Rect[NumRect]; int NumRect)
    Rect rectviewclip
endps

/***************************************************************
**
** FUNCTION:    PSWSetMatrixAndGetTransform
**
** DESCRIPTION: Sets the current matrix to have the specified
**              translation, scale, and halftone phase, and returns
**              the matrices
**
** PARAMETERS:  tx, ty          translation
**              s               scale
**              hx, hy          halftonephase
**
** RETURN:      Ctm             array of current transform matrix
**              Invctm          array of inverted matrix
**              XOffset         X offset value
**              YOffset         Y offset value
**
***************************************************************/
defineps PSWSetMatrixAndGetTransform (float tx, ty, s; int hx, hy
                | float Ctm[6], Invctm[6]; int *XOffset, *YOffset)
        initmatrix
        tx ty translate
        s s scale
        hx hy sethalftonephase
        matrix currentmatrix dup Ctm
        matrix invertmatrix Invctm
        currentXoffset YOffset XOffset
endps
