/*
 * Copyright 1992, 1993 by TOSHIBA Corp.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of TOSHIBA not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. TOSHIBA make no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 *
 * Author: Katsuhisa Yano	TOSHIBA Corp.
 *			   	mopi@osa.ilab.toshiba.co.jp
 */
/*
 * Copyright 1995 by FUJITSU LIMITED
 * This is source code modified by FUJITSU LIMITED under the Joint
 * Development Agreement for the CDE/Motif PST.
 *
 * Modifier: Takanori Tateno   FUJITSU LIMITED
 *
 */

#ifndef _XOMGENERIC_H_
#define _XOMGENERIC_H_

#include "XlcPublic.h"

#define XOM_GENERIC(om)		(&((XOMGeneric) om)->gen)
#define XOC_GENERIC(font_set)	(&((XOCGeneric) font_set)->gen)

/* For VW/UDC */
typedef struct _CodeRangeRec {
    unsigned long       start;
    unsigned long       end;
    unsigned long       dmy1;
    unsigned long       dmy2;
} CodeRangeRec, *CodeRange;

typedef struct _VRotateRec {
    char        *charset_name;  /* Charset name                         */
    XlcSide     side;           /* Encoding side                        */
    int         num_cr;
    CodeRange   code_range;
    char        *xlfd_name;
    XFontStruct *font;
} VRotateRec, *VRotate;

typedef enum {
    XOMMultiByte,
    XOMWideChar,
    XOMUtf8String
} XOMTextType;

typedef struct _FontDataRec {
    char 	*name;
    XlcSide 	side;
    /* For VW/UDC */
    int       	scopes_num;
    FontScope 	scopes;
    char      	*xlfd_name;
    XFontStruct *font;
} FontDataRec, *FontData;

#define VROTATE_NONE   0
#define VROTATE_PART   1
#define VROTATE_ALL    2

typedef struct _OMDataRec {
    int 	charset_count;
    XlcCharSet 	*charset_list;
    int 	font_data_count;
    FontData 	font_data;
    /* For VW/UDC */
    int substitute_num;
    FontData substitute;
    /* Vertical Writing */
    int         vmap_num;
    FontData    vmap;
    int		vrotate_type;
    int         vrotate_num;
    CodeRange   vrotate;
} OMDataRec, *OMData;

typedef struct _XOMGenericPart {
    int 	data_num;
    OMData 	data;
    Bool 	on_demand_loading;
    char 	*object_name;
} XOMGenericPart;

typedef struct _XOMGenericRec {
    XOMMethods 		methods;
    XOMCoreRec 		core;
    XOMGenericPart 	gen;
} XOMGenericRec, *XOMGeneric;

/*
 * XOC dependent data
 */

typedef struct _FontSetRec {
    int 		id;
    int 		charset_count;
    XlcCharSet 		*charset_list;
    int 		font_data_count;
    FontData 		font_data;
    char 		*font_name;
    XFontStruct 	*info;
    XFontStruct 	*font;
    XlcSide 		side;
    Bool 		is_xchar2b;
    /* For VW/UDC */
    int 		substitute_num;
    FontData 		substitute;
    /* Vertical Writing */
    int		vpart_initialize;
    int         vmap_num;
    FontData    vmap;
    int         vrotate_num;
    VRotate     vrotate;
} FontSetRec, *FontSet;

typedef struct _XOCGenericPart {
    XlcConv 		mbs_to_cs;
    XlcConv 		wcs_to_cs;
    XlcConv 		utf8_to_cs;
    int 		font_set_num;
    FontSet 		font_set;
} XOCGenericPart;

typedef struct _XOCGenericRec {
    XOCMethods 		methods;
    XOCCoreRec 		core;
    XOCGenericPart 	gen;
} XOCGenericRec, *XOCGeneric;

_XFUNCPROTOBEGIN

extern XOM _XomGenericOpenOM(
    XLCd		/* lcd */,
    Display*		/* dpy */,
    XrmDatabase		/* rdb */,
    _Xconst char*	/* res_name */,
    _Xconst char*	/* res_class */
);

extern XlcConv _XomInitConverter(
    XOC			/* oc */,
    XOMTextType		/* type */
);

extern int _XomConvert(
    XOC			/* oc */,
    XlcConv		/* conv */,
    XPointer*		/* from */,
    int*		/* from_left */,
    XPointer*		/* to */,
    int*		/* to_left */,
    XPointer*		/* args */,
    int			/* num_args */
);

extern int
_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length);
extern int
_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length);
extern int
_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length);
extern int
_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern int
_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern int
_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern Status
_XmbDefaultTextPerCharExtents(
    XOC oc, _Xconst char *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern Status
_XwcDefaultTextPerCharExtents(
    XOC oc, _Xconst wchar_t *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern Status
_Xutf8DefaultTextPerCharExtents(
    XOC oc, _Xconst char *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern int
_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst char *text, int length);
extern int
_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst wchar_t *text, int length);
extern int
_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst char *text, int length);
extern void
_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst char *text, int length);
extern void
_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst wchar_t *text, int length);
extern void
_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst char *text, int length);

extern int
_XmbGenericTextEscapement(XOC oc, _Xconst char *text, int length);
extern int
_XmbGenericTextExtents(XOC oc, _Xconst char *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern int
_Xutf8GenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst char *text, int length);
extern void
_Xutf8GenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst char *text, int length);
extern Status
_Xutf8GenericTextPerCharExtents(
    XOC oc, _Xconst char *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern int
_Xutf8GenericTextExtents(XOC oc, _Xconst char *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern int
_Xutf8GenericTextEscapement(XOC oc, _Xconst char *text, int length);
extern void
_XwcGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst wchar_t *text, int length);
extern int
_XwcGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst wchar_t *text, int length);
extern Status
_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern int
_XwcGenericTextExtents(XOC oc, _Xconst wchar_t *text, int length,
    XRectangle *overall_ink, XRectangle *overall_logical);
extern int
_XwcGenericTextEscapement(XOC oc, _Xconst wchar_t *text, int length);
extern void
_XmbGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
    int y, _Xconst char *text, int length);
extern int
_XmbGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
    _Xconst char *text, int length);
extern Status
_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
    XRectangle *ink_buf, XRectangle *logical_buf,
    int buf_size, int *num_chars,
    XRectangle *overall_ink,
    XRectangle *overall_logical);

extern FontData
read_EncodingInfo(
    int count,
    char **value);

extern int
_XomGenericDrawString(
    Display *dpy,
    Drawable d,
    XOC oc,
    GC gc,
    int x, int y,
    XOMTextType type,
    XPointer text,
    int length);
extern int
_XomGenericTextExtents(
    XOC oc,
    XOMTextType type,
    XPointer text,
    int length,
    XRectangle *overall_ink,
    XRectangle *overall_logical);
extern FontData
_XomGetFontDataFromFontSet(
    FontSet fs,
    unsigned char *str,
    int len,
    int *len_ret,
    int is2b,
    int type);

_XFUNCPROTOEND

#endif  /* _XOMGENERIC_H_ */