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