2000-11-28 20:56:52 +00:00
|
|
|
/*
|
|
|
|
* @(#)AnchorTables.cpp 1.6 00/03/15
|
|
|
|
*
|
2003-12-19 22:18:26 +00:00
|
|
|
* (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved
|
2000-11-28 20:56:52 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "LETypes.h"
|
|
|
|
#include "LEFontInstance.h"
|
|
|
|
#include "DeviceTables.h"
|
|
|
|
#include "AnchorTables.h"
|
|
|
|
#include "LESwaps.h"
|
|
|
|
|
2001-10-16 00:39:01 +00:00
|
|
|
U_NAMESPACE_BEGIN
|
|
|
|
|
2000-12-21 01:18:44 +00:00
|
|
|
void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance,
|
2001-01-19 00:30:17 +00:00
|
|
|
LEPoint &anchor) const
|
2000-11-28 20:56:52 +00:00
|
|
|
{
|
|
|
|
switch(SWAPW(anchorFormat)) {
|
|
|
|
case 1:
|
|
|
|
{
|
2001-01-19 00:30:17 +00:00
|
|
|
const Format1AnchorTable *f1 = (const Format1AnchorTable *) this;
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
f1->getAnchor(fontInstance, anchor);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
{
|
2001-01-19 00:30:17 +00:00
|
|
|
const Format2AnchorTable *f2 = (const Format2AnchorTable *) this;
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
f2->getAnchor(glyphID, fontInstance, anchor);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
{
|
2001-01-19 00:30:17 +00:00
|
|
|
const Format3AnchorTable *f3 = (const Format3AnchorTable *) this;
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
f3->getAnchor(fontInstance, anchor);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
2003-10-01 18:25:52 +00:00
|
|
|
// Unknown format, set the anchor point to (0, 0)
|
|
|
|
anchor.fX = 0;
|
|
|
|
anchor.fY = 0;
|
2000-11-28 20:56:52 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-01-19 00:30:17 +00:00
|
|
|
void Format1AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const
|
2000-11-28 20:56:52 +00:00
|
|
|
{
|
|
|
|
le_int16 x = SWAPW(xCoordinate);
|
|
|
|
le_int16 y = SWAPW(yCoordinate);
|
|
|
|
LEPoint pixels;
|
|
|
|
|
|
|
|
fontInstance->transformFunits(x, y, pixels);
|
|
|
|
|
|
|
|
fontInstance->pixelsToUnits(pixels, anchor);
|
|
|
|
}
|
|
|
|
|
2001-01-19 00:30:17 +00:00
|
|
|
void Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const
|
2000-11-28 20:56:52 +00:00
|
|
|
{
|
|
|
|
LEPoint point;
|
|
|
|
|
|
|
|
if (! fontInstance->getGlyphPoint(glyphID, SWAPW(anchorPoint), point)) {
|
|
|
|
le_int16 x = SWAPW(xCoordinate);
|
|
|
|
le_int16 y = SWAPW(yCoordinate);
|
|
|
|
|
|
|
|
fontInstance->transformFunits(x, y, point);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fontInstance->pixelsToUnits(point, anchor);
|
|
|
|
}
|
|
|
|
|
2001-01-19 00:30:17 +00:00
|
|
|
void Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const
|
2000-11-28 20:56:52 +00:00
|
|
|
{
|
|
|
|
le_int16 x = SWAPW(xCoordinate);
|
|
|
|
le_int16 y = SWAPW(yCoordinate);
|
|
|
|
LEPoint pixels;
|
|
|
|
Offset dtxOffset = SWAPW(xDeviceTableOffset);
|
|
|
|
Offset dtyOffset = SWAPW(yDeviceTableOffset);
|
|
|
|
|
|
|
|
fontInstance->transformFunits(x, y, pixels);
|
|
|
|
|
|
|
|
if (dtxOffset != 0) {
|
2001-01-19 00:30:17 +00:00
|
|
|
const DeviceTable *dtx = (const DeviceTable *) ((char *) this + dtxOffset);
|
2000-11-28 20:56:52 +00:00
|
|
|
le_int16 adjx = dtx->getAdjustment((le_int16) fontInstance->getXPixelsPerEm());
|
|
|
|
|
|
|
|
pixels.fX += adjx;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dtyOffset != 0) {
|
2001-01-19 00:30:17 +00:00
|
|
|
const DeviceTable *dty = (const DeviceTable *) ((char *) this + dtyOffset);
|
2000-11-28 20:56:52 +00:00
|
|
|
le_int16 adjy = dty->getAdjustment((le_int16) fontInstance->getYPixelsPerEm());
|
|
|
|
|
|
|
|
pixels.fY += adjy;
|
|
|
|
}
|
|
|
|
|
|
|
|
fontInstance->pixelsToUnits(pixels, anchor);
|
|
|
|
}
|
|
|
|
|
2001-10-16 00:39:01 +00:00
|
|
|
U_NAMESPACE_END
|
2000-11-28 20:56:52 +00:00
|
|
|
|