1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LETypes.h" 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LEFontInstance.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "DeviceTables.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "AnchorTables.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LESwaps.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEPoint &anchor) const 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch(SWAPW(anchorFormat)) { 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 1: 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru f1->getAnchor(fontInstance, anchor); 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 2: 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Format2AnchorTable *f2 = (const Format2AnchorTable *) this; 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru f2->getAnchor(glyphID, fontInstance, anchor); 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 3: 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Format3AnchorTable *f3 = (const Format3AnchorTable *) this; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru f3->getAnchor(fontInstance, anchor); 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // unknown format: just use x, y coordinate, like format 1... 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru f1->getAnchor(fontInstance, anchor); 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid Format1AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 x = SWAPW(xCoordinate); 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 y = SWAPW(yCoordinate); 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEPoint pixels; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->transformFunits(x, y, pixels); 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->pixelsToUnits(pixels, anchor); 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEPoint point; 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (! fontInstance->getGlyphPoint(glyphID, SWAPW(anchorPoint), point)) { 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 x = SWAPW(xCoordinate); 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 y = SWAPW(yCoordinate); 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->transformFunits(x, y, point); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->pixelsToUnits(point, anchor); 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 x = SWAPW(xCoordinate); 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 y = SWAPW(yCoordinate); 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEPoint pixels; 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Offset dtxOffset = SWAPW(xDeviceTableOffset); 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Offset dtyOffset = SWAPW(yDeviceTableOffset); 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->transformFunits(x, y, pixels); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (dtxOffset != 0) { 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const DeviceTable *dtx = (const DeviceTable *) ((char *) this + dtxOffset); 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 adjx = dtx->getAdjustment((le_int16) fontInstance->getXPixelsPerEm()); 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru pixels.fX += adjx; 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (dtyOffset != 0) { 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const DeviceTable *dty = (const DeviceTable *) ((char *) this + dtyOffset); 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 adjy = dty->getAdjustment((le_int16) fontInstance->getYPixelsPerEm()); 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru pixels.fY += adjy; 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontInstance->pixelsToUnits(pixels, anchor); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 107