Home | History | Annotate | Download | only in layout
      1 /*
      2  *
      3  * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
      4  *
      5  */
      6 
      7 #include "LETypes.h"
      8 #include "loengine.h"
      9 #include "LayoutEngine.h"
     10 
     11 /**
     12  * \file
     13  * \brief C API for complex text layout.
     14  */
     15 
     16 U_NAMESPACE_USE
     17 
     18 U_CAPI le_engine * U_EXPORT2
     19 le_create(const le_font *font,
     20 		  le_int32 scriptCode,
     21 		  le_int32 languageCode,
     22 		  le_int32 typo_flags,
     23 		  LEErrorCode *success)
     24 {
     25 	LEFontInstance *fontInstance = (LEFontInstance *) font;
     26 
     27 	return (le_engine *) LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, typo_flags, *success);
     28 }
     29 
     30 U_CAPI void U_EXPORT2
     31 le_close(le_engine *engine)
     32 {
     33 	LayoutEngine *le = (LayoutEngine *) engine;
     34 
     35 	delete le;
     36 }
     37 
     38 U_CAPI le_int32 U_EXPORT2
     39 le_layoutChars(le_engine *engine,
     40 			   const LEUnicode chars[],
     41 			   le_int32 offset,
     42 			   le_int32 count,
     43 			   le_int32 max,
     44 			   le_bool rightToLeft,
     45 			   float x,
     46 			   float y,
     47 			   LEErrorCode *success)
     48 {
     49 	LayoutEngine *le = (LayoutEngine *) engine;
     50 
     51 	if (le == NULL) {
     52 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
     53 		return -1;
     54 	}
     55 
     56 	return le->layoutChars(chars, offset, count, max, rightToLeft, x, y, *success);
     57 }
     58 
     59 U_CAPI le_int32 U_EXPORT2
     60 le_getGlyphCount(le_engine *engine,
     61 				 LEErrorCode *success)
     62 {
     63 	LayoutEngine *le = (LayoutEngine *) engine;
     64 
     65 	if (le == NULL) {
     66 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
     67 		return -1;
     68 	}
     69 
     70 	return le->getGlyphCount();
     71 }
     72 
     73 U_CAPI void U_EXPORT2
     74 le_getGlyphs(le_engine *engine,
     75 			 LEGlyphID glyphs[],
     76 			 LEErrorCode *success)
     77 {
     78 	LayoutEngine *le = (LayoutEngine *) engine;
     79 
     80 	if (le == NULL) {
     81 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
     82 		return;
     83 	}
     84 
     85 	le->getGlyphs(glyphs, *success);
     86 }
     87 
     88 U_CAPI void U_EXPORT2
     89 le_getCharIndices(le_engine *engine,
     90 				  le_int32 charIndices[],
     91 				  LEErrorCode *success)
     92 {
     93 	LayoutEngine *le = (LayoutEngine *) engine;
     94 
     95 	if (le == NULL) {
     96 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
     97 		return;
     98 	}
     99 
    100 	le->getCharIndices(charIndices, *success);
    101 }
    102 
    103 U_CAPI void U_EXPORT2
    104 le_getCharIndicesWithBase(le_engine *engine,
    105 				          le_int32 charIndices[],
    106 				          le_int32 indexBase,
    107 				          LEErrorCode *success)
    108 {
    109 	LayoutEngine *le = (LayoutEngine *) engine;
    110 
    111 	if (le == NULL) {
    112 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
    113 		return;
    114 	}
    115 
    116 	le->getCharIndices(charIndices, indexBase, *success);
    117 }
    118 
    119 U_CAPI void U_EXPORT2
    120 le_getGlyphPositions(le_engine *engine,
    121 					 float positions[],
    122 					 LEErrorCode *success)
    123 {
    124 	LayoutEngine *le = (LayoutEngine *) engine;
    125 
    126 	if (le == NULL) {
    127 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
    128 		return;
    129 	}
    130 
    131 	le->getGlyphPositions(positions, *success);
    132 }
    133 
    134 U_CAPI void U_EXPORT2
    135 le_getGlyphPosition(le_engine *engine,
    136 					le_int32 glyphIndex,
    137 					float *x,
    138 					float *y,
    139 					LEErrorCode *success)
    140 {
    141 	LayoutEngine *le = (LayoutEngine *) engine;
    142 
    143 	if (le == NULL) {
    144 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
    145 		return;
    146 	}
    147 
    148 	le->getGlyphPosition(glyphIndex, *x, *y, *success);
    149 }
    150 
    151 U_CAPI void U_EXPORT2
    152 le_reset(le_engine *engine,
    153 		 LEErrorCode *success)
    154 {
    155 	LayoutEngine *le = (LayoutEngine *) engine;
    156 
    157 	if (le == NULL) {
    158 		*success = LE_ILLEGAL_ARGUMENT_ERROR;
    159 		return;
    160 	}
    161 
    162 	le->reset();
    163 }
    164