/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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. */ /* * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ #include #include #include #include "gdk.h" #include "gdkimage.h" #include "gdkprivate.h" #include "gdkprivate-fb.h" struct _GdkImagePrivateFB { GdkImagePrivate base; }; static void gdk_fb_image_destroy (GdkImage *image); static void gdk_image_put_normal (GdkImage *image, GdkDrawable *drawable, GdkGC *gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height); static GdkImageClass image_class_normal = { gdk_fb_image_destroy, gdk_image_put_normal }; GdkImage * gdk_image_new_bitmap(GdkVisual *visual, gpointer data, gint w, gint h) { GdkImage *image; GdkImagePrivateFB *private; private = g_new(GdkImagePrivateFB, 1); image = (GdkImage *) private; private->base.ref_count = 1; private->base.klass = &image_class_normal; image->type = GDK_IMAGE_NORMAL; image->visual = visual; image->width = w; image->height = h; image->depth = 1; image->byte_order = 1 /* MSBFirst */; image->mem = g_malloc(w * h / 8); image->bpp = 1; image->bpl = (w+7)/8; return image; } void gdk_image_init (void) { } GdkImage* gdk_image_new (GdkImageType type, GdkVisual *visual, gint width, gint height) { GdkImage *image; GdkImagePrivateFB *private; private = g_new (GdkImagePrivateFB, 1); image = (GdkImage*) private; private->base.ref_count = 1; image->type = 0; image->visual = visual; image->width = width; image->height = height; image->depth = visual->depth; private->base.klass = &image_class_normal; if (image) { image->byte_order = 0; image->mem = g_malloc(width * height * (image->depth >> 3)); image->bpp = image->depth; image->bpl = (width * image->depth + 7)/8; } return image; } GdkImage* gdk_image_get (GdkWindow *window, gint x, gint y, gint width, gint height) { GdkImage *image; GdkImagePrivateFB *private; gint bits_per_pixel = GDK_DRAWABLE_P(gdk_parent_root)->depth; GdkDrawableFBData fbd; GdkDrawablePrivate tmp_foo; g_return_val_if_fail (window != NULL, NULL); if (GDK_DRAWABLE_DESTROYED (window)) return NULL; private = g_new (GdkImagePrivateFB, 1); image = (GdkImage*) private; private->base.ref_count = 1; private->base.klass = &image_class_normal; image->type = GDK_IMAGE_NORMAL; image->visual = gdk_window_get_visual (window); image->width = width; image->height = height; image->depth = bits_per_pixel; if (bits_per_pixel <= 8) image->bpp = 1; else if (bits_per_pixel <= 16) image->bpp = 2; else if (bits_per_pixel <= 24) image->bpp = 3; else image->bpp = 4; image->byte_order = 1; image->bpl = (image->width * image->bpp + 7)/8; image->mem = g_malloc(image->bpl * image->height); /* Fake its existence as a pixmap */ memset(&tmp_foo, 0, sizeof(tmp_foo)); memset(&fbd, 0, sizeof(fbd)); tmp_foo.klass = &_gdk_fb_drawable_class; tmp_foo.klass_data = &fbd; fbd.mem = image->mem; fbd.rowstride = image->bpl; tmp_foo.width = fbd.lim_x = image->width; tmp_foo.height = fbd.lim_y = image->height; tmp_foo.depth = image->depth; gdk_fb_draw_drawable((GdkPixmap *)&tmp_foo, NULL, window, x, y, 0, 0, width, height); return image; } guint32 gdk_image_get_pixel (GdkImage *image, gint x, gint y) { GdkImagePrivateFB *private; g_return_val_if_fail (image != NULL, 0); private = (GdkImagePrivateFB *) image; g_assert(image->depth == 8); return ((guchar *)image->mem)[x + y * image->bpl]; } void gdk_image_put_pixel (GdkImage *image, gint x, gint y, guint32 pixel) { GdkImagePrivateFB *private; g_return_if_fail (image != NULL); private = (GdkImagePrivateFB *) image; g_assert(image->depth == 8); ((guchar *)image->mem)[x + y * image->bpl] = pixel; } static void gdk_fb_image_destroy (GdkImage *image) { GdkImagePrivateFB *private; g_return_if_fail (image != NULL); private = (GdkImagePrivateFB*) image; g_free(image->mem); image->mem = NULL; g_free (image); } static void gdk_image_put_normal (GdkImage *image, GdkDrawable *drawable, GdkGC *gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { GdkImagePrivateFB *image_private; GdkDrawableFBData fbd; GdkDrawablePrivate tmp_foo; g_return_if_fail (drawable != NULL); g_return_if_fail (image != NULL); g_return_if_fail (gc != NULL); if (GDK_DRAWABLE_DESTROYED (drawable)) return; image_private = (GdkImagePrivateFB*) image; g_return_if_fail (image->type == GDK_IMAGE_NORMAL); /* Fake its existence as a pixmap */ memset(&tmp_foo, 0, sizeof(tmp_foo)); memset(&fbd, 0, sizeof(fbd)); tmp_foo.klass = &_gdk_fb_drawable_class; tmp_foo.klass_data = &fbd; fbd.mem = image->mem; fbd.rowstride = image->bpl; tmp_foo.width = fbd.lim_x = image->width; tmp_foo.height = fbd.lim_y = image->height; tmp_foo.depth = image->depth; gdk_fb_draw_drawable(drawable, gc, (GdkPixmap *)&tmp_foo, xsrc, ysrc, xdest, ydest, width, height); } void gdk_image_exit(void) { }