1/* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26/* 27 * 28 * 29 * (C) Copyright IBM Corp. 2002 - All Rights Reserved 30 * 31 */ 32 33#include "LETypes.h" 34#include "OpenTypeTables.h" 35#include "GlyphSubstitutionTables.h" 36#include "LookupProcessor.h" 37#include "ExtensionSubtables.h" 38#include "GlyphIterator.h" 39#include "LESwaps.h" 40 41U_NAMESPACE_BEGIN 42 43// read a 32-bit value that might only be 16-bit-aligned in memory 44#define READ_LONG(code) (le_uint32)((SWAPW(*(le_uint16*)&code) << 16) + SWAPW(*(((le_uint16*)&code) + 1))) 45 46// FIXME: should look at the format too... maybe have a sub-class for it? 47le_uint32 ExtensionSubtable::process(const LEReferenceTo<ExtensionSubtable> &thisRef, 48 const LookupProcessor *lookupProcessor, le_uint16 lookupType, 49 GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const 50{ 51 if (LE_FAILURE(success)) { 52 return 0; 53 } 54 55 le_uint16 elt = SWAPW(extensionLookupType); 56 57 if (elt != lookupType) { 58 le_uint32 extOffset = READ_LONG(extensionOffset); 59 LEReferenceTo<LookupSubtable> subtable(thisRef, success, extOffset); 60 61 if(LE_SUCCESS(success)) { 62 return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); 63 } 64 } 65 66 return 0; 67} 68 69U_NAMESPACE_END 70