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 = ¤t->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 = ¤t->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 = ¤t->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