/****************************** Module Header ******************************\
*
* Module Name: LAYOUT.H
*
* OS/2 Layout Utility include file.
*
* Copyright (c) International Business Machines Corporation 1993
*
\***************************************************************************/
#if __IBMC__ || __IBMCPP__
   #pragma info( none )
   #ifndef __CHKHDR__
      #pragma info( none )
   #endif
   #pragma info( restore )
#endif

#ifdef __cplusplus
      extern "C" {
#endif

#ifndef INCL_LAYOUT   /* Eliminate multiple definitions... */
#define INCL_LAYOUT


/**************************************************************************/
/***                      Layout Utility constants                      ***/
/**************************************************************************/


/*** Locales ***************************************************************/

#define Locale_Arabic   "Ar_AA"
#define Locale_Hebrew   "Iw_IL"


/*
 * Layout Values Names used for LayoutSet/QueryValues()
 * Types are defined as ULONG (32 bits) split into 2 parts
 * Lower 16 bits  - LayoutTextDescriptor
 * Higher 16 bits - any other type
 */

/*** Layout text descriptors. These Names can be ORed together *************/

#define AllTextDescptors        0x0000ffff
#define Orientation             0x00000001
#define TypeOfText              0x00000002
#define Swapping                0x00000004
#define Numerals                0x00000008
#define TextShaping             0x00000010
#define ArabicSpecialShaping    0x00000020
#define ArabicOneCellShaping    0x00000040
#define Word_Break              0x00000080
#define BidiType                0x00000100

/*** General Layout Value names. These names should NOT be ORed together ***/

#define ActiveShapeEditing      (0x0001<<16)
#define ActiveBidirection       (0x0002<<16)
#define ShapeCharset            (0x0003<<16)
#define ShapeCharsetSize        (0x0004<<16)
#define ShapeContextSize        (0x0005<<16)
#define CellSize                (0x0006<<16)
#define InputMode               (0x0007<<16)
#define InOnlyTextDescr         (0x0008<<16)
#define OutOnlyTextDescr        (0x0009<<16)
#define InOutTextDescrMask      (0x000a<<16)
#define CallerAllocMem          (0x000b<<16)

/*
 * QueryValueSize can be ORed with any of
 * the above Names at query time to determine
 * the amount of memory needed for that value
 */
#define QueryValueSize          (0x8000<<16)


/*
 * Bidirectional attributes values (in Bidi attributes word)
 * To be used as values for the following Layout text descriptors:
 *   - InOnlyTextDescr
 *   - OutOnlyTextDescr
 *
 * Note: These bidi attributes value must match the BDA_XXX
 *       values in pmbidi.h.
 */

                                                             /* Text Type */
#define TEXT_VISUAL             0x00000000
#define TEXT_IMPLICIT           0x01000000
#define TEXT_EXPLICIT           0x02000000

                                                             /* Bidi Type */
#define BIDI_DEFAULT            0x00000000
#define BIDI_UCS                0x04000000

                                                      /* Text Orientation */
#define ORIENTATION_LTR         0x00000000
#define ORIENTATION_RTL         0x00010000

                                /* ORIENTATION_CONTEXT_LTR is equivalent  */
                                /* to BDA_TEXT_ORIENT_CONTEXT in pmbidi.h */
#define ORIENTATION_CONTEXT_LTR 0x00020000
                                           /* ORIENTATION_CONTEXT_RTL has */
                                           /* no equivalent in pmbidi.h   */
#define ORIENTATION_CONTEXT_RTL 0x00030000

                                                              /* Numerals */
#define NUMERALS_NOMINAL        0x00000000
#define NUMERALS_NATIONAL       0x00002000
#define NUMERALS_CONTEXTUAL     0x00003000

                                                            /* Word Break */
#define BREAK                   0x00000200
#define NO_BREAK                0x00000000

                                                    /* Symmetric Swapping */
#define SWAPPING                0x00000100
#define NO_SWAPPING             0x00000000
                                                            /* Text shape */
#define TEXT_SHAPED             0x00000000
#define TEXT_NOMINAL            0x00000010
#define TEXT_INITIAL            0x00000011
#define TEXT_MIDDLE             0x00000012
#define TEXT_FINAL              0x00000013
#define TEXT_ISOLATED           0x00000014


/*** Edit type values used In LayoutEditShape  *************************/
#define EDITINPUT               0
#define EDITREPLACE             1


/**************************************************************************/
/***                          ERROR CODES                               ***/
/**************************************************************************/
#define E2BIG            999

/**************************************************************************/
/***                          STRUCTURES                                ***/
/**************************************************************************/

#if __IBMC__ || __IBMCPP__
   #pragma pack(2)                   /* force structure alignment packing */
#else
   #pragma push_align_members(2)
#endif

#define LAYOUT_VALUES LayoutValueRec
typedef struct _LAYOUT_VALUES
{
  ULONG   name;                              /* Name of Layout Value Item */
  PVOID   value;                             /* Data of Layout Value Item */
} LAYOUT_VALUES ;

#define LAYOUT_EDIT_SIZE LayoutEditSizeRec
typedef struct _LAYOUT_EDIT_SIZE {
  ULONG front;                                          /* previous chars */
  ULONG back;                                         /* succeeding chars */
} LAYOUT_EDIT_SIZE;

#define LAYOUT_TEXT_DESCRIPTOR LayoutTextDescriptorRec
typedef struct _LAYOUT_TEXT_DESCRIPTOR
{
 ULONG in;                                    /* input buffer description */
 ULONG out;                                         /* output description */
} LAYOUT_TEXT_DESCRIPTOR;

#if __IBMC__ || __IBMCPP__
   #pragma pack()                           /* restore packing to default */
#else
   #pragma pop_align_members()
#endif

#define LAYOUT_OBJECT LayoutObject
typedef PVOID  LAYOUT_OBJECT;

typedef PVOID  FAR *  PLAYOUT_OBJECT;

#define PLAYOUT_VALUES LayoutValues
typedef LAYOUT_VALUES FAR *  PLAYOUT_VALUES;

#define PLAYOUT_EDIT_SIZE LayoutEditSize
typedef LAYOUT_EDIT_SIZE FAR *  PLAYOUT_EDIT_SIZE;

#define PLAYOUT_TEXT_DESCRIPTOR LayoutTextDescriptor
typedef LAYOUT_TEXT_DESCRIPTOR FAR *  PLAYOUT_TEXT_DESCRIPTOR;

/************************************************************************/
/***                Layout Text Conversion Functions                  ***/
/************************************************************************/

#define LayoutCreateObject  layout_object_create
#define LayoutDestroyObject layout_object_destroy
#define LayoutTransformText layout_object_transform
#define LayoutEditShape     layout_object_editshape
#define LayoutSetValues     layout_object_setvalues
#define LayoutQueryValues   layout_object_getvalues

APIRET APIENTRY LayoutCreateObject(const PUCHAR locale_name,
                                   PLAYOUT_OBJECT plh);

APIRET APIENTRY LayoutDestroyObject(LAYOUT_OBJECT  plh);

APIRET APIENTRY LayoutSetValues(    LAYOUT_OBJECT  plh,
                                    PLAYOUT_VALUES values,
                                    PULONG         index_returned);


APIRET APIENTRY LayoutQueryValues(  LAYOUT_OBJECT  plh,
                                    PLAYOUT_VALUES values,
                                    PULONG         index_returned);

APIRET APIENTRY LayoutTransformText(LAYOUT_OBJECT  plh,
                                    PUCHAR         InpBuf,
                                    PULONG         InpSize,
                                    PVOID          OutBuf,
                                    PULONG         OutSize,
                                    PULONG         InpToOut,
                                    PULONG         OutToInp,
                                    PUCHAR         BidiLevel);

APIRET APIENTRY LayoutEditShape(    LAYOUT_OBJECT  plh,
                                    BOOL           EditType,
                                    PULONG         index,
                                    PUCHAR         InpBuf,
                                    PULONG         InpSize,
                                    PVOID          OutBuf,
                                    PULONG         OutSize);


#endif  /* INCL_LAYOUT */

#ifdef __cplusplus
        }
#endif

#if __IBMC__ || __IBMCPP__
   #pragma info( none )
   #ifndef __CHKHDR__
      #pragma info( restore )
   #endif
   #pragma info( restore )
#endif
