18393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/*
28393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius *
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * (C) Copyright IBM Corp.  and others 1998-2013 - All Rights Reserved
48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius *
58393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */
68393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
78393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LETypes.h"
88393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LayoutEngine.h"
98393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "GXLayoutEngine2.h"
108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LEGlyphStorage.h"
118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "MorphTables.h"
128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_BEGIN
148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine2)
168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1759d709d503bab6e2b61931737e662dd293b40578ccorneliusGXLayoutEngine2::GXLayoutEngine2(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader2> &morphTable, le_int32 typoFlags, LEErrorCode &success)
1859d709d503bab6e2b61931737e662dd293b40578ccornelius  : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMorphTable(morphTable)
198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
2059d709d503bab6e2b61931737e662dd293b40578ccornelius  // nothing else to do?
218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusGXLayoutEngine2::~GXLayoutEngine2()
248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    reset();
268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius// apply 'morx' table
298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusle_int32 GXLayoutEngine2::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success)
308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (LE_FAILURE(success)) {
328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return 0;
338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        success = LE_ILLEGAL_ARGUMENT_ERROR;
378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return 0;
388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success);
418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (LE_FAILURE(success)) {
438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return 0;
448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
4659d709d503bab6e2b61931737e662dd293b40578ccornelius    fMorphTable->process(fMorphTable, glyphStorage, fTypoFlags, success);
478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    return count;
488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius// apply positional tables
518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusvoid GXLayoutEngine2::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/,
528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                                          LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success)
538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (LE_FAILURE(success)) {
558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return;
568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (chars == NULL || offset < 0 || count < 0) {
598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        success = LE_ILLEGAL_ARGUMENT_ERROR;
608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return;
618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    // FIXME: no positional processing yet...
648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_END
67