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