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