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/*                                                                         */
7a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin/*  Copyright 2000-2017 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  {
90a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    FT_ZERO( 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;
106fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Outline*  outline = &slot->outline;
107fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Bitmap*   bitmap  = &slot->bitmap;
108fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Memory    memory  = render->root.memory;
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_BBox      cbox;
110fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Pos       x_shift = 0;
111fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Pos       y_shift = 0;
112fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Pos       x_left, y_top;
11341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Pos       width, height, pitch;
114aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
11541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Pos       height_org, width_org;
116aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif
117a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    FT_Int       hmul    = ( mode == FT_RENDER_MODE_LCD );
118a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    FT_Int       vmul    = ( mode == FT_RENDER_MODE_LCD_V );
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Raster_Params  params;
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
122fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Bool  have_outline_shifted = FALSE;
123fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    FT_Bool  have_buffer          = FALSE;
124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check glyph image format */
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->format != render->glyph_format )
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Invalid_Argument );
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check mode */
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode != required_mode )
135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Cannot_Render_Glyph );
137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( origin )
141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
142fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      x_shift = origin->x;
143fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      y_shift = origin->y;
144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute the control box, and grid fit it */
147fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    /* taking into account the origin shift     */
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Outline_Get_CBox( outline, &cbox );
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift );
151fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift );
152fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift );
153fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift );
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
155fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    x_shift -= cbox.xMin;
156fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    y_shift -= cbox.yMin;
1577f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
158fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    x_left  = cbox.xMin >> 6;
159fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    y_top   = cbox.yMax >> 6;
160fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
161fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    width  = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6;
162fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6;
1637f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
164aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    width_org  = width;
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    height_org = height;
167aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pitch = width;
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
172fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      width *= 3;
173fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      pitch  = FT_PAD_CEIL( width, 4 );
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      height *= 3;
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int  extra = slot->library->lcd_extra;
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
188fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki        x_shift += 64 * ( extra >> 1 );
189fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki        x_left  -= extra >> 1;
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        width   += 3 * extra;
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        pitch    = FT_PAD_CEIL( width, 4 );
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
196fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki        y_shift += 64 * ( extra >> 1 );
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        y_top   += extra >> 1;
198fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki        height  += 3 * extra;
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
204fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    /*
205fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki     * XXX: on 16bit system, we return an error for huge bitmap
206fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki     * to prevent an overflow.
207fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki     */
208fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ||
209fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki         x_left < FT_INT_MIN || y_top < FT_INT_MIN )
210fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    {
211fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      error = FT_THROW( Invalid_Pixel_Size );
212fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      goto Exit;
213fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    }
214295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Required check is (pitch * height < FT_ULONG_MAX),        */
216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* but we care realistic cases only.  Always pitch <= width. */
21741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( width > 0x7FFF || height > 0x7FFF )
218295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
2197f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
220295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 width, height ));
221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = FT_THROW( Raster_Overflow );
222727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
223295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
224295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
225fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    /* release old bitmap buffer */
226fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
227fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    {
228fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      FT_FREE( bitmap->buffer );
229fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
230fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    }
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
232fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    /* allocate new one */
233fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) )
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Exit;
235727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      have_buffer = TRUE;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
240fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    slot->format      = FT_GLYPH_FORMAT_BITMAP;
241fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    slot->bitmap_left = (FT_Int)x_left;
242fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    slot->bitmap_top  = (FT_Int)y_top;
243fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
244fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
245fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    bitmap->num_grays  = 256;
246fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    bitmap->width      = (unsigned int)width;
247fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    bitmap->rows       = (unsigned int)height;
248fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    bitmap->pitch      = pitch;
249fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
250fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    /* translate outline to render it into the bitmap */
251fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    if ( x_shift || y_shift )
252fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    {
253fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      FT_Outline_Translate( outline, x_shift, y_shift );
254fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      have_outline_shifted = TRUE;
255fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    }
256fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set up parameters */
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.target = bitmap;
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.source = outline;
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    params.flags  = FT_RASTER_FLAG_AA;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* implode outline if needed */
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x *= 3;
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y *= 3;
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into the bitmap */
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* deflate outline if needed */
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points     = outline->points;
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  points_end = points + outline->n_points;
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec;
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( hmul )
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->x /= 3;
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( vmul )
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( vec = points; vec < points_end; vec++ )
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          vec->y /= 3;
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( slot->library->lcd_filter_func )
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->library->lcd_filter_func( bitmap, mode, slot->library );
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* render outline into bitmap */
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = render->raster_render( render->raster, &params );
309727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
310727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it horizontally */
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( hmul )
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  line = bitmap->buffer;
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh--, line += pitch )
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_UInt   xx;
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte*  end = line + width;
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( xx = width_org; xx > 0; xx-- )
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_UInt  pixel = line[xx-1];
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-3] = (FT_Byte)pixel;
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-2] = (FT_Byte)pixel;
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end[-1] = (FT_Byte)pixel;
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          end    -= 3;
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* expand it vertically */
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vmul )
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Byte*  write = bitmap->buffer;
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt   hh;
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( hh = height_org; hh > 0; hh-- )
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
3480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project        ft_memcpy( write, read, pitch );
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write += pitch;
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        read  += pitch;
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
362727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* everything is fine; don't deallocate buffer */
363727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    have_buffer = FALSE;
364727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
365727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    error = FT_Err_Ok;
366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( have_outline_shifted )
369fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki      FT_Outline_Translate( outline, -x_shift, -y_shift );
370727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( have_buffer )
371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_FREE( bitmap->buffer );
373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a bitmap */
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render( FT_Renderer       render,
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_GlyphSlot      slot,
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Render_Mode    mode,
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    const FT_Vector*  origin )
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( mode == FT_RENDER_MODE_LIGHT )
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mode = FT_RENDER_MODE_NORMAL;
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ft_smooth_render_generic( render, slot, mode, origin,
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     FT_RENDER_MODE_NORMAL );
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a horizontal LCD bitmap */
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd( FT_Renderer       render,
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_GlyphSlot      slot,
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_Render_Mode    mode,
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        const FT_Vector*  origin )
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD );
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* convert a slot's glyph image into a vertical LCD bitmap */
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_smooth_render_lcd_v( FT_Renderer       render,
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_GlyphSlot      slot,
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Render_Mode    mode,
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const FT_Vector*  origin )
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = ft_smooth_render_generic( render, slot, mode, origin,
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      FT_RENDER_MODE_LCD_V );
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
431a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin  FT_DEFINE_RENDERER(
432a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    ft_smooth_renderer_class,
433295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
43541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth",
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
441a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      NULL,    /* module specific interface */
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
443a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
444a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Destructor) NULL,            /* module_done   */
445a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Requester)  NULL,            /* get_interface */
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
449a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_RenderFunc)   ft_smooth_render,     /* render_glyph    */
450a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_TransformFunc)ft_smooth_transform,  /* transform_glyph */
451a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,   /* get_glyph_cbox  */
452a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,   /* set_mode        */
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
454a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET           /* raster_class    */
455295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
458a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin  FT_DEFINE_RENDERER(
459a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    ft_smooth_lcd_renderer_class,
46041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
46241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcd",
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
468a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      NULL,    /* module specific interface */
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
470a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
471a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Destructor) NULL,            /* module_done   */
472a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Requester)  NULL,            /* get_interface */
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
476a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,  /* render_glyph    */
477a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_TransformFunc)ft_smooth_transform,   /* transform_glyph */
478a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,    /* get_glyph_cbox  */
479a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,    /* set_mode        */
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
481a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET            /* raster_class    */
482295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
484a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin
485a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin  FT_DEFINE_RENDERER(
486a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    ft_smooth_lcdv_renderer_class,
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_MODULE_RENDERER,
48941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      sizeof ( FT_RendererRec ),
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      "smooth-lcdv",
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x10000L,
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      0x20000L,
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
495a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      NULL,    /* module specific interface */
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
498a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Destructor) NULL,            /* module_done   */
499a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin      (FT_Module_Requester)  NULL,            /* get_interface */
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_GLYPH_FORMAT_OUTLINE,
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
503a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,  /* render_glyph    */
504a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_TransformFunc)ft_smooth_transform,     /* transform_glyph */
505a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,      /* get_glyph_cbox  */
506a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,      /* set_mode        */
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
508a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET              /* raster_class    */
509295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
513