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 178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusGXLayoutEngine2::GXLayoutEngine2(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader2 *morphTable, le_int32 typoFlags, LEErrorCode &success) 188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMorphTable(morphTable) 198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{ 208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // 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 468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fMorphTable->process(glyphStorage, fTypoFlags); 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