1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftsmooth.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Anti-aliasing renderer interface (body).                             */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/*  Copyright 2000-2006, 2009-2012 by                                      */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
20295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftsmooth.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftgrays.h"
25295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "ftspic.h"
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ftsmerrs.h"
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* initialize renderer -- init its raster */
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_init( FT_Renderer  render )
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Library  library = FT_MODULE_LIBRARY( render );
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    render->clazz->raster_class->raster_reset( render->raster,
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                               library->raster_pool,
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                               library->raster_pool_size );
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* sets render-specific mode */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_set_mode( FT_Renderer  render,
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_ULong     mode_tag,
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pointer   data )
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* we simply pass it to the raster */
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return render->clazz->raster_class->raster_set_mode( render->raster,
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                         mode_tag,
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                         data );
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* transform a given glyph image */
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_transform( FT_Renderer       render,
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_GlyphSlot      slot,
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       const FT_Matrix*  matrix,
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       const FT_Vector*  delta )
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error = Smooth_Err_Ok;
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != render->glyph_format )
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Smooth_Err_Invalid_Argument;
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( matrix )
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Transform( &slot->outline, matrix );
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( delta )
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* return the glyph's control box */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_get_cbox( FT_Renderer   render,
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_GlyphSlot  slot,
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_BBox*      cbox )
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format == render->glyph_format )
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Get_CBox( &slot->outline, cbox );
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a bitmap */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_generic( FT_Renderer       render,
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            FT_GlyphSlot      slot,
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            FT_Render_Mode    mode,
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            const FT_Vector*  origin,
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            FT_Render_Mode    required_mode )
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error     error;
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline*  outline = NULL;
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_BBox      cbox;
10841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Pos       width, height, pitch;
109aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
11041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Pos       height_org, width_org;
111aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bitmap*   bitmap;
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory    memory;
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int       hmul = mode == FT_RENDER_MODE_LCD;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int       vmul = mode == FT_RENDER_MODE_LCD_V;
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos       x_shift, y_shift, x_left, y_top;
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Raster_Params  params;
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check glyph image format */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != render->glyph_format )
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Smooth_Err_Invalid_Argument;
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check mode */
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode != required_mode )
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return Smooth_Err_Cannot_Render_Glyph;
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    outline = &slot->outline;
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* translate the outline to the new origin if needed */
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( origin )
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Translate( outline, origin->x, origin->y );
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute the control box, and grid fit it */
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Get_CBox( outline, &cbox );
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1467f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
1477f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
1487f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
1497f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 " xMin = %d, xMax = %d\n",
1507f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 cbox.xMin >> 6, cbox.xMax >> 6 ));
1517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      return Smooth_Err_Raster_Overflow;
1527f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
1537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    else
15441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      width  = ( cbox.xMax - cbox.xMin ) >> 6;
1557f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
1567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
1577f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
1587f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
1597f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 " yMin = %d, yMax = %d\n",
1607f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 cbox.yMin >> 6, cbox.yMax >> 6 ));
1617f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      return Smooth_Err_Raster_Overflow;
1627f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
1637f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    else
16441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      height = ( cbox.yMax - cbox.yMin ) >> 6;
1657f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap = &slot->bitmap;
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = render->root.memory;
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
169aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    width_org  = width;
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    height_org = height;
172aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* release old bitmap buffer */
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( bitmap->buffer );
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* allocate new one */
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pitch = width;
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      width = width * 3;
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pitch = FT_PAD_CEIL( width, 4 );
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      height *= 3;
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    x_shift = (FT_Int) cbox.xMin;
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_shift = (FT_Int) cbox.yMin;
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    x_left  = (FT_Int)( cbox.xMin >> 6 );
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_top   = (FT_Int)( cbox.yMax >> 6 );
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int  extra = slot->library->lcd_extra;
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        x_shift -= 64 * ( extra >> 1 );
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        width   += 3 * extra;
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pitch    = FT_PAD_CEIL( width, 4 );
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        x_left  -= extra >> 1;
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_shift -= 64 * ( extra >> 1 );
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        height  += 3 * extra;
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_top   += extra >> 1;
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
222295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#if FT_UINT_MAX > 0xFFFFU
223295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
224295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* Required check is ( pitch * height < FT_ULONG_MAX ),     */
225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* but we care realistic cases only. Always pitch <= width. */
22641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( width > 0x7FFF || height > 0x7FFF )
227295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
2287f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
229295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 width, height ));
230295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return Smooth_Err_Raster_Overflow;
231295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
232295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
233295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
234295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->num_grays  = 256;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->width      = width;
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->rows       = height;
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->pitch      = pitch;
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* translate outline to render it into the bitmap */
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Translate( outline, -x_shift, -y_shift );
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set up parameters */
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.target = bitmap;
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.source = outline;
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.flags  = FT_RASTER_FLAG_AA;
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* implode outline if needed */
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x *= 3;
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y *= 3;
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into the bitmap */
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* deflate outline if needed */
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x /= 3;
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y /= 3;
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->library->lcd_filter_func( bitmap, mode, slot->library );
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into bitmap */
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it horizontally */
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  line = bitmap->buffer;
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh--, line += pitch )
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt   xx;
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte*  end = line + width;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( xx = width_org; xx > 0; xx-- )
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_UInt  pixel = line[xx-1];
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-3] = (FT_Byte)pixel;
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-2] = (FT_Byte)pixel;
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-1] = (FT_Byte)pixel;
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end    -= 3;
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it vertically */
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  write = bitmap->buffer;
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh-- )
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        read  += pitch;
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Translate( outline, x_shift, y_shift );
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
351295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /*
352295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     * XXX: on 16bit system, we return an error for huge bitmap
353295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     * to prevent an overflow.
354295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     */
355295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
356295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return Smooth_Err_Invalid_Pixel_Size;
357295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->format      = FT_GLYPH_FORMAT_BITMAP;
362295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    slot->bitmap_left = (FT_Int)x_left;
363295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    slot->bitmap_top  = (FT_Int)y_top;
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( outline && origin )
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Translate( outline, -origin->x, -origin->y );
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a bitmap */
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render( FT_Renderer       render,
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_GlyphSlot      slot,
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Render_Mode    mode,
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    const FT_Vector*  origin )
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode == FT_RENDER_MODE_LIGHT )
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mode = FT_RENDER_MODE_NORMAL;
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ft_smooth_render_generic( render, slot, mode, origin,
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     FT_RENDER_MODE_NORMAL );
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a horizontal LCD bitmap */
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd( FT_Renderer       render,
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_GlyphSlot      slot,
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_Render_Mode    mode,
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        const FT_Vector*  origin )
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD );
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a vertical LCD bitmap */
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd_v( FT_Renderer       render,
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_GlyphSlot      slot,
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Render_Mode    mode,
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const FT_Vector*  origin )
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD_V );
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_renderer_class,
425295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
42741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth",
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
438295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render,
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
447295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
448295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
45241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
45441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcd",
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
465295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
474295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
475295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
48041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcdv",
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
491295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
500295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
501295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
505