gtk2/gdk/win32
Tor Lillqvist 3f4c73d0d5 Bug 559408 - Transparency lost when images are copied between GTK+ and the
2009-01-29  Tor Lillqvist  <tml@novell.com>

	Bug 559408 - Transparency lost when images are copied between GTK+
	and the clipboard on Windows

	The code in gdkselection-win32.c is simplified quite a lot. When
	an image is stored on the clipboard from GTK+, only the "PNG" and
	CF_DIB formats are advertised. PNG is our preferred format because
	it can losslessly represent any image that gdk-pixbuf can handle,
	even with alpha, unambiguously. CF_DIB is also advertised because
	of its ubiquitous support in Windows software.

	Delayed rendering is used as before, so for other data than text
	nothing is actually stored on the clipboard until some app asks
	for it.

	It's pointless to advertise images formats like "image/png" or
	"image/x-MS-bmp" that no other Windows application is going to
	look for anyway. Likewise it's pointless to store text under
	formats like "text/plain" or "UTF8_STRING". Just store
	CF_UNICODETEXT. CF_TEXT will be available as a synthesized format
	anyways.

	Office 2007 offers and asks for images in PNG format using the
	registered clipboard format name "PNG", so we do likewise. If the
	"PNG" format is available that is preferred when copying to GTK+
	from the clipboard.

	Unfortunately Word 2007 still uses CF_DIB without handling
	alpha. But PowerPoint 2007 uses PNG if available and handles alpha
	correctly. Both Word and Powerpoint offer PNG with alpha nicely.

	Firefox and IE7 offer images that contain alpha as 32-bit version
	3 BI_RGB DIBs with the undocumented "extra" bytes actually being
	alpha. Also, alpha is premultiplied into the RGB bytes, presumably
	because that is how AlphaBlend() wants such DIBs. That is also
	taken care of. At least for Firefox it easy to be sure that a
	CF_DIB on the clipboard is from Firefox.

	Also some general stylistic cleanup, comment improvements, and
	improvements of debugging printout especially in the clipboard
	handling. Those are not detailled below.

	* gdk/win32/gdkprivate-win32.h
	* gdk/win32/gdkglobals-win32.c
	* gdk/win32/gdkgmain-win32.c: Move some globals that were used
	only in gdkselection-win32.c to be local to that file.

	* gdk/win32/gdkproperty-win32.c (gdk_property_change): Don't
	bother checking if text to be placed on the clipboard consists of
	only ASCII.

	* gdk/win32/gdkselection-win32.c: Add static variables for a list
	of GdkPixbuf-supported formats, well-known registered clipboard
	formats for images, and for GdkAtoms for well-known image and text
	formats.

	(_gdk_win32_selection_init): Initialize above static variables.

	(selection_property_store) (gdk_selection_property_get)
	(_gdk_selection_property_delete): Don't use a FIFO of GdkSelProps
	for a window after all, it breaks testtext. See bug #163844.

	(gdk_selection_convert): When converting to the TARGETS format,
	i.e. when the caller wants to know what clipboard formats are
	available, if PNG is available we report just that and skip
	CF_DIB, JPEG and GIF even if advertised.

	If CF_UNICODETEXT is available, report only UTF8_STRING.

	When converting to the UTF8_STRING format, i.e. when the caller
	wants text from the clipboard, try just CF_UNICODETEXT. There is
	no point in trying CF_TEXT as Windows will synthesize
	CF_UNICODETEXT from CF_TEXT anyway, if some app has stored just
	CF_TEXT.

	When converting to the image/bmp format, i.e. when the caller
	wants an CF_DIB image from the clipboard, we check if the DIB is a
	version 3 32-bit BI_RGB one that is likely to actually contain
	alpha in the "extra" bytes. Such a DIB is likely to have
	premultiplied alpha even, at least in the case of Firefox 3 and
	IE7. We then edit the DIB in-place into a version 5 one in
	BI_BITFIELDS format and undo the alpha premultiplication.

	In any case, prepend a BMP file header before letting go of the
	data which will be fed to the gdk-pixbuf bmp loader by upper
	levels.

	(gdk_win32_selection_add_targets): If some kind of pixmap image
	format is being added, actually advertise just PNG and
	CF_DIB. Note that alpha won't be stored on the clipboard through
	CF_DIB. This is because gdk-pixbuf's bmp loader doesn't save
	alpha. Furthermore, few if any non-GTK+ Windows apps seem to
	understand a version 5 DIB with proper alpha anyway.

	(_gdk_win32_selection_convert_to_dib): Simplified muchly.



svn path=/trunk/; revision=22255
2009-01-30 01:16:47 +00:00
..
rc Remove all .cvsignore files. 2007-12-13 11:18:45 +00:00
bdfcursor.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
cursor.bdf Committing changes to the source bdf font file that I forgot to commit 2007-08-17 03:40:39 +00:00
gdkapplaunchcontext-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkcolor-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkcursor-win32.c Rename static local functions and variables to not have any unnecessary _ 2009-01-21 20:51:22 +00:00
gdkdisplay-win32.c Bug 566628 - gdk_display_close always asserts on win32 2009-01-05 15:31:14 +00:00
gdkdnd-win32.c Bug 544684 - Win64 issue, window handles are assumed to be 32-bit 2008-08-04 22:35:16 +00:00
gdkdrawable-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkdrawable-win32.h Cleanup. (#169648, Fabricio Barros Cabral) 2005-06-12 05:32:25 +00:00
gdkevents-win32.c Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkfont-win32.c Bug 544684 - Win64 issue, window handles are assumed to be 32-bit 2008-08-04 23:21:36 +00:00
gdkgc-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkgeometry-win32.c Bug 541305 – [Win32] Scrolling was broken after GdkWindow refactoring 2008-07-02 20:22:30 +00:00
gdkglobals-win32.c Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkim-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkimage-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkinput-win32.c Bug 540861 - invalid UTF-8 in input device name 2008-07-03 22:11:38 +00:00
gdkinput-win32.h Remove. (gdk_device_get_type): Drop class init function. The X11 version 2007-02-19 00:32:32 +00:00
gdkinput.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkkeys-win32.c Implement trivially on Windows. Not sure if something more complex is 2008-10-01 11:02:22 +00:00
gdkmain-win32.c Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkpixmap-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkpixmap-win32.h Cleanup. (#169648, Fabricio Barros Cabral) 2005-06-12 05:32:25 +00:00
gdkprivate-win32.h Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkproperty-win32.c Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkscreen-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkselection-win32.c Bug 559408 - Transparency lost when images are copied between GTK+ and the 2009-01-30 01:16:47 +00:00
gdkspawn-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdktestutils-win32.c New file, dummy implementations. 2007-11-25 22:25:18 +00:00
gdkvisual-win32.c Include "config.h" instead of <config.h> Command used: find -name 2008-06-22 14:28:52 +00:00
gdkwin32.h define __GDK_H_INSIDE__ around including all other headers. 2008-05-28 14:01:57 +00:00
gdkwin32id.c Bug 544684 - Win64 issue, window handles are assumed to be 32-bit 2008-08-04 23:21:36 +00:00
gdkwindow-win32.c Bug 557266 - Window Management Problem 2008-10-21 20:31:05 +00:00
gdkwindow-win32.h gdk/win32/gdkprivate-win32.h gdk/win32/gdkevents-win32.c 2008-02-05 16:47:24 +00:00
libwntab32x.la Add headers. Add section about ActiveIMM. 2001-11-08 20:57:18 +00:00
Makefile.am Implement GAppLaunchContext in gdk, providing startup notification. 2007-12-13 05:16:33 +00:00
makefile.msc updated fix c99ism (variable at start of block export functions for window 2008-05-23 20:29:27 +00:00
pktdef.h Build Wintab support always on Windows. Don't require the Wintab SDK. 2007-01-19 01:55:52 +00:00
wintab.h Build Wintab support always on Windows. Don't require the Wintab SDK. 2007-01-19 01:55:52 +00:00
xcursors.h Bug 544684 - Win64 issue, window handles are assumed to be 32-bit 2008-08-04 23:21:36 +00:00