Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/V_PowerPlant_Mods/UFontsStyles.cp

//	===========================================================================
//	UFontsStyles.cp					©1994 Metrowerks Inc. All rights reserved.
//	===========================================================================

#ifdef PowerPlant_PCH
#include PowerPlant_PCH
#endif

#include	"UFontsStyles.h"
#include	<UAEGizmos.h>
#include	<LString.h>

/*-
#include	<AETextSuite.h>
#include	<UAppleEventsMgr.h>
#include	<UExtractFromAEDesc.h>
#include	<LString.h>
#include	<LStream.h>
#include	<UDrawingState.h>
#include	<WFixed.h>
#include	<PP_Messages.h>
#include	<UTextMenus.h>
#include	<LCommander.h>
#include	<PP_Resources.h>
#include	<StClasses.h>

#ifndef		__FONTS__
#include	<Fonts.h>
#endif

#ifndef		__AEREGISTRY__
#include	<AERegistry.h>
#endif

#ifndef		__AEOBJECTS__
#include	<AEObjects.h>
#endif

#ifndef		__AEPACKOBJECT__
#include	<AEPackObject.h>
#endif

#ifndef		__AEREGISTRY__
#include	<AERegistry.h>
#endif
*/

#ifndef		__GESTALT__
#include	<Gestalt.h>
#endif

#pragma	warn_unusedarg off

Boolean	UFontsStyles::sMultiByteScriptPresent = -1;
const Point UFontsStyles::sUnitScale = {1, 1};

Boolean	UFontsStyles::MultiByteScriptPresent(void)
{
	if ( (sMultiByteScriptPresent != true) && (sMultiByteScriptPresent != false) ) {
		sMultiByteScriptPresent = false;
		
		do {
			long	response;
			OSErr	err = Gestalt(gestaltScriptMgrVersion, &response);
			if (err)
				break;
			
			if (response < 0x0710)
				break;	//	Actually, a multibyte script may be present
						//	but the CharacterByteType calls used by this
						//	code to deal with it are not present until
						//	system 7.1
		
			long	result = GetScriptManagerVariable(smDoubleByte);
			if (result)
				sMultiByteScriptPresent = true;
		} while (false);
	}

	return sMultiByteScriptPresent;
}

Int16	UFontsStyles::GetFontId(const Str255 inFontName)
{
	Int16	rval;
	
	GetFNum(inFontName, &rval);
	
	if (rval == 0) {
		Str255		fontZeroName;
		GetFontName(0, fontZeroName);
		if (!EqualString(inFontName, fontZeroName, false, false))
			Throw_(fontNotDeclared);
	}
	
	return rval;
}

void	UFontsStyles::GetFontName(Int16 inFontId, Str255 outFontName)
{
	::GetFontName(inFontId, outFontName);
	
	if ((inFontId == 1) && (outFontName[0] == 0)) {
		//	force it
		LString::CopyPStr("\pGeneva", outFontName);
	}
}

void	UFontsStyles::WriteStyles(LAEStream &outStream, Int32 inFaces)
{
	if (inFaces == normal) {
		outStream.WriteEnumDesc(kAEPlain);
	} else {
		if (inFaces & bold)			outStream.WriteEnumDesc(kAEBold);
		if (inFaces & italic)		outStream.WriteEnumDesc(kAEItalic);
		if (inFaces & outline)		outStream.WriteEnumDesc(kAEOutline);
		if (inFaces & shadow)		outStream.WriteEnumDesc(kAEShadow);
		if (inFaces & underline)	outStream.WriteEnumDesc(kAEUnderline);
		if (inFaces & condense)		outStream.WriteEnumDesc(kAECondensed);
		if (inFaces & extend)		outStream.WriteEnumDesc(kAEExpanded);
	}
}

Int32	UFontsStyles::StylesToInt(const LAESubDesc &inStyles)
{
	Int32		rval = normal;
	LAESubDesc	val;
	Int32		i,
				n;
	
	if (!inStyles.IsListOrRecord())
		Throw_(paramErr);
	
	n = inStyles.CountItems();
	
	for (i = 1; i <= n; i++)
		rval |= EnumToFace(inStyles.NthItem(i).ToEnum());
	
	return rval;
}

Int32	UFontsStyles::EnumToFace(OSType inEnum)
{
	switch (inEnum) {
		case kAEBold:			return	bold;			break;
		case kAEItalic:			return	italic;			break;
		case kAEOutline:		return	outline;		break;
		case kAEShadow:			return	shadow;			break;
		case kAEUnderline:		return	underline;		break;
		case kAECondensed:		return	condense;		break;
		case kAEExpanded:		return	extend;			break;
		case kAEPlain:			return	normal;			break;
		default:				Throw_(errAETypeError);	break;
	}
	
	return normal;	//	never executed.
}

void	UFontsStyles::IntToStyles(Int32 inOnFaces, AEDesc *outStyles, Int32 inOffFaces)
{
	LAEStream	aeStream;
	
	if (inOffFaces == 0)
		inOffFaces = ~inOnFaces;
	
	aeStream.OpenRecord(typeTextStyles);
	
	//	On styles
	aeStream.WriteKey(keyAEOnStyles);
	aeStream.OpenList();
	WriteStyles(aeStream, inOnFaces);
	aeStream.CloseList();
	
	//	Off styles
	aeStream.WriteKey(keyAEOffStyles);
	aeStream.OpenList();
	WriteStyles(aeStream, inOffFaces);
	aeStream.CloseList();

	aeStream.CloseRecord();
	
	aeStream.Close(outStyles);
}