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