1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftbitmap.c */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* FreeType utility functions for bitmaps (body). */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 2004-2009, 2011, 2013 by */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT2_BUILD_LIBRARY 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/ftbitmap.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/ftimage.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( void ) 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_New( FT_Bitmap *abitmap ) 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *abitmap = null_bitmap; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_Copy( FT_Library library, 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_Bitmap *source, 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap *target) 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = library->memory; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int pitch = source->pitch; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong size; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( source == target ) 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( source->buffer == NULL ) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *target = *source; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pitch < 0 ) 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pitch = -pitch; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = (FT_ULong)( pitch * source->rows ); 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( target->buffer ) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int target_pitch = target->pitch; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong target_size; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( target_pitch < 0 ) 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target_pitch = -target_pitch; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target_size = (FT_ULong)( target_pitch * target->rows ); 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( target_size != size ) 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)FT_QREALLOC( target->buffer, target_size, size ); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)FT_QALLOC( target->buffer, size ); 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char *p; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = target->buffer; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *target = *source; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->buffer = p; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( target->buffer, source->buffer, size ); 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_bitmap_assure_buffer( FT_Memory memory, 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap* bitmap, 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt xpixels, 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt ypixels ) 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pitch; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int new_pitch; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt bpp; 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i, width, height; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char* buffer = NULL; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = bitmap->width; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov height = bitmap->rows; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pitch = bitmap->pitch; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pitch < 0 ) 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pitch = -pitch; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( bitmap->pixel_mode ) 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_MONO: 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpp = 1; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_pitch = ( width + xpixels + 7 ) >> 3; 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY2: 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpp = 2; 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_pitch = ( width + xpixels + 3 ) >> 2; 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY4: 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpp = 4; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_pitch = ( width + xpixels + 1 ) >> 1; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY: 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD: 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD_V: 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bpp = 8; 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_pitch = ( width + xpixels ); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Glyph_Format ); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if no need to allocate memory */ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ypixels == 0 && new_pitch <= pitch ) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* zero the padding */ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int bit_width = pitch * 8; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int bit_last = ( width + xpixels ) * bpp; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( bit_last < bit_width ) 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* end = bitmap->buffer + pitch; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int shift = bit_last & 7; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt mask = 0xFF00U >> shift; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int count = height; 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( ; count > 0; count--, line += pitch, end += pitch ) 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* write = line; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( shift > 0 ) 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov write[0] = (FT_Byte)( write[0] & mask ); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov write++; 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( write < end ) 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_ZERO( write, end-write ); 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( bitmap->pitch > 0 ) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int len = ( width * bpp + 7 ) >> 3; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < bitmap->rows; i++ ) 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ), 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->buffer + pitch * i, len ); 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int len = ( width * bpp + 7 ) >> 3; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < bitmap->rows; i++ ) 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( buffer + new_pitch * i, 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->buffer + pitch * i, len ); 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( bitmap->buffer ); 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->buffer = buffer; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( bitmap->pitch < 0 ) 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_pitch = -new_pitch; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set pitch only, width and height are left untouched */ 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->pitch = new_pitch; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_Embolden( FT_Library library, 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap* bitmap, 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pos xStrength, 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pos yStrength ) 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char* p; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i, x, y, pitch; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int xstr, ystr; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Library_Handle ); 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !bitmap || !bitmap->buffer ) 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( xstr == 0 && ystr == 0 ) 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( xstr < 0 || ystr < 0 ) 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( bitmap->pixel_mode ) 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY2: 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY4: 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap tmp; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int align; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov align = ( bitmap->width + xstr + 3 ) / 4; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov align = ( bitmap->width + xstr + 1 ) / 2; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_New( &tmp ); 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_Done( library, bitmap ); 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bitmap = tmp; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_MONO: 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( xstr > 8 ) 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xstr = 8; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD: 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov xstr *= 3; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD_V: 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ystr *= 3; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_BGRA: 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We don't embolden color glyphs. */ 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pitch = bitmap->pitch; 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pitch > 0 ) 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = bitmap->buffer + pitch * ystr; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pitch = -pitch; 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = bitmap->buffer + pitch * ( bitmap->rows - 1 ); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* for each row */ 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( y = 0; y < bitmap->rows ; y++ ) 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Horizontally: 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * From the last pixel on, make each pixel or'ed with the 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * `xstr' pixels before it. 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( x = pitch - 1; x >= 0; x-- ) 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char tmp; 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp = p[x]; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 1; i <= xstr; i++ ) 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p[x] |= tmp >> i; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the maximum value of 8 for `xstr' comes from here */ 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( x > 0 ) 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p[x] |= p[x - 1] << ( 8 - i ); 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( p[x] == 0xff ) 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( x - i >= 0 ) 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p[x] = (unsigned char)(bitmap->num_grays - 1); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p[x] = (unsigned char)(p[x] + p[x-i]); 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( p[x] == bitmap->num_grays - 1 ) 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Vertically: 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Make the above `ystr' rows or'ed with it. 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( x = 1; x <= ystr; x++ ) 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char* q; 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q = p - bitmap->pitch * x; 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < pitch; i++ ) 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov q[i] |= p[i]; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p += bitmap->pitch; 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->width += xstr; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap->rows += ystr; 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra ) 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long a = bgra[3]; 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long b = bgra[0]; 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long g = bgra[1]; 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long r = bgra[2]; 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long l; 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * coefficients for RGB channels *on the linear colors*. 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * A gamma of 2.2 is fair to assume. And then, we need to 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * undo the premultiplication too. 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * http://accessibility.kde.org/hsl-adjusted.php 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We do the computation with integers only. 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Undo premultification, get the number in a 16.16 form. */ 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov b = FT_MulDiv( b, 65536, a ); 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov g = FT_MulDiv( g, 65536, a ); 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov r = FT_MulDiv( r, 65536, a ); 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a = a * 256; 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Apply gamma of 2.0 instead of 2.2. */ 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov b = FT_MulFix( b, b ); 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov g = FT_MulFix( g, g ); 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov r = FT_MulFix( r, r ); 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Apply coefficients. */ 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov b = FT_MulFix( b, 4731 /* 0.0722 * 65536 */ ); 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov g = FT_MulFix( g, 46871 /* 0.7152 * 65536 */ ); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov r = FT_MulFix( r, 13933 /* 0.2126 * 65536 */ ); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l = r + g + b; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Final transparency can be determined this way: 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * - If alpha is zero, we want 0. 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * - If alpha is zero and luminosity is zero, we want 255. 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * - If alpha is zero and luminosity is one, we want 0. 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * So the formula is a * (1 - l). 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (FT_Byte)( FT_MulFix( 65535 - l, a ) >> 8 ); 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_Convert( FT_Library library, 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_Bitmap *source, 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap *target, 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int alignment ) 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Library_Handle ); 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( source->pixel_mode ) 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_MONO: 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY: 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY2: 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY4: 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD: 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD_V: 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_BGRA: 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int pad; 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long old_size; 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov old_size = target->rows * target->pitch; 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( old_size < 0 ) 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov old_size = -old_size; 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->pixel_mode = FT_PIXEL_MODE_GRAY; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->rows = source->rows; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->width = source->width; 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pad = 0; 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( alignment > 0 ) 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pad = source->width % alignment; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pad != 0 ) 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pad = alignment - pad; 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->pitch = source->width + pad; 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( target->pitch > 0 && 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch ) 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( target->rows * target->pitch > old_size && 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_QREALLOC( target->buffer, 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov old_size, target->rows * target->pitch ) ) 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( source->pixel_mode ) 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_MONO: 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* s = source->buffer; 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* t = target->buffer; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->num_grays = 2; 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = source->rows; i > 0; i-- ) 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* ss = s; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* tt = t; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int j; 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get the full bytes */ 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = source->width >> 3; j > 0; j-- ) 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[7] = (FT_Byte)( val & 0x01 ); 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 8; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ss += 1; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get remaining pixels (if any) */ 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j = source->width & 7; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( j > 0 ) 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int val = *ss; 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( ; j > 0; j-- ) 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val <<= 1; 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 1; 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s += source->pitch; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t += target->pitch; 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY: 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD: 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_LCD_V: 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int width = source->width; 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* s = source->buffer; 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* t = target->buffer; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int s_pitch = source->pitch; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int t_pitch = target->pitch; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->num_grays = 256; 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = source->rows; i > 0; i-- ) 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ARRAY_COPY( t, s, width ); 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s += s_pitch; 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t += t_pitch; 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY2: 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* s = source->buffer; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* t = target->buffer; 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->num_grays = 4; 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = source->rows; i > 0; i-- ) 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* ss = s; 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* tt = t; 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int j; 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get the full bytes */ 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = source->width >> 2; j > 0; j-- ) 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int val = ss[0]; 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[3] = (FT_Byte)( ( val & 0x03 ) ); 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ss += 1; 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 4; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j = source->width & 3; 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( j > 0 ) 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int val = ss[0]; 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( ; j > 0; j-- ) 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov val <<= 2; 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 1; 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s += source->pitch; 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t += target->pitch; 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_GRAY4: 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* s = source->buffer; 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* t = target->buffer; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->num_grays = 16; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = source->rows; i > 0; i-- ) 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* ss = s; 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* tt = t; 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int j; 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get the full bytes */ 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = source->width >> 1; j > 0; j-- ) 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int val = ss[0]; 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[1] = (FT_Byte)( ( val & 0x0F ) ); 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ss += 1; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 2; 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( source->width & 1 ) 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s += source->pitch; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t += target->pitch; 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_PIXEL_MODE_BGRA: 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* s = source->buffer; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* t = target->buffer; 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int s_pitch = source->pitch; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int t_pitch = target->pitch; 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov target->num_grays = 256; 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = source->rows; i > 0; i-- ) 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* ss = s; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Byte* tt = t; 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int j; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = source->width; j > 0; j-- ) 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss ); 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ss += 4; 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt += 1; 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s += s_pitch; 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov t += t_pitch; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ; 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap bitmap; 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_New( &bitmap ); 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->bitmap = bitmap; 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->internal->flags |= FT_GLYPH_OWN_BITMAP; 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftbitmap.h */ 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap_Done( FT_Library library, 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bitmap *bitmap ) 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Library_Handle ); 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !bitmap ) 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( bitmap->buffer ); 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bitmap = null_bitmap; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 761