os/textandloc/fontservices/textshaperplugin/IcuSource/layout/GlyphPositionAdjustments.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
 *
sl@0
     3
 * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
sl@0
     4
 *
sl@0
     5
 */
sl@0
     6
sl@0
     7
#ifndef __GLYPHPOSITIONADJUSTMENTS_H
sl@0
     8
#define __GLYPHPOSITIONADJUSTMENTS_H
sl@0
     9
sl@0
    10
/**
sl@0
    11
 * \file
sl@0
    12
 * \internal
sl@0
    13
 */
sl@0
    14
sl@0
    15
#include "LETypes.h"
sl@0
    16
#include "OpenTypeTables.h"
sl@0
    17
sl@0
    18
U_NAMESPACE_BEGIN
sl@0
    19
sl@0
    20
class LEGlyphStorage;
sl@0
    21
class LEFontInstance;
sl@0
    22
sl@0
    23
class GlyphPositionAdjustments : public UMemory
sl@0
    24
{
sl@0
    25
private:
sl@0
    26
    class Adjustment : public UMemory {
sl@0
    27
    public:
sl@0
    28
sl@0
    29
        inline Adjustment();
sl@0
    30
        inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1);
sl@0
    31
        inline ~Adjustment();
sl@0
    32
sl@0
    33
        inline float    getXPlacement() const;
sl@0
    34
        inline float    getYPlacement() const;
sl@0
    35
        inline float    getXAdvance() const;
sl@0
    36
        inline float    getYAdvance() const;
sl@0
    37
sl@0
    38
        inline le_int32 getBaseOffset() const;
sl@0
    39
sl@0
    40
        inline void     setXPlacement(float newXPlacement);
sl@0
    41
        inline void     setYPlacement(float newYPlacement);
sl@0
    42
        inline void     setXAdvance(float newXAdvance);
sl@0
    43
        inline void     setYAdvance(float newYAdvance);
sl@0
    44
sl@0
    45
        inline void     setBaseOffset(le_int32 newBaseOffset);
sl@0
    46
sl@0
    47
        inline void    adjustXPlacement(float xAdjustment);
sl@0
    48
        inline void    adjustYPlacement(float yAdjustment);
sl@0
    49
        inline void    adjustXAdvance(float xAdjustment);
sl@0
    50
        inline void    adjustYAdvance(float yAdjustment);
sl@0
    51
sl@0
    52
    private:
sl@0
    53
        float xPlacement;
sl@0
    54
        float yPlacement;
sl@0
    55
        float xAdvance;
sl@0
    56
        float yAdvance;
sl@0
    57
sl@0
    58
        le_int32 baseOffset;
sl@0
    59
sl@0
    60
        // allow copying of this class because all of its fields are simple types
sl@0
    61
    };
sl@0
    62
sl@0
    63
    class EntryExitPoint : public UMemory
sl@0
    64
    {
sl@0
    65
    public:
sl@0
    66
        inline EntryExitPoint();
sl@0
    67
        inline ~EntryExitPoint();
sl@0
    68
sl@0
    69
        inline le_bool isCursiveGlyph() const;
sl@0
    70
        inline le_bool baselineIsLogicalEnd() const;
sl@0
    71
sl@0
    72
        LEPoint *getEntryPoint(LEPoint &entryPoint) const;
sl@0
    73
        LEPoint *getExitPoint(LEPoint &exitPoint) const;
sl@0
    74
sl@0
    75
        inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
sl@0
    76
        inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
sl@0
    77
        inline void setCursiveGlyph(le_bool baselineIsLogicalEnd);
sl@0
    78
sl@0
    79
    private:
sl@0
    80
        enum EntryExitFlags
sl@0
    81
        {
sl@0
    82
            EEF_HAS_ENTRY_POINT         = 0x80000000L,
sl@0
    83
            EEF_HAS_EXIT_POINT          = 0x40000000L,
sl@0
    84
            EEF_IS_CURSIVE_GLYPH        = 0x20000000L,
sl@0
    85
            EEF_BASELINE_IS_LOGICAL_END = 0x10000000L
sl@0
    86
        };
sl@0
    87
sl@0
    88
        le_uint32 fFlags;
sl@0
    89
        LEPoint fEntryPoint;
sl@0
    90
        LEPoint fExitPoint;
sl@0
    91
    };
sl@0
    92
sl@0
    93
    le_int32 fGlyphCount;
sl@0
    94
    EntryExitPoint *fEntryExitPoints;
sl@0
    95
    Adjustment *fAdjustments;
sl@0
    96
sl@0
    97
    GlyphPositionAdjustments();
sl@0
    98
sl@0
    99
public:
sl@0
   100
    GlyphPositionAdjustments(le_int32 glyphCount);
sl@0
   101
    ~GlyphPositionAdjustments();
sl@0
   102
sl@0
   103
    inline le_bool hasCursiveGlyphs() const;
sl@0
   104
    inline le_bool isCursiveGlyph(le_int32 index) const;
sl@0
   105
    inline le_bool baselineIsLogicalEnd(le_int32 index) const;
sl@0
   106
sl@0
   107
    const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const;
sl@0
   108
    const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const;
sl@0
   109
sl@0
   110
    inline float getXPlacement(le_int32 index) const;
sl@0
   111
    inline float getYPlacement(le_int32 index) const;
sl@0
   112
    inline float getXAdvance(le_int32 index) const;
sl@0
   113
    inline float getYAdvance(le_int32 index) const;
sl@0
   114
sl@0
   115
    inline le_int32 getBaseOffset(le_int32 index) const;
sl@0
   116
sl@0
   117
    inline void setXPlacement(le_int32 index, float newXPlacement);
sl@0
   118
    inline void setYPlacement(le_int32 index, float newYPlacement);
sl@0
   119
    inline void setXAdvance(le_int32 index, float newXAdvance);
sl@0
   120
    inline void setYAdvance(le_int32 index, float newYAdvance);
sl@0
   121
sl@0
   122
    inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset);
sl@0
   123
sl@0
   124
    inline void adjustXPlacement(le_int32 index, float xAdjustment);
sl@0
   125
    inline void adjustYPlacement(le_int32 index, float yAdjustment);
sl@0
   126
    inline void adjustXAdvance(le_int32 index, float xAdjustment);
sl@0
   127
    inline void adjustYAdvance(le_int32 index, float yAdjustment);
sl@0
   128
   
sl@0
   129
    void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
sl@0
   130
    void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
sl@0
   131
    void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd);
sl@0
   132
sl@0
   133
    void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance);
sl@0
   134
};
sl@0
   135
sl@0
   136
inline GlyphPositionAdjustments::Adjustment::Adjustment()
sl@0
   137
  : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1)
sl@0
   138
{
sl@0
   139
    // nothing else to do!
sl@0
   140
}
sl@0
   141
sl@0
   142
inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff)
sl@0
   143
  : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff)
sl@0
   144
{
sl@0
   145
    // nothing else to do!
sl@0
   146
}
sl@0
   147
sl@0
   148
inline GlyphPositionAdjustments::Adjustment::~Adjustment()
sl@0
   149
{
sl@0
   150
    // nothing to do!
sl@0
   151
}
sl@0
   152
sl@0
   153
inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const
sl@0
   154
{
sl@0
   155
    return xPlacement;
sl@0
   156
}
sl@0
   157
sl@0
   158
inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const
sl@0
   159
{
sl@0
   160
    return yPlacement;
sl@0
   161
}
sl@0
   162
sl@0
   163
inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const
sl@0
   164
{
sl@0
   165
    return xAdvance;
sl@0
   166
}
sl@0
   167
sl@0
   168
inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const
sl@0
   169
{
sl@0
   170
    return yAdvance;
sl@0
   171
}
sl@0
   172
sl@0
   173
inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const
sl@0
   174
{
sl@0
   175
    return baseOffset;
sl@0
   176
}
sl@0
   177
sl@0
   178
inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement)
sl@0
   179
{
sl@0
   180
    xPlacement = newXPlacement;
sl@0
   181
}
sl@0
   182
sl@0
   183
inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement)
sl@0
   184
{
sl@0
   185
    yPlacement = newYPlacement;
sl@0
   186
}
sl@0
   187
sl@0
   188
inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance)
sl@0
   189
{
sl@0
   190
    xAdvance = newXAdvance;
sl@0
   191
}
sl@0
   192
sl@0
   193
inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance)
sl@0
   194
{
sl@0
   195
    yAdvance = newYAdvance;
sl@0
   196
}
sl@0
   197
sl@0
   198
inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset)
sl@0
   199
{
sl@0
   200
    baseOffset = newBaseOffset;
sl@0
   201
}
sl@0
   202
sl@0
   203
inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment)
sl@0
   204
{
sl@0
   205
    xPlacement += xAdjustment;
sl@0
   206
}
sl@0
   207
sl@0
   208
inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment)
sl@0
   209
{
sl@0
   210
    yPlacement += yAdjustment;
sl@0
   211
}
sl@0
   212
sl@0
   213
inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment)
sl@0
   214
{
sl@0
   215
    xAdvance += xAdjustment;
sl@0
   216
}
sl@0
   217
sl@0
   218
inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment)
sl@0
   219
{
sl@0
   220
    yAdvance += yAdjustment;
sl@0
   221
}
sl@0
   222
sl@0
   223
inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint()
sl@0
   224
    : fFlags(0)
sl@0
   225
{
sl@0
   226
    fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fEntryPoint.fY = 0;
sl@0
   227
}
sl@0
   228
sl@0
   229
inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint()
sl@0
   230
{
sl@0
   231
    // nothing special to do
sl@0
   232
}
sl@0
   233
sl@0
   234
inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const
sl@0
   235
{
sl@0
   236
    return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0;
sl@0
   237
}
sl@0
   238
sl@0
   239
inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const
sl@0
   240
{
sl@0
   241
    return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0;
sl@0
   242
}
sl@0
   243
sl@0
   244
inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
sl@0
   245
{
sl@0
   246
    if (baselineIsLogicalEnd) {
sl@0
   247
        fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
sl@0
   248
    } else {
sl@0
   249
        fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH);
sl@0
   250
    }
sl@0
   251
sl@0
   252
    fEntryPoint = newEntryPoint;
sl@0
   253
}
sl@0
   254
sl@0
   255
inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd)
sl@0
   256
{
sl@0
   257
    if (baselineIsLogicalEnd) {
sl@0
   258
        fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
sl@0
   259
    } else {
sl@0
   260
        fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH);
sl@0
   261
    }
sl@0
   262
sl@0
   263
    fExitPoint  = newExitPoint;
sl@0
   264
}
sl@0
   265
sl@0
   266
inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd)
sl@0
   267
{
sl@0
   268
    if (baselineIsLogicalEnd) {
sl@0
   269
        fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
sl@0
   270
    } else {
sl@0
   271
        fFlags |= EEF_IS_CURSIVE_GLYPH;
sl@0
   272
    }
sl@0
   273
}
sl@0
   274
sl@0
   275
inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const
sl@0
   276
{
sl@0
   277
    return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph();
sl@0
   278
}
sl@0
   279
sl@0
   280
inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const
sl@0
   281
{
sl@0
   282
    return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd();
sl@0
   283
}
sl@0
   284
sl@0
   285
inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const
sl@0
   286
{
sl@0
   287
    return fAdjustments[index].getXPlacement();
sl@0
   288
}
sl@0
   289
sl@0
   290
inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const
sl@0
   291
{
sl@0
   292
    return fAdjustments[index].getYPlacement();
sl@0
   293
}
sl@0
   294
sl@0
   295
inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const
sl@0
   296
{
sl@0
   297
    return fAdjustments[index].getXAdvance();
sl@0
   298
}
sl@0
   299
sl@0
   300
inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const
sl@0
   301
{
sl@0
   302
    return fAdjustments[index].getYAdvance();
sl@0
   303
}
sl@0
   304
sl@0
   305
sl@0
   306
inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const
sl@0
   307
{
sl@0
   308
    return fAdjustments[index].getBaseOffset();
sl@0
   309
}
sl@0
   310
sl@0
   311
inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement)
sl@0
   312
{
sl@0
   313
    fAdjustments[index].setXPlacement(newXPlacement);
sl@0
   314
}
sl@0
   315
sl@0
   316
inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement)
sl@0
   317
{
sl@0
   318
    fAdjustments[index].setYPlacement(newYPlacement);
sl@0
   319
}
sl@0
   320
sl@0
   321
inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance)
sl@0
   322
{
sl@0
   323
    fAdjustments[index].setXAdvance(newXAdvance);
sl@0
   324
}
sl@0
   325
sl@0
   326
inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance)
sl@0
   327
{
sl@0
   328
    fAdjustments[index].setYAdvance(newYAdvance);
sl@0
   329
}
sl@0
   330
sl@0
   331
inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset)
sl@0
   332
{
sl@0
   333
    fAdjustments[index].setBaseOffset(newBaseOffset);
sl@0
   334
}
sl@0
   335
sl@0
   336
inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment)
sl@0
   337
{
sl@0
   338
    fAdjustments[index].adjustXPlacement(xAdjustment);
sl@0
   339
}
sl@0
   340
sl@0
   341
inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment)
sl@0
   342
{
sl@0
   343
    fAdjustments[index].adjustYPlacement(yAdjustment);
sl@0
   344
}
sl@0
   345
sl@0
   346
inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment)
sl@0
   347
{
sl@0
   348
    fAdjustments[index].adjustXAdvance(xAdjustment);
sl@0
   349
}
sl@0
   350
sl@0
   351
inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment)
sl@0
   352
{
sl@0
   353
    fAdjustments[index].adjustYAdvance(yAdjustment);
sl@0
   354
}
sl@0
   355
sl@0
   356
inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const
sl@0
   357
{
sl@0
   358
    return fEntryExitPoints != NULL;
sl@0
   359
}
sl@0
   360
sl@0
   361
U_NAMESPACE_END
sl@0
   362
#endif