2000-06-28 01:18:39 +02:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* ftgrays.c */
|
|
|
|
/* */
|
|
|
|
/* A new `perfect' anti-aliasing renderer (body). */
|
|
|
|
/* */
|
2005-04-14 18:03:15 +02:00
|
|
|
/* Copyright 2000-2001, 2002, 2003, 2005 by */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
|
|
|
/* */
|
|
|
|
/* This file is part of the FreeType project, and may only be used, */
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */
|
|
|
|
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
|
|
|
|
/* this file you indicate that you have read the license and */
|
|
|
|
/* understand and accept it fully. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* This file can be compiled without the rest of the FreeType engine, by */
|
|
|
|
/* defining the _STANDALONE_ macro when compiling it. You also need to */
|
|
|
|
/* put the files `ftgrays.h' and `ftimage.h' into the current */
|
|
|
|
/* compilation directory. Typically, you could do something like */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-09-16 08:15:31 +02:00
|
|
|
/* - copy `src/smooth/ftgrays.c' (this file) to your current directory */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-09-16 08:15:31 +02:00
|
|
|
/* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
|
|
|
|
/* same directory */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* cc -c -D_STANDALONE_ ftgrays.c */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* The renderer can be initialized with a call to */
|
2002-10-24 23:37:02 +02:00
|
|
|
/* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */
|
|
|
|
/* with a call to `ft_gray_raster.raster_render'. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* See the comments and documentation in the file `ftimage.h' for more */
|
|
|
|
/* details on how the raster works. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* This is a new anti-aliasing scan-converter for FreeType 2. The */
|
|
|
|
/* algorithm used here is _very_ different from the one in the standard */
|
|
|
|
/* `ftraster' module. Actually, `ftgrays' computes the _exact_ */
|
|
|
|
/* coverage of the outline on each pixel cell. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* It is based on ideas that I initially found in Raph Levien's */
|
|
|
|
/* excellent LibArt graphics library (see http://www.levien.com/libart */
|
|
|
|
/* for more information, though the web pages do not tell anything */
|
|
|
|
/* about the renderer; you'll have to dive into the source code to */
|
|
|
|
/* understand how it works). */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* Note, however, that this is a _very_ different implementation */
|
|
|
|
/* compared to Raph's. Coverage information is stored in a very */
|
|
|
|
/* different way, and I don't use sorted vector paths. Also, it doesn't */
|
|
|
|
/* use floating point values. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* This renderer has the following advantages: */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - It doesn't need an intermediate bitmap. Instead, one can supply a */
|
|
|
|
/* callback function that will be called by the renderer to draw gray */
|
|
|
|
/* spans on any target surface. You can thus do direct composition on */
|
|
|
|
/* any kind of bitmap, provided that you give the renderer the right */
|
|
|
|
/* callback. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */
|
|
|
|
/* each pixel cell. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - It performs a single pass on the outline (the `standard' FT2 */
|
|
|
|
/* renderer makes two passes). */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - It can easily be modified to render to _any_ number of gray levels */
|
|
|
|
/* cheaply. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* - For small (< 20) pixel sizes, it is faster than the standard */
|
|
|
|
/* renderer. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
|
|
|
|
/* experimental support for gamma correction within the rasterizer */
|
2001-12-05 02:22:05 +01:00
|
|
|
#define xxxGRAYS_USE_GAMMA
|
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
|
|
|
|
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
|
|
|
|
/* messages during execution. */
|
|
|
|
/* */
|
|
|
|
#undef FT_COMPONENT
|
2002-02-21 12:48:48 +01:00
|
|
|
#define FT_COMPONENT trace_smooth
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
#define ErrRaster_MemoryOverflow -4
|
|
|
|
|
* README.UNX: updated the Unix-specific quick-compilation guide to
warn about the GNU Make requirement at compile time..
* include/freetype/config/ftstdlib.h,
include/freetype/config/ftconfig.h,
include/freetype/config/ftheader.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h,
src/autohint/ahoptim.c,
src/base/ftdbgmem.c, src/base/ftdebug.c,
src/base/ftmac.c, src/base/ftobjs.c,
src/base/ftsystem.c,
src/cache/ftcimage.c, src/cache/ftcsbits.c,
src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
src/pcf/pcfdriver.c, src/pcf/pcfread.c,
src/psaux/t1cmap.c, src/psaux/t1decode.c,
src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
src/pshinter/pshrec.c,
src/psnames/psmodule.c,
src/raster/ftraster.c,
src/sfnt/sfdriver.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
src/smooth/ftgrays.c,
src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c:
added the new configuration file "ftstdlib.h" used to define
aliases for all ISO C library functions used by the engine
(e.g. strlen, qsort, setjmp, etc...)
this eases the porting of FreeType 2 to exotic environments like
XFree86 modules/extensions..
also removed many #include <string.h>, #include <stdlib.h>, etc...
from the engine's sources where they're not needed..
2002-04-12 11:31:48 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#ifdef _STANDALONE_
|
|
|
|
|
* README.UNX: updated the Unix-specific quick-compilation guide to
warn about the GNU Make requirement at compile time..
* include/freetype/config/ftstdlib.h,
include/freetype/config/ftconfig.h,
include/freetype/config/ftheader.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h,
src/autohint/ahoptim.c,
src/base/ftdbgmem.c, src/base/ftdebug.c,
src/base/ftmac.c, src/base/ftobjs.c,
src/base/ftsystem.c,
src/cache/ftcimage.c, src/cache/ftcsbits.c,
src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
src/pcf/pcfdriver.c, src/pcf/pcfread.c,
src/psaux/t1cmap.c, src/psaux/t1decode.c,
src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
src/pshinter/pshrec.c,
src/psnames/psmodule.c,
src/raster/ftraster.c,
src/sfnt/sfdriver.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
src/smooth/ftgrays.c,
src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c:
added the new configuration file "ftstdlib.h" used to define
aliases for all ISO C library functions used by the engine
(e.g. strlen, qsort, setjmp, etc...)
this eases the porting of FreeType 2 to exotic environments like
XFree86 modules/extensions..
also removed many #include <string.h>, #include <stdlib.h>, etc...
from the engine's sources where they're not needed..
2002-04-12 11:31:48 +02:00
|
|
|
#include <string.h> /* for ft_memcpy() */
|
|
|
|
#include <setjmp.h>
|
|
|
|
#include <limits.h>
|
2002-04-14 02:54:32 +02:00
|
|
|
#define FT_UINT_MAX UINT_MAX
|
2000-07-09 21:15:30 +02:00
|
|
|
|
2002-09-16 08:15:31 +02:00
|
|
|
#define ft_memset memset
|
|
|
|
|
|
|
|
#define ft_setjmp setjmp
|
|
|
|
#define ft_longjmp longjmp
|
|
|
|
#define ft_jmp_buf jmp_buf
|
2002-06-11 01:03:35 +02:00
|
|
|
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#define ErrRaster_Invalid_Mode -2
|
2000-07-09 21:15:30 +02:00
|
|
|
#define ErrRaster_Invalid_Outline -1
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-09-16 08:15:31 +02:00
|
|
|
#define FT_BEGIN_HEADER
|
|
|
|
#define FT_END_HEADER
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#include "ftimage.h"
|
|
|
|
#include "ftgrays.h"
|
|
|
|
|
|
|
|
/* This macro is used to indicate that a function parameter is unused. */
|
|
|
|
/* Its purpose is simply to reduce compiler warnings. Note also that */
|
|
|
|
/* simply defining it as `(void)x' doesn't avoid warnings with certain */
|
|
|
|
/* ANSI compilers (e.g. LCC). */
|
2000-07-04 20:12:13 +02:00
|
|
|
#define FT_UNUSED( x ) (x) = (x)
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* Disable the tracing mechanism for simplicity -- developers can */
|
|
|
|
/* activate it easily by redefining these two macros. */
|
|
|
|
#ifndef FT_ERROR
|
|
|
|
#define FT_ERROR( x ) do ; while ( 0 ) /* nothing */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef FT_TRACE
|
|
|
|
#define FT_TRACE( x ) do ; while ( 0 ) /* nothing */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#else /* _STANDALONE_ */
|
|
|
|
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
|
2000-12-14 00:44:37 +01:00
|
|
|
#include <ft2build.h>
|
2001-03-20 12:14:24 +01:00
|
|
|
#include "ftgrays.h"
|
2000-12-14 00:44:37 +01:00
|
|
|
#include FT_INTERNAL_OBJECTS_H
|
|
|
|
#include FT_INTERNAL_DEBUG_H
|
|
|
|
#include FT_OUTLINE_H
|
2000-06-28 01:18:39 +02:00
|
|
|
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
#include "ftsmerrs.h"
|
|
|
|
|
|
|
|
#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
|
|
|
|
#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
#endif /* _STANDALONE_ */
|
|
|
|
|
|
|
|
|
2002-03-22 14:52:37 +01:00
|
|
|
#ifndef FT_MEM_SET
|
* README.UNX: updated the Unix-specific quick-compilation guide to
warn about the GNU Make requirement at compile time..
* include/freetype/config/ftstdlib.h,
include/freetype/config/ftconfig.h,
include/freetype/config/ftheader.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h,
src/autohint/ahoptim.c,
src/base/ftdbgmem.c, src/base/ftdebug.c,
src/base/ftmac.c, src/base/ftobjs.c,
src/base/ftsystem.c,
src/cache/ftcimage.c, src/cache/ftcsbits.c,
src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
src/pcf/pcfdriver.c, src/pcf/pcfread.c,
src/psaux/t1cmap.c, src/psaux/t1decode.c,
src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
src/pshinter/pshrec.c,
src/psnames/psmodule.c,
src/raster/ftraster.c,
src/sfnt/sfdriver.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
src/smooth/ftgrays.c,
src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c:
added the new configuration file "ftstdlib.h" used to define
aliases for all ISO C library functions used by the engine
(e.g. strlen, qsort, setjmp, etc...)
this eases the porting of FreeType 2 to exotic environments like
XFree86 modules/extensions..
also removed many #include <string.h>, #include <stdlib.h>, etc...
from the engine's sources where they're not needed..
2002-04-12 11:31:48 +02:00
|
|
|
#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
|
2002-09-16 08:15:31 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef FT_MEM_ZERO
|
|
|
|
#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
|
2001-10-24 09:32:55 +02:00
|
|
|
#endif
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
/* define this to dump debugging information */
|
|
|
|
#define xxxDEBUG_GRAYS
|
|
|
|
|
|
|
|
/* as usual, for the speed hungry :-) */
|
|
|
|
|
|
|
|
#ifndef FT_STATIC_RASTER
|
|
|
|
|
|
|
|
|
|
|
|
#define RAS_ARG PRaster raster
|
|
|
|
#define RAS_ARG_ PRaster raster,
|
|
|
|
|
|
|
|
#define RAS_VAR raster
|
|
|
|
#define RAS_VAR_ raster,
|
|
|
|
|
|
|
|
#define ras (*raster)
|
|
|
|
|
|
|
|
|
|
|
|
#else /* FT_STATIC_RASTER */
|
|
|
|
|
|
|
|
|
|
|
|
#define RAS_ARG /* empty */
|
|
|
|
#define RAS_ARG_ /* empty */
|
|
|
|
#define RAS_VAR /* empty */
|
|
|
|
#define RAS_VAR_ /* empty */
|
|
|
|
|
|
|
|
static TRaster ras;
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* FT_STATIC_RASTER */
|
|
|
|
|
|
|
|
|
|
|
|
/* must be at least 6 bits! */
|
|
|
|
#define PIXEL_BITS 8
|
|
|
|
|
|
|
|
#define ONE_PIXEL ( 1L << PIXEL_BITS )
|
|
|
|
#define PIXEL_MASK ( -1L << PIXEL_BITS )
|
2002-10-05 08:57:53 +02:00
|
|
|
#define TRUNC( x ) ( (TCoord)((x) >> PIXEL_BITS) )
|
|
|
|
#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
|
2000-06-28 01:18:39 +02:00
|
|
|
#define FLOOR( x ) ( (x) & -ONE_PIXEL )
|
|
|
|
#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
|
|
|
|
#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
|
|
|
|
|
|
|
|
#if PIXEL_BITS >= 6
|
|
|
|
#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) )
|
|
|
|
#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) )
|
|
|
|
#else
|
|
|
|
#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) )
|
|
|
|
#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) )
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Define this if you want to use a more compact storage scheme. This */
|
|
|
|
/* increases the number of cells available in the render pool but slows */
|
|
|
|
/* down the rendering a bit. It is useful if you have a really tiny */
|
|
|
|
/* render pool. */
|
2002-09-16 08:15:31 +02:00
|
|
|
#undef GRAYS_COMPACT
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TYPE DEFINITIONS */
|
|
|
|
/* */
|
2001-11-20 02:29:34 +01:00
|
|
|
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
/* don't change the following types to FT_Int or FT_Pos, since we might */
|
|
|
|
/* need to define them to "float" or "double" when experimenting with */
|
|
|
|
/* new algorithms */
|
2001-10-07 12:39:03 +02:00
|
|
|
|
2002-04-30 16:26:49 +02:00
|
|
|
typedef int TCoord; /* integer scanline/pixel coordinate */
|
|
|
|
typedef long TPos; /* sub-pixel coordinate */
|
2000-06-28 01:18:39 +02:00
|
|
|
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
/* determine the type used to store cell areas. This normally takes at */
|
2005-05-18 09:01:59 +02:00
|
|
|
/* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */
|
|
|
|
/* `long' instead of `int', otherwise bad things happen */
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
#if PIXEL_BITS <= 7
|
|
|
|
|
|
|
|
typedef int TArea;
|
|
|
|
|
|
|
|
#else /* PIXEL_BITS >= 8 */
|
|
|
|
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
/* approximately determine the size of integers using an ANSI-C header */
|
* README.UNX: updated the Unix-specific quick-compilation guide to
warn about the GNU Make requirement at compile time..
* include/freetype/config/ftstdlib.h,
include/freetype/config/ftconfig.h,
include/freetype/config/ftheader.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h,
src/autohint/ahoptim.c,
src/base/ftdbgmem.c, src/base/ftdebug.c,
src/base/ftmac.c, src/base/ftobjs.c,
src/base/ftsystem.c,
src/cache/ftcimage.c, src/cache/ftcsbits.c,
src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
src/pcf/pcfdriver.c, src/pcf/pcfread.c,
src/psaux/t1cmap.c, src/psaux/t1decode.c,
src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
src/pshinter/pshrec.c,
src/psnames/psmodule.c,
src/raster/ftraster.c,
src/sfnt/sfdriver.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
src/smooth/ftgrays.c,
src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c:
added the new configuration file "ftstdlib.h" used to define
aliases for all ISO C library functions used by the engine
(e.g. strlen, qsort, setjmp, etc...)
this eases the porting of FreeType 2 to exotic environments like
XFree86 modules/extensions..
also removed many #include <string.h>, #include <stdlib.h>, etc...
from the engine's sources where they're not needed..
2002-04-12 11:31:48 +02:00
|
|
|
#if FT_UINT_MAX == 0xFFFFU
|
2001-10-07 12:39:03 +02:00
|
|
|
typedef long TArea;
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
#else
|
|
|
|
typedef int TArea;
|
|
|
|
#endif
|
2001-10-07 12:39:03 +02:00
|
|
|
|
|
|
|
#endif /* PIXEL_BITS >= 8 */
|
|
|
|
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
/* maximal number of gray spans in a call to the span callback */
|
|
|
|
#define FT_MAX_GRAY_SPANS 32
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef GRAYS_COMPACT
|
|
|
|
|
|
|
|
typedef struct TCell_
|
|
|
|
{
|
|
|
|
short x : 14;
|
|
|
|
short y : 14;
|
|
|
|
int cover : PIXEL_BITS + 2;
|
|
|
|
int area : PIXEL_BITS * 2 + 2;
|
|
|
|
|
|
|
|
} TCell, *PCell;
|
|
|
|
|
|
|
|
#else /* GRAYS_COMPACT */
|
|
|
|
|
|
|
|
typedef struct TCell_
|
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord x;
|
|
|
|
TCoord y;
|
|
|
|
int cover;
|
|
|
|
TArea area;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
} TCell, *PCell;
|
|
|
|
|
|
|
|
#endif /* GRAYS_COMPACT */
|
|
|
|
|
|
|
|
|
2000-07-02 02:27:53 +02:00
|
|
|
typedef struct TRaster_
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
PCell cells;
|
|
|
|
int max_cells;
|
|
|
|
int num_cells;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
TPos min_ex, max_ex;
|
|
|
|
TPos min_ey, max_ey;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-04-30 16:26:49 +02:00
|
|
|
TArea area;
|
|
|
|
int cover;
|
|
|
|
int invalid;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord ex, ey;
|
|
|
|
TCoord cx, cy;
|
|
|
|
TPos x, y;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
TPos last_ey;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-04-26 15:34:36 +02:00
|
|
|
FT_Vector bez_stack[32 * 3 + 1];
|
2000-06-28 01:18:39 +02:00
|
|
|
int lev_stack[32];
|
|
|
|
|
|
|
|
FT_Outline outline;
|
|
|
|
FT_Bitmap target;
|
2000-12-14 19:50:40 +01:00
|
|
|
FT_BBox clip_box;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
FT_Span gray_spans[FT_MAX_GRAY_SPANS];
|
|
|
|
int num_gray_spans;
|
|
|
|
|
|
|
|
FT_Raster_Span_Func render_span;
|
|
|
|
void* render_span_data;
|
|
|
|
int span_y;
|
|
|
|
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
int band_size;
|
|
|
|
int band_shoot;
|
|
|
|
int conic_level;
|
|
|
|
int cubic_level;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-04-14 02:54:32 +02:00
|
|
|
void* memory;
|
* README.UNX: updated the Unix-specific quick-compilation guide to
warn about the GNU Make requirement at compile time..
* include/freetype/config/ftstdlib.h,
include/freetype/config/ftconfig.h,
include/freetype/config/ftheader.h,
include/freetype/internal/ftmemory.h,
include/freetype/internal/ftobjs.h,
src/autohint/ahoptim.c,
src/base/ftdbgmem.c, src/base/ftdebug.c,
src/base/ftmac.c, src/base/ftobjs.c,
src/base/ftsystem.c,
src/cache/ftcimage.c, src/cache/ftcsbits.c,
src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
src/pcf/pcfdriver.c, src/pcf/pcfread.c,
src/psaux/t1cmap.c, src/psaux/t1decode.c,
src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
src/pshinter/pshrec.c,
src/psnames/psmodule.c,
src/raster/ftraster.c,
src/sfnt/sfdriver.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
src/smooth/ftgrays.c,
src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c:
added the new configuration file "ftstdlib.h" used to define
aliases for all ISO C library functions used by the engine
(e.g. strlen, qsort, setjmp, etc...)
this eases the porting of FreeType 2 to exotic environments like
XFree86 modules/extensions..
also removed many #include <string.h>, #include <stdlib.h>, etc...
from the engine's sources where they're not needed..
2002-04-12 11:31:48 +02:00
|
|
|
ft_jmp_buf jump_buffer;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-12-05 02:22:05 +01:00
|
|
|
#ifdef GRAYS_USE_GAMMA
|
2002-09-16 08:15:31 +02:00
|
|
|
unsigned char gamma[257];
|
2001-10-31 00:51:24 +01:00
|
|
|
#endif
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
} TRaster, *PRaster;
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Initialize the cells table. */
|
|
|
|
/* */
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_init_cells( RAS_ARG_ void* buffer,
|
|
|
|
long byte_size )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
ras.cells = (PCell)buffer;
|
* include/freetype/internal/ftdriver.h,
include/freetype/internal/ftobjs.h,
include/freetype/internal/psaux.h, src/cid/cidgload.c,
src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h,
src/pshinter/pshrec.c, src/pshinter/pshalgo.c,
src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c,
src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c,
src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c,
src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c,
src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h:
Many casts and slight argument type changes to make it work with
a 16bit compiler.
2003-06-05 06:31:05 +02:00
|
|
|
ras.max_cells = (int)( byte_size / sizeof ( TCell ) );
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.num_cells = 0;
|
|
|
|
ras.area = 0;
|
|
|
|
ras.cover = 0;
|
|
|
|
ras.invalid = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Compute the outline bounding box. */
|
|
|
|
/* */
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_compute_cbox( RAS_ARG )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
FT_Outline* outline = &ras.outline;
|
|
|
|
FT_Vector* vec = outline->points;
|
|
|
|
FT_Vector* limit = vec + outline->n_points;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( outline->n_points <= 0 )
|
|
|
|
{
|
|
|
|
ras.min_ex = ras.max_ex = 0;
|
|
|
|
ras.min_ey = ras.max_ey = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
ras.min_ex = ras.max_ex = vec->x;
|
|
|
|
ras.min_ey = ras.max_ey = vec->y;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
vec++;
|
|
|
|
|
|
|
|
for ( ; vec < limit; vec++ )
|
|
|
|
{
|
|
|
|
TPos x = vec->x;
|
|
|
|
TPos y = vec->y;
|
|
|
|
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
if ( x < ras.min_ex ) ras.min_ex = x;
|
|
|
|
if ( x > ras.max_ex ) ras.max_ex = x;
|
|
|
|
if ( y < ras.min_ey ) ras.min_ey = y;
|
|
|
|
if ( y > ras.max_ey ) ras.max_ey = y;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* truncate the bounding box to integer pixels */
|
|
|
|
ras.min_ex = ras.min_ex >> 6;
|
|
|
|
ras.min_ey = ras.min_ey >> 6;
|
|
|
|
ras.max_ex = ( ras.max_ex + 63 ) >> 6;
|
|
|
|
ras.max_ey = ( ras.max_ey + 63 ) >> 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Record the current cell in the table. */
|
|
|
|
/* */
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
|
|
|
gray_record_cell( RAS_ARG )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PCell cell;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !ras.invalid && ( ras.area | ras.cover ) )
|
|
|
|
{
|
|
|
|
if ( ras.num_cells >= ras.max_cells )
|
2002-06-11 01:03:35 +02:00
|
|
|
ft_longjmp( ras.jump_buffer, 1 );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
cell = ras.cells + ras.num_cells++;
|
2002-10-05 08:57:53 +02:00
|
|
|
cell->x = (TCoord)(ras.ex - ras.min_ex);
|
|
|
|
cell->y = (TCoord)(ras.ey - ras.min_ey);
|
2000-06-28 01:18:39 +02:00
|
|
|
cell->area = ras.area;
|
|
|
|
cell->cover = ras.cover;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Set the current cell to a new position. */
|
|
|
|
/* */
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
2002-04-30 16:26:49 +02:00
|
|
|
gray_set_cell( RAS_ARG_ TCoord ex,
|
|
|
|
TCoord ey )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
int invalid, record, clean;
|
|
|
|
|
|
|
|
|
|
|
|
/* Move the cell pointer to a new position. We set the `invalid' */
|
|
|
|
/* flag to indicate that the cell isn't part of those we're interested */
|
|
|
|
/* in during the render phase. This means that: */
|
|
|
|
/* */
|
2000-07-02 02:27:53 +02:00
|
|
|
/* . the new vertical position must be within min_ey..max_ey-1. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* . the new horizontal position must be strictly less than max_ex */
|
|
|
|
/* */
|
|
|
|
/* Note that if a cell is to the left of the clipping region, it is */
|
|
|
|
/* actually set to the (min_ex-1) horizontal position. */
|
|
|
|
|
|
|
|
record = 0;
|
|
|
|
clean = 1;
|
|
|
|
|
|
|
|
invalid = ( ey < ras.min_ey || ey >= ras.max_ey || ex >= ras.max_ex );
|
|
|
|
if ( !invalid )
|
|
|
|
{
|
|
|
|
/* All cells that are on the left of the clipping region go to the */
|
|
|
|
/* min_ex - 1 horizontal position. */
|
|
|
|
if ( ex < ras.min_ex )
|
2002-10-05 08:57:53 +02:00
|
|
|
ex = (TCoord)(ras.min_ex - 1);
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* if our position is new, then record the previous cell */
|
|
|
|
if ( ex != ras.ex || ey != ras.ey )
|
|
|
|
record = 1;
|
|
|
|
else
|
|
|
|
clean = ras.invalid; /* do not clean if we didn't move from */
|
|
|
|
/* a valid cell */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* record the previous cell if needed (i.e., if we changed the cell */
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
/* position, or changed the `invalid' flag) */
|
2001-10-07 12:39:03 +02:00
|
|
|
if ( ras.invalid != invalid || record )
|
|
|
|
gray_record_cell( RAS_VAR );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
if ( clean )
|
|
|
|
{
|
|
|
|
ras.area = 0;
|
|
|
|
ras.cover = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ras.invalid = invalid;
|
|
|
|
ras.ex = ex;
|
|
|
|
ras.ey = ey;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Start a new contour at a given cell. */
|
|
|
|
/* */
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2002-04-30 16:26:49 +02:00
|
|
|
gray_start_cell( RAS_ARG_ TCoord ex,
|
|
|
|
TCoord ey )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
if ( ex < ras.min_ex )
|
2002-10-05 08:57:53 +02:00
|
|
|
ex = (TCoord)(ras.min_ex - 1);
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
ras.area = 0;
|
|
|
|
ras.cover = 0;
|
|
|
|
ras.ex = ex;
|
|
|
|
ras.ey = ey;
|
|
|
|
ras.last_ey = SUBPIXELS( ey );
|
|
|
|
ras.invalid = 0;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_set_cell( RAS_VAR_ ex, ey );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Render a scanline as one or more cells. */
|
|
|
|
/* */
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
2002-04-30 16:26:49 +02:00
|
|
|
gray_render_scanline( RAS_ARG_ TCoord ey,
|
|
|
|
TPos x1,
|
|
|
|
TCoord y1,
|
|
|
|
TPos x2,
|
|
|
|
TCoord y2 )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord ex1, ex2, fx1, fx2, delta;
|
|
|
|
long p, first, dx;
|
|
|
|
int incr, lift, mod, rem;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
dx = x2 - x1;
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
ex1 = TRUNC( x1 ); /* if (ex1 >= ras.max_ex) ex1 = ras.max_ex-1; */
|
|
|
|
ex2 = TRUNC( x2 ); /* if (ex2 >= ras.max_ex) ex2 = ras.max_ex-1; */
|
2002-09-28 18:40:57 +02:00
|
|
|
fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
|
|
|
|
fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* trivial case. Happens often */
|
|
|
|
if ( y1 == y2 )
|
2001-10-07 12:39:03 +02:00
|
|
|
{
|
|
|
|
gray_set_cell( RAS_VAR_ ex2, ey );
|
|
|
|
return;
|
|
|
|
}
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* everything is located in a single cell. That is easy! */
|
|
|
|
/* */
|
|
|
|
if ( ex1 == ex2 )
|
|
|
|
{
|
|
|
|
delta = y2 - y1;
|
2001-10-07 12:39:03 +02:00
|
|
|
ras.area += (TArea)( fx1 + fx2 ) * delta;
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.cover += delta;
|
2001-10-07 12:39:03 +02:00
|
|
|
return;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ok, we'll have to render a run of adjacent cells on the same */
|
|
|
|
/* scanline... */
|
|
|
|
/* */
|
|
|
|
p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
|
|
|
|
first = ONE_PIXEL;
|
|
|
|
incr = 1;
|
|
|
|
|
|
|
|
if ( dx < 0 )
|
|
|
|
{
|
|
|
|
p = fx1 * ( y2 - y1 );
|
|
|
|
first = 0;
|
|
|
|
incr = -1;
|
|
|
|
dx = -dx;
|
|
|
|
}
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
delta = (TCoord)( p / dx );
|
|
|
|
mod = (TCoord)( p % dx );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( mod < 0 )
|
|
|
|
{
|
|
|
|
delta--;
|
2002-09-28 18:40:57 +02:00
|
|
|
mod += (TCoord)dx;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
ras.area += (TArea)( fx1 + first ) * delta;
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.cover += delta;
|
|
|
|
|
|
|
|
ex1 += incr;
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_set_cell( RAS_VAR_ ex1, ey );
|
2000-06-28 01:18:39 +02:00
|
|
|
y1 += delta;
|
|
|
|
|
|
|
|
if ( ex1 != ex2 )
|
|
|
|
{
|
* include/freetype/internal/ftdriver.h,
include/freetype/internal/ftobjs.h,
include/freetype/internal/psaux.h, src/cid/cidgload.c,
src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h,
src/pshinter/pshrec.c, src/pshinter/pshalgo.c,
src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c,
src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c,
src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c,
src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c,
src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h:
Many casts and slight argument type changes to make it work with
a 16bit compiler.
2003-06-05 06:31:05 +02:00
|
|
|
p = ONE_PIXEL * ( y2 - y1 + delta );
|
|
|
|
lift = (TCoord)( p / dx );
|
|
|
|
rem = (TCoord)( p % dx );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( rem < 0 )
|
|
|
|
{
|
|
|
|
lift--;
|
2002-09-28 18:40:57 +02:00
|
|
|
rem += (TCoord)dx;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
* include/freetype/internal/ftdriver.h,
include/freetype/internal/ftobjs.h,
include/freetype/internal/psaux.h, src/cid/cidgload.c,
src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h,
src/pshinter/pshrec.c, src/pshinter/pshalgo.c,
src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c,
src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c,
src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c,
src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c,
src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h:
Many casts and slight argument type changes to make it work with
a 16bit compiler.
2003-06-05 06:31:05 +02:00
|
|
|
mod -= (int)dx;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
while ( ex1 != ex2 )
|
|
|
|
{
|
|
|
|
delta = lift;
|
|
|
|
mod += rem;
|
|
|
|
if ( mod >= 0 )
|
|
|
|
{
|
2002-09-28 18:40:57 +02:00
|
|
|
mod -= (TCoord)dx;
|
2000-06-28 01:18:39 +02:00
|
|
|
delta++;
|
|
|
|
}
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
ras.area += (TArea)ONE_PIXEL * delta;
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.cover += delta;
|
|
|
|
y1 += delta;
|
|
|
|
ex1 += incr;
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_set_cell( RAS_VAR_ ex1, ey );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delta = y2 - y1;
|
2001-10-07 12:39:03 +02:00
|
|
|
ras.area += (TArea)( fx2 + ONE_PIXEL - first ) * delta;
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.cover += delta;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Render a given line as a series of scanlines. */
|
|
|
|
/* */
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
|
|
|
gray_render_line( RAS_ARG_ TPos to_x,
|
|
|
|
TPos to_y )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord ey1, ey2, fy1, fy2;
|
|
|
|
TPos dx, dy, x, x2;
|
2002-09-28 18:40:57 +02:00
|
|
|
long p, first;
|
|
|
|
int delta, rem, mod, lift, incr;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
ey1 = TRUNC( ras.last_ey );
|
|
|
|
ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
|
2002-09-28 18:40:57 +02:00
|
|
|
fy1 = (TCoord)( ras.y - ras.last_ey );
|
|
|
|
fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
dx = to_x - ras.x;
|
|
|
|
dy = to_y - ras.y;
|
|
|
|
|
2000-07-02 02:27:53 +02:00
|
|
|
/* XXX: we should do something about the trivial case where dx == 0, */
|
|
|
|
/* as it happens very often! */
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* perform vertical clipping */
|
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord min, max;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
min = ey1;
|
|
|
|
max = ey2;
|
|
|
|
if ( ey1 > ey2 )
|
|
|
|
{
|
|
|
|
min = ey2;
|
|
|
|
max = ey1;
|
|
|
|
}
|
|
|
|
if ( min >= ras.max_ey || max < ras.min_ey )
|
|
|
|
goto End;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* everything is on a single scanline */
|
|
|
|
if ( ey1 == ey2 )
|
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
|
2000-06-28 01:18:39 +02:00
|
|
|
goto End;
|
|
|
|
}
|
|
|
|
|
2002-01-09 22:01:18 +01:00
|
|
|
/* vertical line - avoid calling gray_render_scanline */
|
2002-01-09 11:48:25 +01:00
|
|
|
incr = 1;
|
|
|
|
|
2002-01-09 22:01:18 +01:00
|
|
|
if ( dx == 0 )
|
2002-01-09 11:48:25 +01:00
|
|
|
{
|
2002-10-05 08:57:53 +02:00
|
|
|
TCoord ex = TRUNC( ras.x );
|
|
|
|
TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
|
2002-04-30 16:26:49 +02:00
|
|
|
TPos area;
|
2002-01-09 22:01:18 +01:00
|
|
|
|
2002-01-09 11:48:25 +01:00
|
|
|
|
|
|
|
first = ONE_PIXEL;
|
2002-01-09 22:01:18 +01:00
|
|
|
if ( dy < 0 )
|
2002-01-09 11:48:25 +01:00
|
|
|
{
|
|
|
|
first = 0;
|
|
|
|
incr = -1;
|
|
|
|
}
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
delta = (int)( first - fy1 );
|
2002-01-09 11:48:25 +01:00
|
|
|
ras.area += (TArea)two_fx * delta;
|
|
|
|
ras.cover += delta;
|
|
|
|
ey1 += incr;
|
|
|
|
|
|
|
|
gray_set_cell( raster, ex, ey1 );
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
delta = (int)( first + first - ONE_PIXEL );
|
2002-01-09 11:48:25 +01:00
|
|
|
area = (TArea)two_fx * delta;
|
2002-09-28 18:40:57 +02:00
|
|
|
while ( ey1 != ey2 )
|
2002-01-09 11:48:25 +01:00
|
|
|
{
|
|
|
|
ras.area += area;
|
|
|
|
ras.cover += delta;
|
|
|
|
ey1 += incr;
|
|
|
|
gray_set_cell( raster, ex, ey1 );
|
|
|
|
}
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
delta = (int)( fy2 - ONE_PIXEL + first );
|
2002-01-09 11:48:25 +01:00
|
|
|
ras.area += (TArea)two_fx * delta;
|
|
|
|
ras.cover += delta;
|
|
|
|
goto End;
|
|
|
|
}
|
|
|
|
|
2000-07-02 02:27:53 +02:00
|
|
|
/* ok, we have to render several scanlines */
|
2002-10-05 08:57:53 +02:00
|
|
|
p = ( ONE_PIXEL - fy1 ) * dx;
|
|
|
|
first = ONE_PIXEL;
|
2000-06-28 01:18:39 +02:00
|
|
|
incr = 1;
|
|
|
|
|
|
|
|
if ( dy < 0 )
|
|
|
|
{
|
2002-10-05 08:57:53 +02:00
|
|
|
p = fy1 * dx;
|
2000-06-28 01:18:39 +02:00
|
|
|
first = 0;
|
|
|
|
incr = -1;
|
|
|
|
dy = -dy;
|
|
|
|
}
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
delta = (int)( p / dy );
|
|
|
|
mod = (int)( p % dy );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( mod < 0 )
|
|
|
|
{
|
|
|
|
delta--;
|
2002-09-28 18:40:57 +02:00
|
|
|
mod += (TCoord)dy;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
x = ras.x + delta;
|
2002-10-05 08:57:53 +02:00
|
|
|
gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
ey1 += incr;
|
2002-10-05 08:57:53 +02:00
|
|
|
gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
if ( ey1 != ey2 )
|
|
|
|
{
|
2002-10-05 08:57:53 +02:00
|
|
|
p = ONE_PIXEL * dx;
|
2002-09-28 18:40:57 +02:00
|
|
|
lift = (int)( p / dy );
|
|
|
|
rem = (int)( p % dy );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( rem < 0 )
|
|
|
|
{
|
|
|
|
lift--;
|
2002-09-28 18:40:57 +02:00
|
|
|
rem += (int)dy;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
2002-09-28 18:40:57 +02:00
|
|
|
mod -= (int)dy;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
while ( ey1 != ey2 )
|
|
|
|
{
|
|
|
|
delta = lift;
|
|
|
|
mod += rem;
|
|
|
|
if ( mod >= 0 )
|
|
|
|
{
|
2002-09-28 18:40:57 +02:00
|
|
|
mod -= (int)dy;
|
2000-06-28 01:18:39 +02:00
|
|
|
delta++;
|
|
|
|
}
|
|
|
|
|
|
|
|
x2 = x + delta;
|
2002-09-28 18:40:57 +02:00
|
|
|
gray_render_scanline( RAS_VAR_ ey1, x,
|
|
|
|
(TCoord)( ONE_PIXEL - first ), x2,
|
2002-10-05 08:57:53 +02:00
|
|
|
(TCoord)first );
|
2000-06-28 01:18:39 +02:00
|
|
|
x = x2;
|
2001-10-07 12:39:03 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
ey1 += incr;
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
gray_render_scanline( RAS_VAR_ ey1, x,
|
|
|
|
(TCoord)( ONE_PIXEL - first ), to_x,
|
|
|
|
fy2 );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
End:
|
|
|
|
ras.x = to_x;
|
|
|
|
ras.y = to_y;
|
|
|
|
ras.last_ey = SUBPIXELS( ey2 );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_split_conic( FT_Vector* base )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
TPos a, b;
|
|
|
|
|
|
|
|
|
|
|
|
base[4].x = base[2].x;
|
|
|
|
b = base[1].x;
|
|
|
|
a = base[3].x = ( base[2].x + b ) / 2;
|
|
|
|
b = base[1].x = ( base[0].x + b ) / 2;
|
|
|
|
base[2].x = ( a + b ) / 2;
|
|
|
|
|
|
|
|
base[4].y = base[2].y;
|
|
|
|
b = base[1].y;
|
|
|
|
a = base[3].y = ( base[2].y + b ) / 2;
|
|
|
|
b = base[1].y = ( base[0].y + b ) / 2;
|
|
|
|
base[2].y = ( a + b ) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_render_conic( RAS_ARG_ const FT_Vector* control,
|
|
|
|
const FT_Vector* to )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
TPos dx, dy;
|
|
|
|
int top, level;
|
|
|
|
int* levels;
|
|
|
|
FT_Vector* arc;
|
|
|
|
|
|
|
|
|
|
|
|
dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 );
|
|
|
|
if ( dx < 0 )
|
|
|
|
dx = -dx;
|
|
|
|
dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 );
|
|
|
|
if ( dy < 0 )
|
|
|
|
dy = -dy;
|
|
|
|
if ( dx < dy )
|
|
|
|
dx = dy;
|
|
|
|
|
|
|
|
level = 1;
|
|
|
|
dx = dx / ras.conic_level;
|
|
|
|
while ( dx > 0 )
|
|
|
|
{
|
2000-09-02 02:20:42 +02:00
|
|
|
dx >>= 2;
|
2000-06-28 01:18:39 +02:00
|
|
|
level++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* a shortcut to speed things up */
|
|
|
|
if ( level <= 1 )
|
|
|
|
{
|
|
|
|
/* we compute the mid-point directly in order to avoid */
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
/* calling gray_split_conic() */
|
2000-06-28 01:18:39 +02:00
|
|
|
TPos to_x, to_y, mid_x, mid_y;
|
|
|
|
|
|
|
|
|
|
|
|
to_x = UPSCALE( to->x );
|
|
|
|
to_y = UPSCALE( to->y );
|
|
|
|
mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4;
|
|
|
|
mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_line( RAS_VAR_ mid_x, mid_y );
|
|
|
|
gray_render_line( RAS_VAR_ to_x, to_y );
|
|
|
|
return;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
arc = ras.bez_stack;
|
|
|
|
levels = ras.lev_stack;
|
|
|
|
top = 0;
|
|
|
|
levels[0] = level;
|
|
|
|
|
|
|
|
arc[0].x = UPSCALE( to->x );
|
|
|
|
arc[0].y = UPSCALE( to->y );
|
|
|
|
arc[1].x = UPSCALE( control->x );
|
|
|
|
arc[1].y = UPSCALE( control->y );
|
|
|
|
arc[2].x = ras.x;
|
|
|
|
arc[2].y = ras.y;
|
|
|
|
|
|
|
|
while ( top >= 0 )
|
|
|
|
{
|
|
|
|
level = levels[top];
|
|
|
|
if ( level > 1 )
|
|
|
|
{
|
|
|
|
/* check that the arc crosses the current band */
|
|
|
|
TPos min, max, y;
|
|
|
|
|
|
|
|
|
|
|
|
min = max = arc[0].y;
|
|
|
|
|
|
|
|
y = arc[1].y;
|
|
|
|
if ( y < min ) min = y;
|
|
|
|
if ( y > max ) max = y;
|
|
|
|
|
|
|
|
y = arc[2].y;
|
|
|
|
if ( y < min ) min = y;
|
|
|
|
if ( y > max ) max = y;
|
|
|
|
|
2002-12-16 22:51:24 +01:00
|
|
|
if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Draw;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_split_conic( arc );
|
2000-06-28 01:18:39 +02:00
|
|
|
arc += 2;
|
|
|
|
top++;
|
|
|
|
levels[top] = levels[top - 1] = level - 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
Draw:
|
|
|
|
{
|
|
|
|
TPos to_x, to_y, mid_x, mid_y;
|
|
|
|
|
|
|
|
|
|
|
|
to_x = arc[0].x;
|
|
|
|
to_y = arc[0].y;
|
|
|
|
mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4;
|
|
|
|
mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_line( RAS_VAR_ mid_x, mid_y );
|
|
|
|
gray_render_line( RAS_VAR_ to_x, to_y );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
top--;
|
|
|
|
arc -= 2;
|
|
|
|
}
|
|
|
|
}
|
2001-10-07 12:39:03 +02:00
|
|
|
return;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_split_cubic( FT_Vector* base )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
TPos a, b, c, d;
|
|
|
|
|
|
|
|
|
|
|
|
base[6].x = base[3].x;
|
|
|
|
c = base[1].x;
|
|
|
|
d = base[2].x;
|
|
|
|
base[1].x = a = ( base[0].x + c ) / 2;
|
|
|
|
base[5].x = b = ( base[3].x + d ) / 2;
|
|
|
|
c = ( c + d ) / 2;
|
|
|
|
base[2].x = a = ( a + c ) / 2;
|
|
|
|
base[4].x = b = ( b + c ) / 2;
|
|
|
|
base[3].x = ( a + b ) / 2;
|
|
|
|
|
|
|
|
base[6].y = base[3].y;
|
|
|
|
c = base[1].y;
|
|
|
|
d = base[2].y;
|
|
|
|
base[1].y = a = ( base[0].y + c ) / 2;
|
|
|
|
base[5].y = b = ( base[3].y + d ) / 2;
|
|
|
|
c = ( c + d ) / 2;
|
|
|
|
base[2].y = a = ( a + c ) / 2;
|
|
|
|
base[4].y = b = ( b + c ) / 2;
|
|
|
|
base[3].y = ( a + b ) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
static void
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_render_cubic( RAS_ARG_ const FT_Vector* control1,
|
|
|
|
const FT_Vector* control2,
|
|
|
|
const FT_Vector* to )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
TPos dx, dy, da, db;
|
|
|
|
int top, level;
|
|
|
|
int* levels;
|
|
|
|
FT_Vector* arc;
|
|
|
|
|
|
|
|
|
|
|
|
dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 );
|
|
|
|
if ( dx < 0 )
|
|
|
|
dx = -dx;
|
|
|
|
dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 );
|
|
|
|
if ( dy < 0 )
|
|
|
|
dy = -dy;
|
|
|
|
if ( dx < dy )
|
|
|
|
dx = dy;
|
|
|
|
da = dx;
|
|
|
|
|
|
|
|
dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x );
|
|
|
|
if ( dx < 0 )
|
|
|
|
dx = -dx;
|
|
|
|
dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y );
|
|
|
|
if ( dy < 0 )
|
|
|
|
dy = -dy;
|
|
|
|
if ( dx < dy )
|
|
|
|
dx = dy;
|
|
|
|
db = dx;
|
|
|
|
|
|
|
|
level = 1;
|
|
|
|
da = da / ras.cubic_level;
|
|
|
|
db = db / ras.conic_level;
|
|
|
|
while ( da > 0 || db > 0 )
|
|
|
|
{
|
2000-09-02 02:20:42 +02:00
|
|
|
da >>= 2;
|
|
|
|
db >>= 3;
|
2000-06-28 01:18:39 +02:00
|
|
|
level++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( level <= 1 )
|
|
|
|
{
|
|
|
|
TPos to_x, to_y, mid_x, mid_y;
|
|
|
|
|
|
|
|
|
|
|
|
to_x = UPSCALE( to->x );
|
|
|
|
to_y = UPSCALE( to->y );
|
|
|
|
mid_x = ( ras.x + to_x +
|
|
|
|
3 * UPSCALE( control1->x + control2->x ) ) / 8;
|
|
|
|
mid_y = ( ras.y + to_y +
|
|
|
|
3 * UPSCALE( control1->y + control2->y ) ) / 8;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_line( RAS_VAR_ mid_x, mid_y );
|
|
|
|
gray_render_line( RAS_VAR_ to_x, to_y );
|
|
|
|
return;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
arc = ras.bez_stack;
|
|
|
|
arc[0].x = UPSCALE( to->x );
|
|
|
|
arc[0].y = UPSCALE( to->y );
|
|
|
|
arc[1].x = UPSCALE( control2->x );
|
|
|
|
arc[1].y = UPSCALE( control2->y );
|
|
|
|
arc[2].x = UPSCALE( control1->x );
|
|
|
|
arc[2].y = UPSCALE( control1->y );
|
|
|
|
arc[3].x = ras.x;
|
|
|
|
arc[3].y = ras.y;
|
|
|
|
|
|
|
|
levels = ras.lev_stack;
|
|
|
|
top = 0;
|
|
|
|
levels[0] = level;
|
|
|
|
|
|
|
|
while ( top >= 0 )
|
|
|
|
{
|
|
|
|
level = levels[top];
|
|
|
|
if ( level > 1 )
|
|
|
|
{
|
|
|
|
/* check that the arc crosses the current band */
|
|
|
|
TPos min, max, y;
|
|
|
|
|
|
|
|
|
|
|
|
min = max = arc[0].y;
|
|
|
|
y = arc[1].y;
|
|
|
|
if ( y < min ) min = y;
|
|
|
|
if ( y > max ) max = y;
|
|
|
|
y = arc[2].y;
|
|
|
|
if ( y < min ) min = y;
|
|
|
|
if ( y > max ) max = y;
|
|
|
|
y = arc[3].y;
|
|
|
|
if ( y < min ) min = y;
|
|
|
|
if ( y > max ) max = y;
|
|
|
|
if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 )
|
|
|
|
goto Draw;
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_split_cubic( arc );
|
2000-06-28 01:18:39 +02:00
|
|
|
arc += 3;
|
|
|
|
top ++;
|
|
|
|
levels[top] = levels[top - 1] = level - 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
Draw:
|
|
|
|
{
|
2000-07-02 02:27:53 +02:00
|
|
|
TPos to_x, to_y, mid_x, mid_y;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
to_x = arc[0].x;
|
|
|
|
to_y = arc[0].y;
|
|
|
|
mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8;
|
|
|
|
mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_line( RAS_VAR_ mid_x, mid_y );
|
|
|
|
gray_render_line( RAS_VAR_ to_x, to_y );
|
2000-06-28 01:18:39 +02:00
|
|
|
top --;
|
|
|
|
arc -= 3;
|
|
|
|
}
|
|
|
|
}
|
2001-10-07 12:39:03 +02:00
|
|
|
return;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* a macro comparing two cell pointers. Returns true if a <= b. */
|
|
|
|
#if 1
|
2000-07-02 02:27:53 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#define PACK( a ) ( ( (long)(a)->y << 16 ) + (a)->x )
|
|
|
|
#define LESS_THAN( a, b ) ( PACK( a ) < PACK( b ) )
|
2000-07-02 02:27:53 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#else /* 1 */
|
2000-07-02 02:27:53 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#define LESS_THAN( a, b ) ( (a)->y < (b)->y || \
|
|
|
|
( (a)->y == (b)->y && (a)->x < (b)->x ) )
|
2000-07-02 02:27:53 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#endif /* 1 */
|
|
|
|
|
|
|
|
#define SWAP_CELLS( a, b, temp ) do \
|
|
|
|
{ \
|
|
|
|
temp = *(a); \
|
|
|
|
*(a) = *(b); \
|
|
|
|
*(b) = temp; \
|
|
|
|
} while ( 0 )
|
|
|
|
#define DEBUG_SORT
|
|
|
|
#define QUICK_SORT
|
|
|
|
|
|
|
|
#ifdef SHELL_SORT
|
|
|
|
|
2000-07-02 02:27:53 +02:00
|
|
|
/* a simple shell sort algorithm that works directly on our */
|
|
|
|
/* cells table */
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_shell_sort ( PCell cells,
|
|
|
|
int count )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PCell i, j, limit = cells + count;
|
|
|
|
TCell temp;
|
|
|
|
int gap;
|
|
|
|
|
|
|
|
|
|
|
|
/* compute initial gap */
|
|
|
|
for ( gap = 0; ++gap < count; gap *= 3 )
|
|
|
|
;
|
|
|
|
|
|
|
|
while ( gap /= 3 )
|
|
|
|
{
|
|
|
|
for ( i = cells + gap; i < limit; i++ )
|
|
|
|
{
|
|
|
|
for ( j = i - gap; ; j -= gap )
|
|
|
|
{
|
|
|
|
PCell k = j + gap;
|
|
|
|
|
|
|
|
|
|
|
|
if ( LESS_THAN( j, k ) )
|
|
|
|
break;
|
|
|
|
|
|
|
|
SWAP_CELLS( j, k, temp );
|
|
|
|
|
|
|
|
if ( j < cells + gap )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* SHELL_SORT */
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef QUICK_SORT
|
|
|
|
|
|
|
|
/* This is a non-recursive quicksort that directly process our cells */
|
2002-04-14 02:54:32 +02:00
|
|
|
/* array. It should be faster than calling the stdlib qsort(), and we */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* can even tailor our insertion threshold... */
|
|
|
|
|
|
|
|
#define QSORT_THRESHOLD 9 /* below this size, a sub-array will be sorted */
|
2000-07-02 02:27:53 +02:00
|
|
|
/* through a normal insertion sort */
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_quick_sort( PCell cells,
|
|
|
|
int count )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PCell stack[40]; /* should be enough ;-) */
|
|
|
|
PCell* top; /* top of stack */
|
|
|
|
PCell base, limit;
|
|
|
|
TCell temp;
|
|
|
|
|
|
|
|
|
|
|
|
limit = cells + count;
|
|
|
|
base = cells;
|
|
|
|
top = stack;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
2001-03-10 18:07:42 +01:00
|
|
|
int len = (int)( limit - base );
|
2000-06-28 01:18:39 +02:00
|
|
|
PCell i, j, pivot;
|
|
|
|
|
|
|
|
|
|
|
|
if ( len > QSORT_THRESHOLD )
|
|
|
|
{
|
|
|
|
/* we use base + len/2 as the pivot */
|
|
|
|
pivot = base + len / 2;
|
|
|
|
SWAP_CELLS( base, pivot, temp );
|
|
|
|
|
|
|
|
i = base + 1;
|
|
|
|
j = limit - 1;
|
|
|
|
|
|
|
|
/* now ensure that *i <= *base <= *j */
|
|
|
|
if ( LESS_THAN( j, i ) )
|
|
|
|
SWAP_CELLS( i, j, temp );
|
|
|
|
|
|
|
|
if ( LESS_THAN( base, i ) )
|
|
|
|
SWAP_CELLS( base, i, temp );
|
|
|
|
|
|
|
|
if ( LESS_THAN( j, base ) )
|
|
|
|
SWAP_CELLS( base, j, temp );
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
do i++; while ( LESS_THAN( i, base ) );
|
|
|
|
do j--; while ( LESS_THAN( base, j ) );
|
|
|
|
|
|
|
|
if ( i > j )
|
|
|
|
break;
|
|
|
|
|
|
|
|
SWAP_CELLS( i, j, temp );
|
|
|
|
}
|
|
|
|
|
|
|
|
SWAP_CELLS( base, j, temp );
|
|
|
|
|
|
|
|
/* now, push the largest sub-array */
|
|
|
|
if ( j - base > limit - i )
|
|
|
|
{
|
|
|
|
top[0] = base;
|
|
|
|
top[1] = j;
|
|
|
|
base = i;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
top[0] = i;
|
|
|
|
top[1] = limit;
|
|
|
|
limit = j;
|
|
|
|
}
|
|
|
|
top += 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* the sub-array is small, perform insertion sort */
|
|
|
|
j = base;
|
|
|
|
i = j + 1;
|
|
|
|
|
|
|
|
for ( ; i < limit; j = i, i++ )
|
|
|
|
{
|
|
|
|
for ( ; LESS_THAN( j + 1, j ); j-- )
|
|
|
|
{
|
|
|
|
SWAP_CELLS( j + 1, j, temp );
|
|
|
|
if ( j == base )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( top > stack )
|
|
|
|
{
|
|
|
|
top -= 2;
|
|
|
|
base = top[0];
|
|
|
|
limit = top[1];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* QUICK_SORT */
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_GRAYS
|
|
|
|
#ifdef DEBUG_SORT
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_check_sort( PCell cells,
|
|
|
|
int count )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PCell p, q;
|
|
|
|
|
|
|
|
|
|
|
|
for ( p = cells + count - 2; p >= cells; p-- )
|
|
|
|
{
|
|
|
|
q = p + 1;
|
|
|
|
if ( !LESS_THAN( p, q ) )
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* DEBUG_SORT */
|
|
|
|
#endif /* DEBUG_GRAYS */
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_move_to( const FT_Vector* to,
|
|
|
|
FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
TPos x, y;
|
|
|
|
|
|
|
|
|
|
|
|
/* record current cell, if any */
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_record_cell( (PRaster)raster );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* start to a new position */
|
|
|
|
x = UPSCALE( to->x );
|
|
|
|
y = UPSCALE( to->y );
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
gray_start_cell( (PRaster)raster, TRUNC( x ), TRUNC( y ) );
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
((PRaster)raster)->x = x;
|
|
|
|
((PRaster)raster)->y = y;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_line_to( const FT_Vector* to,
|
|
|
|
FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_line( (PRaster)raster,
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
UPSCALE( to->x ), UPSCALE( to->y ) );
|
2001-10-07 12:39:03 +02:00
|
|
|
return 0;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_conic_to( const FT_Vector* control,
|
|
|
|
const FT_Vector* to,
|
|
|
|
FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_conic( (PRaster)raster, control, to );
|
|
|
|
return 0;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_cubic_to( const FT_Vector* control1,
|
|
|
|
const FT_Vector* control2,
|
|
|
|
const FT_Vector* to,
|
|
|
|
FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_render_cubic( (PRaster)raster, control1, control2, to );
|
|
|
|
return 0;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_render_span( int y,
|
|
|
|
int count,
|
|
|
|
const FT_Span* spans,
|
|
|
|
PRaster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
unsigned char* p;
|
|
|
|
FT_Bitmap* map = &raster->target;
|
|
|
|
|
|
|
|
|
|
|
|
/* first of all, compute the scanline offset */
|
|
|
|
p = (unsigned char*)map->buffer - y * map->pitch;
|
|
|
|
if ( map->pitch >= 0 )
|
|
|
|
p += ( map->rows - 1 ) * map->pitch;
|
|
|
|
|
|
|
|
for ( ; count > 0; count--, spans++ )
|
|
|
|
{
|
2002-09-16 08:15:31 +02:00
|
|
|
unsigned char coverage = spans->coverage;
|
2001-10-31 00:51:24 +01:00
|
|
|
|
2001-12-05 02:22:05 +01:00
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
#ifdef GRAYS_USE_GAMMA
|
2002-09-16 08:15:31 +02:00
|
|
|
coverage = raster->gamma[coverage];
|
2001-10-31 00:51:24 +01:00
|
|
|
#endif
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
if ( coverage )
|
2000-06-28 01:18:39 +02:00
|
|
|
#if 1
|
2002-03-22 14:52:37 +01:00
|
|
|
FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
|
2000-06-28 01:18:39 +02:00
|
|
|
#else /* 1 */
|
|
|
|
{
|
|
|
|
q = p + spans->x;
|
|
|
|
limit = q + spans->len;
|
|
|
|
for ( ; q < limit; q++ )
|
2001-10-31 00:51:24 +01:00
|
|
|
q[0] = (unsigned char)coverage;
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
#endif /* 1 */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_GRAYS
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_dump_cells( RAS_ARG )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PCell cell, limit;
|
|
|
|
int y = -1;
|
|
|
|
|
|
|
|
|
|
|
|
cell = ras.cells;
|
|
|
|
limit = cell + ras.num_cells;
|
|
|
|
|
|
|
|
for ( ; cell < limit; cell++ )
|
|
|
|
{
|
|
|
|
if ( cell->y != y )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "\n%2d: ", cell->y );
|
|
|
|
y = cell->y;
|
|
|
|
}
|
|
|
|
fprintf( stderr, "[%d %d %d]",
|
|
|
|
cell->x, cell->area, cell->cover );
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n" );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* DEBUG_GRAYS */
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2002-04-30 16:26:49 +02:00
|
|
|
gray_hline( RAS_ARG_ TCoord x,
|
|
|
|
TCoord y,
|
|
|
|
TPos area,
|
|
|
|
int acount )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
FT_Span* span;
|
|
|
|
int count;
|
|
|
|
int coverage;
|
|
|
|
|
|
|
|
|
|
|
|
/* compute the coverage line's coverage, depending on the */
|
|
|
|
/* outline fill rule */
|
|
|
|
/* */
|
|
|
|
/* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
|
|
|
|
/* */
|
2002-09-28 18:40:57 +02:00
|
|
|
coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
|
|
|
|
/* use range 0..256 */
|
2002-04-11 16:21:16 +02:00
|
|
|
if ( coverage < 0 )
|
|
|
|
coverage = -coverage;
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-11 16:21:16 +02:00
|
|
|
coverage &= 511;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( coverage > 256 )
|
|
|
|
coverage = 512 - coverage;
|
|
|
|
else if ( coverage == 256 )
|
|
|
|
coverage = 255;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* normal non-zero winding rule */
|
|
|
|
if ( coverage >= 256 )
|
|
|
|
coverage = 255;
|
|
|
|
}
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
y += (TCoord)ras.min_ey;
|
|
|
|
x += (TCoord)ras.min_ex;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
if ( coverage )
|
|
|
|
{
|
|
|
|
/* see if we can add this span to the current list */
|
|
|
|
count = ras.num_gray_spans;
|
|
|
|
span = ras.gray_spans + count - 1;
|
|
|
|
if ( count > 0 &&
|
|
|
|
ras.span_y == y &&
|
|
|
|
(int)span->x + span->len == (int)x &&
|
|
|
|
span->coverage == coverage )
|
|
|
|
{
|
2001-06-20 01:03:41 +02:00
|
|
|
span->len = (unsigned short)( span->len + acount );
|
2000-06-28 01:18:39 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
|
|
|
|
{
|
2000-09-17 19:17:16 +02:00
|
|
|
if ( ras.render_span && count > 0 )
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.render_span( ras.span_y, count, ras.gray_spans,
|
|
|
|
ras.render_span_data );
|
|
|
|
/* ras.render_span( span->y, ras.gray_spans, count ); */
|
|
|
|
|
|
|
|
#ifdef DEBUG_GRAYS
|
|
|
|
|
|
|
|
if ( ras.span_y >= 0 )
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
|
|
|
|
|
|
|
|
fprintf( stderr, "y=%3d ", ras.span_y );
|
|
|
|
span = ras.gray_spans;
|
|
|
|
for ( n = 0; n < count; n++, span++ )
|
|
|
|
fprintf( stderr, "[%d..%d]:%02x ",
|
|
|
|
span->x, span->x + span->len - 1, span->coverage );
|
|
|
|
fprintf( stderr, "\n" );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* DEBUG_GRAYS */
|
|
|
|
|
|
|
|
ras.num_gray_spans = 0;
|
|
|
|
ras.span_y = y;
|
|
|
|
|
|
|
|
count = 0;
|
|
|
|
span = ras.gray_spans;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
span++;
|
|
|
|
|
|
|
|
/* add a gray span to the current list */
|
|
|
|
span->x = (short)x;
|
|
|
|
span->len = (unsigned short)acount;
|
|
|
|
span->coverage = (unsigned char)coverage;
|
|
|
|
ras.num_gray_spans++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
* builds/win32/visualc/freetype.vcproj: Updated.
Exclude debug info for `Release' versions to reduce library size.
* src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
is, ignore `aface' completely if face_index < 0. Reported by David
Osborn <spam@habitualhiatus.com>.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
with `const' where appropriate.
2005-05-17 22:35:23 +02:00
|
|
|
gray_sweep( RAS_ARG_ const FT_Bitmap* target )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-30 16:26:49 +02:00
|
|
|
TCoord x, y, cover;
|
|
|
|
TArea area;
|
|
|
|
PCell start, cur, limit;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2000-07-04 20:12:13 +02:00
|
|
|
FT_UNUSED( target );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-04-30 16:26:49 +02:00
|
|
|
|
2001-02-23 18:47:41 +01:00
|
|
|
if ( ras.num_cells == 0 )
|
|
|
|
return;
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
cur = ras.cells;
|
|
|
|
limit = cur + ras.num_cells;
|
|
|
|
|
|
|
|
cover = 0;
|
|
|
|
ras.span_y = -1;
|
|
|
|
ras.num_gray_spans = 0;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
start = cur;
|
|
|
|
y = start->y;
|
|
|
|
x = start->x;
|
|
|
|
|
|
|
|
area = start->area;
|
|
|
|
cover += start->cover;
|
|
|
|
|
|
|
|
/* accumulate all start cells */
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
++cur;
|
|
|
|
if ( cur >= limit || cur->y != start->y || cur->x != start->x )
|
|
|
|
break;
|
|
|
|
|
|
|
|
area += cur->area;
|
|
|
|
cover += cur->cover;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if the start cell has a non-null area, we must draw an */
|
|
|
|
/* individual gray pixel there */
|
|
|
|
if ( area && x >= 0 )
|
|
|
|
{
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_hline( RAS_VAR_ x, y, cover * ( ONE_PIXEL * 2 ) - area, 1 );
|
2000-06-28 01:18:39 +02:00
|
|
|
x++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( x < 0 )
|
|
|
|
x = 0;
|
|
|
|
|
|
|
|
if ( cur < limit && start->y == cur->y )
|
|
|
|
{
|
|
|
|
/* draw a gray span between the start cell and the current one */
|
|
|
|
if ( cur->x > x )
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_hline( RAS_VAR_ x, y,
|
2002-10-05 08:57:53 +02:00
|
|
|
cover * ( ONE_PIXEL * 2 ), cur->x - x );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* draw a gray span until the end of the clipping region */
|
|
|
|
if ( cover && x < ras.max_ex - ras.min_ex )
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_hline( RAS_VAR_ x, y,
|
2002-10-05 08:57:53 +02:00
|
|
|
cover * ( ONE_PIXEL * 2 ),
|
|
|
|
(int)( ras.max_ex - x - ras.min_ex ) );
|
2000-06-28 01:18:39 +02:00
|
|
|
cover = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( cur >= limit )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ras.render_span && ras.num_gray_spans > 0 )
|
|
|
|
ras.render_span( ras.span_y, ras.num_gray_spans,
|
|
|
|
ras.gray_spans, ras.render_span_data );
|
|
|
|
|
|
|
|
#ifdef DEBUG_GRAYS
|
|
|
|
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
FT_Span* span;
|
|
|
|
|
|
|
|
|
|
|
|
fprintf( stderr, "y=%3d ", ras.span_y );
|
|
|
|
span = ras.gray_spans;
|
|
|
|
for ( n = 0; n < ras.num_gray_spans; n++, span++ )
|
|
|
|
fprintf( stderr, "[%d..%d]:%02x ",
|
|
|
|
span->x, span->x + span->len - 1, span->coverage );
|
|
|
|
fprintf( stderr, "\n" );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* DEBUG_GRAYS */
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _STANDALONE_
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* The following function should only compile in stand_alone mode, */
|
|
|
|
/* i.e., when building this component without the rest of FreeType. */
|
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* FT_Outline_Decompose */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Walks over an outline's structure to decompose it into individual */
|
|
|
|
/* segments and Bezier arcs. This function is also able to emit */
|
|
|
|
/* `move to' and `close to' operations to indicate the start and end */
|
|
|
|
/* of new contours in the outline. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
2002-04-30 08:37:52 +02:00
|
|
|
/* outline :: A pointer to the source target. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-30 08:37:52 +02:00
|
|
|
/* func_interface :: A table of `emitters', i.e,. function pointers */
|
|
|
|
/* called during decomposition to indicate path */
|
|
|
|
/* operations. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
2002-04-30 08:37:52 +02:00
|
|
|
/* user :: A typeless pointer which is passed to each */
|
|
|
|
/* emitter during the decomposition. It can be */
|
|
|
|
/* used to store the state during the */
|
|
|
|
/* decomposition. */
|
2000-06-28 01:18:39 +02:00
|
|
|
/* */
|
|
|
|
/* <Return> */
|
|
|
|
/* Error code. 0 means sucess. */
|
|
|
|
/* */
|
2001-10-07 12:39:03 +02:00
|
|
|
static
|
* include/freetype/ftimage.h (FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_Render_Func, FT_Renderer_TransformFunc),
src/base/ftglyph.c (ft_outline_glyph_transform),
src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render),
src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render),
src/smooth/ftsmooth.c (ft_smooth_transform,
ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Decorate parameters with `const' where
appropriate.
* src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete.
(ft_black_render): Decorate parameters with `const' where
appropriate.
* src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT ->
FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez
<ismail@kde.org.tr>.
2005-05-11 22:04:35 +02:00
|
|
|
int FT_Outline_Decompose( const FT_Outline* outline,
|
2002-04-30 08:37:52 +02:00
|
|
|
const FT_Outline_Funcs* func_interface,
|
2001-10-07 12:39:03 +02:00
|
|
|
void* user )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
#undef SCALED
|
2001-10-07 12:39:03 +02:00
|
|
|
#if 0
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
#define SCALED( x ) ( ( (x) << shift ) - delta )
|
2001-10-07 12:39:03 +02:00
|
|
|
#else
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
#define SCALED( x ) (x)
|
2001-10-07 12:39:03 +02:00
|
|
|
#endif
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
FT_Vector v_last;
|
|
|
|
FT_Vector v_control;
|
|
|
|
FT_Vector v_start;
|
|
|
|
|
|
|
|
FT_Vector* point;
|
|
|
|
FT_Vector* limit;
|
|
|
|
char* tags;
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
int n; /* index of contour in outline */
|
|
|
|
int first; /* index of first point in contour */
|
|
|
|
int error;
|
|
|
|
char tag; /* current point's state */
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
#if 0
|
2002-09-28 18:40:57 +02:00
|
|
|
int shift = func_interface->shift;
|
|
|
|
TPos delta = func_interface->delta;
|
2001-10-07 12:39:03 +02:00
|
|
|
#endif
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
first = 0;
|
|
|
|
|
|
|
|
for ( n = 0; n < outline->n_contours; n++ )
|
|
|
|
{
|
|
|
|
int last; /* index of last point in contour */
|
|
|
|
|
|
|
|
|
|
|
|
last = outline->contours[n];
|
|
|
|
limit = outline->points + last;
|
|
|
|
|
|
|
|
v_start = outline->points[first];
|
|
|
|
v_last = outline->points[last];
|
|
|
|
|
|
|
|
v_start.x = SCALED( v_start.x ); v_start.y = SCALED( v_start.y );
|
|
|
|
v_last.x = SCALED( v_last.x ); v_last.y = SCALED( v_last.y );
|
|
|
|
|
|
|
|
v_control = v_start;
|
|
|
|
|
|
|
|
point = outline->points + first;
|
|
|
|
tags = outline->tags + first;
|
|
|
|
tag = FT_CURVE_TAG( tags[0] );
|
|
|
|
|
|
|
|
/* A contour cannot start with a cubic control point! */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_CUBIC )
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
|
|
|
/* check first point to determine origin */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_CONIC )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
/* first point is conic control. Yes, this happens. */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
/* start at last point if it is on the curve */
|
|
|
|
v_start = v_last;
|
|
|
|
limit--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* if both first and last points are conic, */
|
|
|
|
/* start at their middle and record its position */
|
|
|
|
/* for closure */
|
|
|
|
v_start.x = ( v_start.x + v_last.x ) / 2;
|
|
|
|
v_start.y = ( v_start.y + v_last.y ) / 2;
|
|
|
|
|
|
|
|
v_last = v_start;
|
|
|
|
}
|
|
|
|
point--;
|
|
|
|
tags--;
|
|
|
|
}
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->move_to( &v_start, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
while ( point < limit )
|
|
|
|
{
|
|
|
|
point++;
|
|
|
|
tags++;
|
|
|
|
|
|
|
|
tag = FT_CURVE_TAG( tags[0] );
|
|
|
|
switch ( tag )
|
|
|
|
{
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
case FT_CURVE_TAG_ON: /* emit a single line_to */
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
FT_Vector vec;
|
|
|
|
|
|
|
|
|
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->line_to( &vec, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
case FT_CURVE_TAG_CONIC: /* consume conic arcs */
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
v_control.x = SCALED( point->x );
|
|
|
|
v_control.y = SCALED( point->y );
|
|
|
|
|
|
|
|
Do_Conic:
|
|
|
|
if ( point < limit )
|
|
|
|
{
|
|
|
|
FT_Vector vec;
|
|
|
|
FT_Vector v_middle;
|
|
|
|
|
|
|
|
|
|
|
|
point++;
|
|
|
|
tags++;
|
|
|
|
tag = FT_CURVE_TAG( tags[0] );
|
|
|
|
|
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_ON )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &vec, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag != FT_CURVE_TAG_CONIC )
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
|
|
|
v_middle.x = ( v_control.x + vec.x ) / 2;
|
|
|
|
v_middle.y = ( v_control.y + vec.y ) / 2;
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &v_middle, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
v_control = vec;
|
|
|
|
goto Do_Conic;
|
|
|
|
}
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &v_start, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Close;
|
|
|
|
}
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
default: /* FT_CURVE_TAG_CUBIC */
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
FT_Vector vec1, vec2;
|
|
|
|
|
|
|
|
|
|
|
|
if ( point + 1 > limit ||
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
|
|
|
point += 2;
|
|
|
|
tags += 2;
|
|
|
|
|
|
|
|
vec1.x = SCALED( point[-2].x ); vec1.y = SCALED( point[-2].y );
|
|
|
|
vec2.x = SCALED( point[-1].x ); vec2.y = SCALED( point[-1].y );
|
|
|
|
|
|
|
|
if ( point <= limit )
|
|
|
|
{
|
|
|
|
FT_Vector vec;
|
|
|
|
|
|
|
|
|
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
goto Close;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* close the contour with a line segment */
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->line_to( &v_start, user );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
Close:
|
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
first = last + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
return error;
|
|
|
|
|
|
|
|
Invalid_Outline:
|
|
|
|
return ErrRaster_Invalid_Outline;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _STANDALONE_ */
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct TBand_
|
|
|
|
{
|
2002-09-28 18:40:57 +02:00
|
|
|
TPos min, max;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
} TBand;
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_convert_glyph_inner( RAS_ARG )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
static
|
2002-04-30 08:37:52 +02:00
|
|
|
const FT_Outline_Funcs func_interface =
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
(FT_Outline_MoveTo_Func) gray_move_to,
|
|
|
|
(FT_Outline_LineTo_Func) gray_line_to,
|
|
|
|
(FT_Outline_ConicTo_Func)gray_conic_to,
|
|
|
|
(FT_Outline_CubicTo_Func)gray_cubic_to,
|
2000-06-28 01:18:39 +02:00
|
|
|
0,
|
|
|
|
0
|
|
|
|
};
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
volatile int error = 0;
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2002-06-11 01:03:35 +02:00
|
|
|
if ( ft_setjmp( ras.jump_buffer ) == 0 )
|
2001-10-07 12:39:03 +02:00
|
|
|
{
|
2002-04-30 08:37:52 +02:00
|
|
|
error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_record_cell( RAS_VAR );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error = ErrRaster_MemoryOverflow;
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
gray_convert_glyph( RAS_ARG )
|
|
|
|
{
|
2002-10-05 08:57:53 +02:00
|
|
|
TBand bands[40];
|
2003-03-13 22:07:51 +01:00
|
|
|
TBand* volatile band;
|
|
|
|
int volatile n, num_bands;
|
|
|
|
TPos volatile min, max, max_y;
|
2002-10-05 08:57:53 +02:00
|
|
|
FT_BBox* clip;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* Set up state in the raster object */
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_compute_cbox( RAS_VAR );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* clip to target bitmap, exit if nothing to do */
|
2000-12-14 19:50:40 +01:00
|
|
|
clip = &ras.clip_box;
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2000-12-14 19:50:40 +01:00
|
|
|
if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
|
|
|
|
ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
|
2000-06-28 01:18:39 +02:00
|
|
|
return 0;
|
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
|
|
|
|
if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-10-05 08:57:53 +02:00
|
|
|
if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
|
|
|
|
if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2000-07-02 02:27:53 +02:00
|
|
|
/* simple heuristic used to speed-up the bezier decomposition -- see */
|
Fixed a bug in `glnames.py' that prevented it from generating
correct glyph names tables. This resulted in the unavailability of
certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
charmaps, even if these were present in the font (causing problems
for Polish users).
* src/tools/glnames.py (mac_standard_names): Fixed.
(t1_standard_strings): Some fixes and renamed to ...
(sid_standard_names): This.
(t1_expert_encoding): Fixed.
(the_adobe_glyph_list): Renamed to ...
(adobe_glyph_names): This.
(the_adobe_glyphs): Renamed to ...
(adobe_glyph_values): This.
(dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
Updated.
* src/psnames/pstables.h: Regenerated.
* src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
Fix return value.
Use `sid_standard_table' and `ps_names_to_unicode' instead of
`t1_standard_glyphs' and `names_to_unicode'.
(PS_Macintosh_Name): Use `ps_glyph_names' instead of
`standard_glyph_names'.
(PS_Standard_Strings): Use `sid_standard_names' instead of
`t1_standard_glyphs'.
* doc/BUGS, doc/TODO: New documents.
* src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
correct LRU behaviour.
setjmp() and longjmp() are now used for rollback (i.e. when memory
pool overflow occurs).
Function names are now all uniformly prefixed with `gray_'.
* src/smooth/ftgrays.c: Include <setjmp.h>.
(ErrRaster_MemoryOverflow): New macro.
(TArea): New type to store area values in each cell (using `int' was
too small on 16-bit systems). <limits.h> is included to properly
get the needed data type.
(TCell, TRaster): Use it.
(TRaster): New element `jump_buffer'.
(gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
`outline' from it.
(gray_record_cell): Use longjmp().
(gray_set_cell): Use gray_record_cell() for error handling.
(gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
(gray_convert_glyph_inner): New function, using setjmp().
(gray_convert_glyph): Use it.
Provide a public API to manage multiple size objects for a given
FT_Face in the new header file `ftsizes.h'.
* include/freetype/ftsizes.h: New header file,
* include/freetype/internal/ftobjs.h: Use it.
Remove declarations of FT_New_Size and FT_Done_Size (moved to
ftsizes.h).
* include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
* src/base/ftobjs.c (FT_Activate_Size): New function.
* src/cache/ftcmanag.c: Include ftsizes.h.
(ftc_manager_init_size, ftc_manager_flush_size): Use
FT_Activate_Size.
2001-10-10 21:56:42 +02:00
|
|
|
/* the code in gray_render_conic() and gray_render_cubic() for more */
|
|
|
|
/* details */
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.conic_level = 32;
|
|
|
|
ras.cubic_level = 16;
|
|
|
|
|
|
|
|
{
|
|
|
|
int level = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if ( ras.max_ex > 24 || ras.max_ey > 24 )
|
|
|
|
level++;
|
|
|
|
if ( ras.max_ex > 120 || ras.max_ey > 120 )
|
2000-09-12 00:50:13 +02:00
|
|
|
level++;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
ras.conic_level <<= level;
|
|
|
|
ras.cubic_level <<= level;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* setup vertical bands */
|
2002-10-05 08:57:53 +02:00
|
|
|
num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
|
2000-06-28 01:18:39 +02:00
|
|
|
if ( num_bands == 0 ) num_bands = 1;
|
|
|
|
if ( num_bands >= 39 ) num_bands = 39;
|
|
|
|
|
|
|
|
ras.band_shoot = 0;
|
|
|
|
|
|
|
|
min = ras.min_ey;
|
|
|
|
max_y = ras.max_ey;
|
|
|
|
|
|
|
|
for ( n = 0; n < num_bands; n++, min = max )
|
|
|
|
{
|
|
|
|
max = min + ras.band_size;
|
|
|
|
if ( n == num_bands - 1 || max > max_y )
|
|
|
|
max = max_y;
|
|
|
|
|
|
|
|
bands[0].min = min;
|
|
|
|
bands[0].max = max;
|
|
|
|
band = bands;
|
|
|
|
|
|
|
|
while ( band >= bands )
|
|
|
|
{
|
2002-09-28 18:40:57 +02:00
|
|
|
TPos bottom, top, middle;
|
|
|
|
int error;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
ras.num_cells = 0;
|
|
|
|
ras.invalid = 1;
|
2002-10-05 08:57:53 +02:00
|
|
|
ras.min_ey = band->min;
|
|
|
|
ras.max_ey = band->max;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
#if 1
|
|
|
|
error = gray_convert_glyph_inner( RAS_VAR );
|
2001-11-20 02:29:34 +01:00
|
|
|
#else
|
2002-04-30 08:37:52 +02:00
|
|
|
error = FT_Outline_Decompose( outline, &func_interface, &ras ) ||
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_record_cell( RAS_VAR );
|
|
|
|
#endif
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
if ( !error )
|
|
|
|
{
|
|
|
|
#ifdef SHELL_SORT
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_shell_sort( ras.cells, ras.num_cells );
|
2000-06-28 01:18:39 +02:00
|
|
|
#else
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_quick_sort( ras.cells, ras.num_cells );
|
2000-06-28 01:18:39 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef DEBUG_GRAYS
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_check_sort( ras.cells, ras.num_cells );
|
|
|
|
gray_dump_cells( RAS_VAR );
|
2000-06-28 01:18:39 +02:00
|
|
|
#endif
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_sweep( RAS_VAR_ &ras.target );
|
2000-06-28 01:18:39 +02:00
|
|
|
band--;
|
|
|
|
continue;
|
|
|
|
}
|
2001-10-07 12:39:03 +02:00
|
|
|
else if ( error != ErrRaster_MemoryOverflow )
|
|
|
|
return 1;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
/* render pool overflow, we will reduce the render band by half */
|
|
|
|
bottom = band->min;
|
|
|
|
top = band->max;
|
|
|
|
middle = bottom + ( ( top - bottom ) >> 1 );
|
|
|
|
|
|
|
|
/* waoow! This is too complex for a single scanline, something */
|
|
|
|
/* must be really rotten here! */
|
|
|
|
if ( middle == bottom )
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_GRAYS
|
|
|
|
fprintf( stderr, "Rotten glyph!\n" );
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bottom-top >= ras.band_size )
|
|
|
|
ras.band_shoot++;
|
|
|
|
|
|
|
|
band[1].min = bottom;
|
|
|
|
band[1].max = middle;
|
|
|
|
band[0].min = middle;
|
|
|
|
band[0].max = top;
|
|
|
|
band++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ras.band_shoot > 8 && ras.band_size > 16 )
|
|
|
|
ras.band_size = ras.band_size / 2;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
extern int
|
* include/freetype/ftimage.h (FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_Render_Func, FT_Renderer_TransformFunc),
src/base/ftglyph.c (ft_outline_glyph_transform),
src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render),
src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render),
src/smooth/ftsmooth.c (ft_smooth_transform,
ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Decorate parameters with `const' where
appropriate.
* src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete.
(ft_black_render): Decorate parameters with `const' where
appropriate.
* src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT ->
FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez
<ismail@kde.org.tr>.
2005-05-11 22:04:35 +02:00
|
|
|
gray_raster_render( PRaster raster,
|
|
|
|
const FT_Raster_Params* params )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
2005-04-14 18:03:15 +02:00
|
|
|
FT_Outline* outline = (FT_Outline*)params->source;
|
|
|
|
const FT_Bitmap* target_map = params->target;
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( !raster || !raster->cells || !raster->max_cells )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* return immediately if the outline is empty */
|
|
|
|
if ( outline->n_points == 0 || outline->n_contours <= 0 )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if ( !outline || !outline->contours || !outline->points )
|
|
|
|
return ErrRaster_Invalid_Outline;
|
|
|
|
|
|
|
|
if ( outline->n_points !=
|
|
|
|
outline->contours[outline->n_contours - 1] + 1 )
|
|
|
|
return ErrRaster_Invalid_Outline;
|
|
|
|
|
2000-10-03 21:13:11 +02:00
|
|
|
/* if direct mode is not set, we must have a target bitmap */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( ( params->flags & FT_RASTER_FLAG_DIRECT ) == 0 &&
|
2000-10-05 06:53:31 +02:00
|
|
|
( !target_map || !target_map->buffer ) )
|
2000-06-28 01:18:39 +02:00
|
|
|
return -1;
|
|
|
|
|
2000-10-03 21:13:11 +02:00
|
|
|
/* this version does not support monochrome rendering */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( !( params->flags & FT_RASTER_FLAG_AA ) )
|
2000-06-28 01:18:39 +02:00
|
|
|
return ErrRaster_Invalid_Mode;
|
|
|
|
|
2000-12-14 19:50:40 +01:00
|
|
|
/* compute clipping box */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( ( params->flags & FT_RASTER_FLAG_DIRECT ) == 0 )
|
2000-12-14 19:50:40 +01:00
|
|
|
{
|
|
|
|
/* compute clip box from target pixmap */
|
|
|
|
ras.clip_box.xMin = 0;
|
|
|
|
ras.clip_box.yMin = 0;
|
|
|
|
ras.clip_box.xMax = target_map->width;
|
|
|
|
ras.clip_box.yMax = target_map->rows;
|
|
|
|
}
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
else if ( params->flags & FT_RASTER_FLAG_CLIP )
|
2000-12-14 19:50:40 +01:00
|
|
|
{
|
|
|
|
ras.clip_box = params->clip_box;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-06-18 16:23:45 +02:00
|
|
|
ras.clip_box.xMin = -32768L;
|
|
|
|
ras.clip_box.yMin = -32768L;
|
|
|
|
ras.clip_box.xMax = 32767L;
|
|
|
|
ras.clip_box.yMax = 32767L;
|
2000-12-14 19:50:40 +01:00
|
|
|
}
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.outline = *outline;
|
|
|
|
ras.num_cells = 0;
|
|
|
|
ras.invalid = 1;
|
|
|
|
|
2000-10-05 06:53:31 +02:00
|
|
|
if ( target_map )
|
2000-10-03 21:13:11 +02:00
|
|
|
ras.target = *target_map;
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
ras.render_span = (FT_Raster_Span_Func)gray_render_span;
|
2000-06-28 01:18:39 +02:00
|
|
|
ras.render_span_data = &ras;
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( params->flags & FT_RASTER_FLAG_DIRECT )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
ras.render_span = (FT_Raster_Span_Func)params->gray_spans;
|
|
|
|
ras.render_span_data = params->user;
|
|
|
|
}
|
|
|
|
|
2001-10-07 12:39:03 +02:00
|
|
|
return gray_convert_glyph( (PRaster)raster );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
|
|
|
|
/**** a static object. *****/
|
|
|
|
|
2001-12-05 02:22:05 +01:00
|
|
|
#ifdef GRAYS_USE_GAMMA
|
2001-10-31 00:51:24 +01:00
|
|
|
|
|
|
|
/* initialize the "gamma" table. Yes, this is really a crummy function */
|
2001-12-05 02:22:05 +01:00
|
|
|
/* but the results look pretty good for something that simple. */
|
2001-10-31 00:51:24 +01:00
|
|
|
/* */
|
2001-12-05 02:22:05 +01:00
|
|
|
#define M_MAX 255
|
|
|
|
#define M_X 128
|
|
|
|
#define M_Y 192
|
2001-10-31 00:51:24 +01:00
|
|
|
|
|
|
|
static void
|
|
|
|
grays_init_gamma( PRaster raster )
|
|
|
|
{
|
2002-09-16 08:15:31 +02:00
|
|
|
unsigned int x, a;
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2001-12-05 02:22:05 +01:00
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
for ( x = 0; x < 256; x++ )
|
|
|
|
{
|
|
|
|
if ( x <= M_X )
|
2001-12-05 02:22:05 +01:00
|
|
|
a = ( x * M_Y + M_X / 2) / M_X;
|
2001-10-31 00:51:24 +01:00
|
|
|
else
|
2001-12-05 02:22:05 +01:00
|
|
|
a = M_Y + ( ( x - M_X ) * ( M_MAX - M_Y ) +
|
|
|
|
( M_MAX - M_X ) / 2 ) / ( M_MAX - M_X );
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2002-09-16 08:15:31 +02:00
|
|
|
raster->gamma[x] = (unsigned char)a;
|
2001-10-31 00:51:24 +01:00
|
|
|
}
|
|
|
|
}
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
#endif /* GRAYS_USE_GAMMA */
|
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
#ifdef _STANDALONE_
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_raster_new( void* memory,
|
|
|
|
FT_Raster* araster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
static TRaster the_raster;
|
|
|
|
|
2000-07-04 20:12:13 +02:00
|
|
|
FT_UNUSED( memory );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
*araster = (FT_Raster)&the_raster;
|
2002-07-28 07:05:24 +02:00
|
|
|
FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2001-10-31 00:51:24 +01:00
|
|
|
#ifdef GRAYS_USE_GAMMA
|
|
|
|
grays_init_gamma( (PRaster)*araster );
|
|
|
|
#endif
|
2001-11-20 02:29:34 +01:00
|
|
|
|
2000-06-28 01:18:39 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_raster_done( FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
/* nothing */
|
2000-07-04 20:12:13 +02:00
|
|
|
FT_UNUSED( raster );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#else /* _STANDALONE_ */
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static int
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_raster_new( FT_Memory memory,
|
|
|
|
FT_Raster* araster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
FT_Error error;
|
|
|
|
PRaster raster;
|
|
|
|
|
|
|
|
|
|
|
|
*araster = 0;
|
2002-03-22 14:52:37 +01:00
|
|
|
if ( !FT_ALLOC( raster, sizeof ( TRaster ) ) )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
raster->memory = memory;
|
|
|
|
*araster = (FT_Raster)raster;
|
2001-10-31 00:51:24 +01:00
|
|
|
|
|
|
|
#ifdef GRAYS_USE_GAMMA
|
|
|
|
grays_init_gamma( raster );
|
|
|
|
#endif
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_raster_done( FT_Raster raster )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
FT_Memory memory = (FT_Memory)((PRaster)raster)->memory;
|
|
|
|
|
|
|
|
|
2002-03-22 14:52:37 +01:00
|
|
|
FT_FREE( raster );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _STANDALONE_ */
|
|
|
|
|
|
|
|
|
2001-06-28 01:25:46 +02:00
|
|
|
static void
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_raster_reset( FT_Raster raster,
|
|
|
|
const char* pool_base,
|
|
|
|
long pool_size )
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
|
|
|
PRaster rast = (PRaster)raster;
|
|
|
|
|
|
|
|
|
|
|
|
if ( raster && pool_base && pool_size >= 4096 )
|
2001-10-07 12:39:03 +02:00
|
|
|
gray_init_cells( rast, (char*)pool_base, pool_size );
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
rast->band_size = (int)( ( pool_size / sizeof ( TCell ) ) / 8 );
|
2000-06-28 01:18:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-10-24 00:46:56 +02:00
|
|
|
const FT_Raster_Funcs ft_grays_raster =
|
2000-06-28 01:18:39 +02:00
|
|
|
{
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
FT_GLYPH_FORMAT_OUTLINE,
|
2000-06-28 01:18:39 +02:00
|
|
|
|
2002-04-01 16:25:28 +02:00
|
|
|
(FT_Raster_New_Func) gray_raster_new,
|
|
|
|
(FT_Raster_Reset_Func) gray_raster_reset,
|
|
|
|
(FT_Raster_Set_Mode_Func)0,
|
|
|
|
(FT_Raster_Render_Func) gray_raster_render,
|
|
|
|
(FT_Raster_Done_Func) gray_raster_done
|
2000-06-28 01:18:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* END */
|