blob: c2eb71b6d3100de78d9a1d339cfd7eddcf7d395f [file] [log] [blame]
/***************************************************************************/
/* */
/* ftrgb.h */
/* */
/* RGB color filtering support for FreeType 2 (specification only). */
/* */
/* Copyright 2005 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
/* modified, and distributed under the terms of the FreeType project */
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
/* this file you indicate that you have read the license and */
/* understand and accept it fully. */
/* */
/***************************************************************************/
#ifndef __FT_RGB_H__
#define __FT_RGB_H__
#include <ft2build.h>
#include FT_FREETYPE_H
FT_BEGIN_HEADER
/**
* @type: FT_RgbFilter
*
* @description:
* an opaque handle to an object modelling an RGB color filter.
* this is used to process LCD-decimated bitmaps in order to reduce
* color fringes during display
*/
typedef struct FT_RgbFilterRec_* FT_RgbFilter;
/**
* @func: FT_RgbFilter_ApplyARGB
*
* @description:
* apply a given color filter to a given bitmap. This function does
* nothing if the bitmap's pixel_mode field is not FT_PIXEL_MODE_LCD
* or FT_PIXEL_MODE_LCD_V
*
* @input:
* filter_or_null :: handle to RGB filter object, or NULL to use the
* default one provided with this library
*
* inverted :: boolean. Set to true if BGR or VBGR filtering is
* needed.
*
* in_mode :: input bitmap pixel mode. must be either
* @FT_PIXEL_MODE_LCD or @FT_PIXEL_MODE_LCD_V
*
* in_bytes :: first byte of input bitmap data in memory
* in_pitch :: number of bytes in a row of input pixels.
* can be negative
*
* out_width :: width in pixels of output bitmap
* out_height :: width in pixels of output bitmap
*
* out_bytes :: first byte of output bitmap data in memory, this
* is an array of 32-bit unsigned integer, storing
* pixels values in ARGB8888 format
*
* out_pitch :: number of _bytes_ in a row of output pixels. can
* be negative. Its absolute value must be greater
* than 4*out_width
*
* @return:
* error code. 0 means success
*
* @note:
* this function returns an error if 'in_mode' isn't set to either
* @FT_PIXEL_MODE_LCD or @FT_PIXEL_MODE_LCD_V, or if the values of
* the parameters are incorrect.
*
* when 'in_mode' is @FT_PIXEL_MODE_LCD, this function assumes that the
* width of the input bitmap is three times the output's one. otherwise,
* it is identical.
*
* when 'in_mode' is @FT_PIXEL_MODE_LCD_V, this function assumes that
* the height of the input bitmap is three times the output's one. otherwise
* it is identical
*
* the absolute value on 'in_bytes' should always match the number of
* _bytes_ in a row of input pixels. It can be negative however to
* indicate "inverted" bitmap. See the description of the 'pitch'
* field in @FT_Bitmap
*/
FT_EXPORT( FT_Error )
FT_RgbFilter_ApplyARGB( FT_RgbFilter filter_or_null,
FT_Bool inverted,
FT_Pixel_Mode in_mode,
FT_Byte* in_bytes,
FT_Long in_pitch,
FT_Int out_width,
FT_Int out_height,
FT_UInt32* out_bytes,
FT_Long out_pitch );
/**
* @func: FT_RgbFilter_ApplyInPlace
*
* @description:
* a variant of @FT_RgbFilter_ApplyARGB that performs filtering
* within the input bitmap. It's up to the caller to convert the
* result to a suitable color format.
*
* @input:
* filter_or_null :: handle to RGB filter object, or NULL to use the
* default one provided with this library
*
* inverted :: boolean. Set to true if BGR or VBGR filtering is
* needed.
*
* in_mode :: input bitmap pixel mode. must be either
* @FT_PIXEL_MODE_LCD or @FT_PIXEL_MODE_LCD_V
*
* in_bytes :: first byte of input bitmap data in memory
* in_pitch :: number of bytes in a row of input pixels. can be negative
*
* org_width :: width in pixels of original glyph
* org_height :: height in pixels of original glyph
*
* @return:
* error code. 0 means success
*
* @note:
* this function returns an error if 'in_mode' isn't set to either
* @FT_PIXEL_MODE_LCD or @FT_PIXEL_MODE_LCD_V, or if the values of some
* parameters are incorrect.
*
* when 'in_mode' is @FT_PIXEL_MODE_LCD, this function assumes that the
* width of the input bitmap is three times 'org_width'. otherwise,
* they're identical.
*
* when 'in_mode' is @FT_PIXEL_MODE_LCD_V, this function assumes that
* the height of the input bitmap is three times 'org_height'. otherwise
* they're identical.
*
* the absolute value on 'in_bytes' should always match the number of
* _bytes_ in a row of input pixels. It can be negative however to
* indicate "inverted" bitmap. See the description of the 'pitch'
* field in @FT_Bitmap
*/
FT_EXPORT( FT_Error )
FT_RgbFilter_ApplyInPlace( FT_RgbFilter filter_or_null,
FT_Bool inverted,
FT_Pixel_Mode in_mode,
FT_Byte* in_bytes,
FT_Long in_pitch,
FT_Int org_width,
FT_Int org_height );
/**
* @type: FT_RgbFilter
*
* @description:
* create a new RGB filter object
*
* @input:
* library :: handle to FreeType library instance
* values_9 :: an array of 9 16.16 fixed float values
*
* @output:
* pfilter :: handle to new filter object. NULL in case of error
*
* @return:
* error code. 0 means success
*
* @note:
* see the description of 'values_9' in @FT_RgbFilter_Reset.
*/
FT_EXPORT_DEF( FT_Error )
FT_RgbFilter_New( FT_Library library,
FT_Fixed* values_9,
FT_RgbFilter *pfilter );
/**
* @type: FT_RgbFilter_Done
*
* @description:
* destroy a given RGB filter object
*
* @input:
* filter :: handle to target filter object
*/
FT_EXPORT( void )
FT_RgbFilter_Done( FT_RgbFilter filter );
/**
* @type: FT_RgbFilter_Reset
*
* @description:
* reset a given color filter object
*
* @input:
* filter :: handle to target RGB filter
* values_9 :: an array of 9 fixed-float multipliers used by the RGB
* filter algorithm.
*
* @note:
* the 9 values are used according to the following scheme, at least
* for the 'normal' RGB decimation mode:
*
* {
* red = pix[0]*values[0] + pix[1]*values[1] + pix[2]*values[2];
* green = pix[0]*values[3] + pix[1]*values[4] + pix[2]*values[5];
* blue = pix[0]*values[6] + pix[1]*values[7] + pix[2]*values[8];
*
* red /= 65536;
* green /= 65536;
* blue /= 65536;
* }
*
*/
FT_EXPORT( void )
FT_RgbFilter_Reset( FT_RgbFilter filter,
FT_Fixed* values_9 );
/* */
FT_END_HEADER
#endif /* __FT_RGB_H__ */