gtk/gdk-pixbuf/pixops
Havoc Pennington 518f32d97e contrib subdir
2000-10-06  Havoc Pennington  <hp@redhat.com>

	* Makefile.am (SRC_SUBDIRS): contrib subdir

	* gdk/gdkpixbuf.h: Move GdkPixbufAlphaMode to gdk-pixbuf library,
	so it can be used in Xlib version

	* demos/testpixbuf.c (update_timeout): error checking from 1.0
	tree

	* gtk/gdk-pixbuf-loader.c (gdk_pixbuf_loader_get_pixbuf): Sync
	change from 1.0 tree that returns first frame of animation
	if the loaded file is an animation.

        * contrib: add new directory to hold stuff that comes with GTK+
	but isn't really part of GTK+ (for now, gdk-pixbuf-xlib)

	* configure.in: add contrib/*

2000-10-06  Havoc Pennington  <hp@redhat.com>

	* gdk-pixbuf.h: add GdkPixbufAlphaMode

2000-10-06  Havoc Pennington  <hp@redhat.com>

        This entry is a summary of the merged-in changes from 1.0.
	Relevant original ChangeLog entries are spliced in after
	this entry; the files they refer to are from the 1.0
	gdk-pixbuf sources.

	* pixops/pixops.c (pixops_composite_nearest): sync a small fix
	from 1.0

	* io-xpm.c (xpm_seek_string): add fscanf error check from 1.0
	Add progressive loader from 1.0

	* io-tiff.c (gdk_pixbuf__tiff_image_begin_load): mem leak fixes
	from 1.0 tree

	* io-pnm.c: new version from 1.0 tree

	* io-jpeg.c (gdk_pixbuf__jpeg_image_load): sync from 1.0, use
	malloc not g_malloc

	* io-gif.c (lzw_read_byte): sync from 1.0, change a g_error to
	g_warning
	(gif_get_next_step): return 0 here, sync from 1.0

	* gdk-pixbuf-util.c: sync email address change for Cody
	Russell

2000-09-11  Jeffrey Stedfast  <fejj@helixcode.com>

	* gdk-pixbuf/io-pnm.c: Pretty much totally rewrote again because
	last nights code was still "broken". Should now properly handle
	all error conditions gracefully.

2000-09-10  Jeffrey Stedfast  <fejj@helixcode.com>

	* gdk-pixbuf/io-pnm.c: Rewrote.

2000-09-09  Federico Mena Quintero  <federico@helixcode.com>

	* gdk-pixbuf/pixops/pixops.c (pixops_composite_nearest): Compute
	the correct dest offset.

2000-08-25  Federico Mena Quintero  <federico@helixcode.com>

	* gdk-pixbuf/io-xpm.c: #include <unistd.h>

2000-08-05  Larry Ewing  <lewing@helixcode.com>

	* gdk-pixbuf/io-tiff.c: stop leaking context->tempname.

	* gdk-pixbuf/io-xpm.c: same as above.

2000-07-26  Michael Meeks  <michael@helixcode.com>

	* gdk-pixbuf/io-jpeg.c (gdk_pixbuf__jpeg_image_load): make
	g_malloc a malloc.

2000-07-21  Larry Ewing  <lewing@helixcode.com>

	* gdk-pixbuf/io-xpm.c: add a fake progressive loader so that
	xpm at least supports the progressive interface like the one in
	io-tiff.c. This should be reimplemented as an actual progressive
	loader.

2000-07-19  Jonathan Blandford  <jrb@redhat.com>

	* demo/pixbuf-demo.c (update_timeout): changed scaling level to
	make it look better.
	* gdk-pixbuf/testpixbuf.c (update_timeout): Patch from michael
	meeks to handle errors better.
2000-10-09 17:22:20 +00:00
..
.cvsignore Remove conftest* after use along the lines of AC_TRY_COMPILE. 2000-09-05 14:07:55 +00:00
composite_line_22_4a4_mmx.S Win32 build setup: 2000-07-22 23:50:19 +00:00
composite_line_color_22_4a4_mmx.S Win32 build setup: 2000-07-22 23:50:19 +00:00
DETAILS Add beginnings of file with detailed information about the structure and 2000-05-05 11:44:15 +00:00
have_mmx.S Win32 build setup: 2000-07-22 23:50:19 +00:00
Makefile.am Win32 build setup: 2000-07-22 23:50:19 +00:00
makefile.mingw.in Win32 build setup: 2000-07-22 23:50:19 +00:00
pixops-internal.h Most of this patch is based on a patch by Havoc Pennington (hp@redhat.com) 2000-04-11 07:03:25 +00:00
pixops.c contrib subdir 2000-10-09 17:22:20 +00:00
pixops.h Most of this patch is based on a patch by Havoc Pennington (hp@redhat.com) 2000-04-11 07:03:25 +00:00
README quick fix for initializing arrays in benchmark. 2000-01-05 23:57:02 +00:00
scale_line_22_33_mmx.S Win32 build setup: 2000-07-22 23:50:19 +00:00
timescale.c Win32 build setup: 2000-07-22 23:50:19 +00:00

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.