1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftraster.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    The FreeType glyph rasterizer (body).                                */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 1996-2003, 2005, 2007-2013 by                                */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This file can be compiled without the rest of the FreeType engine, by */
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* directory.  Typically, you should do something like                   */
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - copy `src/raster/ftraster.c' (this file) to your current directory  */
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h'         */
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   to your current directory                                           */
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     cc -c -D_STANDALONE_ ftraster.c                                   */
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The renderer can be initialized with a call to                        */
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* with a call to `ft_standard_raster.raster_render'.                    */
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* See the comments and documentation in the file `ftimage.h' for more   */
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* details on how the raster works.                                      */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This is a rewrite of the FreeType 1.x scan-line converter             */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef _STANDALONE_
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
52295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>
53295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
54295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include <string.h>           /* for memset */
55295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftmisc.h"
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftimage.h"
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !_STANDALONE_ */
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftraster.h"
63a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include FT_INTERNAL_CALC_H   /* for FT_MulDiv and FT_MulDiv_No_Round */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
65295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "rastpic.h"
66295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !_STANDALONE_ */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* A simple technical note on how the raster works                       */
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* -----------------------------------------------                       */
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Converting an outline into a bitmap is achieved in several steps:   */
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   1 - Decomposing the outline into successive `profiles'.  Each       */
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       profile is simply an array of scanline intersections on a given */
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       dimension.  A profile's main attributes are                     */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
81295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       o an array of intersection coordinates for each scanline        */
84295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*         between `Ymin' and `Ymax'                                     */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       o a direction, indicating whether it was built going `up' or    */
87295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*         `down', as this is very important for filling rules           */
88295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
89295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       o its drop-out mode                                             */
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   2 - Sweeping the target map's scanlines in order to compute segment */
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       `spans' which are then filled.  Additionally, this pass         */
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       performs drop-out control.                                      */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The outline data is parsed during step 1 only.  The profiles are    */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   built from the bottom of the render pool, used as a stack.  The     */
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   following graphics shows the profile list under construction:       */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
99295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     __________________________________________________________ _ _    */
100295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    |         |                 |         |                 |          */
101295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    | profile | coordinates for | profile | coordinates for |-->       */
102295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */
103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    |_________|_________________|_________|_________________|__ _ _    */
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
105295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    ^                                                       ^          */
106295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    |                                                       |          */
107295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* start of render pool                                      top         */
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The top of the profile stack is kept in the `top' variable.         */
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   As you can see, a profile record is pushed on top of the render     */
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   pool, which is then followed by its coordinates/intersections.  If  */
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   a change of direction is detected in the outline, a new profile is  */
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   generated until the end of the outline.                             */
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Note that when all profiles have been generated, the function       */
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Finalize_Profile_Table() is used to record, for each profile, its   */
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   bottom-most scanline as well as the scanline above its upmost       */
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   boundary.  These positions are called `y-turns' because they (sort  */
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   of) correspond to local extrema.  They are stored in a sorted list  */
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   built from the top of the render pool as a downwards stack:         */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*      _ _ _______________________________________                      */
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            |                    |                     */
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                         <--| sorted list of     |                     */
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                         <--|  extrema scanlines |                     */
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*      _ _ __________________|____________________|                     */
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            ^                    ^                     */
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                            |                    |                     */
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                         maxBuff           sizeBuff = end of pool      */
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   This list is later used during the sweep phase in order to          */
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   optimize performance (see technical note on the sweep below).       */
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Of course, the raster detects whether the two stacks collide and    */
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   handles the situation properly.                                     */
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**  CONFIGURATION MACROS                                               **/
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* define DEBUG_RASTER if you want to compile a debugging version */
151295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* #define DEBUG_RASTER */
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
153295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */
154295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* 5-levels anti-aliasing                                       */
155295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* #define FT_RASTER_OPTION_ANTI_ALIASING */
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The size of the two-lines intermediate bitmap used */
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* for anti-aliasing, in bytes.                       */
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RASTER_GRAY_LINES  2048
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**  OTHER MACROS (do not change)                                       **/
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_raster
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef _STANDALONE_
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
182a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  /* Auxiliary macros for token concatenation. */
183a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_ERR_XCAT( x, y )  x ## y
184a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This macro is used to indicate that a function parameter is unused. */
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Its purpose is simply to reduce compiler warnings.  Note also that  */
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* simply defining it as `(void)x' doesn't avoid warnings with certain */
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ANSI compilers (e.g. LCC).                                          */
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED( x )  (x) = (x)
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Disable the tracing mechanism for simplicity -- developers can      */
193a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  /* activate it easily by redefining these macros.                      */
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_ERROR
19577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_TRACE
19977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */
20077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */
20177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
204a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifndef FT_THROW
205a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define FT_THROW( e )  FT_ERR_CAT( Raster_Err_, e )
206a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif
207a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_None          0
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Not_Ini      -1
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Overflow     -2
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Neg_Height   -3
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Invalid      -4
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Unsupported  -5
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define ft_memset  memset
216295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
217295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
218295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                raster_reset_, raster_set_mode_,    \
219295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                raster_render_, raster_done_ )      \
220295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          const FT_Raster_Funcs class_ =                            \
221295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          {                                                         \
222295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            glyph_format_,                                          \
223295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            raster_new_,                                            \
224295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            raster_reset_,                                          \
225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            raster_set_mode_,                                       \
226295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            raster_render_,                                         \
227295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            raster_done_                                            \
228295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner         };
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
230295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else /* !_STANDALONE_ */
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
234a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include FT_INTERNAL_DEBUG_H       /* for FT_TRACE, FT_ERROR, and FT_THROW */
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "rasterrs.h"
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define Raster_Err_None         FT_Err_Ok
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Overflow     Raster_Err_Raster_Overflow
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Invalid      Raster_Err_Invalid_Outline
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* !_STANDALONE_ */
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_MEM_SET
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_MEM_ZERO
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* typically a small value and the result of a*b is known to fit into */
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* 32 bits.                                                           */
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* for clipping computations.  It simply uses the FT_MulDiv() function   */
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* defined in `ftcalc.h'.                                                */
265a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define SMulDiv           FT_MulDiv
266a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define SMulDiv_No_Round  FT_MulDiv_No_Round
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The rasterizer is a very general purpose component; please leave */
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the following redefinitions there (you never know your target    */
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* environment).                                                    */
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TRUE
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define TRUE   1
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FALSE
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FALSE  0
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef NULL
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define NULL  (void*)0
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef SUCCESS
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SUCCESS  0
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FAILURE
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FAILURE  1
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        /* Setting this constant to more than 32 is a   */
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        /* pure waste of space.                         */
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define Pixel_Bits  6   /* fractional bits of *input* coordinates */
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**  SIMPLE TYPE DECLARATIONS                                           **/
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef int             Int;
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef unsigned int    UInt;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef short           Short;
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef unsigned short  UShort, *PUShort;
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef long            Long, *PLong;
313a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  typedef unsigned long   ULong;
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef unsigned char   Byte, *PByte;
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef char            Bool;
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef union  Alignment_
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    long    l;
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void*   p;
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void  (*f)(void);
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } Alignment, *PAlignment;
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  TPoint_
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  x;
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  y;
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } TPoint;
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
336295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* values for the `flags' bit field */
337295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define Flow_Up           0x8
338295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define Overshoot_Top     0x10
339295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define Overshoot_Bottom  0x20
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* States of each line, arc, and profile */
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef enum  TStates_
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Unknown_State,
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Ascending_State,
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Descending_State,
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Flat_State
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } TStates;
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct TProfile_  TProfile;
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef TProfile*         PProfile;
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  struct  TProfile_
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
358295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_F26Dot6  X;           /* current coordinate during sweep          */
359295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PProfile    link;        /* link to next profile (various purposes)  */
360295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PLong       offset;      /* start of profile's data in render pool   */
361295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    unsigned    flags;       /* Bit 0-2: drop-out mode                   */
362295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             /* Bit 3: profile orientation (up/down)     */
363295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             /* Bit 4: is top profile?                   */
364295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             /* Bit 5: is bottom profile?                */
365295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    long        height;      /* profile's height in scanlines            */
366295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    long        start;       /* profile's starting scanline              */
367295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
368295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    unsigned    countL;      /* number of lines to step before this      */
369295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             /* profile becomes drawable                 */
370295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
371295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PProfile    next;        /* next profile in same contour, used       */
372295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             /* during drop-out control                  */
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef PProfile   TProfileList;
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef PProfile*  PProfileList;
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Simple record used to implement a stack of bands, required */
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* by the sub-banding mechanism                               */
381e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  typedef struct  black_TBand_
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short  y_min;   /* band's minimum */
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short  y_max;   /* band's maximum */
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
386e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  } black_TBand;
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AlignProfileSize \
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
393e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef RAS_ARG
394e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef RAS_ARGS
395e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef RAS_VAR
396e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef RAS_VARS
397e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_STATIC_RASTER
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_ARGS       /* void */
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_ARG        /* void */
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_VARS       /* void */
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_VAR        /* void */
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
40777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner#define FT_UNUSED_RASTER  do { } while ( 0 )
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
410295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else /* !FT_STATIC_RASTER */
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
413e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define RAS_ARGS       black_PWorker  worker,
414e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define RAS_ARG        black_PWorker  worker
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_VARS       worker,
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define RAS_VAR        worker
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_RASTER  FT_UNUSED( worker )
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* !FT_STATIC_RASTER */
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
425e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  typedef struct black_TWorker_  black_TWorker, *black_PWorker;
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* prototypes used for sweep function dispatch */
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Function_Sweep_Init( RAS_ARGS Short*  min,
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                Short*  max );
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Function_Sweep_Span( RAS_ARGS Short       y,
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x1,
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x2,
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    left,
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    right );
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Function_Sweep_Step( RAS_ARG );
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NOTE: These operations are only valid on 2's complement processors */
445e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef FLOOR
446e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef CEILING
447e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef TRUNC
448e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#undef SCALED
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FLOOR( x )    ( (x) & -ras.precision )
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )
452a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define TRUNC( x )    ( (Long)(x) >> ras.precision_bits )
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FRAC( x )     ( (x) & ( ras.precision - 1 ) )
454a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define SCALED( x )   ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
456295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define IS_BOTTOM_OVERSHOOT( x )  ( CEILING( x ) - x >= ras.precision_half )
457295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define IS_TOP_OVERSHOOT( x )     ( x - FLOOR( x ) >= ras.precision_half )
458295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
459295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* The most used variables are positioned at the top of the structure. */
460295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* Thus, their offset can be coded with less opcodes, resulting in a   */
461295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* smaller executable.                                                 */
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
463e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  struct  black_TWorker_
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
465295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision_bits;     /* precision related variables         */
466295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision;
467295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision_half;
468295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision_shift;
469295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision_step;
470295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         precision_jitter;
471295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
472295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         scale_shift;        /* == precision_shift   for bitmaps    */
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* == precision_shift+1 for pixmaps    */
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
475295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PLong       buff;               /* The profiles buffer                 */
476295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PLong       sizeBuff;           /* Render pool size                    */
477295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PLong       maxBuff;            /* Profiles buffer size                */
478295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PLong       top;                /* Current cursor in buffer            */
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
480295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Error    error;
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
482295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Int         numTurns;           /* number of Y-turns in outline        */
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
484295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    TPoint*     arc;                /* current Bezier arc pointer          */
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
486295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    UShort      bWidth;             /* target bitmap width                 */
487295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PByte       bTarget;            /* target bitmap buffer                */
488295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PByte       gTarget;            /* target pixmap buffer                */
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
490295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Long        lastX, lastY;
491295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Long        minY, maxY;
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
493295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    UShort      num_Profs;          /* current number of profiles          */
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
495295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Bool        fresh;              /* signals a fresh new profile which   */
496295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                    /* `start' field must be completed     */
497295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Bool        joint;              /* signals that the last arc ended     */
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* exactly on a scanline.  Allows      */
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* removal of doublets                 */
500295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PProfile    cProfile;           /* current profile                     */
501295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PProfile    fProfile;           /* head of linked list of profiles     */
502295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    PProfile    gProfile;           /* contour's first profile in case     */
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* of impact                           */
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
505295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    TStates     state;              /* rendering state                     */
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bitmap   target;             /* description of target bit/pixmap    */
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline  outline;
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
510295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Long        traceOfs;           /* current offset in target bitmap     */
511295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Long        traceG;             /* current offset in target pixmap     */
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
513295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Short       traceIncr;          /* sweep's increment in target bitmap  */
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
515295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Short       gray_min_x;         /* current min x during gray rendering */
516295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Short       gray_max_x;         /* current max x during gray rendering */
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* dispatch variables */
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Function_Sweep_Init*  Proc_Sweep_Init;
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Function_Sweep_Span*  Proc_Sweep_Span;
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Function_Sweep_Span*  Proc_Sweep_Drop;
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Function_Sweep_Step*  Proc_Sweep_Step;
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
525295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Byte        dropOutControl;     /* current drop_out control method     */
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
527295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Bool        second_pass;        /* indicates whether a horizontal pass */
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* should be performed to control      */
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* drop-out accurately when calling    */
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* Render_Glyph.  Note that there is   */
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* no horizontal pass during gray      */
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    /* rendering.                          */
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
534295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
536e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    black_TBand  band_stack[16];    /* band stack used for sub-banding     */
537e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    Int          band_top;          /* band stack top                      */
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
541295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Byte*       grays;
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
543295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Byte        gray_lines[RASTER_GRAY_LINES];
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* Intermediate table used to render the   */
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* graylevels pixmaps.                     */
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* gray_lines is a buffer holding two      */
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* monochrome scanlines                    */
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
549295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Short       gray_width;     /* width in bytes of one monochrome        */
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* intermediate scanline of gray_lines.    */
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                /* Each gray pixel takes 2 bits long there */
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       /* The gray_lines must hold 2 lines, thus with size */
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       /* in bytes of at least `gray_width*2'.             */
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_RASTER_ANTI_ALIASING */
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
561e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  typedef struct  black_TRaster_
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
563e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    char*          buffer;
564e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    long           buffer_size;
565e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    void*          memory;
566e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    black_PWorker  worker;
567e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    Byte           grays[5];
568e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    Short          gray_width;
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
570e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  } black_TRaster, *black_PRaster;
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_STATIC_RASTER
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
574e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  static black_TWorker  cur_ras;
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ras  cur_ras
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
577295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else /* !FT_STATIC_RASTER */
578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ras  (*worker)
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
581295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* !FT_STATIC_RASTER */
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
586295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* A lookup table used to quickly count set bits in four gray 2x2 */
587295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* cells.  The values of the table have been produced with the    */
588295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* following code:                                                */
589295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                */
590295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*   for ( i = 0; i < 256; i++ )                                  */
591295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*   {                                                            */
592295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     l = 0;                                                     */
593295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     j = i;                                                     */
594295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                */
595295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     for ( c = 0; c < 4; c++ )                                  */
596295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     {                                                          */
597295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       l <<= 4;                                                 */
598295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                */
599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       if ( j & 0x80 ) l++;                                     */
600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       if ( j & 0x40 ) l++;                                     */
601295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                */
602295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*       j = ( j << 2 ) & 0xFF;                                   */
603295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     }                                                          */
604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*     printf( "0x%04X", l );                                     */
605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*   }                                                            */
606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                */
607295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
608295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  static const short  count_table[256] =
60977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  {
610295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,
611295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,
612295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
613295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
614295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
615295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
616295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,
617295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,
618295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
619295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
620295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
621295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
622295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
623295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
624295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
625295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
626295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
627295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
628295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
629295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
630295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
631295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
632295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
633295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
634295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,
635295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,
636295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
637295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
638295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
639295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
640295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,
641295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222
642295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  };
643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**  PROFILES COMPUTATION                                               **/
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Set_High_Precision                                                 */
661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
66377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Set precision variables according to param flag.                   */
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
666a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  /*    High :: Set to True for high precision (typically for ppem < 24),  */
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*            false otherwise.                                           */
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Set_High_Precision( RAS_ARGS Int  High )
671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
672c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    /*
673c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * `precision_step' is used in `Bezier_Up' to decide when to split a
674c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * given y-monotonous Bezier arc that crosses a scanline before
675c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * approximating it as a straight segment.  The default value of 32 (for
676c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * low accuracy) corresponds to
677c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
678c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *   32 / 64 == 0.5 pixels ,
679c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
680c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * while for the high accuracy case we have
681c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
682c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *   256/ (1 << 12) = 0.0625 pixels .
683c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
684c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * `precision_jitter' is an epsilon threshold used in
685c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
686c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * decomposition (after all, we are working with approximations only);
687c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * it avoids switching on additional pixels which would cause artifacts
688c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * otherwise.
689c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
690c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     * The value of `precision_jitter' has been determined heuristically.
691c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     *
692c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner     */
693c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( High )
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
696295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.precision_bits   = 12;
697295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.precision_step   = 256;
698c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      ras.precision_jitter = 30;
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.precision_bits   = 6;
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.precision_step   = 32;
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.precision_jitter = 2;
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.precision       = 1 << ras.precision_bits;
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.precision_half  = ras.precision / 2;
711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.precision_shift = ras.precision_bits - Pixel_Bits;
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    New_Profile                                                        */
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
72177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Create a new profile in the render pool.                           */
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
724295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    aState    :: The state/orientation of the new profile.             */
725295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
726295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    overshoot :: Whether the profile's unrounded start position        */
727295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                 differs by at least a half pixel.                     */
728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   profile.                                                            */
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
734295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  New_Profile( RAS_ARGS TStates  aState,
735295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                        Bool     overshoot )
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !ras.fProfile )
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile  = (PProfile)ras.top;
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.fProfile  = ras.cProfile;
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.top      += AlignProfileSize;
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.top >= ras.maxBuff )
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
746a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Overflow );
747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
750295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->flags  = 0;
751295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->start  = 0;
752295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->height = 0;
753295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->offset = ras.top;
754295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->link   = (PProfile)0;
755295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->next   = (PProfile)0;
756295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.cProfile->flags  = ras.dropOutControl;
757295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( aState )
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Ascending_State:
761295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.cProfile->flags |= Flow_Up;
762295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( overshoot )
763295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        ras.cProfile->flags |= Overshoot_Bottom;
764295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
7658583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile ));
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Descending_State:
769295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( overshoot )
770295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        ras.cProfile->flags |= Overshoot_Top;
7718583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      FT_TRACE6(( "New descending profile = %p\n", ras.cProfile ));
772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
775295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_ERROR(( "New_Profile: invalid profile direction\n" ));
776a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Invalid );
777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !ras.gProfile )
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.gProfile = ras.cProfile;
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.state = aState;
784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.fresh = TRUE;
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.joint = FALSE;
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    End_Profile                                                        */
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
79777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Finalize the current profile.                                      */
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
799295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* <Input>                                                               */
800295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*    overshoot :: Whether the profile's unrounded end position differs  */
801295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                 by at least a half pixel.                             */
802295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /*                                                                       */
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
807295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  End_Profile( RAS_ARGS Bool  overshoot )
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
809a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    Long  h;
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    h = (Long)( ras.top - ras.cProfile->offset );
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( h < 0 )
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
816295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_ERROR(( "End_Profile: negative height encountered\n" ));
817a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Neg_Height );
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( h > 0 )
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
823a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      PProfile  oldProfile;
824a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
825a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
8268583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n",
8278583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner                  ras.cProfile, ras.cProfile->start, h ));
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->height = h;
830295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( overshoot )
831295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      {
832295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( ras.cProfile->flags & Flow_Up )
833295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          ras.cProfile->flags |= Overshoot_Top;
834295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        else
835295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          ras.cProfile->flags |= Overshoot_Bottom;
836295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      }
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
838295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      oldProfile   = ras.cProfile;
839295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.cProfile = (PProfile)ras.top;
840295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
841295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.top += AlignProfileSize;
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->height = 0;
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->offset = ras.top;
845295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
846295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      oldProfile->next = ras.cProfile;
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.num_Profs++;
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.top >= ras.maxBuff )
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_TRACE1(( "overflow in End_Profile\n" ));
853a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Overflow );
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.joint = FALSE;
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Insert_Y_Turn                                                      */
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
86977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Insert a salient into the sorted list placed on top of the render  */
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    pool.                                                              */
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    New y scanline position.                                           */
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Insert_Y_Turn( RAS_ARGS Int  y )
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PLong  y_turns;
882a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    Int    n;
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    n       = ras.numTurns - 1;
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_turns = ras.sizeBuff - ras.numTurns;
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* look for first y value that is <= */
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( n >= 0 && y < y_turns[n] )
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      n--;
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* if it is <, simply insert it, ignore if == */
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n >= 0 && y > y_turns[n] )
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( n >= 0 )
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
896a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        Int  y2 = (Int)y_turns[n];
897a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
898a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_turns[n] = y;
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y = y2;
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        n--;
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n < 0 )
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.maxBuff--;
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ras.maxBuff <= ras.top )
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
909a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        ras.error = FT_THROW( Overflow );
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FAILURE;
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.numTurns++;
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.sizeBuff[-ras.numTurns] = y;
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Finalize_Profile_Table                                             */
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
92677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Adjust all links in the profiles list.                             */
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Finalize_Profile_Table( RAS_ARG )
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    UShort    n;
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PProfile  p;
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    n = ras.num_Profs;
93977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    p = ras.fProfile;
940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    if ( n > 1 && p )
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( n > 0 )
944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
945a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        Int  bottom, top;
946a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
947a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( n > 1 )
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          p->link = (PProfile)( p->offset + p->height );
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          p->link = NULL;
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
953295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( p->flags & Flow_Up )
954295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        {
955295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          bottom = (Int)p->start;
956295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          top    = (Int)( p->start + p->height - 1 );
957295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        }
958295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        else
959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          bottom     = (Int)( p->start - p->height + 1 );
961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          top        = (Int)p->start;
962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          p->start   = bottom;
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          p->offset += p->height - 1;
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
966295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( Insert_Y_Turn( RAS_VARS bottom )  ||
967295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             Insert_Y_Turn( RAS_VARS top + 1 ) )
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return FAILURE;
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        p = p->link;
971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        n--;
972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.fProfile = NULL;
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Split_Conic                                                        */
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
98777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    stack.                                                             */
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    None (subdivided Bezier is taken from the top of the stack).       */
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This routine is the `beef' of this component.  It is  _the_ inner  */
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    loop that should be optimized to hell to get the best performance. */
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Split_Conic( TPoint*  base )
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  a, b;
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[4].x = base[2].x;
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b = base[1].x;
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a = base[3].x = ( base[2].x + b ) / 2;
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b = base[1].x = ( base[0].x + b ) / 2;
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[2].x = ( a + b ) / 2;
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[4].y = base[2].y;
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b = base[1].y;
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a = base[3].y = ( base[2].y + b ) / 2;
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b = base[1].y = ( base[0].y + b ) / 2;
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[2].y = ( a + b ) / 2;
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* hand optimized.  gcc doesn't seem to be too good at common      */
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expression substitution and instruction scheduling ;-)          */
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Split_Cubic                                                        */
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
102677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Bezier stack.                                                      */
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This routine is the `beef' of the component.  It is one of _the_   */
1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    inner loops that should be optimized like hell to get the best     */
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    performance.                                                       */
1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Split_Cubic( TPoint*  base )
1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  a, b, c, d;
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[6].x = base[3].x;
1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    c = base[1].x;
1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    d = base[2].x;
1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[1].x = a = ( base[0].x + c + 1 ) >> 1;
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[5].x = b = ( base[3].x + d + 1 ) >> 1;
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    c = ( c + d + 1 ) >> 1;
1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[2].x = a = ( a + c + 1 ) >> 1;
1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[4].x = b = ( b + c + 1 ) >> 1;
1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[3].x = ( a + b + 1 ) >> 1;
1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[6].y = base[3].y;
1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    c = base[1].y;
1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    d = base[2].y;
1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[1].y = a = ( base[0].y + c + 1 ) >> 1;
1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[5].y = b = ( base[3].y + d + 1 ) >> 1;
1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    c = ( c + d + 1 ) >> 1;
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[2].y = a = ( a + c + 1 ) >> 1;
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[4].y = b = ( b + c + 1 ) >> 1;
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    base[3].y = ( a + b + 1 ) >> 1;
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Line_Up                                                            */
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
106877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Compute the x-coordinates of an ascending line segment and store   */
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    them in the render pool.                                           */
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x1   :: The x-coordinate of the segment's start point.             */
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    y1   :: The y-coordinate of the segment's start point.             */
1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x2   :: The x-coordinate of the segment's end point.               */
1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    y2   :: The y-coordinate of the segment's end point.               */
1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    miny :: A lower vertical clipping bound value.                     */
1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    maxy :: An upper vertical clipping bound value.                    */
1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE on render pool overflow.               */
1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Line_Up( RAS_ARGS Long  x1,
1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  y1,
1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  x2,
1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  y2,
1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  miny,
1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  maxy )
1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long   Dx, Dy;
1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */
1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long   Ix, Rx, Ax;
1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PLong  top;
1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Dx = x2 - x1;
1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Dy = y2 - y1;
1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Dy <= 0 || y2 < miny || y1 > maxy )
1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return SUCCESS;
1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( y1 < miny )
1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Take care: miny-y1 can be a very large value; we use     */
1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*            a slow MulDiv function to avoid clipping bugs */
1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      x1 += SMulDiv( Dx, miny - y1, Dy );
1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e1  = (Int)TRUNC( miny );
1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f1  = 0;
1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e1 = (Int)TRUNC( y1 );
1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f1 = (Int)FRAC( y1 );
1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( y2 > maxy )
1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */
1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2  = (Int)TRUNC( maxy );
1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f2  = 0;
1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2 = (Int)TRUNC( y2 );
1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f2 = (Int)FRAC( y2 );
1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( f1 > 0 )
1135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 == e2 )
1137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
1138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
11408583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner        x1 += SMulDiv( Dx, ras.precision - f1, Dy );
1141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        e1 += 1;
1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ras.joint )
1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.top--;
1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.joint = FALSE;
1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.joint = (char)( f2 == 0 );
1152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.fresh )
1154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->start = e1;
1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.fresh           = FALSE;
1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size = e2 - e1 + 1;
1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.top + size >= ras.maxBuff )
1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1162a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Overflow );
1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Dx > 0 )
1167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1168a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
1169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Rx = ( ras.precision * Dx ) % Dy;
1170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Dx = 1;
1171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1174a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
1175a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Rx = ( ras.precision * -Dx ) % Dy;
1176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Dx = -1;
1177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Ax  = -Dy;
1180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    top = ras.top;
1181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( size > 0 )
1183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *top++ = x1;
1185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      x1 += Ix;
1187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Ax += Rx;
1188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Ax >= 0 )
1189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Ax -= Dy;
1191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        x1 += Dx;
1192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      size--;
1194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.top = top;
1197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Line_Down                                                          */
1205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
120777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Compute the x-coordinates of an descending line segment and store  */
120877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    them in the render pool.                                           */
1209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x1   :: The x-coordinate of the segment's start point.             */
1212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    y1   :: The y-coordinate of the segment's start point.             */
1214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x2   :: The x-coordinate of the segment's end point.               */
1216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    y2   :: The y-coordinate of the segment's end point.               */
1218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    miny :: A lower vertical clipping bound value.                     */
1220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    maxy :: An upper vertical clipping bound value.                    */
1222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE on render pool overflow.               */
1225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Line_Down( RAS_ARGS Long  x1,
1228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long  y1,
1229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long  x2,
1230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long  y2,
1231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long  miny,
1232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long  maxy )
1233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Bool  result, fresh;
1235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    fresh  = ras.fresh;
1238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
1240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( fresh && !ras.fresh )
1242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->start = -ras.cProfile->start;
1243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
1245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* A function type describing the functions used to split Bezier arcs */
1249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void  (*TSplitter)( TPoint*  base );
1250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Bezier_Up                                                          */
1256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
125877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Compute the x-coordinates of an ascending Bezier arc and store     */
1259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    them in the render pool.                                           */
1260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
1263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    splitter :: The function to split Bezier arcs.                     */
1265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    miny     :: A lower vertical clipping bound value.                 */
1267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    maxy     :: An upper vertical clipping bound value.                */
1269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE on render pool overflow.               */
1272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Bezier_Up( RAS_ARGS Int        degree,
1275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      TSplitter  splitter,
1276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long       miny,
1277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      Long       maxy )
1278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long   y1, y2, e, e2, e0;
1280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short  f1;
1281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TPoint*  arc;
1283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TPoint*  start_arc;
1284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PLong top;
1286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    arc = ras.arc;
1289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y1  = arc[degree].y;
1290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y2  = arc[0].y;
1291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    top = ras.top;
1292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( y2 < miny || y1 > maxy )
1294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fin;
1295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    e2 = FLOOR( y2 );
1297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e2 > maxy )
1299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2 = maxy;
1300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    e0 = miny;
1302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( y1 < miny )
1304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e = miny;
1305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e  = CEILING( y1 );
1308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f1 = (Short)( FRAC( y1 ) );
1309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e0 = e;
1310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( f1 == 0 )
1312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.joint )
1314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          top--;
1316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.joint = FALSE;
1317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *top++ = arc[degree].x;
1320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        e += ras.precision;
1322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.fresh )
1326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->start = TRUNC( e0 );
1328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.fresh = FALSE;
1329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e2 < e )
1332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fin;
1333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
1335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.top   = top;
1337a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Overflow );
1338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    start_arc = arc;
1342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( arc >= start_arc && e <= e2 )
1344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.joint = FALSE;
1346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y2 = arc[0].y;
1348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y2 > e )
1350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y1 = arc[degree].y;
1352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( y2 - y1 >= ras.precision_step )
1353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          splitter( arc );
1355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          arc += degree;
1356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1359295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
1360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            e - y1, y2 - y1 );
1361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          arc -= degree;
1362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          e   += ras.precision;
1363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( y2 == e )
1368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.joint  = TRUE;
1370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *top++     = arc[0].x;
1371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          e += ras.precision;
1373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        arc -= degree;
1375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fin:
1379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.top  = top;
1380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc -= degree;
1381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Bezier_Down                                                        */
1389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
139177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Compute the x-coordinates of an descending Bezier arc and store    */
1392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    them in the render pool.                                           */
1393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
1396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    splitter :: The function to split Bezier arcs.                     */
1398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    miny     :: A lower vertical clipping bound value.                 */
1400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    maxy     :: An upper vertical clipping bound value.                */
1402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE on render pool overflow.               */
1405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Bezier_Down( RAS_ARGS Int        degree,
1408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        TSplitter  splitter,
1409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        Long       miny,
1410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        Long       maxy )
1411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TPoint*  arc = ras.arc;
1413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Bool     result, fresh;
1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    arc[0].y = -arc[0].y;
1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    arc[1].y = -arc[1].y;
1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    arc[2].y = -arc[2].y;
1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( degree > 2 )
1420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      arc[3].y = -arc[3].y;
1421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    fresh = ras.fresh;
1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( fresh && !ras.fresh )
1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.cProfile->start = -ras.cProfile->start;
1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    arc[0].y = -arc[0].y;
1430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Line_To                                                            */
1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
144077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Inject a new line segment and adjust the Profiles list.            */
1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   x :: The x-coordinate of the segment's end point (its start point   */
1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        is stored in `lastX').                                         */
1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   y :: The y-coordinate of the segment's end point (its start point   */
1447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        is stored in `lastY').                                         */
1448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   profile.                                                            */
1452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Line_To( RAS_ARGS Long  x,
1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    Long  y )
1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* First, detect a change of direction */
1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( ras.state )
1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Unknown_State:
1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y > ras.lastY )
1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1464295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( New_Profile( RAS_VARS Ascending_State,
1465295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return FAILURE;
1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( y < ras.lastY )
1471295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( New_Profile( RAS_VARS Descending_State,
1472295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )
1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return FAILURE;
1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Ascending_State:
1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y < ras.lastY )
1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1480295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
1481295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             New_Profile( RAS_VARS Descending_State,
1482295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )
1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return FAILURE;
1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Descending_State:
1488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y > ras.lastY )
1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1490295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
1491295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             New_Profile( RAS_VARS Ascending_State,
1492295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return FAILURE;
1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ;
1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Then compute the lines */
1502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( ras.state )
1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Ascending_State:
1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
1507295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             x, y, ras.minY, ras.maxY ) )
1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FAILURE;
1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case Descending_State:
1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
1513295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                               x, y, ras.minY, ras.maxY ) )
1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FAILURE;
1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
1516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
1518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ;
1519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastX = x;
1522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastY = y;
1523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Conic_To                                                           */
1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
153477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Inject a new conic arc and adjust the profile list.                */
1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cx :: The x-coordinate of the arc's new control point.              */
1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cy :: The y-coordinate of the arc's new control point.              */
1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   x  :: The x-coordinate of the arc's end point (its start point is   */
1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*         stored in `lastX').                                           */
1543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   y  :: The y-coordinate of the arc's end point (its start point is   */
1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*         stored in `lastY').                                           */
1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   profile.                                                            */
1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Conic_To( RAS_ARGS Long  cx,
1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  cy,
1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  x,
1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  y )
1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long     y1, y2, y3, x3, ymin, ymax;
1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TStates  state_bez;
1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc      = ras.arcs;
1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc[2].x = ras.lastX;
1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc[2].y = ras.lastY;
1564295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[1].x = cx;
1565295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[1].y = cy;
1566295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[0].x = x;
1567295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[0].y = y;
1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y1 = ras.arc[2].y;
1572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y2 = ras.arc[1].y;
1573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y3 = ras.arc[0].y;
1574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      x3 = ras.arc[0].x;
1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* first, categorize the Bezier arc */
1577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y1 <= y3 )
1579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin = y1;
1581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax = y3;
1582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin = y3;
1586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax = y1;
1587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y2 < ymin || y2 > ymax )
1590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this arc has no given direction, split it! */
1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Split_Conic( ras.arc );
1593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.arc += 2;
1594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( y1 == y3 )
1596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this arc is flat, ignore it and pop it from the Bezier stack */
1598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.arc -= 2;
1599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* the arc is y-monotonous, either ascending or descending */
1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* detect a change of direction                            */
1604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        state_bez = y1 < y3 ? Ascending_State : Descending_State;
1605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.state != state_bez )
1606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1607295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
1608295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                                 : IS_TOP_OVERSHOOT( y1 );
1609295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1610295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* finalize current profile if any */
1612295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( ras.state != Unknown_State &&
1613295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               End_Profile( RAS_VARS o )  )
1614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* create a new profile */
1617295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( New_Profile( RAS_VARS state_bez, o ) )
1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* now call the appropriate routine */
1622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( state_bez == Ascending_State )
1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( ras.arc >= ras.arcs );
1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastX = x3;
1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastY = y3;
1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Cubic_To                                                           */
1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
165077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Inject a new cubic arc and adjust the profile list.                */
1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cx1 :: The x-coordinate of the arc's first new control point.       */
1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cy1 :: The y-coordinate of the arc's first new control point.       */
1656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cx2 :: The x-coordinate of the arc's second new control point.      */
1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   cy2 :: The y-coordinate of the arc's second new control point.      */
1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   x   :: The x-coordinate of the arc's end point (its start point is  */
1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*          stored in `lastX').                                          */
1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   y   :: The y-coordinate of the arc's end point (its start point is  */
1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*          stored in `lastY').                                          */
1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   profile.                                                            */
1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Cubic_To( RAS_ARGS Long  cx1,
1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  cy1,
1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  cx2,
1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  cy2,
1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  x,
1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     Long  y )
1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TStates  state_bez;
1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc      = ras.arcs;
1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc[3].x = ras.lastX;
1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.arc[3].y = ras.lastY;
1686295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[2].x = cx1;
1687295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[2].y = cy1;
1688295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[1].x = cx2;
1689295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[1].y = cy2;
1690295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[0].x = x;
1691295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ras.arc[0].y = y;
1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
1694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y1 = ras.arc[3].y;
1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y2 = ras.arc[2].y;
1697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y3 = ras.arc[1].y;
1698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y4 = ras.arc[0].y;
1699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      x4 = ras.arc[0].x;
1700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* first, categorize the Bezier arc */
1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y1 <= y4 )
1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin1 = y1;
1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax1 = y4;
1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin1 = y4;
1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax1 = y1;
1712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( y2 <= y3 )
1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin2 = y2;
1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax2 = y3;
1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymin2 = y3;
1722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ymax2 = y2;
1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ymin2 < ymin1 || ymax2 > ymax1 )
1726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this arc has no given direction, split it! */
1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Split_Cubic( ras.arc );
1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.arc += 3;
1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( y1 == y4 )
1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this arc is flat, ignore it and pop it from the Bezier stack */
1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.arc -= 3;
1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* detect a change of direction */
1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.state != state_bez )
1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1743295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
1744295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                                 : IS_TOP_OVERSHOOT( y1 );
1745295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1746295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1747295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* finalize current profile if any */
1748295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( ras.state != Unknown_State &&
1749295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               End_Profile( RAS_VARS o )  )
1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1752295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( New_Profile( RAS_VARS state_bez, o ) )
1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* compute intersections */
1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( state_bez == Ascending_State )
1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( ras.arc >= ras.arcs );
1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastX = x4;
1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastY = y4;
1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
1775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
1776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  SWAP_
1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SWAP_( x, y )  do                \
1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       {                 \
1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         Long  swap = x; \
1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         x = y;          \
1786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         y = swap;       \
1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       } while ( 0 )
1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Decompose_Curve                                                    */
1794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
179677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Scan the outline arrays in order to emit individual segments and   */
1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */
1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    weird cases, like when the first point is off the curve, or when   */
1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    there are simply no `on' points in the contour!                    */
1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    first   :: The index of the first point in the contour.            */
1803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    last    :: The index of the last point in the contour.             */
1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    flipped :: If set, flip the direction of the curve.                */
1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE on error.                              */
1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Decompose_Curve( RAS_ARGS UShort  first,
1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            UShort  last,
1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            int     flipped )
1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   v_last;
1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   v_control;
1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   v_start;
1819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  points;
1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  point;
1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  limit;
1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*       tags;
1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    unsigned    tag;       /* current point's state           */
1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    points = ras.outline.points;
1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit  = points + last;
1830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v_start.x = SCALED( points[first].x );
1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v_start.y = SCALED( points[first].y );
1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v_last.x  = SCALED( points[last].x );
1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v_last.y  = SCALED( points[last].y );
1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( flipped )
1837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      SWAP_( v_start.x, v_start.y );
1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      SWAP_( v_last.x, v_last.y );
1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v_control = v_start;
1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = points + first;
1845295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    tags  = ras.outline.tags + first;
1846295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1847295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* set scan mode if necessary */
1848295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
1849295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ras.dropOutControl = (Byte)tags[0] >> 5;
1850295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
1851295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    tag = FT_CURVE_TAG( tags[0] );
1852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* A contour cannot start with a cubic control point! */
1854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( tag == FT_CURVE_TAG_CUBIC )
1855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Invalid_Outline;
1856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check first point to determine origin */
1858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( tag == FT_CURVE_TAG_CONIC )
1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* first point is conic control.  Yes, this happens. */
1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* start at last point if it is on the curve */
1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_start = v_last;
1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        limit--;
1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* if both first and last points are conic,         */
1870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* start at their middle and record its position    */
1871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* for closure                                      */
1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_start.x = ( v_start.x + v_last.x ) / 2;
1873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_start.y = ( v_start.y + v_last.y ) / 2;
1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_last = v_start;
1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point--;
1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tags--;
1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastX = v_start.x;
1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.lastY = v_start.y;
1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( point < limit )
1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point++;
1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tags++;
1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tag = FT_CURVE_TAG( tags[0] );
1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( tag )
1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case FT_CURVE_TAG_ON:  /* emit a single line_to */
1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Long  x, y;
1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = SCALED( point->x );
1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y = SCALED( point->y );
1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( flipped )
1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            SWAP_( x, y );
1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Line_To( RAS_VARS x, y ) )
1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          continue;
1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_control.x = SCALED( point[0].x );
1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        v_control.y = SCALED( point[0].y );
1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( flipped )
1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          SWAP_( v_control.x, v_control.y );
1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Do_Conic:
1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( point < limit )
1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Vector  v_middle;
1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Long       x, y;
1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          point++;
1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          tags++;
1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          tag = FT_CURVE_TAG( tags[0] );
1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = SCALED( point[0].x );
1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y = SCALED( point[0].y );
1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( flipped )
1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            SWAP_( x, y );
1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( tag == FT_CURVE_TAG_ON )
1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              goto Fail;
1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            continue;
1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( tag != FT_CURVE_TAG_CONIC )
1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Invalid_Outline;
1941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          v_middle.x = ( v_control.x + x ) / 2;
1943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          v_middle.y = ( v_control.y + y ) / 2;
1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Conic_To( RAS_VARS v_control.x, v_control.y,
1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  v_middle.x,  v_middle.y ) )
1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          v_control.x = x;
1950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          v_control.y = y;
1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Do_Conic;
1953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( Conic_To( RAS_VARS v_control.x, v_control.y,
1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                v_start.x,   v_start.y ) )
1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Close;
1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:  /* FT_CURVE_TAG_CUBIC */
1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Long  x1, y1, x2, y2, x3, y3;
1964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( point + 1 > limit                             ||
1967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Invalid_Outline;
1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          point += 2;
1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          tags  += 2;
1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x1 = SCALED( point[-2].x );
1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y1 = SCALED( point[-2].y );
1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x2 = SCALED( point[-1].x );
1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y2 = SCALED( point[-1].y );
1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( flipped )
1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            SWAP_( x1, y1 );
1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            SWAP_( x2, y2 );
1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( point <= limit )
1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1986aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            x3 = SCALED( point[0].x );
1987aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            y3 = SCALED( point[0].y );
1988aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1989aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich            if ( flipped )
1990aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich              SWAP_( x3, y3 );
1991aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              goto Fail;
1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            continue;
1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Close;
2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* close the contour with a line segment */
2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Close:
2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Invalid_Outline:
2012a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    ras.error = FT_THROW( Invalid );
2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Convert_Glyph                                                      */
2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
202577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Convert a glyph into a series of segments and arcs and make a      */
2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    profiles list with them.                                           */
2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    flipped :: If set, flip the direction of curve.                    */
2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS on success, FAILURE if any error was encountered during    */
2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    rendering.                                                         */
2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Convert_Glyph( RAS_ARGS int  flipped )
2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int       i;
2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    unsigned  start;
2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.fProfile = NULL;
2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.joint    = FALSE;
2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.fresh    = FALSE;
2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;
2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.numTurns = 0;
2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.cProfile         = (PProfile)ras.top;
2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.cProfile->offset = ras.top;
2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.num_Profs        = 0;
2053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    start = 0;
2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < ras.outline.n_contours; i++ )
2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2058a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      PProfile  lastProfile;
2059a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Bool      o;
2060295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2061295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.state    = Unknown_State;
2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.gProfile = NULL;
2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Decompose_Curve( RAS_VARS (unsigned short)start,
2066295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                     ras.outline.contours[i],
2067295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                     flipped ) )
2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FAILURE;
2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      start = ras.outline.contours[i] + 1;
2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2072295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      /* we must now check whether the extreme arcs join or not */
2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FRAC( ras.lastY ) == 0 &&
2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           ras.lastY >= ras.minY  &&
2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           ras.lastY <= ras.maxY  )
2076295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        if ( ras.gProfile                        &&
2077295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner             ( ras.gProfile->flags & Flow_Up ) ==
2078295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               ( ras.cProfile->flags & Flow_Up ) )
2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.top--;
2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* Note that ras.gProfile can be nil if the contour was too small */
2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* to be drawn.                                                   */
2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      lastProfile = ras.cProfile;
2084295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( ras.cProfile->flags & Flow_Up )
2085295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        o = IS_TOP_OVERSHOOT( ras.lastY );
2086295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      else
2087295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        o = IS_BOTTOM_OVERSHOOT( ras.lastY );
2088295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      if ( End_Profile( RAS_VARS o ) )
2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FAILURE;
2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* close the `next profile in contour' linked list */
2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ras.gProfile )
2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        lastProfile->next = ras.gProfile;
2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Finalize_Profile_Table( RAS_VAR ) )
2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/
2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**                                                                     **/
2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Init_Linked                                                          */
2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Initializes an empty linked list.                                  */
2117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Init_Linked( TProfileList*  l )
2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *l = NULL;
2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  InsNew                                                               */
2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Inserts a new profile in a linked list.                            */
2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  InsNew( PProfileList  list,
2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          PProfile      profile )
2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PProfile  *old, current;
2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long       x;
2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    old     = list;
2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    current = *old;
2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    x       = profile->X;
2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( current )
2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( x < current->X )
2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      old     = &current->link;
2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      current = *old;
2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    profile->link = current;
2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *old          = profile;
2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  DelOld                                                               */
2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Removes an old profile from a linked list.                         */
2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  DelOld( PProfileList  list,
2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          PProfile      profile )
2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PProfile  *old, current;
2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    old     = list;
2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    current = *old;
2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( current )
2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( current == profile )
2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *old = current->link;
2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      old     = &current->link;
2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      current = *old;
2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* we should never get there, unless the profile was not part of */
2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* the list.                                                     */
2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Sort                                                                 */
2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */
2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    an algorithm which is fast in this case.  Bubble sort is enough    */
2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    and simple.                                                        */
2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Sort( PProfileList  list )
2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PProfile  *old, current, next;
2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* First, set the new X coordinate of each profile */
2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    current = *list;
2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( current )
2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      current->X       = *current->offset;
2208295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      current->offset += current->flags & Flow_Up ? 1 : -1;
2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      current->height--;
2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      current = current->link;
2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Then sort them */
2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    old     = list;
2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    current = *old;
2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !current )
2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    next = current->link;
2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( next )
2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( current->X <= next->X )
2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old     = &current->link;
2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        current = *old;
2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !current )
2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *old          = next;
2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        current->link = next->link;
2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        next->link    = current;
2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old     = list;
2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        current = *old;
2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      next = current->link;
2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Vertical Sweep Procedure Set                                         */
2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  These four routines are used during the vertical black/white sweep   */
2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  phase by the generic Draw_Sweep() function.                          */
2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Sweep_Init( RAS_ARGS Short*  min,
2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                Short*  max )
2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  pitch = ras.target.pitch;
2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( max );
2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceIncr = (Short)-pitch;
2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceOfs  = -*min * pitch;
2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pitch > 0 )
2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.gray_min_x = 0;
2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.gray_max_x = 0;
2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Sweep_Span( RAS_ARGS Short       y,
2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x1,
2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x2,
2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    left,
2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    right )
2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long   e1, e2;
2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Byte*  target;
2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( y );
2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( left );
2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( right );
2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Drop-out control */
2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    e1 = TRUNC( CEILING( x1 ) );
2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( x2 - x1 - ras.precision <= ras.precision_jitter )
2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2 = e1;
2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2 = TRUNC( FLOOR( x2 ) );
2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e2 >= 0 && e1 < ras.bWidth )
2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2301a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      int   c1, c2;
2302a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Byte  f1, f2;
2303a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2304a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 < 0 )
2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        e1 = 0;
2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e2 >= ras.bWidth )
2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        e2 = ras.bWidth - 1;
2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      c1 = (Short)( e1 >> 3 );
2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      c2 = (Short)( e2 >> 3 );
2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );
2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
231677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.gray_min_x > c1 )
231777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.gray_min_x = (short)c1;
231877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.gray_max_x < c2 )
231977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.gray_max_x = (short)c2;
2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      target = ras.bTarget + ras.traceOfs + c1;
2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      c2 -= c1;
2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( c2 > 0 )
2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        target[0] |= f1;
2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* memset() is slower than the following code on many platforms. */
2329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* This is due to the fact that, in the vast majority of cases,  */
2330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* the span length in bytes is relatively small.                 */
2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        c2--;
2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( c2 > 0 )
2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *(++target) = 0xFF;
2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          c2--;
2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        target[1] |= f2;
2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *target |= ( f1 & f2 );
2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Sweep_Drop( RAS_ARGS Short       y,
2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x1,
2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  x2,
2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    left,
2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                PProfile    right )
2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
235277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    Long   e1, e2, pxl;
2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short  c1, f1;
2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Drop-out control */
2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
235877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*   e2            x2                    x1           e1   */
235977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                                                         */
236077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                 ^                     |                 */
236177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                 |                     |                 */
236277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*   +-------------+---------------------+------------+    */
236377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                 |                     |                 */
236477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                 |                     v                 */
236577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*                                                         */
236677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* pixel         contour              contour       pixel  */
236777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* center                                           center */
236877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
236977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* drop-out mode    scan conversion rules (as defined in OpenType) */
237077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* --------------------------------------------------------------- */
237177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  0                1, 2, 3                                       */
237277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  1                1, 2, 4                                       */
237377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  2                1, 2                                          */
237477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  3                same as mode 2                                */
237577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  4                1, 2, 5                                       */
237677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  5                1, 2, 6                                       */
237777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*  6, 7             same as mode 2                                */
237877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
237977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e1  = CEILING( x1 );
238077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e2  = FLOOR  ( x2 );
238177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    pxl = e1;
2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 > e2 )
2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2385295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      Int  dropOutControl = left->flags & 7;
2386295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2387295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 == e2 + ras.precision )
2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2390295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        switch ( dropOutControl )
2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
239277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 0: /* simple drop-outs including stubs */
239377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          pxl = e2;
2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
239677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 4: /* smart drop-outs including stubs */
2397295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
240077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 1: /* simple drop-outs excluding stubs */
240177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 5: /* smart drop-outs excluding stubs  */
240277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
240377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          /* Drop-out Control Rules #4 and #6 */
2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2405295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* The specification neither provides an exact definition */
2406295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* of a `stub' nor gives exact rules to exclude them.     */
2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2408295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* Here the constraints we use to recognize a stub.       */
2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*  upper stub:                                           */
2411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - P_Left and P_Right are in the same contour         */
2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - P_Right is the successor of P_Left in that contour */
2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - y is the top of P_Left and P_Right                 */
2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*  lower stub:                                           */
2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - P_Left and P_Right are in the same contour         */
2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - P_Left is the successor of P_Right in that contour */
2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*   - y is the bottom of P_Left                          */
2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /*                                                        */
2422295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* We draw a stub if the following constraints are met.   */
2423295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /*                                                        */
2424295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /*   - for an upper or lower stub, there is top or bottom */
2425295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /*     overshoot, respectively                            */
2426295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /*   - the covered interval is greater or equal to a half */
2427295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /*     pixel                                              */
2428295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2429295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* upper stub test */
2430295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( left->next == right                &&
2431295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               left->height <= 0                  &&
2432295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               !( left->flags & Overshoot_Top   &&
2433295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                  x2 - x1 >= ras.precision_half ) )
2434295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            return;
2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2436295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          /* lower stub test */
2437295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( right->next == left                 &&
2438295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               left->start == y                    &&
2439295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               !( left->flags & Overshoot_Bottom &&
2440295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                  x2 - x1 >= ras.precision_half  ) )
2441295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            return;
2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2443295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( dropOutControl == 1 )
244477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner            pxl = e2;
244577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          else
2446295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
244777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          break;
2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
244977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        default: /* modes 2, 3, 6, 7 */
245077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return;  /* no drop-out control */
245177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        }
2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2453c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* undocumented but confirmed: If the drop-out would result in a  */
2454c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* pixel outside of the bounding box, use the pixel inside of the */
2455c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* bounding box instead                                           */
2456c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        if ( pxl < 0 )
2457c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          pxl = e1;
2458c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        else if ( TRUNC( pxl ) >= ras.bWidth )
2459c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          pxl = e2;
2460c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
246177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* check that the other pixel isn't set */
246277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        e1 = pxl == e1 ? e2 : e1;
2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        e1 = TRUNC( e1 );
2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        c1 = (Short)( e1 >> 3 );
246777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        f1 = (Short)( e1 &  7 );
2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        if ( e1 >= 0 && e1 < ras.bWidth                      &&
247077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
247177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return;
2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
247777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e1 = TRUNC( pxl );
2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 >= 0 && e1 < ras.bWidth )
2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      c1 = (Short)( e1 >> 3 );
2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      f1 = (Short)( e1 & 7 );
2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
248477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.gray_min_x > c1 )
248577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.gray_min_x = c1;
248677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.gray_max_x < c1 )
248777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.gray_max_x = c1;
2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Sweep_Step( RAS_ARG )
2496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceOfs += ras.traceIncr;
2498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /***********************************************************************/
2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                     */
2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Horizontal Sweep Procedure Set                                     */
2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                     */
2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  These four routines are used during the horizontal black/white     */
2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  sweep phase by the generic Draw_Sweep() function.                  */
2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                     */
2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /***********************************************************************/
2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Sweep_Init( RAS_ARGS Short*  min,
2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  Short*  max )
2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing, really */
2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_RASTER;
2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( min );
2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( max );
2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Sweep_Span( RAS_ARGS Short       y,
2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_F26Dot6  x1,
2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_F26Dot6  x2,
2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  PProfile    left,
2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  PProfile    right )
2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( left );
2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( right );
2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( x2 - x1 < ras.precision )
2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2534a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Long  e1, e2;
2535a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2536a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e1 = CEILING( x1 );
2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e2 = FLOOR  ( x2 );
2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 == e2 )
2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2542a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        Byte   f1;
2543a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        PByte  bits;
2544a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2545a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        bits = ras.bTarget + ( y >> 3 );
2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        f1   = (Byte)( 0x80 >> ( y & 7 ) );
2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        e1 = TRUNC( e1 );
2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( e1 >= 0 && e1 < ras.target.rows )
2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          PByte  p;
2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2556aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich          p = bits - e1 * ras.target.pitch;
2557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( ras.target.pitch > 0 )
2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            p += ( ras.target.rows - 1 ) * ras.target.pitch;
2559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          p[0] |= f1;
2561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Sweep_Drop( RAS_ARGS Short       y,
2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_F26Dot6  x1,
2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  FT_F26Dot6  x2,
2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  PProfile    left,
2572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  PProfile    right )
2573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
257477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    Long   e1, e2, pxl;
2575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PByte  bits;
2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Byte   f1;
2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* During the horizontal sweep, we only take care of drop-outs */
2580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
258177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* e1     +       <-- pixel center */
258277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*        |                        */
258377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* x1  ---+-->    <-- contour      */
258477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*        |                        */
258577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*        |                        */
258677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* x2  <--+---    <-- contour      */
258777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*        |                        */
258877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /*        |                        */
258977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* e2     +       <-- pixel center */
259077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
259177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e1  = CEILING( x1 );
259277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e2  = FLOOR  ( x2 );
259377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    pxl = e1;
2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 > e2 )
2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2597295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      Int  dropOutControl = left->flags & 7;
2598295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 == e2 + ras.precision )
2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2602295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        switch ( dropOutControl )
2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
260477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 0: /* simple drop-outs including stubs */
260577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          pxl = e2;
2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
260877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 4: /* smart drop-outs including stubs */
2609295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 1: /* simple drop-outs excluding stubs */
261377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 5: /* smart drop-outs excluding stubs  */
261477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          /* see Vertical_Sweep_Drop for details */
2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* rightmost stub test */
2617295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( left->next == right                &&
2618295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               left->height <= 0                  &&
2619295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               !( left->flags & Overshoot_Top   &&
2620295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                  x2 - x1 >= ras.precision_half ) )
2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return;
2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* leftmost stub test */
2624295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( right->next == left                 &&
2625295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               left->start == y                    &&
2626295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner               !( left->flags & Overshoot_Bottom &&
2627295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                  x2 - x1 >= ras.precision_half  ) )
2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return;
2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2630295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( dropOutControl == 1 )
263177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner            pxl = e2;
263277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          else
2633295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
263477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          break;
2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
263677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        default: /* modes 2, 3, 6, 7 */
263777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return;  /* no drop-out control */
263877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        }
2639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2640c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* undocumented but confirmed: If the drop-out would result in a  */
2641c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* pixel outside of the bounding box, use the pixel inside of the */
2642c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        /* bounding box instead                                           */
2643c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        if ( pxl < 0 )
2644c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          pxl = e1;
2645c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        else if ( TRUNC( pxl ) >= ras.target.rows )
2646c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner          pxl = e2;
2647c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
264877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* check that the other pixel isn't set */
264977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        e1 = pxl == e1 ? e2 : e1;
2650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        e1 = TRUNC( e1 );
2652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        bits = ras.bTarget + ( y >> 3 );
265477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        f1   = (Byte)( 0x80 >> ( y & 7 ) );
2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        bits -= e1 * ras.target.pitch;
265777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        if ( ras.target.pitch > 0 )
265877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          bits += ( ras.target.rows - 1 ) * ras.target.pitch;
2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
266077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        if ( e1 >= 0              &&
266177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner             e1 < ras.target.rows &&
266277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner             *bits & f1           )
266377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return;
2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bits = ras.bTarget + ( y >> 3 );
2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    f1   = (Byte)( 0x80 >> ( y & 7 ) );
2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
267277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    e1 = TRUNC( pxl );
2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 >= 0 && e1 < ras.target.rows )
2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      bits -= e1 * ras.target.pitch;
2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ras.target.pitch > 0 )
2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        bits += ( ras.target.rows - 1 ) * ras.target.pitch;
2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      bits[0] |= f1;
2681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Sweep_Step( RAS_ARG )
2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Nothing, really */
2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_RASTER;
2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
2694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Vertical Gray Sweep Procedure Set                                    */
2699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  These two routines are used during the vertical gray-levels sweep    */
2701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  phase by the generic Draw_Sweep() function.                          */
2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  NOTES                                                                */
2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - The target pixmap's width *must* be a multiple of 4.               */
2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - You have to use the function Vertical_Sweep_Span() for the gray    */
2708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    span call.                                                         */
2709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Gray_Sweep_Init( RAS_ARGS Short*  min,
2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     Short*  max )
2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long  pitch, byte_len;
2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *min = *min & -2;
2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *max = ( *max + 3 ) & -2;
2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceOfs  = 0;
2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pitch         = ras.target.pitch;
2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    byte_len      = -pitch;
2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceIncr = (Short)byte_len;
2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceG    = ( *min / 2 ) * byte_len;
2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pitch > 0 )
2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.traceG += ( ras.target.rows - 1 ) * pitch;
2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      byte_len    = -byte_len;
2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.gray_min_x =  (Short)byte_len;
2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.gray_max_x = -(Short)byte_len;
2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Vertical_Gray_Sweep_Step( RAS_ARG )
2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2742295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    short*  count = (short*)count_table;
2743295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    Byte*   grays;
2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.traceOfs += ras.gray_width;
2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.traceOfs > ras.gray_width )
2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2750a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      PByte  pix;
2751a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2752a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pix   = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      grays = ras.grays;
2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ras.gray_max_x >= 0 )
2757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
275877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        Long  last_pixel = ras.target.width - 1;
275977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        Int   last_cell  = last_pixel >> 2;
276077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        Int   last_bit   = last_pixel & 3;
276177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        Bool  over       = 0;
2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2763a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        Int    c1, c2;
2764a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        PByte  bit, bit2;
2765a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.gray_max_x >= last_cell && last_bit != 3 )
2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.gray_max_x = last_cell - 1;
2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          over = 1;
2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.gray_min_x < 0 )
2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.gray_min_x = 0;
2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
277677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        bit  = ras.bTarget + ras.gray_min_x;
277777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        bit2 = bit + ras.gray_width;
2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        c1 = ras.gray_max_x - ras.gray_min_x;
2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( c1 >= 0 )
2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          c2 = count[*bit] + count[*bit2];
2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( c2 )
2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            pix[0] = grays[(c2 >> 12) & 0x000F];
2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            pix[1] = grays[(c2 >> 8 ) & 0x000F];
2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            pix[2] = grays[(c2 >> 4 ) & 0x000F];
2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            pix[3] = grays[ c2        & 0x000F];
2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            *bit  = 0;
2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            *bit2 = 0;
2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          bit++;
2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          bit2++;
2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          pix += 4;
2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          c1--;
2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( over )
2803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          c2 = count[*bit] + count[*bit2];
2805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( c2 )
2806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
2807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            switch ( last_bit )
2808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
2809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            case 2:
2810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              pix[2] = grays[(c2 >> 4 ) & 0x000F];
2811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            case 1:
2812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              pix[1] = grays[(c2 >> 8 ) & 0x000F];
2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            default:
2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              pix[0] = grays[(c2 >> 12) & 0x000F];
2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            *bit  = 0;
2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            *bit2 = 0;
2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.traceOfs = 0;
2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.traceG  += ras.traceIncr;
2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.gray_min_x =  32000;
2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.gray_max_x = -32000;
2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Gray_Sweep_Span( RAS_ARGS Short       y,
2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6  x1,
2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6  x2,
2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       PProfile    left,
2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       PProfile    right )
2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing, really */
2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_RASTER;
2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( y );
2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( x1 );
2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( x2 );
2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( left );
2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( right );
2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,
2851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6  x1,
2852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6  x2,
2853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       PProfile    left,
2854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       PProfile    right )
2855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long   e1, e2;
2857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PByte  pixel;
2858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* During the horizontal sweep, we only take care of drop-outs */
286177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    e1 = CEILING( x1 );
2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    e2 = FLOOR  ( x2 );
2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 > e2 )
2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2867295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      Int  dropOutControl = left->flags & 7;
2868295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2869295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 == e2 + ras.precision )
2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2872295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        switch ( dropOutControl )
2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
287477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 0: /* simple drop-outs including stubs */
2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          e1 = e2;
2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
287877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 4: /* smart drop-outs including stubs */
2879295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
288277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 1: /* simple drop-outs excluding stubs */
288377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        case 5: /* smart drop-outs excluding stubs  */
288477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          /* see Vertical_Sweep_Drop for details */
2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* rightmost stub test */
2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( left->next == right && left->height <= 0 )
2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return;
2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* leftmost stub test */
2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( right->next == left && left->start == y )
2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return;
2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2894295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( dropOutControl == 1 )
2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            e1 = e2;
2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
2897295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner            e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
290177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        default: /* modes 2, 3, 6, 7 */
290277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return;  /* no drop-out control */
2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( e1 >= 0 )
2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2911a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      Byte  color;
2912a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2913a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( x2 - x1 >= ras.precision_half )
2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        color = ras.grays[2];
2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        color = ras.grays[1];
2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      e1 = TRUNC( e1 ) / 2;
2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( e1 < ras.target.rows )
2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.target.pitch > 0 )
2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( pixel[0] == ras.grays[0] )
2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          pixel[0] = color;
2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Generic Sweep Drawing routine                                        */
2939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static Bool
2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Draw_Sweep( RAS_ARG )
2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short         y, y_change, y_height;
2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    PProfile      P, Q, P_Left, P_Right;
2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short         min_Y, max_Y, top, bottom, dropouts;
2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long          x1, x2, xs, e1, e2;
2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TProfileList  waiting;
2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TProfileList  draw_left, draw_right;
2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
295777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* initialize empty linked lists */
2958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Init_Linked( &waiting );
2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Init_Linked( &draw_left  );
2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Init_Linked( &draw_right );
2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first, compute min and max Y */
2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    P     = ras.fProfile;
2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    max_Y = (Short)TRUNC( ras.minY );
2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    min_Y = (Short)TRUNC( ras.maxY );
2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( P )
2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Q = P->link;
2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      bottom = (Short)P->start;
2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      top    = (Short)( P->start + P->height - 1 );
2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( min_Y > bottom )
297877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        min_Y = bottom;
297977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( max_Y < top )
298077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        max_Y = top;
2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P->X = 0;
2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      InsNew( &waiting, P );
2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P = Q;
2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* check the Y-turns */
2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.numTurns == 0 )
2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2991a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      ras.error = FT_THROW( Invalid );
2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* now initialize the sweep */
2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* then compute the distance of each profile from min_Y */
3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    P = waiting;
3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( P )
3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P->countL = (UShort)( P->start - min_Y );
3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P = P->link;
3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
300977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* let's go */
3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y        = min_Y;
3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_height = 0;
3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3014295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( ras.numTurns > 0                     &&
3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ras.sizeBuff[-ras.numTurns] == min_Y )
3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.numTurns--;
3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ras.numTurns > 0 )
3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
302077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      /* check waiting list for new activations */
3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P = waiting;
3023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( P )
3025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Q = P->link;
3027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P->countL -= y_height;
3028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( P->countL == 0 )
3029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
3030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DelOld( &waiting, P );
3031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3032295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          if ( P->flags & Flow_Up )
3033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            InsNew( &draw_left,  P );
3034295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner          else
3035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            InsNew( &draw_right, P );
3036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
3037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P = Q;
3039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      /* sort the drawing lists */
3042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Sort( &draw_left );
3044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Sort( &draw_right );
3045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y_change = (Short)ras.sizeBuff[-ras.numTurns--];
3047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y_height = (Short)( y_change - y );
3048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( y < y_change )
3050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
305177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* let's trace */
3052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dropouts = 0;
3054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P_Left  = draw_left;
3056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P_Right = draw_right;
3057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( P_Left )
3059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
3060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x1 = P_Left ->X;
3061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x2 = P_Right->X;
3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( x1 > x2 )
3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
3065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            xs = x1;
3066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            x1 = x2;
3067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            x2 = xs;
3068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
3069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          e1 = FLOOR( x1 );
307177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          e2 = CEILING( x2 );
3072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          if ( x2 - x1 <= ras.precision &&
307477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner               e1 != x1 && e2 != x2     )
307577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          {
307677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner            if ( e1 > e2 || e2 == e1 + ras.precision )
3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
3078295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner              Int  dropOutControl = P_Left->flags & 7;
3079295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
3080295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
3081295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner              if ( dropOutControl != 2 )
308277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner              {
308377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                /* a drop-out was detected */
3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                P_Left ->X = x1;
308677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                P_Right->X = x2;
3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                /* mark profile for drop-out processing */
308977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                P_Left->countL = 1;
309077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                dropouts++;
309177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner              }
3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              goto Skip_To_Next;
3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Skip_To_Next:
3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          P_Left  = P_Left->link;
3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          P_Right = P_Right->link;
3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
310577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* handle drop-outs _after_ the span drawing --       */
310677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* drop-out processing has been moved out of the loop */
310777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        /* for performance tuning                             */
3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( dropouts > 0 )
3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Scan_DropOuts;
3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Next_Line:
3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.Proc_Sweep_Step( RAS_VAR );
3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y++;
3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( y < y_change )
3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Sort( &draw_left  );
3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Sort( &draw_right );
3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      /* now finalize the profiles that need it */
3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P = draw_left;
3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( P )
3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Q = P->link;
3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( P->height == 0 )
3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DelOld( &draw_left, P );
3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P = Q;
3133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P = draw_right;
3136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( P )
3137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Q = P->link;
3139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( P->height == 0 )
3140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DelOld( &draw_right, P );
3141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P = Q;
3142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
314577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    /* for gray-scaling, flush the bitmap scanline cache */
3146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( y <= max_Y )
3147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Step( RAS_VAR );
3149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      y++;
3150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
3153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Scan_DropOuts:
3155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    P_Left  = draw_left;
3157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    P_Right = draw_right;
3158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( P_Left )
3160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( P_Left->countL )
3162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        P_Left->countL = 0;
3164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
3165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dropouts--;  /* -- this is useful when debugging only */
3166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.Proc_Sweep_Drop( RAS_VARS y,
3168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      P_Left->X,
3169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      P_Right->X,
3170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      P_Left,
3171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      P_Right );
3172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P_Left  = P_Left->link;
3175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      P_Right = P_Right->link;
3176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    goto Next_Line;
3179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
3185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Render_Single_Pass                                                 */
3186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
318877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Perform one sweep with sub-banding.                                */
3189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
3191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    flipped :: If set, flip the direction of the outline.              */
3192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
3194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Renderer error code.                                               */
3195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
3197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Render_Single_Pass( RAS_ARGS Bool  flipped )
3198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Short  i, j, k;
3200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ras.band_top >= 0 )
3203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
3205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
3206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.top = ras.buff;
3208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.error = Raster_Err_None;
3210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Convert_Glyph( RAS_VARS flipped ) )
3212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.error != Raster_Err_Overflow )
3214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return FAILURE;
3215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.error = Raster_Err_None;
3217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* sub-banding */
3219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef DEBUG_RASTER
3221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
3222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        i = ras.band_stack[ras.band_top].y_min;
3225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        j = ras.band_stack[ras.band_top].y_max;
3226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        k = (Short)( ( i + j ) / 2 );
3228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.band_top >= 7 || k < i )
3230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
3231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ras.band_top = 0;
3232a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang          ras.error    = FT_THROW( Invalid );
3233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return ras.error;
3235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
3236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.band_stack[ras.band_top + 1].y_min = k;
3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.band_stack[ras.band_top + 1].y_max = j;
3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.band_top++;
3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( ras.fProfile )
3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( Draw_Sweep( RAS_VAR ) )
3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             return ras.error;
3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ras.band_top--;
3250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Render_Glyph                                                       */
3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
326377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */
3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
3269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Render_Glyph( RAS_ARG )
3270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
3272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Set_High_Precision( RAS_VARS ras.outline.flags &
3275295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                 FT_OUTLINE_HIGH_PRECISION );
327677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.scale_shift = ras.precision_shift;
327777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
327877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
327977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      ras.dropOutControl = 2;
328077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    else
328177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    {
328277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
328377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl = 4;
328477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      else
328577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl = 0;
328677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
328777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
328877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl += 1;
328977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    }
329077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
329177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.second_pass = (FT_Byte)( !( ras.outline.flags &
329277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                                    FT_OUTLINE_SINGLE_PASS ) );
3293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Vertical Sweep */
3295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Init = Vertical_Sweep_Init;
3296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
3297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
3298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Step = Vertical_Sweep_Step;
3299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_top            = 0;
3301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_stack[0].y_min = 0;
3302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );
3303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.bWidth  = (unsigned short)ras.target.width;
3305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.bTarget = (Byte*)ras.target.buffer;
3306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
3308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
3309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Horizontal Sweep */
331177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    if ( ras.second_pass && ras.dropOutControl != 2 )
3312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
3314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
3315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
3316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
3317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_top            = 0;
3319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_stack[0].y_min = 0;
3320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_stack[0].y_max = (short)( ras.target.width - 1 );
3321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
3323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
3324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return Raster_Err_None;
3327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
3331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
3335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Render_Gray_Glyph                                                  */
3336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
333877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  /*    Render a glyph with grayscaling.  Sub-banding if needed.           */
3339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
3341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
3342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
3344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Render_Gray_Glyph( RAS_ARG )
3345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Long      pixel_width;
3347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
3348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Set_High_Precision( RAS_VARS ras.outline.flags &
3351295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                 FT_OUTLINE_HIGH_PRECISION );
335277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.scale_shift = ras.precision_shift + 1;
335377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
335477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
335577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      ras.dropOutControl = 2;
335677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    else
335777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    {
335877f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
335977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl = 4;
336077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      else
336177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl = 0;
336277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
336377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
336477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        ras.dropOutControl += 1;
336577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    }
336677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner
336777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );
3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Vertical Sweep */
3370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_top            = 0;
3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_stack[0].y_min = 0;
3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.bWidth  = ras.gray_width;
3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ras.bWidth > pixel_width )
3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.bWidth = pixel_width;
3380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.bWidth  = ras.bWidth * 8;
3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.bTarget = (Byte*)ras.gray_lines;
3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.gTarget = (Byte*)ras.target.buffer;
3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
3387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = Render_Single_Pass( RAS_VARS 0 );
3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Horizontal Sweep */
339577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    if ( ras.second_pass && ras.dropOutControl != 2 )
3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
3399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
3400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_top            = 0;
3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_stack[0].y_min = 0;
3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ras.band_stack[0].y_max = ras.target.width * 2 - 1;
3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Render_Single_Pass( RAS_VARS 1 );
3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return Raster_Err_None;
3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Render_Gray_Glyph( RAS_ARG )
3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_RASTER;
3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3421a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    return FT_THROW( Unsupported );
3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3428e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_init( black_PRaster  raster )
3429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
3431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt  n;
3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set default 5-levels gray palette */
3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < 5; n++ )
3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[n] = n * 255 / 4;
3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    raster->gray_width = RASTER_GRAY_LINES / 2;
3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( raster );
3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                         a static object.                  *****/
3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef _STANDALONE_
3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
345377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner  ft_black_new( void*       memory,
3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                FT_Raster  *araster )
3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3456e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang     static black_TRaster  the_raster;
34578583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner     FT_UNUSED( memory );
3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     *araster = (FT_Raster)&the_raster;
3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     ft_black_init( &the_raster );
3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     return 0;
3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_black_done( FT_Raster  raster )
3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing */
3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( raster );
3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3476aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#else /* !_STANDALONE_ */
3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
3480e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_new( FT_Memory       memory,
3481e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                black_PRaster  *araster )
3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3483e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Error       error;
3484e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    black_PRaster  raster = NULL;
3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *araster = 0;
3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !FT_NEW( raster ) )
3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->memory = memory;
3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ft_black_init( raster );
3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *araster = raster;
3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3501e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_done( black_PRaster  raster )
3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = (FT_Memory)raster->memory;
3504e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
3505e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( raster );
3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3510aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif /* !_STANDALONE_ */
3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3514e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_reset( black_PRaster  raster,
3515e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                  char*          pool_base,
3516e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                  long           pool_size )
3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( raster )
3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3520e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )
3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3522e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang        black_PWorker  worker = (black_PWorker)pool_base;
3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3525aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        raster->buffer      = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );
3526a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        raster->buffer_size = (long)( pool_base + pool_size -
3527a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                        (char*)raster->buffer );
3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        raster->worker      = worker;
3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        raster->buffer      = NULL;
3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        raster->buffer_size = 0;
3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        raster->worker      = NULL;
3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3541e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_set_mode( black_PRaster  raster,
354277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                     unsigned long  mode,
354377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                     const char*    palette )
3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* set 5-levels gray palette */
3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[0] = palette[0];
3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[1] = palette[1];
3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[2] = palette[2];
3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[3] = palette[3];
3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      raster->grays[4] = palette[4];
3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( raster );
3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( mode );
3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( palette );
3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
3568e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_black_render( black_PRaster            raster,
3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   const FT_Raster_Params*  params )
3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const FT_Outline*  outline    = (const FT_Outline*)params->source;
3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const FT_Bitmap*   target_map = params->target;
3573e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    black_PWorker      worker;
3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !raster || !raster->buffer || !raster->buffer_size )
3577a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Not_Ini );
3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !outline )
3580a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid );
3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* return immediately if the outline is empty */
3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( outline->n_points == 0 || outline->n_contours <= 0 )
3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return Raster_Err_None;
3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !outline->contours || !outline->points )
3587a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid );
3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( outline->n_points !=
3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           outline->contours[outline->n_contours - 1] + 1 )
3591a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid );
3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    worker = raster->worker;
3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* this version of the raster does not support direct rendering, sorry */
3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( params->flags & FT_RASTER_FLAG_DIRECT )
3597a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unsupported );
3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !target_map )
3600a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid );
3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !target_map->width || !target_map->rows )
3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return Raster_Err_None;
3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !target_map->buffer )
3607a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid );
3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
360977f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.outline = *outline;
361077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    ras.target  = *target_map;
3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
361277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    worker->buff       = (PLong) raster->buffer;
361377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    worker->sizeBuff   = worker->buff +
361477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                           raster->buffer_size / sizeof ( Long );
3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_RASTER_OPTION_ANTI_ALIASING
361677f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    worker->grays      = raster->grays;
361777f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    worker->gray_width = raster->gray_width;
3618295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
3619295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );
3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3622295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return ( params->flags & FT_RASTER_FLAG_AA )
3623295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner           ? Render_Gray_Glyph( RAS_VAR )
3624295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner           : Render_Glyph( RAS_VAR );
3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3628295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_DEFINE_RASTER_FUNCS( ft_standard_raster,
3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Raster_New_Func)     ft_black_new,
3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Raster_Reset_Func)   ft_black_reset,
3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Raster_Set_Mode_Func)ft_black_set_mode,
3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Raster_Render_Func)  ft_black_render,
3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Raster_Done_Func)    ft_black_done
3635295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
3639