misc/libfreetype/src/cff/cffgload.c
author koda
Sun, 29 Jan 2012 18:52:01 +0100
changeset 6613 c7bf3b7c49dd
parent 5172 88f2e05288ba
permissions -rw-r--r--
disabling the discovery of SDL13+ on desktop. SDL13 has become SDL2 with a completely different ABI and will require a new FindSDL2 module for Cmake to be found; for current sdl development installations, hedgewars will either use the compatibility layer (present in sdl1.3 but not in sdl2) or just fail to build (in case sdl2 is installed but sdl1.2.* is not). whew
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     1
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     2
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     3
/*  cffgload.c                                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     4
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     5
/*    OpenType Glyph Loader (body).                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     6
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     7
/*  Copyright 1996-2011 by                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     8
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     9
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    10
/*  This file is part of the FreeType project, and may only be used,       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    11
/*  modified, and distributed under the terms of the FreeType project      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    12
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    13
/*  this file you indicate that you have read the license and              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    14
/*  understand and accept it fully.                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    15
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    16
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    17
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    18
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    19
#include <ft2build.h>
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    20
#include FT_INTERNAL_DEBUG_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    21
#include FT_INTERNAL_STREAM_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    22
#include FT_INTERNAL_SFNT_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    23
#include FT_OUTLINE_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    24
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    25
#include "cffobjs.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    26
#include "cffload.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    27
#include "cffgload.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    28
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    29
#include "cfferrs.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    30
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    31
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    32
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    33
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    34
  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    35
  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    36
  /* messages during execution.                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    37
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    38
#undef  FT_COMPONENT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    39
#define FT_COMPONENT  trace_cffgload
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    40
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    41
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    42
  typedef enum  CFF_Operator_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    43
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    44
    cff_op_unknown = 0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    45
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    46
    cff_op_rmoveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    47
    cff_op_hmoveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    48
    cff_op_vmoveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    49
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    50
    cff_op_rlineto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    51
    cff_op_hlineto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    52
    cff_op_vlineto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    53
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    54
    cff_op_rrcurveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    55
    cff_op_hhcurveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    56
    cff_op_hvcurveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    57
    cff_op_rcurveline,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    58
    cff_op_rlinecurve,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    59
    cff_op_vhcurveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    60
    cff_op_vvcurveto,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    61
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    62
    cff_op_flex,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    63
    cff_op_hflex,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    64
    cff_op_hflex1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    65
    cff_op_flex1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    66
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    67
    cff_op_endchar,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    68
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    69
    cff_op_hstem,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    70
    cff_op_vstem,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    71
    cff_op_hstemhm,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    72
    cff_op_vstemhm,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    73
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    74
    cff_op_hintmask,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    75
    cff_op_cntrmask,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    76
    cff_op_dotsection,  /* deprecated, acts as no-op */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    77
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    78
    cff_op_abs,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    79
    cff_op_add,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    80
    cff_op_sub,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    81
    cff_op_div,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    82
    cff_op_neg,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    83
    cff_op_random,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    84
    cff_op_mul,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    85
    cff_op_sqrt,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    86
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    87
    cff_op_blend,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    88
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    89
    cff_op_drop,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    90
    cff_op_exch,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    91
    cff_op_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    92
    cff_op_roll,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    93
    cff_op_dup,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    94
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    95
    cff_op_put,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    96
    cff_op_get,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    97
    cff_op_store,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    98
    cff_op_load,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    99
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   100
    cff_op_and,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   101
    cff_op_or,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   102
    cff_op_not,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   103
    cff_op_eq,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   104
    cff_op_ifelse,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   105
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   106
    cff_op_callsubr,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   107
    cff_op_callgsubr,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   108
    cff_op_return,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   109
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   110
    /* Type 1 opcodes: invalid but seen in real life */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   111
    cff_op_hsbw,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   112
    cff_op_closepath,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   113
    cff_op_callothersubr,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   114
    cff_op_pop,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   115
    cff_op_seac,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   116
    cff_op_sbw,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   117
    cff_op_setcurrentpoint,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   118
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   119
    /* do not remove */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   120
    cff_op_max
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   121
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   122
  } CFF_Operator;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   123
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   124
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   125
#define CFF_COUNT_CHECK_WIDTH  0x80
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   126
#define CFF_COUNT_EXACT        0x40
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   127
#define CFF_COUNT_CLEAR_STACK  0x20
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   128
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   129
  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   130
  /* used for checking the width and requested numbers of arguments    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   131
  /* only; they are set to zero afterwards                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   132
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   133
  /* the other two flags are informative only and unused currently     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   134
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   135
  static const FT_Byte  cff_argument_counts[] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   136
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   137
    0,  /* unknown */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   138
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   139
    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   140
    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   141
    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   142
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   143
    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   144
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   145
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   146
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   147
    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   148
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   149
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   150
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   151
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   152
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   153
    0 | CFF_COUNT_CLEAR_STACK,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   154
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   155
    13, /* flex */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   156
    7,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   157
    9,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   158
    11,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   159
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   160
    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   161
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   162
    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   163
    2 | CFF_COUNT_CHECK_WIDTH,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   164
    2 | CFF_COUNT_CHECK_WIDTH,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   165
    2 | CFF_COUNT_CHECK_WIDTH,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   166
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   167
    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   168
    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   169
    0, /* dotsection */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   171
    1, /* abs */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   172
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   173
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   174
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   175
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   176
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   177
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   178
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   179
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   180
    1, /* blend */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   181
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   182
    1, /* drop */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   183
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   184
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   185
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   186
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   187
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   188
    2, /* put */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   189
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   190
    4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   191
    3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   192
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   193
    2, /* and */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   194
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   195
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   196
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   197
    4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   198
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   199
    1, /* callsubr */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   200
    1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   201
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   202
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   203
    2, /* hsbw */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   204
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   205
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   206
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   207
    5, /* seac */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   208
    4, /* sbw */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   209
    2  /* setcurrentpoint */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   210
  };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   211
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   213
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   214
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   215
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   216
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   217
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   218
  /**********             GENERIC CHARSTRING PARSING               *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   219
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   220
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   221
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   222
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   223
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   224
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   225
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   226
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   227
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   228
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   229
  /*    cff_builder_init                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   230
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   231
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   232
  /*    Initializes a given glyph builder.                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   233
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   234
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   235
  /*    builder :: A pointer to the glyph builder to initialize.           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   236
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   237
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   238
  /*    face    :: The current face object.                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   239
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   240
  /*    size    :: The current size object.                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   241
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   242
  /*    glyph   :: The current glyph object.                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   243
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   244
  /*    hinting :: Whether hinting is active.                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   245
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   246
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   247
  cff_builder_init( CFF_Builder*   builder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   248
                    TT_Face        face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   249
                    CFF_Size       size,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   250
                    CFF_GlyphSlot  glyph,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   251
                    FT_Bool        hinting )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   252
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   253
    builder->path_begun  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   254
    builder->load_points = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   255
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   256
    builder->face   = face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   257
    builder->glyph  = glyph;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   258
    builder->memory = face->root.memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   259
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   260
    if ( glyph )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   261
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   262
      FT_GlyphLoader  loader = glyph->root.internal->loader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   263
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   264
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   265
      builder->loader  = loader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   266
      builder->base    = &loader->base.outline;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   267
      builder->current = &loader->current.outline;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   268
      FT_GlyphLoader_Rewind( loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   269
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   270
      builder->hints_globals = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   271
      builder->hints_funcs   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   272
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   273
      if ( hinting && size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   274
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   275
        CFF_Internal  internal = (CFF_Internal)size->root.internal;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   276
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   277
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   278
        builder->hints_globals = (void *)internal->topfont;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   279
        builder->hints_funcs   = glyph->root.internal->glyph_hints;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   280
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   281
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   282
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   283
    builder->pos_x = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   284
    builder->pos_y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   285
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   286
    builder->left_bearing.x = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   287
    builder->left_bearing.y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   288
    builder->advance.x      = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   289
    builder->advance.y      = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   290
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   291
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   292
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   293
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   294
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   295
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   296
  /*    cff_builder_done                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   297
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   298
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   299
  /*    Finalizes a given glyph builder.  Its contents can still be used   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   300
  /*    after the call, but the function saves important information       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   301
  /*    within the corresponding glyph slot.                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   302
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   303
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   304
  /*    builder :: A pointer to the glyph builder to finalize.             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   305
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   306
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   307
  cff_builder_done( CFF_Builder*  builder )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   308
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   309
    CFF_GlyphSlot  glyph = builder->glyph;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   310
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   311
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   312
    if ( glyph )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   313
      glyph->root.outline = *builder->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   314
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   315
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   316
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   317
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   318
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   319
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   320
  /*    cff_compute_bias                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   321
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   322
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   323
  /*    Computes the bias value in dependence of the number of glyph       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   324
  /*    subroutines.                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   325
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   326
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   327
  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   328
  /*                          dictionary.                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   329
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   330
  /*    num_subrs          :: The number of glyph subroutines.             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   331
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   332
  /* <Return>                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   333
  /*    The bias value.                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   334
  static FT_Int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   335
  cff_compute_bias( FT_Int   in_charstring_type,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   336
                    FT_UInt  num_subrs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   337
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   338
    FT_Int  result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   339
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   340
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   341
    if ( in_charstring_type == 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   342
      result = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   343
    else if ( num_subrs < 1240 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   344
      result = 107;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   345
    else if ( num_subrs < 33900U )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   346
      result = 1131;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   347
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   348
      result = 32768U;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   350
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   351
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   352
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   353
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   354
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   355
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   356
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   357
  /*    cff_decoder_init                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   358
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   359
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   360
  /*    Initializes a given glyph decoder.                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   361
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   362
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   363
  /*    decoder :: A pointer to the glyph builder to initialize.           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   364
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   365
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   366
  /*    face      :: The current face object.                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   367
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   368
  /*    size      :: The current size object.                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   369
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   370
  /*    slot      :: The current glyph object.                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   371
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   372
  /*    hinting   :: Whether hinting is active.                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   373
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   374
  /*    hint_mode :: The hinting mode.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   375
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   376
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   377
  cff_decoder_init( CFF_Decoder*    decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   378
                    TT_Face         face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   379
                    CFF_Size        size,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   380
                    CFF_GlyphSlot   slot,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   381
                    FT_Bool         hinting,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   382
                    FT_Render_Mode  hint_mode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   383
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   384
    CFF_Font  cff = (CFF_Font)face->extra.data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   385
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   386
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   387
    /* clear everything */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   388
    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   389
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   390
    /* initialize builder */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   391
    cff_builder_init( &decoder->builder, face, size, slot, hinting );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   392
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   393
    /* initialize Type2 decoder */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   394
    decoder->cff          = cff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   395
    decoder->num_globals  = cff->global_subrs_index.count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   396
    decoder->globals      = cff->global_subrs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   397
    decoder->globals_bias = cff_compute_bias(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   398
                              cff->top_font.font_dict.charstring_type,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   399
                              decoder->num_globals );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   400
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   401
    decoder->hint_mode    = hint_mode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   402
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   403
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   404
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   405
  /* this function is used to select the subfont */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   406
  /* and the locals subrs array                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   407
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   408
  cff_decoder_prepare( CFF_Decoder*  decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   409
                       CFF_Size      size,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   410
                       FT_UInt       glyph_index )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   411
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   412
    CFF_Builder  *builder = &decoder->builder;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   413
    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   414
    CFF_SubFont   sub     = &cff->top_font;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   415
    FT_Error      error   = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   416
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   417
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   418
    /* manage CID fonts */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   419
    if ( cff->num_subfonts )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   420
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   421
      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   422
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   423
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   424
      if ( fd_index >= cff->num_subfonts )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   425
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   426
        FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   427
        error = CFF_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   428
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   429
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   430
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   431
      FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   432
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   433
      sub = cff->subfonts[fd_index];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   434
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   435
      if ( builder->hints_funcs && size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   436
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   437
        CFF_Internal  internal = (CFF_Internal)size->root.internal;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   438
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   439
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   440
        /* for CFFs without subfonts, this value has already been set */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   441
        builder->hints_globals = (void *)internal->subfonts[fd_index];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   442
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   443
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   444
#ifdef FT_DEBUG_LEVEL_TRACE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   445
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   446
      FT_TRACE3(( "glyph index %d:\n", glyph_index ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   447
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   448
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   449
    decoder->num_locals    = sub->local_subrs_index.count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   450
    decoder->locals        = sub->local_subrs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   451
    decoder->locals_bias   = cff_compute_bias(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   452
                               decoder->cff->top_font.font_dict.charstring_type,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   453
                               decoder->num_locals );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   454
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   455
    decoder->glyph_width   = sub->private_dict.default_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   456
    decoder->nominal_width = sub->private_dict.nominal_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   457
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   458
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   459
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   460
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   461
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   462
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   463
  /* check that there is enough space for `count' more points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   464
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   465
  check_points( CFF_Builder*  builder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   466
                FT_Int        count )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   467
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   468
    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   469
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   470
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   471
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   472
  /* add a new point, do not check space */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   473
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   474
  cff_builder_add_point( CFF_Builder*  builder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   475
                         FT_Pos        x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   476
                         FT_Pos        y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   477
                         FT_Byte       flag )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   478
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   479
    FT_Outline*  outline = builder->current;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   480
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   481
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   482
    if ( builder->load_points )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   483
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   484
      FT_Vector*  point   = outline->points + outline->n_points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   485
      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   486
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   487
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   488
      point->x = x >> 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   489
      point->y = y >> 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   490
      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   491
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   492
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   493
    outline->n_points++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   494
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   495
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   496
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   497
  /* check space for a new on-curve point, then add it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   498
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   499
  cff_builder_add_point1( CFF_Builder*  builder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   500
                          FT_Pos        x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   501
                          FT_Pos        y )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   502
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   503
    FT_Error  error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   504
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   505
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   506
    error = check_points( builder, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   507
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   508
      cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   509
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   510
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   511
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   512
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   513
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   514
  /* check space for a new contour, then add it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   515
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   516
  cff_builder_add_contour( CFF_Builder*  builder )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   517
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   518
    FT_Outline*  outline = builder->current;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   519
    FT_Error     error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   520
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   521
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   522
    if ( !builder->load_points )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   523
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   524
      outline->n_contours++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   525
      return CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   526
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   527
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   528
    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   529
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   530
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   531
      if ( outline->n_contours > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   532
        outline->contours[outline->n_contours - 1] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   533
          (short)( outline->n_points - 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   534
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   535
      outline->n_contours++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   536
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   537
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   538
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   539
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   540
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   541
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   542
  /* if a path was begun, add its first on-curve point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   543
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   544
  cff_builder_start_point( CFF_Builder*  builder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   545
                           FT_Pos        x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   546
                           FT_Pos        y )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   547
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   548
    FT_Error  error = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   549
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   550
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   551
    /* test whether we are building a new contour */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   552
    if ( !builder->path_begun )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   553
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   554
      builder->path_begun = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   555
      error = cff_builder_add_contour( builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   556
      if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   557
        error = cff_builder_add_point1( builder, x, y );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   558
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   559
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   560
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   561
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   562
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   563
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   564
  /* close the current contour */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   565
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   566
  cff_builder_close_contour( CFF_Builder*  builder )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   567
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   568
    FT_Outline*  outline = builder->current;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   569
    FT_Int       first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   570
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   571
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   572
    if ( !outline )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   573
      return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   574
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   575
    first = outline->n_contours <= 1
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   576
            ? 0 : outline->contours[outline->n_contours - 2] + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   577
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   578
    /* We must not include the last point in the path if it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   579
    /* is located on the first point.                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   580
    if ( outline->n_points > 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   581
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   582
      FT_Vector*  p1      = outline->points + first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   583
      FT_Vector*  p2      = outline->points + outline->n_points - 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   584
      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   585
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   586
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   587
      /* `delete' last point only if it coincides with the first    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   588
      /* point and if it is not a control point (which can happen). */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   589
      if ( p1->x == p2->x && p1->y == p2->y )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   590
        if ( *control == FT_CURVE_TAG_ON )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   591
          outline->n_points--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   592
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   593
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   594
    if ( outline->n_contours > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   595
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   596
      /* Don't add contours only consisting of one point, i.e., */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   597
      /* check whether begin point and last point are the same. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   598
      if ( first == outline->n_points - 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   599
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   600
        outline->n_contours--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   601
        outline->n_points--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   602
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   603
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   604
        outline->contours[outline->n_contours - 1] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   605
          (short)( outline->n_points - 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   606
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   607
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   608
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   609
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   610
  static FT_Int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   611
  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   612
                                   FT_Int    charcode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   613
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   614
    FT_UInt    n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   615
    FT_UShort  glyph_sid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   616
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   617
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   618
    /* CID-keyed fonts don't have glyph names */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   619
    if ( !cff->charset.sids )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   620
      return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   621
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   622
    /* check range of standard char code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   623
    if ( charcode < 0 || charcode > 255 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   624
      return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   625
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   626
    /* Get code to SID mapping from `cff_standard_encoding'. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   627
    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   628
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   629
    for ( n = 0; n < cff->num_glyphs; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   630
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   631
      if ( cff->charset.sids[n] == glyph_sid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   632
        return n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   633
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   634
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   635
    return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   636
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   637
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   638
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   639
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   640
  cff_get_glyph_data( TT_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   641
                      FT_UInt    glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   642
                      FT_Byte**  pointer,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   643
                      FT_ULong*  length )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   644
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   645
#ifdef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   646
    /* For incremental fonts get the character data using the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   647
    /* callback function.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   648
    if ( face->root.internal->incremental_interface )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   649
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   650
      FT_Data   data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   651
      FT_Error  error =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   652
                  face->root.internal->incremental_interface->funcs->get_glyph_data(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   653
                    face->root.internal->incremental_interface->object,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   654
                    glyph_index, &data );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   655
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   656
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   657
      *pointer = (FT_Byte*)data.pointer;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   658
      *length = data.length;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   659
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   660
      return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   661
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   662
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   663
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   664
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   665
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   666
      CFF_Font  cff  = (CFF_Font)(face->extra.data);
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   667
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   668
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   669
      return cff_index_access_element( &cff->charstrings_index, glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   670
                                       pointer, length );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   671
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   672
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   673
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   674
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   675
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   676
  cff_free_glyph_data( TT_Face    face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   677
                       FT_Byte**  pointer,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   678
                       FT_ULong   length )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   679
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   680
#ifndef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   681
    FT_UNUSED( length );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   682
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   683
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   684
#ifdef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   685
    /* For incremental fonts get the character data using the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   686
    /* callback function.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   687
    if ( face->root.internal->incremental_interface )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   688
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   689
      FT_Data data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   690
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   691
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   692
      data.pointer = *pointer;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   693
      data.length  = length;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   694
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   695
      face->root.internal->incremental_interface->funcs->free_glyph_data(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   696
        face->root.internal->incremental_interface->object, &data );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   697
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   698
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   699
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   700
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   701
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   702
      CFF_Font  cff = (CFF_Font)(face->extra.data);
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   703
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   704
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   705
      cff_index_forget_element( &cff->charstrings_index, pointer );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   706
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   707
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   708
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   709
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   710
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   711
  cff_operator_seac( CFF_Decoder*  decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   712
                     FT_Pos        asb,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   713
                     FT_Pos        adx,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   714
                     FT_Pos        ady,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   715
                     FT_Int        bchar,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   716
                     FT_Int        achar )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   717
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   718
    FT_Error      error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   719
    CFF_Builder*  builder = &decoder->builder;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   720
    FT_Int        bchar_index, achar_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   721
    TT_Face       face = decoder->builder.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   722
    FT_Vector     left_bearing, advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   723
    FT_Byte*      charstring;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   724
    FT_ULong      charstring_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   725
    FT_Pos        glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   726
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   727
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   728
    if ( decoder->seac )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   729
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   730
      FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   731
      return CFF_Err_Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   732
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   733
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   734
    adx += decoder->builder.left_bearing.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   735
    ady += decoder->builder.left_bearing.y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   736
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   737
#ifdef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   738
    /* Incremental fonts don't necessarily have valid charsets.        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   739
    /* They use the character code, not the glyph index, in this case. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   740
    if ( face->root.internal->incremental_interface )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   741
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   742
      bchar_index = bchar;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   743
      achar_index = achar;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   744
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   745
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   746
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   747
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   748
      CFF_Font cff = (CFF_Font)(face->extra.data);
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   749
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   750
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   751
      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   752
      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   753
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   754
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   755
    if ( bchar_index < 0 || achar_index < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   756
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   757
      FT_ERROR(( "cff_operator_seac:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   758
                 " invalid seac character code arguments\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   759
      return CFF_Err_Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   760
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   761
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   762
    /* If we are trying to load a composite glyph, do not load the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   763
    /* accent character and return the array of subglyphs.         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   764
    if ( builder->no_recurse )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   765
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   766
      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   767
      FT_GlyphLoader  loader = glyph->internal->loader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   768
      FT_SubGlyph     subg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   769
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   770
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   771
      /* reallocate subglyph array if necessary */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   772
      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   773
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   774
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   775
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   776
      subg = loader->current.subglyphs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   777
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   778
      /* subglyph 0 = base character */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   779
      subg->index = bchar_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   780
      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   781
                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   782
      subg->arg1  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   783
      subg->arg2  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   784
      subg++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   785
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   786
      /* subglyph 1 = accent character */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   787
      subg->index = achar_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   788
      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   789
      subg->arg1  = (FT_Int)( adx >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   790
      subg->arg2  = (FT_Int)( ady >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   791
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   792
      /* set up remaining glyph fields */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   793
      glyph->num_subglyphs = 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   794
      glyph->subglyphs     = loader->base.subglyphs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   795
      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   796
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   797
      loader->current.num_subglyphs = 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   798
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   799
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   800
    FT_GlyphLoader_Prepare( builder->loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   801
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   802
    /* First load `bchar' in builder */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   803
    error = cff_get_glyph_data( face, bchar_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   804
                                &charstring, &charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   805
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   806
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   807
      /* the seac operator must not be nested */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   808
      decoder->seac = TRUE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   809
      error = cff_decoder_parse_charstrings( decoder, charstring,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   810
                                             charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   811
      decoder->seac = FALSE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   812
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   813
      cff_free_glyph_data( face, &charstring, charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   814
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   815
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   816
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   817
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   818
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   819
    /* Save the left bearing, advance and glyph width of the base */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   820
    /* character as they will be erased by the next load.         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   821
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   822
    left_bearing = builder->left_bearing;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   823
    advance      = builder->advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   824
    glyph_width  = decoder->glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   825
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   826
    builder->left_bearing.x = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   827
    builder->left_bearing.y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   828
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   829
    builder->pos_x = adx - asb;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   830
    builder->pos_y = ady;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   831
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   832
    /* Now load `achar' on top of the base outline. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   833
    error = cff_get_glyph_data( face, achar_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   834
                                &charstring, &charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   835
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   836
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   837
      /* the seac operator must not be nested */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   838
      decoder->seac = TRUE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   839
      error = cff_decoder_parse_charstrings( decoder, charstring,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   840
                                             charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   841
      decoder->seac = FALSE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   842
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   843
      cff_free_glyph_data( face, &charstring, charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   845
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   846
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   847
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   848
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   849
    /* Restore the left side bearing, advance and glyph width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   850
    /* of the base character.                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   851
    builder->left_bearing = left_bearing;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   852
    builder->advance      = advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   853
    decoder->glyph_width  = glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   854
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   855
    builder->pos_x = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   856
    builder->pos_y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   857
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   858
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   859
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   860
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   861
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   862
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   863
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   864
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   865
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   866
  /*    cff_decoder_parse_charstrings                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   867
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   868
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   869
  /*    Parses a given Type 2 charstrings program.                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   870
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   871
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   872
  /*    decoder         :: The current Type 1 decoder.                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   873
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   874
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   875
  /*    charstring_base :: The base of the charstring stream.              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   876
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   877
  /*    charstring_len  :: The length in bytes of the charstring stream.   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   878
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   879
  /* <Return>                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   880
  /*    FreeType error code.  0 means success.                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   881
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   882
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   883
  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   884
                                 FT_Byte*      charstring_base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   885
                                 FT_ULong      charstring_len )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   886
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   887
    FT_Error           error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   888
    CFF_Decoder_Zone*  zone;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   889
    FT_Byte*           ip;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   890
    FT_Byte*           limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   891
    CFF_Builder*       builder = &decoder->builder;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   892
    FT_Pos             x, y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   893
    FT_Fixed           seed;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   894
    FT_Fixed*          stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   895
    FT_Int             charstring_type =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   896
                         decoder->cff->top_font.font_dict.charstring_type;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   897
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   898
    T2_Hints_Funcs     hinter;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   899
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   900
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   901
    /* set default width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   902
    decoder->num_hints  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   903
    decoder->read_width = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   904
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   905
    /* compute random seed from stack address of parameter */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   906
    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   907
                         (FT_PtrDist)(char*)&decoder           ^
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   908
                         (FT_PtrDist)(char*)&charstring_base ) &
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   909
                         FT_ULONG_MAX ) ;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   910
    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   911
    if ( seed == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   912
      seed = 0x7384;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   914
    /* initialize the decoder */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   915
    decoder->top  = decoder->stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   916
    decoder->zone = decoder->zones;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   917
    zone          = decoder->zones;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   918
    stack         = decoder->top;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   919
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   920
    hinter = (T2_Hints_Funcs)builder->hints_funcs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   921
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   922
    builder->path_begun = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   923
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   924
    zone->base           = charstring_base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   925
    limit = zone->limit  = charstring_base + charstring_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   926
    ip    = zone->cursor = zone->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   927
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   928
    error = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   929
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   930
    x = builder->pos_x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   931
    y = builder->pos_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   932
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   933
    /* begin hints recording session, if any */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   934
    if ( hinter )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   935
      hinter->open( hinter->hints );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   936
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   937
    /* now execute loop */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   938
    while ( ip < limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   939
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   940
      CFF_Operator  op;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   941
      FT_Byte       v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   942
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   943
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   944
      /********************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   945
      /*                                                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   946
      /* Decode operator or operand                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   947
      /*                                                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   948
      v = *ip++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   949
      if ( v >= 32 || v == 28 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   950
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   951
        FT_Int    shift = 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   952
        FT_Int32  val;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   953
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   954
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   955
        /* this is an operand, push it on the stack */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   956
        if ( v == 28 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   957
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   958
          if ( ip + 1 >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   959
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   960
          val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   961
          ip += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   962
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   963
        else if ( v < 247 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   964
          val = (FT_Int32)v - 139;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   965
        else if ( v < 251 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   966
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   967
          if ( ip >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   968
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   969
          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   970
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   971
        else if ( v < 255 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   972
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   973
          if ( ip >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   974
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   975
          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   976
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   977
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   978
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   979
          if ( ip + 3 >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   980
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   981
          val = ( (FT_Int32)ip[0] << 24 ) |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   982
                ( (FT_Int32)ip[1] << 16 ) |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   983
                ( (FT_Int32)ip[2] <<  8 ) |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   984
                            ip[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   985
          ip    += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   986
          if ( charstring_type == 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   987
            shift = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   988
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   989
        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   990
          goto Stack_Overflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   991
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   992
        val           <<= shift;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   993
        *decoder->top++ = val;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   994
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   995
#ifdef FT_DEBUG_LEVEL_TRACE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   996
        if ( !( val & 0xFFFFL ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   997
          FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   998
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   999
          FT_TRACE4(( " %.2f", val / 65536.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1000
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1001
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1002
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1003
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1004
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1005
        /* The specification says that normally arguments are to be taken */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1006
        /* from the bottom of the stack.  However, this seems not to be   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1007
        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1008
        /* arguments similar to a PS interpreter.                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1009
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1010
        FT_Fixed*  args     = decoder->top;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1011
        FT_Int     num_args = (FT_Int)( args - decoder->stack );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1012
        FT_Int     req_args;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1013
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1014
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1015
        /* find operator */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1016
        op = cff_op_unknown;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1017
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1018
        switch ( v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1019
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1020
        case 1:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1021
          op = cff_op_hstem;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1022
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1023
        case 3:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1024
          op = cff_op_vstem;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1025
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1026
        case 4:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1027
          op = cff_op_vmoveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1028
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1029
        case 5:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1030
          op = cff_op_rlineto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1031
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1032
        case 6:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1033
          op = cff_op_hlineto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1034
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1035
        case 7:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1036
          op = cff_op_vlineto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1037
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1038
        case 8:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1039
          op = cff_op_rrcurveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1040
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1041
        case 9:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1042
          op = cff_op_closepath;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1043
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1044
        case 10:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1045
          op = cff_op_callsubr;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1046
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1047
        case 11:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1048
          op = cff_op_return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1049
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1050
        case 12:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1051
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1052
            if ( ip >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1053
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1054
            v = *ip++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1055
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1056
            switch ( v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1057
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1058
            case 0:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1059
              op = cff_op_dotsection;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1060
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1061
            case 1: /* this is actually the Type1 vstem3 operator */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1062
              op = cff_op_vstem;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1063
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1064
            case 2: /* this is actually the Type1 hstem3 operator */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1065
              op = cff_op_hstem;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1066
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1067
            case 3:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1068
              op = cff_op_and;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1069
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1070
            case 4:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1071
              op = cff_op_or;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1072
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1073
            case 5:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1074
              op = cff_op_not;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1075
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1076
            case 6:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1077
              op = cff_op_seac;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1078
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1079
            case 7:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1080
              op = cff_op_sbw;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1081
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1082
            case 8:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1083
              op = cff_op_store;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1084
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1085
            case 9:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1086
              op = cff_op_abs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1087
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1088
            case 10:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1089
              op = cff_op_add;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1090
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1091
            case 11:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1092
              op = cff_op_sub;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1093
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1094
            case 12:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1095
              op = cff_op_div;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1096
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1097
            case 13:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1098
              op = cff_op_load;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1099
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1100
            case 14:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1101
              op = cff_op_neg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1102
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1103
            case 15:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1104
              op = cff_op_eq;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1105
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1106
            case 16:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1107
              op = cff_op_callothersubr;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1108
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1109
            case 17:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1110
              op = cff_op_pop;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1111
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1112
            case 18:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1113
              op = cff_op_drop;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1114
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1115
            case 20:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1116
              op = cff_op_put;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1117
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1118
            case 21:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1119
              op = cff_op_get;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1120
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1121
            case 22:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1122
              op = cff_op_ifelse;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1123
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1124
            case 23:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1125
              op = cff_op_random;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1126
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1127
            case 24:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1128
              op = cff_op_mul;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1129
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1130
            case 26:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1131
              op = cff_op_sqrt;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1132
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1133
            case 27:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1134
              op = cff_op_dup;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1135
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1136
            case 28:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1137
              op = cff_op_exch;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1138
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1139
            case 29:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1140
              op = cff_op_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1141
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1142
            case 30:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1143
              op = cff_op_roll;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1144
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1145
            case 33:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1146
              op = cff_op_setcurrentpoint;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1147
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1148
            case 34:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1149
              op = cff_op_hflex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1150
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1151
            case 35:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1152
              op = cff_op_flex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1153
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1154
            case 36:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1155
              op = cff_op_hflex1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1156
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1157
            case 37:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1158
              op = cff_op_flex1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1159
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1160
            default:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1161
              FT_TRACE4(( " unknown op (12, %d)\n", v ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1162
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1163
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1164
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1165
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1166
        case 13:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1167
          op = cff_op_hsbw;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1168
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1169
        case 14:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1170
          op = cff_op_endchar;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1171
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1172
        case 16:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1173
          op = cff_op_blend;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1174
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1175
        case 18:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1176
          op = cff_op_hstemhm;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1177
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1178
        case 19:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1179
          op = cff_op_hintmask;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1180
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1181
        case 20:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1182
          op = cff_op_cntrmask;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1183
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1184
        case 21:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1185
          op = cff_op_rmoveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1186
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1187
        case 22:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1188
          op = cff_op_hmoveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1189
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1190
        case 23:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1191
          op = cff_op_vstemhm;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1192
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1193
        case 24:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1194
          op = cff_op_rcurveline;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1195
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1196
        case 25:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1197
          op = cff_op_rlinecurve;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1198
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1199
        case 26:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1200
          op = cff_op_vvcurveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1201
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1202
        case 27:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1203
          op = cff_op_hhcurveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1204
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1205
        case 29:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1206
          op = cff_op_callgsubr;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1207
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1208
        case 30:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1209
          op = cff_op_vhcurveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1210
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1211
        case 31:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1212
          op = cff_op_hvcurveto;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1213
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1214
        default:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1215
          FT_TRACE4(( " unknown op (%d)\n", v ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1216
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1217
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1218
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1219
        if ( op == cff_op_unknown )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1220
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1221
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1222
        /* check arguments */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1223
        req_args = cff_argument_counts[op];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1224
        if ( req_args & CFF_COUNT_CHECK_WIDTH )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1225
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1226
          if ( num_args > 0 && decoder->read_width )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1227
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1228
            /* If `nominal_width' is non-zero, the number is really a      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1229
            /* difference against `nominal_width'.  Else, the number here  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1230
            /* is truly a width, not a difference against `nominal_width'. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1231
            /* If the font does not set `nominal_width', then              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1232
            /* `nominal_width' defaults to zero, and so we can set         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1233
            /* `glyph_width' to `nominal_width' plus number on the stack   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1234
            /* -- for either case.                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1235
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1236
            FT_Int  set_width_ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1237
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1238
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1239
            switch ( op )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1240
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1241
            case cff_op_hmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1242
            case cff_op_vmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1243
              set_width_ok = num_args & 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1244
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1245
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1246
            case cff_op_hstem:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1247
            case cff_op_vstem:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1248
            case cff_op_hstemhm:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1249
            case cff_op_vstemhm:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1250
            case cff_op_rmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1251
            case cff_op_hintmask:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1252
            case cff_op_cntrmask:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1253
              set_width_ok = num_args & 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1254
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1255
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1256
            case cff_op_endchar:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1257
              /* If there is a width specified for endchar, we either have */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1258
              /* 1 argument or 5 arguments.  We like to argue.             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1259
              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1260
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1261
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1262
            default:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1263
              set_width_ok = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1264
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1265
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1266
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1267
            if ( set_width_ok )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1268
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1269
              decoder->glyph_width = decoder->nominal_width +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1270
                                       ( stack[0] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1271
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1272
              if ( decoder->width_only )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1273
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1274
                /* we only want the advance width; stop here */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1275
                break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1276
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1277
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1278
              /* Consumed an argument. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1279
              num_args--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1280
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1281
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1282
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1283
          decoder->read_width = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1284
          req_args            = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1285
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1286
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1287
        req_args &= 0x000F;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1288
        if ( num_args < req_args )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1289
          goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1290
        args     -= req_args;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1291
        num_args -= req_args;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1292
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1293
        /* At this point, `args' points to the first argument of the  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1294
        /* operand in case `req_args' isn't zero.  Otherwise, we have */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1295
        /* to adjust `args' manually.                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1296
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1297
        /* Note that we only pop arguments from the stack which we    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1298
        /* really need and can digest so that we can continue in case */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1299
        /* of superfluous stack elements.                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1300
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1301
        switch ( op )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1302
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1303
        case cff_op_hstem:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1304
        case cff_op_vstem:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1305
        case cff_op_hstemhm:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1306
        case cff_op_vstemhm:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1307
          /* the number of arguments is always even here */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1308
          FT_TRACE4((
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1309
              op == cff_op_hstem   ? " hstem\n"   :
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1310
            ( op == cff_op_vstem   ? " vstem\n"   :
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1311
            ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1312
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1313
          if ( hinter )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1314
            hinter->stems( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1315
                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1316
                           num_args / 2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1317
                           args - ( num_args & ~1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1318
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1319
          decoder->num_hints += num_args / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1320
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1321
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1322
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1323
        case cff_op_hintmask:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1324
        case cff_op_cntrmask:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1325
          FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1326
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1327
          /* implement vstem when needed --                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1328
          /* the specification doesn't say it, but this also works */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1329
          /* with the 'cntrmask' operator                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1330
          /*                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1331
          if ( num_args > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1332
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1333
            if ( hinter )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1334
              hinter->stems( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1335
                             0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1336
                             num_args / 2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1337
                             args - ( num_args & ~1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1338
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1339
            decoder->num_hints += num_args / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1340
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1341
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1342
          /* In a valid charstring there must be at least one byte */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1343
          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1344
          /* instruction).  Additionally, there must be space for  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1345
          /* `num_hints' bits.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1346
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1347
          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1348
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1350
          if ( hinter )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1351
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1352
            if ( op == cff_op_hintmask )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1353
              hinter->hintmask( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1354
                                builder->current->n_points,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1355
                                decoder->num_hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1356
                                ip );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1357
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1358
              hinter->counter( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1359
                               decoder->num_hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1360
                               ip );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1361
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1362
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1363
#ifdef FT_DEBUG_LEVEL_TRACE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1364
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1365
            FT_UInt maskbyte;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1366
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1367
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1368
            FT_TRACE4(( " (maskbytes:" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1369
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1370
            for ( maskbyte = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1371
                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1372
                  maskbyte++, ip++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1373
              FT_TRACE4(( " 0x%02X", *ip ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1374
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1375
            FT_TRACE4(( ")\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1376
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1377
#else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1378
          ip += ( decoder->num_hints + 7 ) >> 3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1379
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1380
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1381
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1382
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1383
        case cff_op_rmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1384
          FT_TRACE4(( " rmoveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1385
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1386
          cff_builder_close_contour( builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1387
          builder->path_begun = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1388
          x   += args[-2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1389
          y   += args[-1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1390
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1391
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1392
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1393
        case cff_op_vmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1394
          FT_TRACE4(( " vmoveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1395
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1396
          cff_builder_close_contour( builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1397
          builder->path_begun = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1398
          y   += args[-1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1399
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1400
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1401
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1402
        case cff_op_hmoveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1403
          FT_TRACE4(( " hmoveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1404
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1405
          cff_builder_close_contour( builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1406
          builder->path_begun = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1407
          x   += args[-1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1408
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1409
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1410
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1411
        case cff_op_rlineto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1412
          FT_TRACE4(( " rlineto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1413
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1414
          if ( cff_builder_start_point ( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1415
               check_points( builder, num_args / 2 )     )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1416
            goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1417
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1418
          if ( num_args < 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1419
            goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1420
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1421
          args -= num_args & ~1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1422
          while ( args < decoder->top )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1423
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1424
            x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1425
            y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1426
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1427
            args += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1428
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1429
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1430
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1431
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1432
        case cff_op_hlineto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1433
        case cff_op_vlineto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1434
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1435
            FT_Int  phase = ( op == cff_op_hlineto );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1436
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1437
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1438
            FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1439
                                             : " vlineto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1440
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1441
            if ( num_args < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1442
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1443
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1444
            /* there exist subsetted fonts (found in PDFs) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1445
            /* which call `hlineto' without arguments      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1446
            if ( num_args == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1447
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1448
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1449
            if ( cff_builder_start_point ( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1450
                 check_points( builder, num_args )         )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1451
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1452
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1453
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1454
            while ( args < decoder->top )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1455
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1456
              if ( phase )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1457
                x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1458
              else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1459
                y += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1460
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1461
              if ( cff_builder_add_point1( builder, x, y ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1462
                goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1463
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1464
              args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1465
              phase ^= 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1466
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1467
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1468
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1469
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1470
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1471
        case cff_op_rrcurveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1472
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1473
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1474
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1475
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1476
            FT_TRACE4(( " rrcurveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1477
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1478
            if ( num_args < 6 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1479
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1480
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1481
            nargs = num_args - num_args % 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1483
            if ( cff_builder_start_point ( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1484
                 check_points( builder, nargs / 2 )     )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1485
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1486
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1487
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1488
            while ( args < decoder->top )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1489
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1490
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1491
              y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1492
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1493
              x += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1494
              y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1495
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1496
              x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1497
              y += args[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1498
              cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1499
              args += 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1500
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1501
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1502
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1503
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1504
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1505
        case cff_op_vvcurveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1506
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1507
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1508
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1509
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1510
            FT_TRACE4(( " vvcurveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1511
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1512
            if ( num_args < 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1513
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1514
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1515
            /* if num_args isn't of the form 4n or 4n+1, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1516
            /* we reduce it to 4n+1                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1517
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1518
            nargs = num_args - num_args % 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1519
            if ( num_args - nargs > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1520
              nargs += 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1521
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1522
            if ( cff_builder_start_point( builder, x, y ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1523
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1524
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1525
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1526
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1527
            if ( nargs & 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1528
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1529
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1530
              args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1531
              nargs--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1532
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1533
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1534
            if ( check_points( builder, 3 * ( nargs / 4 ) ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1535
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1536
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1537
            while ( args < decoder->top )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1538
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1539
              y += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1540
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1541
              x += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1542
              y += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1543
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1544
              y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1545
              cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1546
              args += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1547
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1548
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1549
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1550
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1551
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1552
        case cff_op_hhcurveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1553
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1554
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1555
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1556
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1557
            FT_TRACE4(( " hhcurveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1558
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1559
            if ( num_args < 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1560
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1561
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1562
            /* if num_args isn't of the form 4n or 4n+1, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1563
            /* we reduce it to 4n+1                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1564
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1565
            nargs = num_args - num_args % 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1566
            if ( num_args - nargs > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1567
              nargs += 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1568
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1569
            if ( cff_builder_start_point( builder, x, y ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1570
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1571
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1572
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1573
            if ( nargs & 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1574
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1575
              y += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1576
              args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1577
              nargs--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1578
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1579
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1580
            if ( check_points( builder, 3 * ( nargs / 4 ) ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1581
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1582
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1583
            while ( args < decoder->top )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1584
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1585
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1586
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1587
              x += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1588
              y += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1589
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1590
              x += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1591
              cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1592
              args += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1593
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1594
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1595
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1596
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1597
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1598
        case cff_op_vhcurveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1599
        case cff_op_hvcurveto:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1600
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1601
            FT_Int  phase;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1602
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1603
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1604
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1605
            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1606
                                               : " hvcurveto\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1607
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1608
            if ( cff_builder_start_point( builder, x, y ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1609
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1610
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1611
            if ( num_args < 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1612
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1613
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1614
            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1615
            /* we reduce it to the largest one which fits             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1616
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1617
            nargs = num_args - num_args % 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1618
            if ( num_args - nargs > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1619
              nargs += 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1620
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1621
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1622
            if ( check_points( builder, ( nargs / 4 ) * 3 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1623
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1624
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1625
            phase = ( op == cff_op_hvcurveto );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1626
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1627
            while ( nargs >= 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1628
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1629
              nargs -= 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1630
              if ( phase )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1631
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1632
                x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1633
                cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1634
                x += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1635
                y += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1636
                cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1637
                y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1638
                if ( nargs == 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1639
                  x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1640
                cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1641
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1642
              else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1643
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1644
                y += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1645
                cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1646
                x += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1647
                y += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1648
                cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1649
                x += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1650
                if ( nargs == 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1651
                  y += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1652
                cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1653
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1654
              args  += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1655
              phase ^= 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1656
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1657
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1658
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1659
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1660
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1661
        case cff_op_rlinecurve:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1662
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1663
            FT_Int  num_lines;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1664
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1665
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1666
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1667
            FT_TRACE4(( " rlinecurve\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1668
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1669
            if ( num_args < 8 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1670
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1671
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1672
            nargs     = num_args & ~1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1673
            num_lines = ( nargs - 6 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1674
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1675
            if ( cff_builder_start_point( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1676
                 check_points( builder, num_lines + 3 )   )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1677
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1678
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1679
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1680
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1681
            /* first, add the line segments */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1682
            while ( num_lines > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1683
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1684
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1685
              y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1686
              cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1687
              args += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1688
              num_lines--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1689
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1690
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1691
            /* then the curve */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1692
            x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1693
            y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1694
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1695
            x += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1696
            y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1697
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1698
            x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1699
            y += args[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1700
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1701
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1702
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1703
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1704
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1705
        case cff_op_rcurveline:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1706
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1707
            FT_Int  num_curves;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1708
            FT_Int  nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1709
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1710
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1711
            FT_TRACE4(( " rcurveline\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1712
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1713
            if ( num_args < 8 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1714
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1715
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1716
            nargs      = num_args - 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1717
            nargs      = nargs - nargs % 6 + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1718
            num_curves = ( nargs - 2 ) / 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1719
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1720
            if ( cff_builder_start_point ( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1721
                 check_points( builder, num_curves * 3 + 2 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1722
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1723
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1724
            args -= nargs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1725
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1726
            /* first, add the curves */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1727
            while ( num_curves > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1728
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1729
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1730
              y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1731
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1732
              x += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1733
              y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1734
              cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1735
              x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1736
              y += args[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1737
              cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1738
              args += 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1739
              num_curves--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1740
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1741
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1742
            /* then the final line */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1743
            x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1744
            y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1745
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1746
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1747
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1748
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1749
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1750
        case cff_op_hflex1:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1751
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1752
            FT_Pos start_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1753
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1754
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1755
            FT_TRACE4(( " hflex1\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1756
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1757
            /* adding five more points: 4 control points, 1 on-curve point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1758
            /* -- make sure we have enough space for the start point if it */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1759
            /* needs to be added                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1760
            if ( cff_builder_start_point( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1761
                 check_points( builder, 6 )               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1762
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1763
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1764
            /* record the starting point's y position for later use */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1765
            start_y = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1766
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1767
            /* first control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1768
            x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1769
            y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1770
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1771
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1772
            /* second control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1773
            x += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1774
            y += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1775
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1776
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1777
            /* join point; on curve, with y-value the same as the last */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1778
            /* control point's y-value                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1779
            x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1780
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1781
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1782
            /* third control point, with y-value the same as the join */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1783
            /* point's y-value                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1784
            x += args[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1785
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1786
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1787
            /* fourth control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1788
            x += args[6];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1789
            y += args[7];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1790
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1791
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1792
            /* ending point, with y-value the same as the start   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1793
            x += args[8];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1794
            y  = start_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1795
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1796
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1797
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1798
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1799
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1800
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1801
        case cff_op_hflex:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1802
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1803
            FT_Pos start_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1804
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1805
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1806
            FT_TRACE4(( " hflex\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1807
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1808
            /* adding six more points; 4 control points, 2 on-curve points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1809
            if ( cff_builder_start_point( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1810
                 check_points( builder, 6 )               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1811
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1812
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1813
            /* record the starting point's y-position for later use */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1814
            start_y = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1815
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1816
            /* first control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1817
            x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1818
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1819
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1820
            /* second control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1821
            x += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1822
            y += args[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1823
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1824
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1825
            /* join point; on curve, with y-value the same as the last */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1826
            /* control point's y-value                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1827
            x += args[3];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1828
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1829
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1830
            /* third control point, with y-value the same as the join */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1831
            /* point's y-value                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1832
            x += args[4];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1833
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1834
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1835
            /* fourth control point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1836
            x += args[5];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1837
            y  = start_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1838
            cff_builder_add_point( builder, x, y, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1839
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1840
            /* ending point, with y-value the same as the start point's */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1841
            /* y-value -- we don't add this point, though               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1842
            x += args[6];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1843
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1845
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1846
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1847
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1848
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1849
        case cff_op_flex1:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1850
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1851
            FT_Pos     start_x, start_y; /* record start x, y values for */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1852
                                         /* alter use                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1853
            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1854
                                         /* algorithm below              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1855
            FT_Int     horizontal, count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1856
            FT_Fixed*  temp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1857
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1858
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1859
            FT_TRACE4(( " flex1\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1860
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1861
            /* adding six more points; 4 control points, 2 on-curve points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1862
            if ( cff_builder_start_point( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1863
                 check_points( builder, 6 )               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1864
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1865
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1866
            /* record the starting point's x, y position for later use */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1867
            start_x = x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1868
            start_y = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1869
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1870
            /* XXX: figure out whether this is supposed to be a horizontal */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1871
            /*      or vertical flex; the Type 2 specification is vague... */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1872
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1873
            temp = args;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1874
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1875
            /* grab up to the last argument */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1876
            for ( count = 5; count > 0; count-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1877
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1878
              dx += temp[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1879
              dy += temp[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1880
              temp += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1881
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1882
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1883
            if ( dx < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1884
              dx = -dx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1885
            if ( dy < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1886
              dy = -dy;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1887
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1888
            /* strange test, but here it is... */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1889
            horizontal = ( dx > dy );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1890
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1891
            for ( count = 5; count > 0; count-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1892
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1893
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1894
              y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1895
              cff_builder_add_point( builder, x, y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1896
                                     (FT_Bool)( count == 3 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1897
              args += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1898
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1899
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1900
            /* is last operand an x- or y-delta? */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1901
            if ( horizontal )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1902
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1903
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1904
              y  = start_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1905
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1906
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1907
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1908
              x  = start_x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1909
              y += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1910
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1911
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1912
            cff_builder_add_point( builder, x, y, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1914
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1915
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1916
           }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1917
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1918
        case cff_op_flex:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1919
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1920
            FT_UInt  count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1921
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1922
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1923
            FT_TRACE4(( " flex\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1924
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1925
            if ( cff_builder_start_point( builder, x, y ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1926
                 check_points( builder, 6 )               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1927
              goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1928
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1929
            for ( count = 6; count > 0; count-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1930
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1931
              x += args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1932
              y += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1933
              cff_builder_add_point( builder, x, y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1934
                                     (FT_Bool)( count == 4 || count == 1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1935
              args += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1936
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1937
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1938
            args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1939
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1940
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1941
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1942
        case cff_op_seac:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1943
            FT_TRACE4(( " seac\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1944
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1945
            error = cff_operator_seac( decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1946
                                       args[0], args[1], args[2],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1947
                                       (FT_Int)( args[3] >> 16 ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1948
                                       (FT_Int)( args[4] >> 16 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1949
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1950
            /* add current outline to the glyph slot */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1951
            FT_GlyphLoader_Add( builder->loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1952
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1953
            /* return now! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1954
            FT_TRACE4(( "\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1955
            return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1956
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1957
        case cff_op_endchar:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1958
          FT_TRACE4(( " endchar\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1959
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1960
          /* We are going to emulate the seac operator. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1961
          if ( num_args >= 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1962
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1963
            /* Save glyph width so that the subglyphs don't overwrite it. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1964
            FT_Pos  glyph_width = decoder->glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1965
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1966
            error = cff_operator_seac( decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1967
                                       0L, args[-4], args[-3],
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1968
                                       (FT_Int)( args[-2] >> 16 ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1969
                                       (FT_Int)( args[-1] >> 16 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1970
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1971
            decoder->glyph_width = glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1972
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1973
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1974
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1975
            if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1976
              error = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1977
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1978
            cff_builder_close_contour( builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1979
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1980
            /* close hints recording session */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1981
            if ( hinter )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1982
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1983
              if ( hinter->close( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1984
                                  builder->current->n_points ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1985
                goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1986
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1987
              /* apply hints to the loaded glyph outline now */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1988
              hinter->apply( hinter->hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1989
                             builder->current,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1990
                             (PSH_Globals)builder->hints_globals,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1991
                             decoder->hint_mode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1992
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1993
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1994
            /* add current outline to the glyph slot */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1995
            FT_GlyphLoader_Add( builder->loader );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1996
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1997
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1998
          /* return now! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1999
          FT_TRACE4(( "\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2000
          return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2001
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2002
        case cff_op_abs:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2003
          FT_TRACE4(( " abs\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2004
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2005
          if ( args[0] < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2006
            args[0] = -args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2007
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2008
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2009
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2010
        case cff_op_add:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2011
          FT_TRACE4(( " add\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2012
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2013
          args[0] += args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2014
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2015
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2016
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2017
        case cff_op_sub:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2018
          FT_TRACE4(( " sub\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2019
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2020
          args[0] -= args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2021
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2022
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2023
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2024
        case cff_op_div:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2025
          FT_TRACE4(( " div\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2026
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2027
          args[0] = FT_DivFix( args[0], args[1] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2028
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2029
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2030
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2031
        case cff_op_neg:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2032
          FT_TRACE4(( " neg\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2033
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2034
          args[0] = -args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2035
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2036
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2037
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2038
        case cff_op_random:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2039
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2040
            FT_Fixed  Rand;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2041
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2042
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2043
            FT_TRACE4(( " rand\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2044
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2045
            Rand = seed;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2046
            if ( Rand >= 0x8000L )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2047
              Rand++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2048
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2049
            args[0] = Rand;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2050
            seed    = FT_MulFix( seed, 0x10000L - seed );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2051
            if ( seed == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2052
              seed += 0x2873;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2053
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2054
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2055
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2056
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2057
        case cff_op_mul:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2058
          FT_TRACE4(( " mul\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2059
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2060
          args[0] = FT_MulFix( args[0], args[1] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2061
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2062
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2063
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2064
        case cff_op_sqrt:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2065
          FT_TRACE4(( " sqrt\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2066
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2067
          if ( args[0] > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2068
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2069
            FT_Int    count = 9;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2070
            FT_Fixed  root  = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2071
            FT_Fixed  new_root;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2072
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2073
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2074
            for (;;)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2075
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2076
              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2077
              if ( new_root == root || count <= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2078
                break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2079
              root = new_root;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2080
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2081
            args[0] = new_root;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2082
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2083
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2084
            args[0] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2085
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2086
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2087
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2088
        case cff_op_drop:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2089
          /* nothing */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2090
          FT_TRACE4(( " drop\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2091
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2092
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2093
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2094
        case cff_op_exch:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2095
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2096
            FT_Fixed  tmp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2097
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2098
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2099
            FT_TRACE4(( " exch\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2100
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2101
            tmp     = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2102
            args[0] = args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2103
            args[1] = tmp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2104
            args   += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2105
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2106
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2107
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2108
        case cff_op_index:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2109
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2110
            FT_Int  idx = (FT_Int)( args[0] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2111
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2112
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2113
            FT_TRACE4(( " index\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2114
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2115
            if ( idx < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2116
              idx = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2117
            else if ( idx > num_args - 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2118
              idx = num_args - 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2119
            args[0] = args[-( idx + 1 )];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2120
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2121
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2122
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2123
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2124
        case cff_op_roll:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2125
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2126
            FT_Int  count = (FT_Int)( args[0] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2127
            FT_Int  idx   = (FT_Int)( args[1] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2128
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2129
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2130
            FT_TRACE4(( " roll\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2131
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2132
            if ( count <= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2133
              count = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2134
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2135
            args -= count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2136
            if ( args < stack )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2137
              goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2138
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2139
            if ( idx >= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2140
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2141
              while ( idx > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2142
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2143
                FT_Fixed  tmp = args[count - 1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2144
                FT_Int    i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2145
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2146
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2147
                for ( i = count - 2; i >= 0; i-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2148
                  args[i + 1] = args[i];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2149
                args[0] = tmp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2150
                idx--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2151
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2152
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2153
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2154
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2155
              while ( idx < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2156
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2157
                FT_Fixed  tmp = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2158
                FT_Int    i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2159
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2160
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2161
                for ( i = 0; i < count - 1; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2162
                  args[i] = args[i + 1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2163
                args[count - 1] = tmp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2164
                idx++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2165
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2166
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2167
            args += count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2168
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2169
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2171
        case cff_op_dup:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2172
          FT_TRACE4(( " dup\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2173
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2174
          args[1] = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2175
          args += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2176
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2177
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2178
        case cff_op_put:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2179
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2180
            FT_Fixed  val = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2181
            FT_Int    idx = (FT_Int)( args[1] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2182
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2183
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2184
            FT_TRACE4(( " put\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2186
            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2187
              decoder->buildchar[idx] = val;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2188
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2189
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2190
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2191
        case cff_op_get:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2192
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2193
            FT_Int    idx = (FT_Int)( args[0] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2194
            FT_Fixed  val = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2195
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2196
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2197
            FT_TRACE4(( " get\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2198
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2199
            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2200
              val = decoder->buildchar[idx];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2201
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2202
            args[0] = val;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2203
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2204
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2205
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2206
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2207
        case cff_op_store:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2208
          FT_TRACE4(( " store\n"));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2209
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2210
          goto Unimplemented;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2211
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2212
        case cff_op_load:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2213
          FT_TRACE4(( " load\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2214
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2215
          goto Unimplemented;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2216
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2217
        case cff_op_dotsection:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2218
          /* this operator is deprecated and ignored by the parser */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2219
          FT_TRACE4(( " dotsection\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2220
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2221
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2222
        case cff_op_closepath:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2223
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2224
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2225
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2226
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2227
          FT_TRACE4(( " closepath (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2228
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2229
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2230
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2231
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2232
        case cff_op_hsbw:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2233
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2234
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2235
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2236
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2237
          FT_TRACE4(( " hsbw (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2238
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2239
          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2240
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2241
          decoder->builder.left_bearing.x = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2242
          decoder->builder.left_bearing.y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2243
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2244
          x    = decoder->builder.pos_x + args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2245
          y    = decoder->builder.pos_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2246
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2247
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2248
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2249
        case cff_op_sbw:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2250
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2251
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2252
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2253
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2254
          FT_TRACE4(( " sbw (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2255
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2256
          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2257
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2258
          decoder->builder.left_bearing.x = args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2259
          decoder->builder.left_bearing.y = args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2260
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2261
          x    = decoder->builder.pos_x + args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2262
          y    = decoder->builder.pos_y + args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2263
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2264
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2265
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2266
        case cff_op_setcurrentpoint:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2267
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2268
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2269
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2270
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2271
          FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2272
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2273
          x    = decoder->builder.pos_x + args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2274
          y    = decoder->builder.pos_y + args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2275
          args = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2276
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2277
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2278
        case cff_op_callothersubr:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2279
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2280
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2281
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2282
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2283
          FT_TRACE4(( " callothersubr (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2284
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2285
          /* subsequent `pop' operands should add the arguments,       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2286
          /* this is the implementation described for `unknown' other  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2287
          /* subroutines in the Type1 spec.                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2288
          /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2289
          /* XXX Fix return arguments (see discussion below).          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2290
          args -= 2 + ( args[-2] >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2291
          if ( args < stack )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2292
            goto Stack_Underflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2293
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2294
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2295
        case cff_op_pop:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2296
          /* this is an invalid Type 2 operator; however, there        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2297
          /* exist fonts which are incorrectly converted from probably */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2298
          /* Type 1 to CFF, and some parsers seem to accept it         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2299
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2300
          FT_TRACE4(( " pop (invalid op)\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2301
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2302
          /* XXX Increasing `args' is wrong: After a certain number of */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2303
          /* `pop's we get a stack overflow.  Reason for doing it is   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2304
          /* code like this (actually found in a CFF font):            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2305
          /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2306
          /*   17 1 3 callothersubr                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2307
          /*   pop                                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2308
          /*   callsubr                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2309
          /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2310
          /* Since we handle `callothersubr' as a no-op, and           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2311
          /* `callsubr' needs at least one argument, `pop' can't be a  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2312
          /* no-op too as it basically should be.                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2313
          /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2314
          /* The right solution would be to provide real support for   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2315
          /* `callothersubr' as done in `t1decode.c', however, given   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2316
          /* the fact that CFF fonts with `pop' are invalid, it is     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2317
          /* questionable whether it is worth the time.                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2318
          args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2319
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2320
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2321
        case cff_op_and:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2322
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2323
            FT_Fixed  cond = args[0] && args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2324
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2325
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2326
            FT_TRACE4(( " and\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2327
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2328
            args[0] = cond ? 0x10000L : 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2329
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2330
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2331
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2332
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2333
        case cff_op_or:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2334
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2335
            FT_Fixed  cond = args[0] || args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2336
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2337
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2338
            FT_TRACE4(( " or\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2339
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2340
            args[0] = cond ? 0x10000L : 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2341
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2342
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2343
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2344
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2345
        case cff_op_eq:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2346
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2347
            FT_Fixed  cond = !args[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2348
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2350
            FT_TRACE4(( " eq\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2351
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2352
            args[0] = cond ? 0x10000L : 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2353
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2354
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2355
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2356
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2357
        case cff_op_ifelse:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2358
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2359
            FT_Fixed  cond = ( args[2] <= args[3] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2360
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2361
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2362
            FT_TRACE4(( " ifelse\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2363
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2364
            if ( !cond )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2365
              args[0] = args[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2366
            args++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2367
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2368
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2369
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2370
        case cff_op_callsubr:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2371
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2372
            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2373
                                      decoder->locals_bias );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2374
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2375
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2376
            FT_TRACE4(( " callsubr(%d)\n", idx ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2377
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2378
            if ( idx >= decoder->num_locals )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2379
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2380
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2381
                         " invalid local subr index\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2382
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2383
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2384
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2385
            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2386
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2387
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2388
                         " too many nested subrs\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2389
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2390
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2391
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2392
            zone->cursor = ip;  /* save current instruction pointer */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2393
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2394
            zone++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2395
            zone->base   = decoder->locals[idx];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2396
            zone->limit  = decoder->locals[idx + 1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2397
            zone->cursor = zone->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2398
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2399
            if ( !zone->base || zone->limit == zone->base )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2400
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2401
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2402
                         " invoking empty subrs\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2403
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2404
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2405
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2406
            decoder->zone = zone;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2407
            ip            = zone->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2408
            limit         = zone->limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2409
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2410
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2411
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2412
        case cff_op_callgsubr:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2413
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2414
            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2415
                                      decoder->globals_bias );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2416
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2417
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2418
            FT_TRACE4(( " callgsubr(%d)\n", idx ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2419
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2420
            if ( idx >= decoder->num_globals )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2421
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2422
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2423
                         " invalid global subr index\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2424
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2425
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2426
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2427
            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2428
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2429
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2430
                         " too many nested subrs\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2431
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2432
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2433
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2434
            zone->cursor = ip;  /* save current instruction pointer */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2435
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2436
            zone++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2437
            zone->base   = decoder->globals[idx];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2438
            zone->limit  = decoder->globals[idx + 1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2439
            zone->cursor = zone->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2440
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2441
            if ( !zone->base || zone->limit == zone->base )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2442
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2443
              FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2444
                         " invoking empty subrs\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2445
              goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2446
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2447
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2448
            decoder->zone = zone;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2449
            ip            = zone->base;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2450
            limit         = zone->limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2451
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2452
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2453
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2454
        case cff_op_return:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2455
          FT_TRACE4(( " return\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2456
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2457
          if ( decoder->zone <= decoder->zones )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2458
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2459
            FT_ERROR(( "cff_decoder_parse_charstrings:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2460
                       " unexpected return\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2461
            goto Syntax_Error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2462
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2463
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2464
          decoder->zone--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2465
          zone  = decoder->zone;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2466
          ip    = zone->cursor;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2467
          limit = zone->limit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2468
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2469
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2470
        default:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2471
        Unimplemented:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2472
          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2473
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2474
          if ( ip[-1] == 12 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2475
            FT_ERROR(( " %d", ip[0] ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2476
          FT_ERROR(( "\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2477
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2478
          return CFF_Err_Unimplemented_Feature;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2479
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2480
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2481
        decoder->top = args;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2483
        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2484
          goto Stack_Overflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2485
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2486
      } /* general operator processing */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2487
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2488
    } /* while ip < limit */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2489
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2490
    FT_TRACE4(( "..end..\n\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2491
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2492
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2493
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2494
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2495
  Syntax_Error:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2496
    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2497
    return CFF_Err_Invalid_File_Format;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2498
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2499
  Stack_Underflow:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2500
    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2501
    return CFF_Err_Too_Few_Arguments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2502
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2503
  Stack_Overflow:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2504
    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2505
    return CFF_Err_Stack_Overflow;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2506
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2507
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2508
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2509
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2510
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2511
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2512
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2513
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2514
  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2515
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2516
  /**********    The following code is in charge of computing      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2517
  /**********    the maximum advance width of the font.  It        *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2518
  /**********    quickly processes each glyph charstring to        *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2519
  /**********    extract the value from either a `sbw' or `seac'   *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2520
  /**********    operator.                                         *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2521
  /**********                                                      *********/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2522
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2523
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2524
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2525
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2526
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2527
#if 0 /* unused until we support pure CFF fonts */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2528
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2529
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2530
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2531
  cff_compute_max_advance( TT_Face  face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2532
                           FT_Int*  max_advance )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2533
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2534
    FT_Error     error = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2535
    CFF_Decoder  decoder;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2536
    FT_Int       glyph_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2537
    CFF_Font     cff = (CFF_Font)face->other;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2538
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2539
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2540
    *max_advance = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2541
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2542
    /* Initialize load decoder */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2543
    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2544
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2545
    decoder.builder.metrics_only = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2546
    decoder.builder.load_points  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2547
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2548
    /* For each glyph, parse the glyph charstring and extract */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2549
    /* the advance width.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2550
    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2551
          glyph_index++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2552
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2553
      FT_Byte*  charstring;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2554
      FT_ULong  charstring_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2555
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2556
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2557
      /* now get load the unscaled outline */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2558
      error = cff_get_glyph_data( face, glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2559
                                  &charstring, &charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2560
      if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2561
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2562
        error = cff_decoder_prepare( &decoder, size, glyph_index );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2563
        if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2564
          error = cff_decoder_parse_charstrings( &decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2565
                                                 charstring,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2566
                                                 charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2567
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2568
        cff_free_glyph_data( face, &charstring, &charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2569
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2570
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2571
      /* ignore the error if one has occurred -- skip to next glyph */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2572
      error = CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2573
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2574
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2575
    *max_advance = decoder.builder.advance.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2576
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2577
    return CFF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2578
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2579
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2580
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2581
#endif /* 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2582
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2583
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2584
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2585
  cff_slot_load( CFF_GlyphSlot  glyph,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2586
                 CFF_Size       size,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2587
                 FT_UInt        glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2588
                 FT_Int32       load_flags )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2589
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2590
    FT_Error     error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2591
    CFF_Decoder  decoder;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2592
    TT_Face      face = (TT_Face)glyph->root.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2593
    FT_Bool      hinting, force_scaling;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2594
    CFF_Font     cff  = (CFF_Font)face->extra.data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2595
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2596
    FT_Matrix    font_matrix;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2597
    FT_Vector    font_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2598
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2599
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2600
    force_scaling = FALSE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2601
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2602
    /* in a CID-keyed font, consider `glyph_index' as a CID and map */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2603
    /* it immediately to the real glyph_index -- if it isn't a      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2604
    /* subsetted font, glyph_indices and CIDs are identical, though */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2605
    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2606
         cff->charset.cids                               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2607
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2608
      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2609
      if ( glyph_index != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2610
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2611
        glyph_index = cff_charset_cid_to_gindex( &cff->charset,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2612
                                                 glyph_index );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2613
        if ( glyph_index == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2614
          return CFF_Err_Invalid_Argument;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2615
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2616
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2617
    else if ( glyph_index >= cff->num_glyphs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2618
      return CFF_Err_Invalid_Argument;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2619
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2620
    if ( load_flags & FT_LOAD_NO_RECURSE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2621
      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2622
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2623
    glyph->x_scale = 0x10000L;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2624
    glyph->y_scale = 0x10000L;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2625
    if ( size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2626
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2627
      glyph->x_scale = size->root.metrics.x_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2628
      glyph->y_scale = size->root.metrics.y_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2629
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2630
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2631
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2632
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2633
    /* try to load embedded bitmap if any              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2634
    /*                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2635
    /* XXX: The convention should be emphasized in     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2636
    /*      the documents because it can be confusing. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2637
    if ( size )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2638
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2639
      CFF_Face      cff_face = (CFF_Face)size->root.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2640
      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2641
      FT_Stream     stream   = cff_face->root.stream;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2642
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2643
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2644
      if ( size->strike_index != 0xFFFFFFFFUL      &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2645
           sfnt->load_eblc                         &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2646
           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2647
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2648
        TT_SBit_MetricsRec  metrics;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2649
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2650
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2651
        error = sfnt->load_sbit_image( face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2652
                                       size->strike_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2653
                                       glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2654
                                       (FT_Int)load_flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2655
                                       stream,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2656
                                       &glyph->root.bitmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2657
                                       &metrics );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2658
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2659
        if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2660
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2661
          glyph->root.outline.n_points   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2662
          glyph->root.outline.n_contours = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2663
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2664
          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2665
          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2666
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2667
          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2668
          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2669
          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2670
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2671
          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2672
          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2673
          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2674
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2675
          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2676
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2677
          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2678
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2679
            glyph->root.bitmap_left = metrics.vertBearingX;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2680
            glyph->root.bitmap_top  = metrics.vertBearingY;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2681
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2682
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2683
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2684
            glyph->root.bitmap_left = metrics.horiBearingX;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2685
            glyph->root.bitmap_top  = metrics.horiBearingY;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2686
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2687
          return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2688
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2689
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2690
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2691
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2692
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2693
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2694
    /* return immediately if we only want the embedded bitmaps */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2695
    if ( load_flags & FT_LOAD_SBITS_ONLY )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2696
      return CFF_Err_Invalid_Argument;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2697
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2698
    /* if we have a CID subfont, use its matrix (which has already */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2699
    /* been multiplied with the root matrix)                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2700
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2701
    /* this scaling is only relevant if the PS hinter isn't active */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2702
    if ( cff->num_subfonts )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2703
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2704
      FT_ULong  top_upm, sub_upm;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2705
      FT_Byte   fd_index = cff_fd_select_get( &cff->fd_select,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2706
                                              glyph_index );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2707
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2708
      if ( fd_index >= cff->num_subfonts ) 
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2709
        fd_index = cff->num_subfonts - 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2710
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2711
      top_upm = cff->top_font.font_dict.units_per_em;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2712
      sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2713
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2714
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2715
      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2716
      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2717
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2718
      if ( top_upm != sub_upm )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2719
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2720
        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2721
        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2722
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2723
        force_scaling = TRUE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2724
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2725
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2726
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2727
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2728
      font_matrix = cff->top_font.font_dict.font_matrix;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2729
      font_offset = cff->top_font.font_dict.font_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2730
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2731
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2732
    glyph->root.outline.n_points   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2733
    glyph->root.outline.n_contours = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2734
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2735
    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2736
                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2737
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2738
    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2739
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2740
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2741
      FT_Byte*  charstring;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2742
      FT_ULong  charstring_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2743
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2744
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2745
      cff_decoder_init( &decoder, face, size, glyph, hinting,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2746
                        FT_LOAD_TARGET_MODE( load_flags ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2747
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2748
      if ( load_flags & FT_LOAD_ADVANCE_ONLY )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2749
        decoder.width_only = TRUE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2750
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2751
      decoder.builder.no_recurse =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2752
        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2753
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2754
      /* now load the unscaled outline */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2755
      error = cff_get_glyph_data( face, glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2756
                                  &charstring, &charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2757
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2758
        goto Glyph_Build_Finished;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2759
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2760
      error = cff_decoder_prepare( &decoder, size, glyph_index );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2761
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2762
        goto Glyph_Build_Finished;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2763
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2764
      error = cff_decoder_parse_charstrings( &decoder,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2765
                                             charstring,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2766
                                             charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2767
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2768
      cff_free_glyph_data( face, &charstring, charstring_len );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2769
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2770
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2771
        goto Glyph_Build_Finished;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2772
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2773
#ifdef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2774
      /* Control data and length may not be available for incremental */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2775
      /* fonts.                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2776
      if ( face->root.internal->incremental_interface )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2777
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2778
        glyph->root.control_data = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2779
        glyph->root.control_len = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2780
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2781
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2782
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2783
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2784
      /* We set control_data and control_len if charstrings is loaded. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2785
      /* See how charstring loads at cff_index_access_element() in     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2786
      /* cffload.c.                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2787
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2788
        CFF_Index  csindex = &cff->charstrings_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2789
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2790
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2791
        if ( csindex->offsets )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2792
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2793
          glyph->root.control_data = csindex->bytes +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2794
                                     csindex->offsets[glyph_index] - 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2795
          glyph->root.control_len  = charstring_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2796
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2797
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2798
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2799
  Glyph_Build_Finished:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2800
      /* save new glyph tables, if no error */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2801
      if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2802
        cff_builder_done( &decoder.builder );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2803
      /* XXX: anything to do for broken glyph entry? */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2804
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2805
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2806
#ifdef FT_CONFIG_OPTION_INCREMENTAL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2807
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2808
    /* Incremental fonts can optionally override the metrics. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2809
    if ( !error                                                               &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2810
         face->root.internal->incremental_interface                           &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2811
         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2812
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2813
      FT_Incremental_MetricsRec  metrics;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2814
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2815
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2816
      metrics.bearing_x = decoder.builder.left_bearing.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2817
      metrics.bearing_y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2818
      metrics.advance   = decoder.builder.advance.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2819
      metrics.advance_v = decoder.builder.advance.y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2820
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2821
      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2822
                face->root.internal->incremental_interface->object,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2823
                glyph_index, FALSE, &metrics );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2824
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2825
      decoder.builder.left_bearing.x = metrics.bearing_x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2826
      decoder.builder.advance.x      = metrics.advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2827
      decoder.builder.advance.y      = metrics.advance_v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2828
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2829
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2830
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2831
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2832
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2833
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2834
      /* Now, set the metrics -- this is rather simple, as   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2835
      /* the left side bearing is the xMin, and the top side */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2836
      /* bearing the yMax.                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2837
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2838
      /* For composite glyphs, return only left side bearing and */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2839
      /* advance width.                                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2840
      if ( load_flags & FT_LOAD_NO_RECURSE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2841
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2842
        FT_Slot_Internal  internal = glyph->root.internal;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2843
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2845
        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2846
        glyph->root.metrics.horiAdvance  = decoder.glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2847
        internal->glyph_matrix           = font_matrix;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2848
        internal->glyph_delta            = font_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2849
        internal->glyph_transformed      = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2850
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2851
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2852
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2853
        FT_BBox            cbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2854
        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2855
        FT_Vector          advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2856
        FT_Bool            has_vertical_info;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2857
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2858
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2859
        /* copy the _unscaled_ advance width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2860
        metrics->horiAdvance                    = decoder.glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2861
        glyph->root.linearHoriAdvance           = decoder.glyph_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2862
        glyph->root.internal->glyph_transformed = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2863
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2864
#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2865
        has_vertical_info = FT_BOOL( face->vertical_info                   &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2866
                                     face->vertical.number_Of_VMetrics > 0 &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2867
                                     face->vertical.long_metrics           );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2868
#else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2869
        has_vertical_info = FT_BOOL( face->vertical_info                   &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2870
                                     face->vertical.number_Of_VMetrics > 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2871
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2872
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2873
        /* get the vertical metrics from the vtmx table if we have one */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2874
        if ( has_vertical_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2875
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2876
          FT_Short   vertBearingY = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2877
          FT_UShort  vertAdvance  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2878
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2879
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2880
          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2881
                                                     glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2882
                                                     &vertBearingY,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2883
                                                     &vertAdvance );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2884
          metrics->vertBearingY = vertBearingY;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2885
          metrics->vertAdvance  = vertAdvance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2886
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2887
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2888
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2889
          /* make up vertical ones */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2890
          if ( face->os2.version != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2891
            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2892
                                             face->os2.sTypoDescender );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2893
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2894
            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2895
                                             face->horizontal.Descender );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2896
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2897
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2898
        glyph->root.linearVertAdvance = metrics->vertAdvance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2899
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2900
        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2901
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2902
        glyph->root.outline.flags = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2903
        if ( size && size->root.metrics.y_ppem < 24 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2904
          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2905
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2906
        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2907
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2908
        if ( !( font_matrix.xx == 0x10000L &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2909
                font_matrix.yy == 0x10000L &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2910
                font_matrix.xy == 0        &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2911
                font_matrix.yx == 0        ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2912
          FT_Outline_Transform( &glyph->root.outline, &font_matrix );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2914
        if ( !( font_offset.x == 0 &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2915
                font_offset.y == 0 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2916
          FT_Outline_Translate( &glyph->root.outline,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2917
                                font_offset.x, font_offset.y );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2918
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2919
        advance.x = metrics->horiAdvance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2920
        advance.y = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2921
        FT_Vector_Transform( &advance, &font_matrix );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2922
        metrics->horiAdvance = advance.x + font_offset.x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2923
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2924
        advance.x = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2925
        advance.y = metrics->vertAdvance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2926
        FT_Vector_Transform( &advance, &font_matrix );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2927
        metrics->vertAdvance = advance.y + font_offset.y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2928
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2929
        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2930
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2931
          /* scale the outline and the metrics */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2932
          FT_Int       n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2933
          FT_Outline*  cur     = &glyph->root.outline;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2934
          FT_Vector*   vec     = cur->points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2935
          FT_Fixed     x_scale = glyph->x_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2936
          FT_Fixed     y_scale = glyph->y_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2937
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2938
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2939
          /* First of all, scale the points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2940
          if ( !hinting || !decoder.builder.hints_funcs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2941
            for ( n = cur->n_points; n > 0; n--, vec++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2942
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2943
              vec->x = FT_MulFix( vec->x, x_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2944
              vec->y = FT_MulFix( vec->y, y_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2945
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2946
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2947
          /* Then scale the metrics */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2948
          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2949
          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2950
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2951
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2952
        /* compute the other metrics */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2953
        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2954
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2955
        metrics->width  = cbox.xMax - cbox.xMin;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2956
        metrics->height = cbox.yMax - cbox.yMin;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2957
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2958
        metrics->horiBearingX = cbox.xMin;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2959
        metrics->horiBearingY = cbox.yMax;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2960
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2961
        if ( has_vertical_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2962
          metrics->vertBearingX = metrics->horiBearingX -
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2963
                                    metrics->horiAdvance / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2964
        else 
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2965
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2966
          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2967
            ft_synthesize_vertical_metrics( metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2968
                                            metrics->vertAdvance );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2969
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2970
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2971
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2972
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2973
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2974
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2975
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2976
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2977
/* END */