# typemap for perl 5 interface to FreeType Ver1.0
#
# written by Takuya SHIOZAKI (tshiozak@makino.ise.chuo-u.ac.jp)
#

TYPEMAP
TT_Fixed		T_LONG
TT_FWord		T_SHORT
TT_UFWord		T_U_SHORT
TT_Short		T_SHORT
TT_UShort		T_U_SHORT
TT_LONG			T_LONG
TT_ULong		T_U_LONG
TT_F2Dot14		T_SHORT
TT_F26Dot6		T_LONG
TT_Pos			T_LONG
TT_UnitVector		T_UnitVector
TT_Vector		T_Vector
TT_Matrix		T_Matrix
TT_Outline		T_Outline
TT_BBox			T_BBox
TT_Glyph_Metrics	T_Glyph_Metrics
#TT_Big_Glyph_Metrics	T_Big_Glyph_Metrics
TT_Instance_Metrics	T_Instance_Metrics
TT_Raster_Map		T_Raster_Map
#TT_Header		T_Header
#TT_Horizontal_Header	T_Horizontal_Header
#TT_OS2			T_OS2
#TT_Postscript		T_Postscript
#TT_Hdmx_Record		T_Hdmx_Record
#TT_Hdmx		T_Hdmx
TT_Face_Properties	T_Face_Properties
TT_Engine		T_Handle
TT_Stream		T_Handle
TT_Face			T_Handle
TT_Instance		T_Handle
TT_Glyph		T_Handle
TT_CharMap		T_Handle
TT_Error		T_INT

INPUT
T_Handle
	{
		void **ptrImage;
		if (SvTYPE($arg) == SVt_PV &&
		    ((ptrImage = (void **)SvPV($arg, na)),
		     na == sizeof($var.z)))
			$var.z = *ptrImage;
		else
			croak(\"Illegal Handle for $var.\");
	}
#T_Face_Properties
#	/* NO NEED */
T_UnitVector
	if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) {
		HV *obj = (HV*)SvRV($arg);
		FETCH_OBJ_IV(obj, &$var, x, $var);
		FETCH_OBJ_IV(obj, &$var, y, $var);
	}
	else
		croak(\"Illegal Object for $var.\");
T_Vector
	if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) {
		HV *obj = (HV*)SvRV($arg);
		FETCH_OBJ_IV(obj, &$var, x, $var);
		FETCH_OBJ_IV(obj, &$var, y, $var);
	}
	else
		croak(\"Illegal Object for $var.\");
T_Matrix
	if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) {
		HV *obj = (HV*)SvRV($arg);
		FETCH_OBJ_IV(obj, &$var, xx, $var);
		FETCH_OBJ_IV(obj, &$var, xy, $var);
		FETCH_OBJ_IV(obj, &$var, yx, $var);
		FETCH_OBJ_IV(obj, &$var, yy, $var);
	}
	else
		croak(\"Illegal Object for $var.\");
T_Outline
	if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) {
		HV *obj = (HV*)SvRV($arg);
		conv_hash_obj_to_outline(&$var, obj);
	}
	else
		croak(\"Illegal Object for $var.\");
#T_BBox
#	/* NO NEED */
#T_Glyph_Metrics
#	/* NO NEED */
#T_Instance_Metrics
#	/* NO NEED */
T_Raster_Map
	if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVHV) {
		HV *obj = (HV*)SvRV($arg);
		SV *sv;
		FETCH_OBJ_IV(obj, &$var, rows, $var);
		FETCH_OBJ_IV(obj, &$var, cols, $var);
		FETCH_OBJ_IV(obj, &$var, width, $var);
		FETCH_OBJ_IV(obj, &$var, flow, $var);
#		FETCH_OBJ_IV(obj, &$var, size, $var);
		FETCH_OBJ(obj, bitmap, sv, $var);
		$var.bitmap = SvPV(sv, na);
		$var.size = na;
	}
	else
		croak(\"Illegal Object for $var.\");

OUTPUT
T_Handle
	sv_setpvn($arg, (char*)&$var, sizeof(&$var));

T_Face_Properties
	sv_setsv($arg,
		newRV_noinc((SV*)conv_face_properties_to_hash_obj(&$var)));

T_UnitVector
	{
		HV *obj = newHV();

		STORE_OBJ_IV(obj, &$var, x);
		STORE_OBJ_IV(obj, &$var, y);
		sv_setsv($arg, newRV_noinc((SV*)obj));
	}
T_Vector
	{
		HV *obj = newHV();

		STORE_OBJ_IV(obj, &$var, x);
		STORE_OBJ_IV(obj, &$var, y);
		sv_setsv($arg, newRV_noinc((SV*)obj));
	}
T_Matrix
	{
		HV *obj = newHV();

		STORE_OBJ_IV(obj, &$var, xx);
		STORE_OBJ_IV(obj, &$var, xy);
		STORE_OBJ_IV(obj, &$var, yx);
		STORE_OBJ_IV(obj, &$var, yy);
		sv_setsv($arg, newRV_noinc((SV*)obj));
	}
T_Outline
	sv_setsv($arg,
		newRV_noinc((SV*)conv_outline_to_hash_obj(&$var)));
T_BBox
	sv_setsv($arg, newRV_noinc((SV*)conv_bbox_to_hash_obj(&$var)));
T_Glyph_Metrics
	{
		HV *obj = newHV();

		STORE_OBJ(obj, bbox,
			newRV_noinc((SV*)conv_bbox_to_hash_obj(&$var.bbox)));
		STORE_OBJ_IV(obj, &$var, bearingX);
		STORE_OBJ_IV(obj, &$var, bearingY);
		STORE_OBJ_IV(obj, &$var, advance);
		sv_setsv($arg, newRV_noinc((SV*)obj));
	}
T_Instance_Metrics
	{
		HV *obj = newHV();

		STORE_OBJ_IV(obj, &$var, pointSize);
		STORE_OBJ_IV(obj, &$var, x_ppem);
		STORE_OBJ_IV(obj, &$var, y_ppem);
		STORE_OBJ_IV(obj, &$var, x_scale);
		STORE_OBJ_IV(obj, &$var, y_scale);
		STORE_OBJ_IV(obj, &$var, x_resolution);
		STORE_OBJ_IV(obj, &$var, y_resolution);
		sv_setsv($arg, newRV_noinc((SV*)obj));
	}
#T_Raster_Map
#	/* NO NEED */
