/* type1interface.c

    Author - Amish S. Dave

This file contains interface functions that get called by the
shared library entry points, and calls functions in the type1
sources.

*/

#ifndef T1GST
#include "global.h"
#endif
#include "amishfontrequest.h"
#include <stdio.h>

/**
 * DEFINES
 **/
#define DECIPOINTSPERINCH 722.7
#define DEFAULTRES 75
#define DEFAULTPOINTSIZE 120


/**
 * GLOBAL VARIABLES
 **/
FontScalableRec vals;
FontEntryRec entry;
FontPtr fontptr;
CharInfoPtr glyphs;


/**
 * PROTOTYPES
 **/
void OpenType1Engine(void);
void CloseType1Engine(void);
unsigned long ReadType1Font(FONTREQUEST *fontreq_p);
struct GlyphMap *GetType1GlyphMap(unsigned long GlyphCode);
void CloseType1Font(void);
int MyQueryFontLib(char *filename, char *env, pointer dest);
unsigned long SetTransformType1Font(FONTREQUEST *fontreq_p);


/**
 *	Create memory pool
 **/
void OpenType1Engine(void)
{
	addmemory2(100000);
	fontptr = NULL;
}

/**
 * Free memory, cleanup, etc.
 **/
void CloseType1Engine(void)
{
	extern psfont *FontP;

	free_vm();
	FontP = NULL;
	MyType1CloseFont(fontptr);
	delmemory2();
}


/* return 0 on success */
unsigned long ReadType1Font(FONTREQUEST *fontreq_p)
{
	int rc;

	vals.x = fontreq_p->DeviceXDPI;
	vals.y = fontreq_p->DeviceYDPI;
	vals.point = fontreq_p->PointHeight * 10;
	vals.pixel = (vals.point * vals.y) / DECIPOINTSPERINCH;
	vals.pixel_set = (fontreq_p->PointSet != 0) ? ((fontreq_p->PointSet * 10 * vals.x) / DECIPOINTSPERINCH) : vals.pixel;
	vals.pixel_matrix[0] = vals.pixel_matrix[3] = vals.pixel;
	vals.ShearSin = fontreq_p->ShearSin;
	vals.ShearCos = fontreq_p->ShearCos;
	vals.RotateSin = fontreq_p->RotateSin;
	vals.RotateCos = fontreq_p->RotateCos;

	rc = MyType1OpenScalable(&fontptr, fontreq_p->FontFileName, &vals);

	if (rc != Successful)
		return -1;
	else
		return 0;
}


unsigned long SetTransformType1Font(FONTREQUEST *fontreq_p)
{
	int rc;

	vals.x = fontreq_p->DeviceXDPI;
	vals.y = fontreq_p->DeviceYDPI;
	vals.point = fontreq_p->PointHeight * 10;
	vals.pixel = (vals.point * vals.y) / DECIPOINTSPERINCH;
	vals.pixel_set = (fontreq_p->PointSet != 0) ? ((fontreq_p->PointSet * 10 * vals.x) / DECIPOINTSPERINCH) : vals.pixel;
	vals.pixel_matrix[0] = vals.pixel_matrix[3] = vals.pixel;
	vals.ShearSin = fontreq_p->ShearSin;
	vals.ShearCos = fontreq_p->ShearCos;
	vals.RotateSin = fontreq_p->RotateSin;
	vals.RotateCos = fontreq_p->RotateCos;

	rc = MyType1SetTransform(fontptr, &vals);

	if (rc != Successful)
		return -1;
	else
		return 0;
}


/* return NULL on failure, struct GlyphMap * on success */
struct GlyphMap *GetType1GlyphMap(unsigned long GlyphCode)
{
	int rc;

	if (GlyphCode >= 256)
		return NULL;

	rc = MyType1GetGlyphs(fontptr, GlyphCode, &glyphs);

//if ((glyphs == NULL) && (rc == Successful)) kprintf("NULL glyph returned!\n");

	if ((rc != Successful) || (glyphs == NULL))
		return NULL;
	else
		return glyphs->glyphmap;
}


void CloseType1Font(void)
{
	return;
}


int MyQueryFontLib(char *filename, char *env, pointer dest)
{
	int rc;

	QueryFontLib(filename, env, dest, &rc);
	return rc;
}

void FatalError(char *line)
{
//	puts(line);
}
