jdk/src/java.desktop/share/native/libfontmanager/layout/LETableReference.h
author prr
Thu, 11 Sep 2014 10:10:16 -0700
changeset 28547 16e96997b7fa
parent 25859 3317bb8137f4
child 29908 83e2c403fefd
permissions -rw-r--r--
8055489: Better substitution formats Reviewed-by: srl, bae, mschoene
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     1
/*
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     3
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     6
 * published by the Free Software Foundation.  Oracle designates this
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     7
 * particular file as subject to the "Classpath" exception as provided
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     8
 * by Oracle in the LICENSE file that accompanied this code.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
     9
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    14
 * accompanied this code).
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    15
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    19
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    22
 * questions.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    23
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    24
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    25
/*
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    26
 * -*- c++ -*-
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    27
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    28
 * (C) Copyright IBM Corp. and others 2013 - All Rights Reserved
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    29
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    30
 * Range checking
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    31
 *
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    32
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    33
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    34
#ifndef __LETABLEREFERENCE_H
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    35
#define __LETABLEREFERENCE_H
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    36
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    37
#include "LETypes.h"
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    38
#include "LEFontInstance.h"
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    39
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    40
/**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    41
 * \def LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    42
 * If this is 1, enables old non-safe raw access
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    43
 */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    44
#ifndef LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    45
#define LE_ENABLE_RAW 0
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    46
#endif
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    47
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    48
#define kQuestionmarkTableTag  0x3F3F3F3FUL /* ???? */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    49
#define kStaticTableTag  0x30303030UL  /* 0000 */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    50
#define kTildeTableTag  0x7e7e7e7eUL /* ~~~~ */
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    51
#ifdef __cplusplus
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    52
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    53
// internal - interface for range checking
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    54
U_NAMESPACE_BEGIN
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    55
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    56
#if LE_ASSERT_BAD_FONT
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    57
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    58
#ifndef LE_TRACE_TR
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    59
#define LE_TRACE_TR 0
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    60
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    61
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    62
class LETableReference; // fwd
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    63
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    64
 *  defined in OpenTypeUtilities.cpp
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    65
 * @internal
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    66
 */
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    67
U_CAPI void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len);
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    68
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    69
#define LE_DEBUG_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    70
#define LE_DEBUG_TR3(x,y,z) _debug_LETableReference(__FILE__, __LINE__, x, this, (const void*)y, (size_t)z);
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    71
#if LE_TRACE_TR
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    72
#define _TRTRACE(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0);
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    73
#else
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    74
#define _TRTRACE(x)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    75
#endif
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    76
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    77
#else
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    78
#define LE_DEBUG_TR(x)
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    79
#define LE_DEBUG_TR3(x,y,z)
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    80
#define _TRTRACE(x)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    81
#endif
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    82
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    83
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    84
 * @internal
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    85
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    86
class LETableReference {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    87
public:
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    88
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    89
  /**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    90
   * Dummy enum asserting that a value is actually static data
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    91
   * and does not need to be range checked
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    92
   */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    93
  enum EStaticData { kStaticData = 0 };
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
    94
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    95
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    96
 * @internal
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    97
 * Construct from a specific tag
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    98
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
    99
  LETableReference(const LEFontInstance* font, LETag tableTag, LEErrorCode &success) :
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   100
    fFont(font), fTag(tableTag), fParent(NULL), fStart(NULL),fLength(LE_UINTPTR_MAX) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   101
      loadTable(success);
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   102
    _TRTRACE("INFO: new table load")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   103
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   104
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   105
  LETableReference(const LETableReference &parent, LEErrorCode &success) : fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), fStart(parent.fStart), fLength(parent.fLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   106
    if(LE_FAILURE(success)) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   107
      clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   108
    }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   109
    _TRTRACE("INFO: new clone")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   110
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   111
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   112
#if LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   113
   /**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   114
    * Construct  without a parent LETR.
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   115
    */
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   116
   LETableReference(const le_uint8* data, size_t length = LE_UINTPTR_MAX) :
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   117
    fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) {
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   118
    _TRTRACE("INFO: new raw")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   119
  }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   120
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   121
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   122
   /**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   123
    * Construct  without a parent LETR.
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   124
    */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   125
 LETableReference(EStaticData /* NOTUSED */, const le_uint8* data, size_t length) :
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   126
    fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   127
    _TRTRACE("INFO: new EStaticData")
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   128
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   129
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   130
  LETableReference() :
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   131
    fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(NULL), fLength(0) {
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   132
    _TRTRACE("INFO: new empty")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   133
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   134
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   135
  ~LETableReference() {
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   136
    fTag= (LETag)kTildeTableTag;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   137
    _TRTRACE("INFO: new dtor")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   138
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   139
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   140
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   141
   * @internal
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   142
   * @param length  if LE_UINTPTR_MAX means "whole table"
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   143
   * subset
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   144
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   145
  LETableReference(const LETableReference &parent, size_t offset, size_t length,
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   146
                   LEErrorCode &err) :
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   147
    fFont(parent.fFont), fTag(parent.fTag), fParent(&parent),
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   148
    fStart((parent.fStart)+offset), fLength(length) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   149
    if(LE_SUCCESS(err)) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   150
      if(isEmpty()) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   151
        //err = LE_MISSING_FONT_TABLE_ERROR;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   152
        clear(); // it's just empty. Not an error.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   153
      } else if(offset >= fParent->fLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   154
        LE_DEBUG_TR3("offset out of range: (%p) +%d", NULL, offset);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   155
        err = LE_INDEX_OUT_OF_BOUNDS_ERROR;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   156
        clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   157
      } else {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   158
        if(fLength == LE_UINTPTR_MAX &&
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   159
           fParent->fLength != LE_UINTPTR_MAX) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   160
          fLength = (fParent->fLength) - offset; // decrement length as base address is incremented
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   161
        }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   162
        if(fLength != LE_UINTPTR_MAX) {  // if we have bounds:
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   163
          if((offset+fLength < offset) || (offset+fLength > fParent->fLength)) {
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   164
            LE_DEBUG_TR3("offset+fLength out of range: (%p) +%d", NULL, offset+fLength);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   165
            err = LE_INDEX_OUT_OF_BOUNDS_ERROR; // exceeded
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   166
            clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   167
          }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   168
        }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   169
      }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   170
    } else {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   171
      clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   172
    }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   173
    _TRTRACE("INFO: new subset")
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   174
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   175
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   176
  const void* getAlias() const { return (const void*)fStart; }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   177
#ifndef LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   178
  const void* getAliasRAW() const { LE_DEBUG_TR("getAliasRAW()"); return (const void*)fStart; }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   179
#endif
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   180
  le_bool isEmpty() const { return fStart==NULL || fLength==0; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   181
  le_bool isValid() const { return !isEmpty(); }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   182
  le_bool hasBounds() const { return fLength!=LE_UINTPTR_MAX; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   183
  void clear() { fLength=0; fStart=NULL; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   184
  size_t getLength() const { return fLength; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   185
  const LEFontInstance* getFont() const { return fFont; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   186
  LETag getTag() const { return fTag; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   187
  const LETableReference* getParent() const { return fParent; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   188
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   189
  void addOffset(size_t offset, LEErrorCode &success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   190
    if(hasBounds()) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   191
      if(offset > fLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   192
        LE_DEBUG_TR("addOffset off end");
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   193
        success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   194
        return;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   195
      } else {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   196
        fLength -= offset;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   197
      }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   198
    }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   199
    fStart += offset;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   200
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   201
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   202
  size_t ptrToOffset(const void *atPtr, LEErrorCode &success) const {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   203
    if(atPtr==NULL) return 0;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   204
    if(LE_FAILURE(success)) return LE_UINTPTR_MAX;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   205
    if((atPtr < fStart) ||
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   206
       (hasBounds() && (atPtr > fStart+fLength))) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   207
      LE_DEBUG_TR3("ptrToOffset args out of range: %p", atPtr, 0);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   208
      success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   209
      return LE_UINTPTR_MAX;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   210
    }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   211
    return ((const le_uint8*)atPtr)-fStart;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   212
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   213
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   214
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   215
   * Clamp down the length, for range checking.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   216
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   217
  size_t contractLength(size_t newLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   218
    if(fLength!=LE_UINTPTR_MAX&&newLength>0&&newLength<=fLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   219
      fLength = newLength;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   220
    }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   221
    return fLength;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   222
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   223
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   224
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   225
   * Throw an error if offset+length off end
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   226
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   227
public:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   228
  size_t verifyLength(size_t offset, size_t length, LEErrorCode &success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   229
    if(isValid()&&
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   230
       LE_SUCCESS(success) &&
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   231
       fLength!=LE_UINTPTR_MAX && length!=LE_UINTPTR_MAX && offset!=LE_UINTPTR_MAX &&
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   232
       (offset+length)>fLength) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   233
      LE_DEBUG_TR3("verifyLength failed (%p) %d",NULL, offset+length);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   234
      success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   235
#if LE_ASSERT_BAD_FONT
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   236
      fprintf(stderr, "offset=%lu, len=%lu, would be at %p, (%lu) off end. End at %p\n", offset,length, fStart+offset+length, (offset+length-fLength), (offset+length-fLength)+fStart);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   237
#endif
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   238
    }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   239
    return fLength;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   240
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   241
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   242
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   243
   * Change parent link to another
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   244
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   245
  LETableReference &reparent(const LETableReference &base) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   246
    fParent = &base;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   247
    return *this;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   248
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   249
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   250
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   251
   * remove parent link. Factory functions should do this.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   252
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   253
  void orphan(void) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   254
    fParent=NULL;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   255
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   256
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   257
protected:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   258
  const LEFontInstance* fFont;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   259
  LETag  fTag;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   260
  const LETableReference *fParent;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   261
  const le_uint8 *fStart; // keep as 8 bit internally, for pointer math
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   262
  size_t fLength;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   263
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   264
  void loadTable(LEErrorCode &success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   265
    if(LE_SUCCESS(success)) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   266
      fStart = (const le_uint8*)(fFont->getFontTable(fTag, fLength)); // note - a null table is not an error.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   267
    }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   268
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   269
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   270
  void setRaw(const void *data, size_t length = LE_UINTPTR_MAX) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   271
    fFont = NULL;
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   272
    fTag = (LETag)kQuestionmarkTableTag;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   273
    fParent = NULL;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   274
    fStart = (const le_uint8*)data;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   275
    fLength = length;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   276
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   277
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   278
  /**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   279
   * set this object pointing to static data
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   280
   */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   281
  void setTo(EStaticData /*notused*/, const void *data, size_t length) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   282
    fFont = NULL;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   283
    fTag = (LETag)kStaticTableTag;
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   284
    fParent = NULL;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   285
    fStart = (const le_uint8*)data;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   286
    fLength = length;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   287
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   288
};
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   289
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   290
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   291
template<class T>
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   292
class LETableVarSizer {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   293
 public:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   294
  inline static size_t getSize();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   295
};
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   296
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   297
// base definition- could override for adjustments
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   298
template<class T> inline
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   299
size_t LETableVarSizer<T>::getSize() {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   300
  return sizeof(T);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   301
}
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   302
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   303
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   304
 * \def LE_VAR_ARRAY
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   305
 * @param x Type (T)
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   306
 * @param y some member that is of length ANY_NUMBER
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   307
 * Call this after defining a class, for example:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   308
 *   LE_VAR_ARRAY(FeatureListTable,featureRecordArray)
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   309
 * this is roughly equivalent to:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   310
 *   template<> inline size_t LETableVarSizer<FeatureListTable>::getSize() { return sizeof(FeatureListTable) - (sizeof(le_uint16)*ANY_NUMBER); }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   311
 * it's a specialization that informs the LETableReference subclasses to NOT include the variable array in the size.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   312
 * dereferencing NULL is valid here because we never actually dereference it, just inside sizeof.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   313
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   314
#define LE_VAR_ARRAY(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return sizeof(x) - (sizeof(((const x*)0)->y)); }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   315
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   316
 * \def LE_CORRECT_SIZE
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   317
 * @param x type (T)
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   318
 * @param y fixed size for T
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   319
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   320
#define LE_CORRECT_SIZE(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return y; }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   321
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   322
/**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   323
 * Open a new entry based on an existing table
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   324
 */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   325
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   326
template<class T>
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   327
class LEReferenceTo : public LETableReference {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   328
public:
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   329
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   330
   * open a sub reference.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   331
   * @param parent parent reference
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   332
   * @param success error status
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   333
   * @param atPtr location of reference - if NULL, will be at offset zero (i.e. downcast of parent). Otherwise must be a pointer within parent's bounds.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   334
   */
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   335
 inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   336
    : LETableReference(parent, parent.ptrToOffset(atPtr, success), LE_UINTPTR_MAX, success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   337
    verifyLength(0, LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   338
    if(LE_FAILURE(success)) clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   339
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   340
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   341
   * ptr plus offset
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   342
   */
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   343
 inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr, size_t offset)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   344
    : LETableReference(parent, parent.ptrToOffset(atPtr, success)+offset, LE_UINTPTR_MAX, success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   345
    verifyLength(0, LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   346
    if(LE_FAILURE(success)) clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   347
  }
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   348
 inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, size_t offset)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   349
    : LETableReference(parent, offset, LE_UINTPTR_MAX, success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   350
    verifyLength(0, LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   351
    if(LE_FAILURE(success)) clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   352
  }
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   353
 inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   354
    : LETableReference(parent, 0, LE_UINTPTR_MAX, success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   355
    verifyLength(0, LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   356
    if(LE_FAILURE(success)) clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   357
  }
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   358
 inline LEReferenceTo(const LEFontInstance *font, LETag tableTag, LEErrorCode &success)
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   359
   : LETableReference(font, tableTag, success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   360
    verifyLength(0, LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   361
    if(LE_FAILURE(success)) clear();
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   362
  }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   363
#if LE_ENABLE_RAW
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   364
 inline LEReferenceTo(const le_uint8 *data, size_t length = LE_UINTPTR_MAX) : LETableReference(data, length) {}
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   365
 inline LEReferenceTo(const T *data, size_t length = LE_UINTPTR_MAX) : LETableReference((const le_uint8*)data, length) {}
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   366
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   367
 inline LEReferenceTo(EStaticData staticData, const le_uint8 *data, size_t length) : LETableReference(staticData, data, length) {}
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   368
 inline LEReferenceTo(EStaticData staticData, const T *data, size_t length) : LETableReference(staticData, (const le_uint8*)data, length) {}
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   369
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   370
 inline LEReferenceTo() : LETableReference() {}
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   371
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   372
#if LE_ENABLE_RAW
18518
153791a0895c 8015144: Performance regression in ICU OpenType Layout library
prr
parents: 16891
diff changeset
   373
 inline LEReferenceTo<T>& operator=(const T* other) {
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   374
    setRaw(other);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   375
    return *this;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   376
  }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   377
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   378
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   379
 LEReferenceTo<T>& setTo(LETableReference::EStaticData staticData, const T* other, size_t length) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   380
   LETableReference::setTo(staticData, other, length);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   381
   return *this;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   382
 }
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   383
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   384
  LEReferenceTo<T> &reparent(const LETableReference &base) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   385
    fParent = &base;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   386
    return *this;
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   387
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   388
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   389
  /**
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   390
   * roll forward by one <T> size.
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   391
   * same as addOffset(LETableVarSizer<T>::getSize(),success)
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   392
   */
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   393
  void addObject(LEErrorCode &success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   394
    addOffset(LETableVarSizer<T>::getSize(), success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   395
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   396
  void addObject(size_t count, LEErrorCode &success) {
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   397
    addOffset(LETableVarSizer<T>::getSize()*count, success);
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   398
  }
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   399
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   400
  const T *operator->() const { return getAlias(); }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   401
  const T *operator*() const { return getAlias(); }
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   402
  const T *getAlias() const { return (const T*)fStart; }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   403
#if LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   404
  const T *getAliasRAW() const { LE_DEBUG_TR("getAliasRAW<>"); return (const T*)fStart; }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   405
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   406
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   407
};
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   408
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   409
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   410
/**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   411
 * \def LE_UNBOUNDED_ARRAY
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   412
 * define an array with no *known* bound. Will trim to available size.
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   413
 * @internal
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   414
 */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   415
#define LE_UNBOUNDED_ARRAY LE_UINT32_MAX
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   416
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   417
template<class T>
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   418
class LEReferenceToArrayOf : public LETableReference {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   419
public:
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   420
  LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, size_t offset, le_uint32 count)
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   421
    : LETableReference(parent, offset, LE_UINTPTR_MAX, success), fCount(count) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   422
    _TRTRACE("INFO: new RTAO by offset")
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   423
    if(LE_SUCCESS(success)) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   424
      if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   425
        fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   426
      }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   427
      LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*fCount, success);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   428
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   429
    if(LE_FAILURE(success)) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   430
      fCount=0;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   431
      clear();
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   432
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   433
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   434
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   435
  LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, le_uint32 count)
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   436
    : LETableReference(parent, parent.ptrToOffset(array, success), LE_UINTPTR_MAX, success), fCount(count) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   437
_TRTRACE("INFO: new RTAO")
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   438
    if(LE_SUCCESS(success)) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   439
      if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   440
        fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   441
      }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   442
      LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*fCount, success);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   443
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   444
    if(LE_FAILURE(success)) clear();
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   445
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   446
 LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, size_t offset, le_uint32 count)
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   447
   : LETableReference(parent, parent.ptrToOffset(array, success)+offset, LE_UINTPTR_MAX, success), fCount(count) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   448
_TRTRACE("INFO: new RTAO")
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   449
    if(LE_SUCCESS(success)) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   450
      if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   451
        fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   452
      }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   453
      LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*fCount, success);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   454
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   455
    if(LE_FAILURE(success)) clear();
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   456
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   457
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   458
 LEReferenceToArrayOf() :LETableReference(), fCount(0) {}
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   459
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   460
  le_uint32 getCount() const { return fCount; }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   461
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   462
  const T *getAlias() const { return (const T*)fStart; }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   463
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   464
  const T *getAlias(le_uint32 i, LEErrorCode &success) const {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   465
    return ((const T*)(((const char*)getAlias())+getOffsetFor(i, success)));
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   466
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   467
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   468
#ifndef LE_ENABLE_RAW
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   469
  const T *getAliasRAW() const { LE_DEBUG_TR("getAliasRAW<>"); return (const T*)fStart; }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   470
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   471
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   472
  const T& getObject(le_uint32 i, LEErrorCode &success) const {
28547
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   473
      const T *ret = getAlias(i, success);
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   474
      if (LE_FAILURE(success) || ret==NULL) {
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   475
          return *(new T(0));
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   476
      } else {
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   477
          return *ret;
16e96997b7fa 8055489: Better substitution formats
prr
parents: 25859
diff changeset
   478
     }
22330
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   479
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   480
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   481
  /**
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   482
   * by-value array accessor for integral types.
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   483
   */
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   484
  const T operator[](le_uint32 i) const {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   485
    LEErrorCode success = LE_NO_ERROR;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   486
    const T *ret = getAlias(i, success);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   487
    if(LE_FAILURE(success) || ret==NULL) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   488
#if LE_ASSERT_BAD_FONT
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   489
      LE_DEBUG_TR3("Range error, out of bounds? (%p) #%d", NULL, i);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   490
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   491
      return T(0); // will not work for all types.
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   492
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   493
    return *ret;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   494
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   495
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   496
  const LEReferenceTo<T> getReference(le_uint32 i, LEErrorCode &success) const {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   497
    if(LE_FAILURE(success)) return LEReferenceTo<T>();
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   498
    return LEReferenceTo<T>(*this, success, getAlias(i,success));
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   499
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   500
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   501
  const T& operator()(le_uint32 i, LEErrorCode &success) const {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   502
    return *getAlias(i,success);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   503
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   504
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   505
  size_t getOffsetFor(le_uint32 i, LEErrorCode &success) const {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   506
    if(LE_SUCCESS(success)&&i<getCount()) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   507
      return LETableVarSizer<T>::getSize()*i;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   508
    } else {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   509
      LE_DEBUG_TR3("getOffsetFor failed (%p) index=%d",NULL, i);
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   510
      success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   511
    }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   512
    return 0;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   513
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   514
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   515
  LEReferenceToArrayOf<T> &reparent(const LETableReference &base) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   516
    fParent = &base;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   517
    return *this;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   518
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   519
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   520
 LEReferenceToArrayOf(const LETableReference& parent, LEErrorCode & success) : LETableReference(parent,0, LE_UINTPTR_MAX, success), fCount(0) {
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   521
    _TRTRACE("INFO: null RTAO")
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   522
  }
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   523
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   524
private:
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   525
  le_uint32 fCount;
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   526
};
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   527
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   528
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   529
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   530
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   531
#ifdef _TRTRACE
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   532
#undef _TRTRACE
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   533
#endif
cafb826672bd 8024530: Enhance font process resilience
prr
parents: 18518
diff changeset
   534
16891
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   535
U_NAMESPACE_END
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   536
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   537
#endif
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   538
91e99bed64ae 8001031: Better font processing
prr
parents:
diff changeset
   539
#endif