misc/libfreetype/src/base/ftbbox.c
author belphegorr <szabibibi@gmail.com>
Mon, 23 Jul 2012 19:15:59 +0300
changeset 7263 644eabbc9218
parent 5172 88f2e05288ba
permissions -rw-r--r--
Added a new function: AddNewEvent, which only adds an event to the list if it doesn't already exist. Kept the old one as it might me useful to be able to add an event more than once.
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
/*  ftbbox.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
/*    FreeType bbox computation (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-2001, 2002, 2004, 2006, 2010 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
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    20
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    21
  /* This component has a _single_ role: to compute exact outline bounding */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    22
  /* boxes.                                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    23
  /*                                                                       */
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    26
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    27
#include <ft2build.h>
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    28
#include FT_BBOX_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    29
#include FT_IMAGE_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    30
#include FT_OUTLINE_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    31
#include FT_INTERNAL_CALC_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    32
#include FT_INTERNAL_OBJECTS_H
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    35
  typedef struct  TBBox_Rec_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    36
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    37
    FT_Vector  last;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    38
    FT_BBox    bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    39
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    40
  } TBBox_Rec;
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
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
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    45
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    46
  /*    BBox_Move_To                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    47
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    48
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    49
  /*    This function is used as a `move_to' and `line_to' emitter during  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    50
  /*    FT_Outline_Decompose().  It simply records the destination point   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    51
  /*    in `user->last'; no further computations are necessary since we    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    52
  /*    use the cbox as the starting bbox which must be refined.           */
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
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    55
  /*    to   :: A pointer to the destination vector.                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    56
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    57
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    58
  /*    user :: A pointer to the current walk context.                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    59
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    60
  /* <Return>                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    61
  /*    Always 0.  Needed for the interface only.                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    62
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    63
  static int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    64
  BBox_Move_To( FT_Vector*  to,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    65
                TBBox_Rec*  user )
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
    user->last = *to;
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
    return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    70
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    71
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    72
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    73
#define CHECK_X( p, bbox )  \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    74
          ( p->x < bbox.xMin || p->x > bbox.xMax )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    75
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    76
#define CHECK_Y( p, bbox )  \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    77
          ( p->y < bbox.yMin || p->y > bbox.yMax )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    78
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    79
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    80
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    81
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    82
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    83
  /*    BBox_Conic_Check                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    84
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    85
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    86
  /*    Finds the extrema of a 1-dimensional conic Bezier curve and update */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    87
  /*    a bounding range.  This version uses direct computation, as it     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    88
  /*    doesn't need square roots.                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    89
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    90
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    91
  /*    y1  :: The start coordinate.                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    92
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    93
  /*    y2  :: The coordinate of the control point.                        */
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
  /*    y3  :: The end coordinate.                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    96
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    97
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    98
  /*    min :: The address of the current minimum.                         */
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
  /*    max :: The address of the current maximum.                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   101
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   102
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   103
  BBox_Conic_Check( FT_Pos   y1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   104
                    FT_Pos   y2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   105
                    FT_Pos   y3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   106
                    FT_Pos*  min,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   107
                    FT_Pos*  max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   108
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   109
    if ( y1 <= y3 && y2 == y1 )     /* flat arc */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   110
      goto Suite;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   111
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   112
    if ( y1 < y3 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   113
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   114
      if ( y2 >= y1 && y2 <= y3 )   /* ascending arc */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   115
        goto Suite;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   116
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   117
    else
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
      if ( y2 >= y3 && y2 <= y1 )   /* descending arc */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   120
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   121
        y2 = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   122
        y1 = y3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   123
        y3 = y2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   124
        goto Suite;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   125
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   126
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   127
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   128
    y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   129
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   130
  Suite:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   131
    if ( y1 < *min ) *min = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   132
    if ( y3 > *max ) *max = y3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   133
  }
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
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
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   138
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   139
  /*    BBox_Conic_To                                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   140
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   141
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   142
  /*    This function is used as a `conic_to' emitter during               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   143
  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   144
  /*    current bounding box, and computes its extrema if necessary to     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   145
  /*    update it.                                                         */
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
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   148
  /*    control :: A pointer to a control point.                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   149
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   150
  /*    to      :: A pointer to the destination vector.                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   151
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   152
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   153
  /*    user    :: The address of the current walk context.                */
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
  /* <Return>                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   156
  /*    Always 0.  Needed for the interface only.                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   157
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   158
  /* <Note>                                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   159
  /*    In the case of a non-monotonous arc, we compute directly the       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   160
  /*    extremum coordinates, as it is sufficiently fast.                  */
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
  static int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   163
  BBox_Conic_To( FT_Vector*  control,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   164
                 FT_Vector*  to,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   165
                 TBBox_Rec*  user )
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
    /* we don't need to check `to' since it is always an `on' point, thus */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   168
    /* within the bbox                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   169
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   170
    if ( CHECK_X( control, user->bbox ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   171
      BBox_Conic_Check( user->last.x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   172
                        control->x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   173
                        to->x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   174
                        &user->bbox.xMin,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   175
                        &user->bbox.xMax );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   176
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   177
    if ( CHECK_Y( control, user->bbox ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   178
      BBox_Conic_Check( user->last.y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   179
                        control->y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   180
                        to->y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   181
                        &user->bbox.yMin,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   182
                        &user->bbox.yMax );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   183
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   184
    user->last = *to;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   186
    return 0;
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   189
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   190
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   191
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   192
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   193
  /*    BBox_Cubic_Check                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   194
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   195
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   196
  /*    Finds the extrema of a 1-dimensional cubic Bezier curve and        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   197
  /*    updates a bounding range.  This version uses splitting because we  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   198
  /*    don't want to use square roots and extra accuracy.                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   199
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   200
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   201
  /*    p1  :: The start coordinate.                                       */
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
  /*    p2  :: The coordinate of the first control point.                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   204
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   205
  /*    p3  :: The coordinate of the second control point.                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   206
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   207
  /*    p4  :: The end coordinate.                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   208
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   209
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   210
  /*    min :: The address of the current minimum.                         */
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
  /*    max :: The address of the current maximum.                         */
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
#if 0
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
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   218
  BBox_Cubic_Check( FT_Pos   p1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   219
                    FT_Pos   p2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   220
                    FT_Pos   p3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   221
                    FT_Pos   p4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   222
                    FT_Pos*  min,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   223
                    FT_Pos*  max )
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
    FT_Pos  stack[32*3 + 1], *arc;
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
    arc = stack;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   229
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   230
    arc[0] = p1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   231
    arc[1] = p2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   232
    arc[2] = p3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   233
    arc[3] = p4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   234
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   235
    do
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
      FT_Pos  y1 = arc[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   238
      FT_Pos  y2 = arc[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   239
      FT_Pos  y3 = arc[2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   240
      FT_Pos  y4 = arc[3];
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   243
      if ( y1 == y4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   244
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   245
        if ( y1 == y2 && y1 == y3 )                         /* flat */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   246
          goto Test;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   247
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   248
      else if ( y1 < y4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   249
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   250
        if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   251
          goto Test;
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
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   254
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   255
        if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   256
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   257
          y2 = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   258
          y1 = y4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   259
          y4 = y2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   260
          goto Test;
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
      }
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
      /* unknown direction -- split the arc in two */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   265
      arc[6] = y4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   266
      arc[1] = y1 = ( y1 + y2 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   267
      arc[5] = y4 = ( y4 + y3 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   268
      y2 = ( y2 + y3 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   269
      arc[2] = y1 = ( y1 + y2 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   270
      arc[4] = y4 = ( y4 + y2 ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   271
      arc[3] = ( y1 + y4 ) / 2;
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
      arc += 3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   274
      goto Suite;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   275
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   276
   Test:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   277
      if ( y1 < *min ) *min = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   278
      if ( y4 > *max ) *max = y4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   279
      arc -= 3;
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
    Suite:
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
    } while ( arc >= stack );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   284
  }
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
#else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   287
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   288
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   289
  test_cubic_extrema( FT_Pos    y1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   290
                      FT_Pos    y2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   291
                      FT_Pos    y3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   292
                      FT_Pos    y4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   293
                      FT_Fixed  u,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   294
                      FT_Pos*   min,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   295
                      FT_Pos*   max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   296
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   297
 /* FT_Pos    a = y4 - 3*y3 + 3*y2 - y1; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   298
    FT_Pos    b = y3 - 2*y2 + y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   299
    FT_Pos    c = y2 - y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   300
    FT_Pos    d = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   301
    FT_Pos    y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   302
    FT_Fixed  uu;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   303
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   304
    FT_UNUSED ( y4 );
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   307
    /* The polynomial is                      */
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
    /*    P(x) = a*x^3 + 3b*x^2 + 3c*x + d  , */
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
    /*   dP/dx = 3a*x^2 + 6b*x + 3c         . */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   312
    /*                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   313
    /* However, we also have                  */
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
    /*   dP/dx(u) = 0                       , */
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
    /* which implies by subtraction that      */
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
    /*   P(u) = b*u^2 + 2c*u + d            . */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   320
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   321
    if ( u > 0 && u < 0x10000L )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   322
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   323
      uu = FT_MulFix( u, u );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   324
      y  = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );
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
      if ( y < *min ) *min = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   327
      if ( y > *max ) *max = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   328
    }
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
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
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   333
  BBox_Cubic_Check( FT_Pos   y1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   334
                    FT_Pos   y2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   335
                    FT_Pos   y3,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   336
                    FT_Pos   y4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   337
                    FT_Pos*  min,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   338
                    FT_Pos*  max )
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
    /* always compare first and last points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   341
    if      ( y1 < *min )  *min = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   342
    else if ( y1 > *max )  *max = y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   343
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   344
    if      ( y4 < *min )  *min = y4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   345
    else if ( y4 > *max )  *max = y4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   346
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   347
    /* now, try to see if there are split points here */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   348
    if ( y1 <= y4 )
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
      /* flat or ascending arc test */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   351
      if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   352
        return;
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
    else /* y1 > y4 */
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
      /* descending arc test */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   357
      if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   358
        return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   359
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   360
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   361
    /* There are some split points.  Find them. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   362
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   363
      FT_Pos    a = y4 - 3*y3 + 3*y2 - y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   364
      FT_Pos    b = y3 - 2*y2 + y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   365
      FT_Pos    c = y2 - y1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   366
      FT_Pos    d;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   367
      FT_Fixed  t;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   368
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
      /* We need to solve `ax^2+2bx+c' here, without floating points!      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   371
      /* The trick is to normalize to a different representation in order  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   372
      /* to use our 16.16 fixed point routines.                            */
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
      /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   375
      /* These values must fit into a single 16.16 value.                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   376
      /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   377
      /* We normalize a, b, and c to `8.16' fixed float values to ensure   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   378
      /* that its product is held in a `16.16' value.                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   379
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   380
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   381
        FT_ULong  t1, t2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   382
        int       shift = 0;
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   385
        /* The following computation is based on the fact that for   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   386
        /* any value `y', if `n' is the position of the most         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   387
        /* significant bit of `abs(y)' (starting from 0 for the      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   388
        /* least significant bit), then `y' is in the range          */
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
        /*   -2^n..2^n-1                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   391
        /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   392
        /* We want to shift `a', `b', and `c' concurrently in order  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   393
        /* to ensure that they all fit in 8.16 values, which maps    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   394
        /* to the integer range `-2^23..2^23-1'.                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   395
        /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   396
        /* Necessarily, we need to shift `a', `b', and `c' so that   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   397
        /* the most significant bit of its absolute values is at     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   398
        /* _most_ at position 23.                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   399
        /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   400
        /* We begin by computing `t1' as the bitwise `OR' of the     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   401
        /* absolute values of `a', `b', `c'.                         */
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
        t1  = (FT_ULong)( ( a >= 0 ) ? a : -a );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   404
        t2  = (FT_ULong)( ( b >= 0 ) ? b : -b );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   405
        t1 |= t2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   406
        t2  = (FT_ULong)( ( c >= 0 ) ? c : -c );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   407
        t1 |= t2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   408
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   409
        /* Now we can be sure that the most significant bit of `t1'  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   410
        /* is the most significant bit of either `a', `b', or `c',   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   411
        /* depending on the greatest integer range of the particular */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   412
        /* variable.                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   413
        /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   414
        /* Next, we compute the `shift', by shifting `t1' as many    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   415
        /* times as necessary to move its MSB to position 23.  This  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   416
        /* corresponds to a value of `t1' that is in the range       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   417
        /* 0x40_0000..0x7F_FFFF.                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   418
        /*                                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   419
        /* Finally, we shift `a', `b', and `c' by the same amount.   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   420
        /* This ensures that all values are now in the range         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   421
        /* -2^23..2^23, i.e., they are now expressed as 8.16         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   422
        /* fixed-float numbers.  This also means that we are using   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   423
        /* 24 bits of precision to compute the zeros, independently  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   424
        /* of the range of the original polynomial coefficients.     */
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
        /* This algorithm should ensure reasonably accurate values   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   427
        /* for the zeros.  Note that they are only expressed with    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   428
        /* 16 bits when computing the extrema (the zeros need to     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   429
        /* be in 0..1 exclusive to be considered part of the arc).   */
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
        if ( t1 == 0 )  /* all coefficients are 0! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   432
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   433
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   434
        if ( t1 > 0x7FFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   435
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   436
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   437
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   438
            shift++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   439
            t1 >>= 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   440
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   441
          } while ( t1 > 0x7FFFFFUL );
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
          /* this loses some bits of precision, but we use 24 of them */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   444
          /* for the computation anyway                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   445
          a >>= shift;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   446
          b >>= shift;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   447
          c >>= shift;
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
        else if ( t1 < 0x400000UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   450
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   451
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   452
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   453
            shift++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   454
            t1 <<= 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   455
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   456
          } while ( t1 < 0x400000UL );
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
          a <<= shift;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   459
          b <<= shift;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   460
          c <<= shift;
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   464
      /* handle a == 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   465
      if ( a == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   466
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   467
        if ( b != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   468
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   469
          t = - FT_DivFix( c, b ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   470
          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
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
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   473
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   474
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   475
        /* solve the equation now */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   476
        d = FT_MulFix( b, b ) - FT_MulFix( a, c );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   477
        if ( d < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   478
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   479
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   480
        if ( d == 0 )
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
          /* there is a single split point at -b/a */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   483
          t = - FT_DivFix( b, a );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   484
          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   485
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   486
        else
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
          /* there are two solutions; we need to filter them */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   489
          d = FT_SqrtFixed( (FT_Int32)d );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   490
          t = - FT_DivFix( b - d, a );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   491
          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
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
          t = - FT_DivFix( b + d, a );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   494
          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
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
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   498
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   499
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   500
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   501
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
  /*************************************************************************/
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
  /* <Function>                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   506
  /*    BBox_Cubic_To                                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   507
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   508
  /* <Description>                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   509
  /*    This function is used as a `cubic_to' emitter during               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   510
  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   511
  /*    current bounding box, and computes its extrema if necessary to     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   512
  /*    update it.                                                         */
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
  /* <Input>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   515
  /*    control1 :: A pointer to the first control point.                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   516
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   517
  /*    control2 :: A pointer to the second control point.                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   518
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   519
  /*    to       :: A pointer to the destination vector.                   */
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
  /* <InOut>                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   522
  /*    user     :: The address of the current walk context.               */
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
  /* <Return>                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   525
  /*    Always 0.  Needed for the interface only.                          */
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
  /* <Note>                                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   528
  /*    In the case of a non-monotonous arc, we don't compute directly     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   529
  /*    extremum coordinates, we subdivide instead.                        */
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
  static int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   532
  BBox_Cubic_To( FT_Vector*  control1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   533
                 FT_Vector*  control2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   534
                 FT_Vector*  to,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   535
                 TBBox_Rec*  user )
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
    /* we don't need to check `to' since it is always an `on' point, thus */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   538
    /* within the bbox                                                    */
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
    if ( CHECK_X( control1, user->bbox ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   541
         CHECK_X( control2, user->bbox ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   542
      BBox_Cubic_Check( user->last.x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   543
                        control1->x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   544
                        control2->x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   545
                        to->x,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   546
                        &user->bbox.xMin,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   547
                        &user->bbox.xMax );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   548
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   549
    if ( CHECK_Y( control1, user->bbox ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   550
         CHECK_Y( control2, user->bbox ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   551
      BBox_Cubic_Check( user->last.y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   552
                        control1->y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   553
                        control2->y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   554
                        to->y,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   555
                        &user->bbox.yMin,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   556
                        &user->bbox.yMax );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   557
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   558
    user->last = *to;
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 0;
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
FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   564
    (FT_Outline_MoveTo_Func) BBox_Move_To,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   565
    (FT_Outline_LineTo_Func) BBox_Move_To,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   566
    (FT_Outline_ConicTo_Func)BBox_Conic_To,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   567
    (FT_Outline_CubicTo_Func)BBox_Cubic_To,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   568
    0, 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   569
  )
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
  /* documentation is in ftbbox.h */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   572
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   573
  FT_EXPORT_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   574
  FT_Outline_Get_BBox( FT_Outline*  outline,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   575
                       FT_BBox     *abbox )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   576
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   577
    FT_BBox     cbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   578
    FT_BBox     bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   579
    FT_Vector*  vec;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   580
    FT_UShort   n;
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   583
    if ( !abbox )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   584
      return FT_Err_Invalid_Argument;
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
    if ( !outline )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   587
      return FT_Err_Invalid_Outline;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   588
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   589
    /* if outline is empty, return (0,0,0,0) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   590
    if ( outline->n_points == 0 || outline->n_contours <= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   591
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   592
      abbox->xMin = abbox->xMax = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   593
      abbox->yMin = abbox->yMax = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   594
      return 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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   597
    /* We compute the control box as well as the bounding box of  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   598
    /* all `on' points in the outline.  Then, if the two boxes    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   599
    /* coincide, we exit immediately.                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   600
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   601
    vec = outline->points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   602
    bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   603
    bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   604
    vec++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   605
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   606
    for ( n = 1; n < outline->n_points; n++ )
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
      FT_Pos  x = vec->x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   609
      FT_Pos  y = vec->y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   610
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   611
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   612
      /* update control box */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   613
      if ( x < cbox.xMin ) cbox.xMin = x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   614
      if ( x > cbox.xMax ) cbox.xMax = x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   615
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   616
      if ( y < cbox.yMin ) cbox.yMin = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   617
      if ( y > cbox.yMax ) cbox.yMax = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   618
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   619
      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   620
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   621
        /* update bbox for `on' points only */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   622
        if ( x < bbox.xMin ) bbox.xMin = x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   623
        if ( x > bbox.xMax ) bbox.xMax = x;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   624
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   625
        if ( y < bbox.yMin ) bbox.yMin = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   626
        if ( y > bbox.yMax ) bbox.yMax = y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   627
      }
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
      vec++;
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
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   632
    /* test two boxes for equality */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   633
    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   634
         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   635
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   636
      /* the two boxes are different, now walk over the outline to */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   637
      /* get the Bezier arc extrema.                               */
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
      FT_Error   error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   640
      TBBox_Rec  user;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   641
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   642
#ifdef FT_CONFIG_OPTION_PIC
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   643
      FT_Outline_Funcs bbox_interface;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   644
      Init_Class_bbox_interface(&bbox_interface);
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   645
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   646
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   647
      user.bbox = bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   648
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   649
      error = FT_Outline_Decompose( outline, &bbox_interface, &user );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   650
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   651
        return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   652
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   653
      *abbox = user.bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   654
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   655
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   656
      *abbox = bbox;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   657
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   658
    return FT_Err_Ok;
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
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
/* END */