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/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 2000-2006, 2009-2013 by                                      */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#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  {
64727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error  error = FT_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    {
69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( 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
112727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bitmap*   bitmap  = &slot->bitmap;
113727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Memory    memory  = render->root.memory;
114727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int       hmul    = mode == FT_RENDER_MODE_LCD;
115727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int       vmul    = mode == FT_RENDER_MODE_LCD_V;
116727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Pos       x_shift = 0;
117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Pos       y_shift = 0;
118727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Pos       x_left, y_top;
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Raster_Params  params;
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bool  have_translated_origin = FALSE;
123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bool  have_outline_shifted   = FALSE;
124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bool  have_buffer            = FALSE;
125727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check glyph image format */
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != render->glyph_format )
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
130727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Invalid_Argument );
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check mode */
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode != required_mode )
136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Cannot_Render_Glyph );
138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    outline = &slot->outline;
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* translate the outline to the new origin if needed */
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( origin )
145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Translate( outline, origin->x, origin->y );
147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      have_translated_origin = TRUE;
148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute the control box, and grid fit it */
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Get_CBox( outline, &cbox );
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1587f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
1597f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
1607f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
1617f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 " xMin = %d, xMax = %d\n",
1627f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 cbox.xMin >> 6, cbox.xMax >> 6 ));
163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Raster_Overflow );
164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
1657f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
1667f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    else
167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      width = ( cbox.xMax - cbox.xMin ) >> 6;
1687f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
1697f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
1707f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
1717f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
1727f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 " yMin = %d, yMax = %d\n",
1737f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                 cbox.yMin >> 6, cbox.yMax >> 6 ));
174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Raster_Overflow );
175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
1767f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
1777f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    else
17841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      height = ( cbox.yMax - cbox.yMin ) >> 6;
1797f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
180aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    width_org  = width;
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    height_org = height;
183aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* release old bitmap buffer */
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( bitmap->buffer );
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* allocate new one */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pitch = width;
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      width = width * 3;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pitch = FT_PAD_CEIL( width, 4 );
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      height *= 3;
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    x_shift = (FT_Int) cbox.xMin;
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_shift = (FT_Int) cbox.yMin;
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    x_left  = (FT_Int)( cbox.xMin >> 6 );
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    y_top   = (FT_Int)( cbox.yMax >> 6 );
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int  extra = slot->library->lcd_extra;
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        x_shift -= 64 * ( extra >> 1 );
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        width   += 3 * extra;
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pitch    = FT_PAD_CEIL( width, 4 );
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        x_left  -= extra >> 1;
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_shift -= 64 * ( extra >> 1 );
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        height  += 3 * extra;
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_top   += extra >> 1;
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
233295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#if FT_UINT_MAX > 0xFFFFU
234295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
235727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Required check is (pitch * height < FT_ULONG_MAX),        */
236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* but we care realistic cases only.  Always pitch <= width. */
23741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( width > 0x7FFF || height > 0x7FFF )
238295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
2397f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
240295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 width, height ));
241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Raster_Overflow );
242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
243295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
244295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
245295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
246295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->num_grays  = 256;
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->width      = width;
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->rows       = height;
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bitmap->pitch      = pitch;
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* translate outline to render it into the bitmap */
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Translate( outline, -x_shift, -y_shift );
255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    have_outline_shifted = TRUE;
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      have_buffer = TRUE;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set up parameters */
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.target = bitmap;
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.source = outline;
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.flags  = FT_RASTER_FLAG_AA;
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* implode outline if needed */
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x *= 3;
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y *= 3;
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into the bitmap */
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* deflate outline if needed */
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x /= 3;
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y /= 3;
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->library->lcd_filter_func( bitmap, mode, slot->library );
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into bitmap */
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
316727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it horizontally */
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  line = bitmap->buffer;
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh--, line += pitch )
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt   xx;
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte*  end = line + width;
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( xx = width_org; xx > 0; xx-- )
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_UInt  pixel = line[xx-1];
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-3] = (FT_Byte)pixel;
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-2] = (FT_Byte)pixel;
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-1] = (FT_Byte)pixel;
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end    -= 3;
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it vertically */
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  write = bitmap->buffer;
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh-- )
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        read  += pitch;
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
369295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /*
370295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     * XXX: on 16bit system, we return an error for huge bitmap
371295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     * to prevent an overflow.
372295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner     */
373295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Invalid_Pixel_Size );
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->format      = FT_GLYPH_FORMAT_BITMAP;
380295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    slot->bitmap_left = (FT_Int)x_left;
381295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    slot->bitmap_top  = (FT_Int)y_top;
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
383727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* everything is fine; don't deallocate buffer */
384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    have_buffer = FALSE;
385727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    error = FT_Err_Ok;
387727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
389727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( have_outline_shifted )
390727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Outline_Translate( outline, x_shift, y_shift );
391727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( have_translated_origin )
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Outline_Translate( outline, -origin->x, -origin->y );
393727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( have_buffer )
394727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
395727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_FREE( bitmap->buffer );
396727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
397727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a bitmap */
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render( FT_Renderer       render,
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_GlyphSlot      slot,
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Render_Mode    mode,
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    const FT_Vector*  origin )
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode == FT_RENDER_MODE_LIGHT )
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mode = FT_RENDER_MODE_NORMAL;
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ft_smooth_render_generic( render, slot, mode, origin,
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     FT_RENDER_MODE_NORMAL );
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a horizontal LCD bitmap */
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd( FT_Renderer       render,
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_GlyphSlot      slot,
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_Render_Mode    mode,
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        const FT_Vector*  origin )
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD );
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a vertical LCD bitmap */
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd_v( FT_Renderer       render,
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_GlyphSlot      slot,
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Render_Mode    mode,
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const FT_Vector*  origin )
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD_V );
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_renderer_class,
455295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
45741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth",
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
468295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render,
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
477295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
478295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
48241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
48441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcd",
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
495295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
504295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
505295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
50741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
51041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcdv",
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0,    /* module specific interface */
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Constructor)ft_smooth_init,
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Destructor) 0,
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      (FT_Module_Requester)  0
521295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ,
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_TransformFunc)ft_smooth_transform,
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
530295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
531295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
535