ref: 859a18a358ccc64451ac834137e61cf26c9da1f8
parent: 63408a12996662d7af707c844a3d879d68c4ca7b
author: David Turner <[email protected]>
date: Thu Dec 14 13:50:40 EST 2000
support for clipped direct rendering updated INSTALL file for Win32 case
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2000-12-15 David Turner <[email protected]>
+
+ * include/freetype/ftimage.h, include/freetype/fttypes.h,
+ src/smooth/ftgrays.c: added support for clipped direct rendering in
+ the smooth renderer. This should not break binary compatibility of
+ existing applications..
+
+ * INSTALL: updated installation instructions on Win32, listing the
+ new "make setup list" target used to list supported compilers/targets
+
2000-12-13 David Turner <[email protected]>
* include/freetype/config/ft2build.h,
--- a/INSTALL
+++ b/INSTALL
@@ -9,7 +9,7 @@
- Go to the `freetype2' directory.
- - On Unix (any C compiler should work):
+ - On Unix or (any C compiler should work):
- make setup (don't worry, this will invoke a configure script)
- make
@@ -27,25 +27,29 @@
We provide a version of GNU Make for Win32 on the FreeType site.
See http://www.freetype.org/download.html for details.
- If you are using gcc:
+ - if you're using gcc (Mingw, _not_ CygWin):
+
+ - make setup
+ - make
- - make setup
- - make
- If you are using Visual C++:
+ - if you're using Visual C++
- - make setup visualc
- - make
-
- If you are using Win32-lCC:
+ - make setup visualc
+ - make
+
+
+ - if you're using another compiler:
- - make setup lcc
- - make
-
- If you are using the Borland C++ Builder compiler:
-
- - make setup bcc32
- - make
+ - make setup xxxx
+ - make
+
+
+ where "xxxx" is a special target corresponding to your compiler.
+ To see a list of supported compilers in this release, type:
+
+ make setup list
+
II. In your own environment (IDE):
--- a/include/freetype/ftimage.h
+++ b/include/freetype/ftimage.h
@@ -610,6 +610,33 @@
/*************************************************************************/
/* */
/* <Struct> */
+ /* FT_BBox */
+ /* */
+ /* <Description> */
+ /* A structure used to hold an outline's bounding box, i.e., the */
+ /* coordinates of its extrema in the horizontal and vertical */
+ /* directions. */
+ /* */
+ /* <Fields> */
+ /* xMin :: The horizontal minimum (left-most). */
+ /* */
+ /* yMin :: The vertical minimum (bottom-most). */
+ /* */
+ /* xMax :: The horizontal maximum (right-most). */
+ /* */
+ /* yMax :: The vertical maximum (top-most). */
+ /* */
+ typedef struct FT_BBox_
+ {
+ FT_Pos xMin, yMin;
+ FT_Pos xMax, yMax;
+
+ } FT_BBox;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
/* FT_Span */
/* */
/* <Description> */
@@ -747,23 +774,35 @@
/* <Fields> */
/* ft_raster_flag_default :: This value is 0. */
/* */
- /* ft_raster_flag_aa :: Requests the rendering of an */
- /* anti-aliased glyph bitmap. If unset, a */
- /* monchrome bitmap will be rendered. */
+ /* ft_raster_flag_aa :: */
+ /* this flag is set to indicate that a anti-aliased glyph image */
+ /* should be generated. Otherwise, it will be monochrome (1-bit) */
/* */
- /* ft_raster_flag_direct :: Requests direct rendering over the */
- /* target bitmap. Direct rendering uses */
- /* user-provided callbacks in order to */
- /* perform direct drawing or composition */
- /* over an existing bitmap. If this bit is */
- /* unset, the content of the target bitmap */
- /* *must be zeroed*! */
+ /* ft_raster_flag_direct :: */
+ /* this flag is set to indicate direct rendering. In this mode, */
+ /* client applications must provide their own span callback. */
+ /* this let them direct drawing or composition over an existing */
+ /* bitmap. If this bit is not set, the target pixmap's buffer */
+ /* _must_ be zeroed before rendering. */
/* */
+ /* note that for now, direct rendering is only possible with */
+ /* anti-aliased glyphs only.. */
+ /* */
+ /* ft_raster_flag_clip :: */
+ /* this flag is only used in direct rendering mode. When set, */
+ /* the output will be clipped to a box specified in the "clip_box" */
+ /* field of the FT_Raster_Params structure. */
+ /* */
+ /* note that by default, the glyph bitmap is clipped to the */
+ /* target pixmap, except in direct rendering mode where all */
+ /* spans are generated if no clipping box is set. */
+ /* */
typedef enum
{
ft_raster_flag_default = 0,
ft_raster_flag_aa = 1,
- ft_raster_flag_direct = 2
+ ft_raster_flag_direct = 2,
+ ft_raster_flag_clip = 4
} FT_Raster_Flag;
@@ -796,6 +835,9 @@
/* user :: User-supplied data that is passed to each drawing */
/* callback. */
/* */
+ /* clip_box :: an optional clipping box. It is only used in */
+ /* direct rendering mode */
+ /* */
/* <Note> */
/* An anti-aliased glyph bitmap is drawn if the ft_raster_flag_aa bit */
/* flag is set in the `flags' field, otherwise a monochrome bitmap */
@@ -823,6 +865,7 @@
FT_Raster_BitTest_Func bit_test;
FT_Raster_BitSet_Func bit_set;
void* user;
+ FT_BBox clip_box;
} FT_Raster_Params;
--- a/include/freetype/fttypes.h
+++ b/include/freetype/fttypes.h
@@ -277,33 +277,6 @@
/*************************************************************************/
/* */
- /* <Struct> */
- /* FT_BBox */
- /* */
- /* <Description> */
- /* A structure used to hold an outline's bounding box, i.e., the */
- /* coordinates of its extrema in the horizontal and vertical */
- /* directions. */
- /* */
- /* <Fields> */
- /* xMin :: The horizontal minimum (left-most). */
- /* */
- /* yMin :: The vertical minimum (bottom-most). */
- /* */
- /* xMax :: The horizontal maximum (right-most). */
- /* */
- /* yMax :: The vertical maximum (top-most). */
- /* */
- typedef struct FT_BBox_
- {
- FT_Pos xMin, yMin;
- FT_Pos xMax, yMax;
-
- } FT_BBox;
-
-
- /*************************************************************************/
- /* */
/* <Macro> */
/* FT_MAKE_TAG */
/* */
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -252,6 +252,7 @@
FT_Outline outline;
FT_Bitmap target;
+ FT_BBox clip_box;
FT_Span gray_spans[FT_MAX_GRAY_SPANS];
int num_gray_spans;
@@ -1702,6 +1703,7 @@
TBand bands[40], *band;
int n, num_bands;
TPos min, max, max_y;
+ FT_BBox* clip;
/* Set up state in the raster object */
@@ -1708,15 +1710,17 @@
compute_cbox( RAS_VAR_ outline );
/* clip to target bitmap, exit if nothing to do */
- if ( ras.max_ex <= 0 || ras.min_ex >= ras.target.width ||
- ras.max_ey <= 0 || ras.min_ey >= ras.target.rows )
+ clip = &ras.clip_box;
+
+ if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
+ ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
return 0;
- if ( ras.min_ex < 0 ) ras.min_ex = 0;
- if ( ras.min_ey < 0 ) ras.min_ey = 0;
+ if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
+ if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
- if ( ras.max_ex > ras.target.width ) ras.max_ex = ras.target.width;
- if ( ras.max_ey > ras.target.rows ) ras.max_ey = ras.target.rows;
+ if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
+ if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
/* simple heuristic used to speed-up the bezier decomposition -- see */
/* the code in render_conic() and render_cubic() for more details */
@@ -1851,6 +1855,27 @@
/* this version does not support monochrome rendering */
if ( !( params->flags & ft_raster_flag_aa ) )
return ErrRaster_Invalid_Mode;
+
+ /* compute clipping box */
+ if ( (params->flags & ft_raster_flag_direct) == 0 )
+ {
+ /* 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;
+ }
+ else if ( params->flags & ft_raster_flag_clip )
+ {
+ ras.clip_box = params->clip_box;
+ }
+ else
+ {
+ ras.clip_box.xMin = -32768;
+ ras.clip_box.yMin = -32768;
+ ras.clip_box.xMax = 32767;
+ ras.clip_box.yMax = 32767;
+ }
ras.outline = *outline;
ras.num_cells = 0;