Home | History | Annotate | Download | only in layout
      1 /*
      2  *
      3  * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
      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:
     44         // unknown format: just use x, y coordinate, like format 1...
     45         const Format1AnchorTable *f1 = (const Format1AnchorTable *) this;
     46 
     47         f1->getAnchor(fontInstance, anchor);
     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 
    107