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
le_create(const le_font * font,le_int32 scriptCode,le_int32 languageCode,le_int32 typo_flags,LEErrorCode * success)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
le_close(le_engine * engine)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
le_layoutChars(le_engine * engine,const LEUnicode chars[],le_int32 offset,le_int32 count,le_int32 max,le_bool rightToLeft,float x,float y,LEErrorCode * success)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
le_getGlyphCount(le_engine * engine,LEErrorCode * success)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
le_getGlyphs(le_engine * engine,LEGlyphID glyphs[],LEErrorCode * success)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
le_getCharIndices(le_engine * engine,le_int32 charIndices[],LEErrorCode * success)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
le_getCharIndicesWithBase(le_engine * engine,le_int32 charIndices[],le_int32 indexBase,LEErrorCode * success)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
le_getGlyphPositions(le_engine * engine,float positions[],LEErrorCode * success)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
le_getGlyphPosition(le_engine * engine,le_int32 glyphIndex,float * x,float * y,LEErrorCode * success)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
le_reset(le_engine * engine,LEErrorCode * success)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