diff options
Diffstat (limited to 'gst/smpte/gstmask.c')
-rw-r--r-- | gst/smpte/gstmask.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/gst/smpte/gstmask.c b/gst/smpte/gstmask.c new file mode 100644 index 0000000..940bf82 --- /dev/null +++ b/gst/smpte/gstmask.c @@ -0,0 +1,121 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmask.h" +#include "paint.h" + +static GList *masks = NULL; + +void +_gst_mask_init (void) +{ + _gst_barboxwipes_register (); +} + +static gint +gst_mask_compare (GstMaskDefinition * def1, GstMaskDefinition * def2) +{ + return (def1->type - def2->type); +} + +void +_gst_mask_register (const GstMaskDefinition * definition) +{ + masks = + g_list_insert_sorted (masks, (gpointer) definition, + (GCompareFunc) gst_mask_compare); +} + +const GList * +gst_mask_get_definitions (void) +{ + return masks; +} + +static GstMaskDefinition * +gst_mask_find_definition (gint type) +{ + GList *walk = masks; + + while (walk) { + GstMaskDefinition *def = (GstMaskDefinition *) walk->data; + + if (def->type == type) + return def; + + walk = g_list_next (walk); + } + return NULL; +} + +GstMask * +gst_mask_factory_new (gint type, gboolean invert, gint bpp, gint width, + gint height) +{ + GstMaskDefinition *definition; + GstMask *mask = NULL; + + definition = gst_mask_find_definition (type); + if (definition) { + mask = g_new0 (GstMask, 1); + + mask->type = definition->type; + mask->bpp = bpp; + mask->width = width; + mask->height = height; + mask->destroy_func = definition->destroy_func; + mask->user_data = definition->user_data; + mask->data = g_malloc (width * height * sizeof (guint32)); + + definition->draw_func (mask); + + if (invert) { + gint i, j; + guint32 *datap = mask->data; + guint32 max = (1 << bpp); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + *datap = max - *datap; + datap++; + } + } + } + } + + return mask; +} + +void +_gst_mask_default_destroy (GstMask * mask) +{ + g_free (mask->data); + g_free (mask); +} + +void +gst_mask_destroy (GstMask * mask) +{ + if (mask->destroy_func) + mask->destroy_func (mask); +} |