root/include/gpac/modules/raster2d.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jean Le Feuvre
 *                      Copyright (c) Telecom ParisTech 2000-2012
 *                                      All rights reserved
 *
 *  This file is part of GPAC / modules interfaces
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


#ifndef _GF_MODULE_RASTER2D_H_
#define _GF_MODULE_RASTER2D_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <gpac/path2d.h>
#include <gpac/module.h>
#include <gpac/color.h>


/*stencil types*/
typedef enum
{
        /*solid color stencil*/
        GF_STENCIL_SOLID = 0,
        /*linear color gradient stencil*/
        GF_STENCIL_LINEAR_GRADIENT,
        /*radial color gradient stencil*/
        GF_STENCIL_RADIAL_GRADIENT,
        /*texture stencil*/
        GF_STENCIL_VERTEX_GRADIENT,
        /*texture stencil*/
        GF_STENCIL_TEXTURE,
} GF_StencilType;


/*gradient filling modes*/
typedef enum
{
        /*edge colors are repeated until path is filled*/
        GF_GRADIENT_MODE_PAD,
        /*pattern is inversed each time it's repeated*/
        GF_GRADIENT_MODE_SPREAD,
        /*pattern is repeated to fill path*/
        GF_GRADIENT_MODE_REPEAT
} GF_GradientMode;


/*texture tiling flags*/
typedef enum
{
        /*texture is repeated in its horizontal direction*/
        GF_TEXTURE_REPEAT_S = (1<<1),
        /*texture is repeated in its horizontal direction*/
        GF_TEXTURE_REPEAT_T = (1<<2),
        /*texture is fliped vertically*/
        GF_TEXTURE_FLIP = (1<<3),
} GF_TextureTiling;

/*filter levels for texturing - up to the graphics engine but the following levels are used by
the client*/
typedef enum
{
        /*high speed mapping (ex, no filtering applied)*/
        GF_TEXTURE_FILTER_HIGH_SPEED,
        /*compromise between speed and quality (ex, filter to nearest pixel)*/
        GF_TEXTURE_FILTER_MID,
        /*high quality mapping (ex, bi-linear/bi-cubic interpolation)*/
        GF_TEXTURE_FILTER_HIGH_QUALITY
} GF_TextureFilter;

/* rasterizer antialiasing depending on the graphics engine*/
typedef enum
{
        /*raster shall use no antialiasing */
        GF_RASTER_HIGH_SPEED,
        /*raster should use fast mode and good quality if possible*/
        GF_RASTER_MID,
        /*raster should use full antialiasing*/
        GF_RASTER_HIGH_QUALITY
} GF_RasterLevel;


/*user routines for raserizer. common syntaxes:
        @cbk: user defined callback
        @x, y: first pixel position of the run, in device memory (top-left) coordinates
        @run_h_len: number of pixels to fill on line
        @color: color to fill pixel with. USER MUST IGNORE THE ALPHA COMPONENT OF THIS COLOR, the final
                alpha is computed by the lib
        @alpha: blending amount (0->0xFF) for the pixels
*/

typedef void (*raster_cbk_fill_run_alpha) (void *, u32, u32, u32, GF_Color, u8);
typedef void (*raster_cbk_fill_run_no_alpha) (void *, u32, u32, u32, GF_Color);
typedef void (*raster_cbk_fill_rect)(void *cbk, u32 x, u32 y, u32 width, u32 height, GF_Color color);

typedef struct
{
        void *cbk;
        /*fills line pixels without any blending operation*/
        raster_cbk_fill_run_no_alpha fill_run_no_alpha;
        /* fills line pixels with blending operation - alpha combines both fill color and anti-aliasing blending */
        raster_cbk_fill_run_alpha fill_run_alpha;
        /*fills rectangle*/
        raster_cbk_fill_rect fill_rect;
} GF_RasterCallback;



/*opaque handler for all stencils*/
typedef void *GF_STENCIL;

/*visual surface handler*/
typedef void *GF_SURFACE;

/*interface name and version for raster2D*/
#define GF_RASTER_2D_INTERFACE          GF_4CC('G','R','2', '3')

/*graphics driver*/
typedef struct _raster2d_interface
{
        /* interface declaration*/
        GF_DECL_MODULE_INTERFACE

        GF_STENCIL (*stencil_new) (struct _raster2d_interface *, GF_StencilType type);
        /*common destructor for all stencils*/
        void (*stencil_delete) (GF_STENCIL _this);
        /*set stencil transformation matrix*/
        GF_Err (*stencil_set_matrix) (GF_STENCIL _this, GF_Matrix2D *mat);
        /*solid brush - set brush color*/
        GF_Err (*stencil_set_brush_color) (GF_STENCIL _this, GF_Color c);
        /*gradient brushes*/
        /*sets gradient repeat mode - return GF_NOT_SUPPORTED if driver doesn't support this to let the app compute repeat patterns
        this may be called before the gradient is setup*/
        GF_Err (*stencil_set_gradient_mode) (GF_STENCIL _this, GF_GradientMode mode);
        /*set linear gradient.  line is defined by start and end, and you can give interpolation colors at specified positions*/
        GF_Err (*stencil_set_linear_gradient) (GF_STENCIL _this, Fixed start_x, Fixed start_y, Fixed end_x, Fixed end_y);
        /*radial gradient brush center point, focal point and radius - colors can only be set through set_interpolation */
        GF_Err (*stencil_set_radial_gradient) (GF_STENCIL _this, Fixed cx, Fixed cy, Fixed fx, Fixed fy, Fixed x_radius, Fixed y_radius);
        /*radial and linear gradient (not used with vertex) - set color interpolation at given points,
                @pos[i]: distance from (center for radial, start for linear) expressed between 0 and 1 (1 being the gradient bounds)
                @col[i]: associated color
        NOTE 1: the colors at 0 and 1.0 MUST be provided
        NOTE 2: colors shall be fed in order from 0 to 1
        NOTE 3: this overrides the colors provided for linear gradient
        */
        GF_Err (*stencil_set_gradient_interpolation) (GF_STENCIL _this, Fixed *pos, GF_Color *col, u32 count);

        /*vertex gradient : set limit path */
        GF_Err (*stencil_set_vertex_path) (GF_STENCIL _this, GF_Path *path);
        /*set the center of the gradient*/
        GF_Err (*stencil_set_vertex_center) (GF_STENCIL _this, Fixed cx, Fixed cy, u32 color);
        /*set the center of the gradient*/
        GF_Err (*stencil_set_vertex_colors) (GF_STENCIL _this, u32 *colors, u32 nbCol);

        /*sets global alpha blending level for stencil (texture and gradients)
        the alpha channel shall be combined with the color matrix if any*/
        GF_Err (*stencil_set_alpha) (GF_STENCIL _this, u8 alpha);

        /*set stencil texture
                @pixels: texture data, from top to bottom
                @width, @height: texture size
                @stride: texture horizontal pitch (bytes to skip to get to next row)
                @pixelFormat: texture pixel format as defined in file constants.h
                @destination_format_hint: this is the current pixel format of the destination surface, and is given
                as a hint in case the texture needs to be converted by the stencil
                @no_copy: if set, specifies the texture data shall not be cached by the module (eg it must be able
                to directly modify the given memory
        NOTE: this stencil acts as a data wrapper, the pixel data is not required to be locally copied
        data is not required to be available for texturing until the stencil is used in a draw operation
        */
        GF_Err (*stencil_set_texture) (GF_STENCIL _this, char *pixels, u32 width, u32 height, u32 stride, GF_PixelFormat pixelFormat, GF_PixelFormat destination_format_hint, Bool no_copy);
        /*signals the texture has been modified (internal texture only)*/
        void (*stencil_texture_modified) (GF_STENCIL _this);

        /*sets texture tile mode*/
        GF_Err (*stencil_set_tiling) (GF_STENCIL _this, GF_TextureTiling mode);
        /*sets texture filtering mode*/
        GF_Err (*stencil_set_filter) (GF_STENCIL _this, GF_TextureFilter filter_mode);
        /*set stencil color matrix - texture stencils only. If matrix is NULL, resets current color matrix*/
        GF_Err (*stencil_set_color_matrix) (GF_STENCIL _this, GF_ColorMatrix *cmat);

        /*creates surface object*/
        /* @center_coords: true indicates mathematical-like coord system,
                                           false indicates computer-like coord system */
        GF_SURFACE (*surface_new) (struct _raster2d_interface *, Bool center_coords);
        /* delete surface object */
        void (*surface_delete) (GF_SURFACE _this);

        /* attach surface object to device object (Win32: HDC) width and height are target surface size*/
        GF_Err (*surface_attach_to_device) (GF_SURFACE _this, void *os_handle, u32 width, u32 height);
        /* attach surface object to stencil object*/
        GF_Err (*surface_attach_to_texture) (GF_SURFACE _this, GF_STENCIL sten);
        /* attach surface object to memory buffer if supported
                @pixels: texture data
                @width, @height: texture size
                @pitch_x: texture horizontal pitch (bytes to skip to get to next pixel). O means linear frame buffer (eg pitch_x==bytes per pixel)
                @pitch_y: texture vertical pitch (bytes to skip to get to next line)
                @pixelFormat: texture pixel format
        */
        GF_Err (*surface_attach_to_buffer) (GF_SURFACE _this, char *pixels, u32 width, u32 height, s32 pitch_x, s32 pitch_y, GF_PixelFormat pixelFormat);

        GF_Err (*surface_attach_to_callbacks) (GF_SURFACE _this, GF_RasterCallback *callbacks, u32 width, u32 height);

        /* detach surface object */
        void (*surface_detach) (GF_SURFACE _this);

        /*sets rasterizer precision */
        GF_Err (*surface_set_raster_level) (GF_SURFACE _this, GF_RasterLevel RasterSetting);
        /* set the given matrix as the current transformations for all drawn paths
        if NULL reset the current transformation */
        GF_Err (*surface_set_matrix) (GF_SURFACE _this, GF_Matrix2D *mat);
        /* set the given rectangle as a clipper - nothing will be drawn outside this clipper
        if the clipper is NULL then no clipper is set
        NB: the clipper is not affected by the surface matrix and is given in pixels
        CF ABOVE NOTE ON CLIPPERS*/
        GF_Err (*surface_set_clipper) (GF_SURFACE _this, GF_IRect *rc);

        /*sets the given path as the current one for drawing - the surface transform is NEVER changed between
        setting the path and filling, only the clipper may change*/
        GF_Err (*surface_set_path) (GF_SURFACE _this, GF_Path *path);
        /*fills the current path using the given stencil - can be called several times with the same current path*/
        GF_Err (*surface_fill) (GF_SURFACE _this, GF_STENCIL stencil);

        /*flushes to surface*/
        GF_Err (*surface_flush) (GF_SURFACE _this);

        /*clears given pixel rect on the surface with the given color - REQUIRED
        the given rect is formatted as a clipper - CF ABOVE NOTE ON CLIPPERS*/
        GF_Err (*surface_clear)(GF_SURFACE _this, GF_IRect *rc, GF_Color col);

        /*private:*/
        void *internal;
} GF_Raster2D;



#ifdef __cplusplus
}
#endif


#endif  /*_GF_MODULE_RASTER2D_H_*/


/* [<][>][^][v][top][bottom][index][help] */