forked from AuroraMiddleware/gtk
829ed02435
2000-04-11 Federico Mena Quintero <federico@helixcode.com> Most of this patch is based on a patch by Havoc Pennington (hp@redhat.com) to make GdkPixbuf's structures opaque and to remove the libart dependency. * gdk-pixbuf/gdk-pixbuf.h: Removed the public structures. (GdkColorspace): New enum that for now only contains GDK_COLORSPACE_RGB. (GdkPixbufDestroyNotify): New type for the pixbuf's pixels destroy notification function. (GdkInterpType): New num with interpolation types. * *.[ch]: Replace the libart stuff with our own stuff. * pixops/*.[ch]: Likewise. * gdk-pixbuf/gdk-pixbuf-private.h: New file with the private declarations of the GdkPixbuf structures. * gdk-pixbuf/gdk-pixbuf.c (gdk_pixbuf_new_from_art_pixbuf): Removed function. (gdk_pixbuf_get_format): Constify. (gdk_pixbuf_get_n_channels): Constify. (gdk_pixbuf_get_has_alpha): Constify. (gdk_pixbuf_get_bits_per_sample): Constify. (gdk_pixbuf_get_pixels): Constify. (gdk_pixbuf_get_width): Constify. (gdk_pixbuf_get_height): Constify. (gdk_pixbuf_get_rowstride): Constify. * gdk-pixbuf/gdk-pixbuf.c (gdk_pixbuf_copy): New function to copy a pixbuf. * gdk-pixbuf/gdk-pixbuf-data.c (gdk_pixbuf_new_from_data): Added a bits_per_sample argument; currently only 8 bits per sample are supported. * gdk-pixbuf/gdk-pixbuf-animation.c (gdk_pixbuf_frame_get_pixbuf): New accessor. (gdk_pixbuf_frame_get_x_offset): New accessor. (gdk_pixbuf_frame_get_y_offset): New accessor. (gdk_pixbuf_frame_get_delay_time): New accessor. (gdk_pixbuf_frame_get_action): New accessor. * gdk-pixbuf/gdk-pixbuf-render.c (gdk_pixbuf_render_pixmap_and_mask): Instead of returning a solid mask rectangle for pixbufs without an alpha channel, set the *mask_return to NULL. * gdk-pixbuf/gdk-pixbuf-util.c (gdk_pixbuf_add_alpha): Constify. * gdk-pixbuf/gdk-pixbuf-scale.c: Fix includes. * gdk-pixbuf/gdk-pixbuf-scale.c (gdk_pixbuf_scale): Added some preconditions. Maybe we should also check for the colorspace, bits per pixel, and such. (gdk_pixbuf_composite): Likewise. (gdk_pixbuf_composite_color): Likewise. (gdk_pixbuf_scale_simple): Likewise, and fail gracefully if we cannot allocate the new pixbuf. (gdk_pixbuf_composite_color_simple): Likewise. * gdk-pixbuf/gnome-canvas-pixbuf.c (gnome_canvas_pixbuf_render): Use art_rgb_rgba_affine() or art_rgb_affine() since we no longer have an ArtPixBuf. * gdk-pixbuf/io-bmp.c: Fix includes. * gdk-pixbuf/pixops/pixops.c (pixops_scale_nearest): Fixed cast in an lvalue. * TODO: Populated. * configure.in: Removed checks for libart. * gdk-pixbuf/Makefile.am: Removed references to libart. (noinst_HEADERS): Added gdk-pixbuf-private.h. * gdk-pixbuf/Makefile.am (libgdk_pixbuf_la_LDFLAGS): Incremented the version number of the libtool library to indicate that this definitely is not compatible with the old usage. I know you love me. I know you do. * configure.in: Bumped version number to 0.7.0. * README: Updated. * gdk-pixbuf-config.in (--libs): We no longer require libart. * DEPENDS.libgdk_pixbuf: We no longer depend on libart. * gdk-pixbuf.spec.in: Updated, but I don't guarantee anything. |
||
---|---|---|
.. | ||
.cvsignore | ||
composite_line_22_4a4_mmx.S | ||
composite_line_color_22_4a4_mmx.S | ||
have_mmx.S | ||
Makefile.am | ||
pixops-internal.h | ||
pixops.c | ||
pixops.h | ||
README | ||
scale_line_22_33_mmx.S | ||
timescale.c |
The code in this directory implements optimized, filtered scaling for pixmap data. This code is copyright Red Hat, Inc, 2000 and licensed under the terms of the GNU Lesser General Public License (LGPL). (If you want to use it in a project where that license is not appropriate, please contact me, and most likely something can be worked out.) Owen Taylor <otaylor@redhat.com> PRINCIPLES ========== The general principle of this code is that it first computes a filter matrix for the given filtering mode, and then calls a general driver routine, passing in functions to composite pixels and lines. (The pixel functions are used for handling edge cases, and the line functions are simply used for the middle parts of the image.) The system is designed so that the line functions can be simple, don't have to worry about special cases, can be selected to be specific to the particular formats involved. This allows them to be hyper-optimized. Since most of the compution time is spent in these functions, this results in an overall fast design. MMX assembly code for Intel (and compatible) processors is included for a number of the most common special cases: scaling from RGB to RGB compositing from RGBA to RGBx compositing against a color from RGBA and storing in a RGBx buffer TODO ==== * ART_FILTER_HYPER is not correctly implemented. It is currently implemented as a filter that is derived by doing linear interpolation on the source image and then averaging that with a box filter. It should be defined as followed (see art_filterlevel.h) "HYPER is the highest quality reconstruction function. It is derived from the hyperbolic filters in Wolberg's "Digital Image Warping," and is formally defined as the hyperbolic-filter sampling the ideal hyperbolic-filter interpolated image (the filter is designed to be idempotent for 1:1 pixel mapping). It is the slowest and highest quality." The current HYPER is probably as slow, but lower quality. Also, there are some subtle errors in the calculation current HYPER that show up as dark stripes if you scale a constant-color image. * There are some roundoff errors in the compositing routines. the _nearest() variants do it right, most of the other code is wrong to some degree or another. For instance, in composite line, we have: dest[0] = ((0xff0000 - a) * dest[0] + r) >> 24; if a is 0, then we have: (0xff0000 * dest[0] + r) >> 24 which gives results which are 1 to low: 255 => 254, 1 => 0. So, this should be something like: ((0xff0000 - a) * dest[0] + r + 0xffffff) >> 24; (Not checked, caveat emptor) An alternatve formulation of this as: dest[0] + (r - a * dest[0] + 0xffffff) >> 24 may be better numerically, but would need consideration for overflow. * The generic functions could be sped up considerably by switching around conditionals and inner loops in various places. * Right now, in several of the most common cases, there are optimized mmx routines, but no optimized C routines. For instance, there is a pixops_composite_line_22_4a4_mmx() But no pixops_composite_line_22_4a4() Also, it may be desirable to include a few more special cases - in particular: pixops_composite_line_22_4a3() May be desirable. * Scaling down images by large scale factors is _slow_ since huge filter matrixes are computed. (e.g., to scale down by a factor of 100, we compute 101x101 filter matrixes. At some point, it would be more efficent to switch over to subsampling when scaling down - one should never need a filter matrix bigger than 16x16.