Re: Thoughts about a new GdkPixbuf transform interface
- From: Oleg Klimov <quif land ru>
- To: Owen Taylor <gtk-devel-list gnome org>
- Subject: Re: Thoughts about a new GdkPixbuf transform interface
- Date: Thu, 20 Feb 2003 00:53:46 +0300
Minimal GdkPixbufTransform API as I see it.
[comments in the code]
Should be many typos.
typedef struct _GdkPixbufTransform GdkPixbufTransform;
enum {
GDK_TRANSFORM_AFFINE, /* dest coord = linear function (src
coord) */
GDK_TRANSFORM_FUNCTION, /* any arbitrary function */
GDK_TRANSFORM_FUNCTION_AFFINE, /* dst coord = function ( affine
(src coord) ) */
GDK_TRANSFORM_AFFINE_FUNCTION, /* dst coord = affine ( function
(src coord) ) */
} GdkPixbufTransformType;
GdkPixbufTransform* gdk_pixbuf_transform_new (GdkPixbuf* src,
GdkPixbufTransformType
type);
/* transformation setup functions */
void gdk_pixbuf_transform_reset (GdkPixbufTransform* trans);
void gdk_pixbuf_transform_set_affine (GdkPixbufTransform* trans,
gdouble offset_x,
gdouble offset_y,
gdouble m00,
gdouble m01,
gdouble m10,
gdouble m11);
[I like it this way. Somebody will like big matrix]
void gdk_pixbuf_transform_rotate (GdkPixbufTransform* trans,
gdouble angle);
void gdk_pixbuf_transform_scale (GdkPixbufTransform* trans,
gdouble scale_x,
gdouble scale_y);
void gdk_pixbuf_transform_offset (GdkPixbufTransform* trans,
gdouble move_x,
gdouble move_y);
typedef gboolean (*GdkPixbufTransformFunc) (gdouble* src_x,
gdouble* src_y,
gdouble dst_x,
gdouble dst_y,
gpointer user_data);
void gdk_pixbuf_transform_set_func (GdkPixbufTransform*
trans,
GdkPixbufTransformFunc
reverse_func,
gpointer
user_data);
[one function call for each pixel.
nearest is trivial.
keeping values for neighbor pixels allows to approximate derivatives,
should be
enough to calculate filter]
/* convenience setup functions */
void gdk_pixbuf_transform_setup_rotate (GdkPixbufTransform* trans,
gdouble dst_x,
gdouble dst_y,
gdouble angle,
gdouble
src_center_x,
gdouble
src_center_y);
/* options */
typedef enum {
GDK_PIXBUF_EDGE_TRANSPARENT, /* do nothing (default) */
GDK_PIXBUF_EDGE_NEAREST, /* edges stratching mode (useful
when scaling) */
GDK_PIXBUF_EDGE_TILE, /* clone src pixbuf */
} GdkPixbufEdgeMode;
void gdk_pixbuf_transform_set_edge_mode (GdkPixbufTransform*
trans,
GdkPixbufEdgeMode
mode);
void gdk_pixbuf_transform_set_interp_type (GdkPixbufTransform*
trans,
GdkInterpType
interp_type);
void gdk_pixbuf_transform_set_overall_alpha (GdkPixbufTransform*
trans,
gint
overall_alpha);
void gdk_pixbuf_transform_set_background_color (GdkPixbufTransform*
trans,
guint32
color);
/* render functions */
void gdk_pixbuf_transform_get_bounds (GdkPixbufTransform* trans,
GdkPixbuf* dest,
gdouble*
bound_rect_x,
gdouble*
bound_rect_y,
gdouble*
bound_rect_width,
gdouble*
bound_rect_height);
void gdk_pixbuf_transform_render (GdkPixbufTransform* trans,
GdkPixbuf* dest);
void gdk_pixbuf_transform_render_rect (GdkPixbufTransform* trans,
GdkPixbuf* dest,
gint rect_x,
gint rect_y,
gint rect_width,
gint
rect_height);
/* convinience functions */
void gdk_pixbuf_transform_vector (GdkPixbufTransform* trans,
gdouble*
dst_vector_x,
gdouble*
dst_vector_y,
gdouble
src_vector_x,
gdouble
src_vector_y);
GdkPixbuf* gdk_pixbuf_transform_rotate_simple (GdkPixbuf* src,
gdouble angle);
GdkPixbuf* gdk_pixbuf_transform_scale_simple (GdkPixbuf* src,
gint dest_width,
gint
dest_height);
Suggestions welcome.
(I'm now implemeting it, quite easy, without complex filters)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]