/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Torsten Jürgeleit
 *
 *	Name .....: fonts.c
 *	Created ..: Tuesday 31-Dec-91 14:29:10
 *	Revision .: 1
 *
 *	Date        Author                 Comment
 *	=========   ====================   ====================
 *	07-Jan-92   Torsten Jürgeleit      update to new ISUP font routines
 *	31-Dec-91   Torsten Jürgeleit      Created this file!
 *
 ****************************************************************************
 *
 *	Font support routines
 *
 * $Revision Header ********************************************************/

 /* Includes */

#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"

 /* Open template font with given attributes */

struct TextAttr *
open_template_font_by_attributes(struct TemplateList *tl, BYTE * name,
								 USHORT ysize)
{
	struct TextAttr search_ta, *avail_ta, *ta = NULL;

	/* Try to open given font */
	search_ta.ta_Name = (STRPTR) name;
	search_ta.ta_YSize = ysize;
	search_ta.ta_Style = FS_NORMAL;
	search_ta.ta_Flags = FPF_ROMFONT;
	if (avail_ta = IAskFont(pri, &search_ta))
	{
		struct TemplateFont *tf;

		/* Search given template font in font list */
		ysize = avail_ta->ta_YSize;
		for (tf = get_head((struct List *) & tl->tl_Fonts); tf;
			 tf = get_succ((struct Node *) & tf->tf_MinNode))
		{
			if (!strcmp(name, (BYTE *) tf->tf_TextAttr.ta_Name) &&
				ysize == tf->tf_TextAttr.ta_YSize)
			{
				tf->tf_UseCount++;
				ta = &tf->tf_TextAttr;
				break;
			}
		}
		if (!ta)
		{

			/* Create new template font */
			if (tf = AllocMem((LONG) sizeof(struct TemplateFont),
							   (LONG) MEMF_PUBLIC))
			{
				if (duplicate_string(name, (BYTE **) & tf->tf_TextAttr.ta_Name) !=
					EDITOR_STATUS_NORMAL)
				{
					FreeMem(tf, (LONG) sizeof(struct TemplateFont));
				}
				else
				{

					/* Init template font and add it to font list */
					ta = &tf->tf_TextAttr;
					ta->ta_YSize = avail_ta->ta_YSize;
					ta->ta_Style = avail_ta->ta_Style;
					ta->ta_Flags = avail_ta->ta_Flags;
					tf->tf_UseCount = 1;
					AddTail((struct List *) & tl->tl_Fonts,
							(struct Node *) & tf->tf_MinNode);
				}
			}
		}
	}
	return (ta);
}

 /* Open template font with given number */

struct TextAttr *
open_template_font_by_num(struct TemplateList *tl, USHORT num)
{
	struct TemplateFont *tf;
	struct TextAttr *ta;

	/* Search given template font in font list */
	if (!(tf = get_node((struct List *) & tl->tl_Fonts, num)))
	{
		ta = NULL;
	}
	else
	{
		tf->tf_UseCount++;
		ta = &tf->tf_TextAttr;
	}
	return (ta);
}

 /* Get number of template font from font list */

USHORT
get_template_font_num(struct TemplateList * tl, struct TextAttr * ta)
{
	struct TemplateFont *tf;
	USHORT num = 0;

	/* Search given template font in font list */
	for (tf = get_head((struct List *) & tl->tl_Fonts); tf;
		 tf = get_succ((struct Node *) & tf->tf_MinNode))
	{
		if (ta == &tf->tf_TextAttr)
		{
			break;
		}
		else
		{
			num++;
		}
	}
	return (num);
}

 /* Close template font with given attributes */

VOID
close_template_font(struct TemplateList * tl, struct TextAttr * ta)
{
	if (ta)
	{
		struct TemplateFont *tf;

		/* Search given template font in font list */
		for (tf = get_head((struct List *) & tl->tl_Fonts); tf;
			 tf = get_succ((struct Node *) & tf->tf_MinNode))
		{
			if (ta == &tf->tf_TextAttr)
			{

				/* Close font and check if its in use yet */
				if (!--tf->tf_UseCount)
				{

					/* Remove and free template font from font list */
					Remove((struct Node *) & tf->tf_MinNode);
					free_template_font(tf);
				}
				break;
			}
		}
	}
}

 /* Free template font list */

VOID
free_font_list(struct TemplateList *tl)
{
	struct TemplateFont *tf;
	struct List *list = (struct List *) & tl->tl_Fonts;

	while (tf = (struct TemplateFont *) RemHead(list))
	{
		free_template_font(tf);
	}
}

 /* Free template font */

VOID
free_template_font(struct TemplateFont *tf)
{
	if (tf)
	{
		free(tf->tf_TextAttr.ta_Name);
		FreeMem(tf, (LONG) sizeof(struct TemplateFont));
	}
}
