Release 941227
Tue Dec 27 13:35:16 1994 Alexandre Julliard (julliard@lamisun.epfl.ch) * [*/Imakefile] All objects files are now kept in their respective directory. * [README] Rewrote most of it. * [objects/bitblt.c] Rewrote BitBlt() to look right in every case, while minimizing the impact on performance. Not really finished yet. * [objects/bitmap.c] [objects/dc.c] Fixed bug with pattern brushes. * [objects/clipping.c] [windows/painting.c] Fixes for logical coordinates. * [objects/color.c] [windows/graphics.c] Fixed GetPixel() to return the correct color, and made it faster. * [objects/region.c] Fixed bug in CombineRgn() when one of the region is empty. Fri Dec 22 01:42:57 MET 1994 Dag Asheim (dash@ifi.uio.no) * [Configure] Don't assume that expr handles '==', use '=' instead. Give a (hopefully informative) message if imake fails.
This commit is contained in:
parent
234bc24db1
commit
3a5816f87e
|
@ -0,0 +1,42 @@
|
||||||
|
This is release 941227 of Wine the MS Windows emulator. This is still a
|
||||||
|
developer's only release. There are many bugs and many unimplemented API
|
||||||
|
features. Most applications still do not work.
|
||||||
|
|
||||||
|
Patches should be submitted to "wine-new@amscons.com". Please don't forget
|
||||||
|
to include a ChangeLog entry. I'll try to make a new release every Sunday.
|
||||||
|
|
||||||
|
WHAT'S NEW with Wine-941227: (see ChangeLog for details)
|
||||||
|
- Better BitBlt()
|
||||||
|
- Lots of bug fixes
|
||||||
|
|
||||||
|
See the README file in the distribution for installation instructions.
|
||||||
|
|
||||||
|
Because of lags created by using mirror, this message may reach you before
|
||||||
|
the release is available at the ftp sites. The sources will be available
|
||||||
|
from the following locations:
|
||||||
|
|
||||||
|
sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-941227.tar.gz
|
||||||
|
aris.com:/pub/linux/ALPHA/Wine/development/Wine-941227.tar.gz
|
||||||
|
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-941227.tar.gz
|
||||||
|
ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-941227.tar.gz
|
||||||
|
ftp.wonderland.org:/Wine/Wine-941227.tar.gz
|
||||||
|
|
||||||
|
If you submitted a patch, please check to make sure it has been
|
||||||
|
included in the new release.
|
||||||
|
|
||||||
|
New developers should read the info files available from the ftp sites.
|
||||||
|
The files NEWBIE-PROJECTS, DEVELOPERS-HINTS and Wine.FAQ are required
|
||||||
|
reading for new developers.
|
||||||
|
|
||||||
|
Wine is available thanks to the work of Bob Amstadt, Dag Asheim,
|
||||||
|
Martin Ayotte, Erik Bos, John Brezak, Andrew Bulhak, John Burton,
|
||||||
|
Paul Falstad, Peter Galbavy, Jeffrey Hsu, Miguel de Icaza,
|
||||||
|
Alexandre Julliard, Jon Konrath, Scott A. Laird, Martin von Loewis,
|
||||||
|
Kenneth MacDonald, Peter MacDonald, David Metcalfe, Michael Patra,
|
||||||
|
John Richardson, Johannes Ruscheinski, Yngvi Sigurjonsson,
|
||||||
|
Rick Sladkey, William Smith, Jon Tombs, Linus Torvalds, Carl Williams,
|
||||||
|
Karl Guenter Wuensch, and Eric Youngdale.
|
||||||
|
|
||||||
|
--
|
||||||
|
Alexandre Julliard
|
||||||
|
julliard@lamisun.epfl.ch
|
30
ChangeLog
30
ChangeLog
|
@ -1,3 +1,33 @@
|
||||||
|
Tue Dec 27 13:35:16 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
|
||||||
|
|
||||||
|
* [*/Imakefile]
|
||||||
|
All objects files are now kept in their respective directory.
|
||||||
|
|
||||||
|
* [README]
|
||||||
|
Rewrote most of it.
|
||||||
|
|
||||||
|
* [objects/bitblt.c]
|
||||||
|
Rewrote BitBlt() to look right in every case, while minimizing
|
||||||
|
the impact on performance. Not really finished yet.
|
||||||
|
|
||||||
|
* [objects/bitmap.c] [objects/dc.c]
|
||||||
|
Fixed bug with pattern brushes.
|
||||||
|
|
||||||
|
* [objects/clipping.c] [windows/painting.c]
|
||||||
|
Fixes for logical coordinates.
|
||||||
|
|
||||||
|
* [objects/color.c] [windows/graphics.c]
|
||||||
|
Fixed GetPixel() to return the correct color, and made it faster.
|
||||||
|
|
||||||
|
* [objects/region.c]
|
||||||
|
Fixed bug in CombineRgn() when one of the region is empty.
|
||||||
|
|
||||||
|
Fri Dec 22 01:42:57 MET 1994 Dag Asheim (dash@ifi.uio.no)
|
||||||
|
|
||||||
|
* [Configure]
|
||||||
|
Don't assume that expr handles '==', use '=' instead.
|
||||||
|
Give a (hopefully informative) message if imake fails.
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
Wed Dec 7 14:52:25 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
|
Wed Dec 7 14:52:25 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
|
||||||
|
|
||||||
|
|
33
Configure
33
Configure
|
@ -56,10 +56,10 @@ then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
LANGS=`echo En rc/sysres_*.rc | sed -e 's/rc\/sysres_//g' -e 's/\.rc//g' -e 's/ /\//g;'`
|
LANGS=`echo En rc/sysres_*.rc | sed -e 's/rc\/sysres_//g' -e 's/\.rc//g' -e 's/ /\//g;'`
|
||||||
while expr "$LANGS" : ".*$LANG" == 0 > /dev/null
|
while expr "$LANGS" : ".*$LANG" = 0 > /dev/null
|
||||||
do
|
do
|
||||||
prompt "Language ($LANGS)" LANG En
|
prompt "Language ($LANGS)" LANG En
|
||||||
if expr "$LANGS" : ".*$LANG" == 0 > /dev/null
|
if expr "$LANGS" : ".*$LANG" = 0 > /dev/null
|
||||||
then
|
then
|
||||||
echo "\"$LANG\" is not a supported language."
|
echo "\"$LANG\" is not a supported language."
|
||||||
fi
|
fi
|
||||||
|
@ -209,22 +209,37 @@ EOF
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "Creating Makefiles. This may take a while."
|
echo "Creating Makefiles. This may take a while."
|
||||||
xmkmf -a
|
if xmkmf -a
|
||||||
|
then :
|
||||||
|
else cat << EOF
|
||||||
|
|
||||||
|
WARNING: The exit status of the command 'xmkmf -a' indicates an error.
|
||||||
|
Maybe the Wine directory is incomplete, or Imake (see 'man xmkmf imake')
|
||||||
|
is incorrectly configured? In the latter case, it might be easiest to
|
||||||
|
reinstall X11 to get a new copy of Imake.
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
if [ 0 -lt `find . -name "*.rej" -print | wc -l` ]
|
if [ 0 -lt `find . -name "*.rej" -print | wc -l` ]
|
||||||
then
|
then
|
||||||
cat << EOF
|
cat << EOF
|
||||||
|
|
||||||
WARNING: You have some files named "*.rej". Rejected patch files?
|
WARNING: You have some files named '*.rej', which usually indicates
|
||||||
Maybe you tried to upgrade Wine by diff-files, and that patch failed.
|
rejected patch files. Maybe you tried to upgrade Wine with 'patch',
|
||||||
If something doesn't work, this might be the reason. See "man patch".
|
and that some of the patches failed? If something doesn't work, this
|
||||||
|
might be the reason. See 'man patch' (especially the '-p' option).
|
||||||
|
|
||||||
List of "*.rej" files:
|
List of "*.rej" files:
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
find . -name "*.rej" -print
|
find . -name "*.rej" -print
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
if [ -f ./Makefile ]
|
||||||
echo "Configure finished. Do 'make' to compile Wine."
|
then
|
||||||
|
echo
|
||||||
|
echo "Configure finished. Do 'make' to compile Wine."
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "*** There was a problem with 'imake': the main Makefile has not be created."
|
||||||
|
fi
|
||||||
|
|
41
Imakefile
41
Imakefile
|
@ -21,18 +21,15 @@ DEFINES = AutoDefines -DUSE_READLINE -DWINESTAT
|
||||||
|
|
||||||
#define IHaveSubdirs
|
#define IHaveSubdirs
|
||||||
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
|
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
|
||||||
'DEFINES=$(DEFINES)'
|
'DEFINES=$(DEFINES)' 'LD=$(LD)'
|
||||||
|
|
||||||
COMMONSUBDIRS = \
|
COMMONSUBDIRS = \
|
||||||
controls \
|
controls \
|
||||||
etc \
|
|
||||||
include \
|
|
||||||
rc \
|
rc \
|
||||||
loader \
|
loader \
|
||||||
misc \
|
misc \
|
||||||
multimedia \
|
multimedia \
|
||||||
objects \
|
objects \
|
||||||
test \
|
|
||||||
windows
|
windows
|
||||||
|
|
||||||
EMUSUBDIRS = \
|
EMUSUBDIRS = \
|
||||||
|
@ -48,35 +45,33 @@ LIBSUBDIRS = \
|
||||||
WINEDIR = $(LIBDIR)/wine
|
WINEDIR = $(LIBDIR)/wine
|
||||||
|
|
||||||
COMMONOBJS = \
|
COMMONOBJS = \
|
||||||
controls.o \
|
controls/controls.o \
|
||||||
loader.o \
|
loader/loader.o \
|
||||||
misc.o \
|
misc/misc.o \
|
||||||
multimedia.o \
|
multimedia/multimedia.o \
|
||||||
objects.o \
|
objects/objects.o \
|
||||||
rc.o \
|
rc/rc.o \
|
||||||
windows.o
|
windows/windows.o
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WARNING: if1632.o must be the first object file because its code must be
|
* WARNING: if1632.o must be the first object file because its code must be
|
||||||
* linked at the lowest possible addresses.
|
* linked at the lowest possible addresses.
|
||||||
*/
|
*/
|
||||||
EMUOBJS = \
|
EMUOBJS = \
|
||||||
if1632.o \
|
if1632/if1632.o \
|
||||||
debugger.o \
|
debugger/debugger.o \
|
||||||
memory.o \
|
memory/memory.o \
|
||||||
miscemu.o \
|
miscemu/miscemu.o
|
||||||
opcodes.o \
|
|
||||||
readline.o
|
|
||||||
|
|
||||||
LIBOBJS = \
|
LIBOBJS = \
|
||||||
toolkit.o
|
toolkit/toolkit.o
|
||||||
|
|
||||||
#ifndef WINELIB
|
#ifndef WINELIB
|
||||||
SUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS)
|
SUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS)
|
||||||
OBJS = $(COMMONOBJS) $(EMUOBJS)
|
OBJS = $(EMUOBJS) $(COMMONOBJS)
|
||||||
#else
|
#else
|
||||||
SUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS)
|
SUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS)
|
||||||
OBJS = $(COMMONOBJS) $(LIBOBJS)
|
OBJS = $(LIBOBJS) $(COMMONOBJS)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef i386BsdArchitecture
|
#ifdef i386BsdArchitecture
|
||||||
|
@ -100,9 +95,9 @@ DependSubdirs($(SUBDIRS))
|
||||||
AllTarget(wine.sym)
|
AllTarget(wine.sym)
|
||||||
|
|
||||||
#ifndef WINELIB
|
#ifndef WINELIB
|
||||||
NormalProgramTarget(wine,$(EMUOBJS) $(COMMONOBJS),$(DEPXLIB),$(XPM_LIB) $(XLIB),$(SYSLIBS))
|
NormalProgramTarget(wine,$(OBJS),$(DEPXLIB),$(XPM_LIB) $(XLIB),$(SYSLIBS))
|
||||||
#else
|
#else
|
||||||
NormalLibraryTarget(wine,$(LIBOBJS) $(COMMONOBJS))
|
NormalLibraryTarget(wine,$(OBJS))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wine.sym: wine
|
wine.sym: wine
|
||||||
|
@ -119,6 +114,6 @@ etags::
|
||||||
etags `find . -name '*.[chS]' -print`
|
etags `find . -name '*.[chS]' -print`
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
$(RM) `find . -name Makefile -print`
|
|
||||||
echo "/* autoconf.h generated automatically. Run Configure */" >autoconf.h
|
echo "/* autoconf.h generated automatically. Run Configure */" >autoconf.h
|
||||||
echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
|
echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
|
||||||
|
$(RM) `find . -name Makefile -print`
|
||||||
|
|
481
README
481
README
|
@ -1,36 +1,20 @@
|
||||||
0. LICENSE
|
1. INTRODUCTION
|
||||||
|
|
||||||
You may without charge, royalty or other payment, copy and
|
Wine is a program that allows running MS-Windows programs under X11.
|
||||||
distribute copies of this work and derivative works of this work
|
It consists of a program loader, that loads and executes an
|
||||||
in source or binary form provided that: (1)
|
MS-Windows binary, and of an emulation library that translates Windows
|
||||||
you appropriately publish on each copy an appropriate copyright
|
API calls to their Unix/X11 equivalent.
|
||||||
notice; (2) faithfully reproduce all prior copyright notices
|
|
||||||
included in the original work (you may also add your own
|
|
||||||
copyright notice); and (3) agree to indemnify and hold all prior
|
|
||||||
authors, copyright holders and licensors of the work harmless
|
|
||||||
from and against all damages arising from use of the work.
|
|
||||||
|
|
||||||
You may distribute sources of derivative works of the work
|
Wine is free software. See the file LICENSE for the details.
|
||||||
provided that (1) (a) all source files of the original work that
|
Basically, you can do anything with it, except claim that you wrote it.
|
||||||
have been modified, (b) all source files of the derivative work
|
|
||||||
that contain any party of the original work, and (c) all source
|
|
||||||
files of the derivative work that are necessary to compile, link
|
|
||||||
and run the derivative work without unresolved external calls and
|
|
||||||
with the same functionality of the original work ("Necessary
|
|
||||||
Sources") carry a prominent notice explaining the nature and date
|
|
||||||
of the modification and/or creation. You are encouraged to make
|
|
||||||
the Necessary Sources available under this license in order to
|
|
||||||
further the development and acceptance of the work.
|
|
||||||
|
|
||||||
EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED
|
Important note: current versions of Wine include a built-in debugger
|
||||||
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING
|
for 16-bit code, that is based on code from gdb. This means that if
|
||||||
BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A
|
you redistribute a version of Wine that includes this debugger, you
|
||||||
PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS
|
must follow the terms of the GNU General Public License.
|
||||||
OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR
|
|
||||||
LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
1. COMPILATION:
|
|
||||||
|
2. COMPILATION
|
||||||
|
|
||||||
You must have one of:
|
You must have one of:
|
||||||
|
|
||||||
|
@ -42,15 +26,25 @@ To build Wine, first do a "./Configure" and then a "make" (or "gmake"
|
||||||
if you're running *BSD). The executable "wine" will be built. "wine"
|
if you're running *BSD). The executable "wine" will be built. "wine"
|
||||||
will load and run 16-bit Windows' executables.
|
will load and run 16-bit Windows' executables.
|
||||||
|
|
||||||
|
To upgrade to a new release by using a patch file, first cd to the
|
||||||
|
top-level directory of the release (the one containing this README
|
||||||
|
file). Then do a "make clean", and patch the release with:
|
||||||
|
|
||||||
|
gunzip -c patch-file | patch -p1
|
||||||
|
|
||||||
|
where "patch-file" is the name of the patch file (something like
|
||||||
|
Wine-yymmdd.diff.gz). You can then re-run "./Configure", and then
|
||||||
|
run "make".
|
||||||
|
|
||||||
|
|
||||||
2. SETUP:
|
3. SETUP
|
||||||
|
|
||||||
Wine requires you to have a file /usr/local/etc/wine.conf (you can
|
Wine requires you to have a file /usr/local/etc/wine.conf (you can
|
||||||
supply a different name when configuring wine) or a file called .winerc
|
supply a different name when configuring wine) or a file called .winerc
|
||||||
in your homedirectory.
|
in your home directory.
|
||||||
|
|
||||||
The formatstyle of this config file is just like a windows .ini file.
|
The format of this config file is just like a Windows .ini file.
|
||||||
|
The file wine.ini contains a config file example.
|
||||||
|
|
||||||
Here's an explanation of each section:
|
Here's an explanation of each section:
|
||||||
|
|
||||||
|
@ -60,10 +54,10 @@ format: <driveletter> = <rootdirectory>
|
||||||
default: none
|
default: none
|
||||||
|
|
||||||
This section is used to specify the root directory of each `dos'drive
|
This section is used to specify the root directory of each `dos'drive
|
||||||
as windows' applications require a dos/mswindows based diskdrive &
|
as Windows' applications require a dos/mswindows based diskdrive &
|
||||||
directory scheme.
|
directory scheme.
|
||||||
|
|
||||||
If you mounted you dos-partition as /dos and installed microsoft windows
|
If you mounted your dos-partition as /dos and installed Microsoft Windows
|
||||||
in c:\windows than you should specify c=/dos in the drives section.
|
in c:\windows than you should specify c=/dos in the drives section.
|
||||||
|
|
||||||
* [wine]
|
* [wine]
|
||||||
|
@ -81,7 +75,7 @@ Used to specify an different system directory.
|
||||||
format: temp = <directory>
|
format: temp = <directory>
|
||||||
default: c:\temp
|
default: c:\temp
|
||||||
|
|
||||||
Used to specify a directory where windows applications can store temporary
|
Used to specify a directory where Windows applications can store temporary
|
||||||
files.
|
files.
|
||||||
|
|
||||||
format: path = <directories separated by semi-colons>
|
format: path = <directories separated by semi-colons>
|
||||||
|
@ -92,7 +86,7 @@ Used to specify the path which will be used to find executables and DLL's.
|
||||||
format: systemresources = <filename>
|
format: systemresources = <filename>
|
||||||
default: c:\temp
|
default: c:\temp
|
||||||
|
|
||||||
Used to specify the name of sysres.dll, a dll which is used by wine itself.
|
Used to specify the name of sysres.dll, a dll which is used by Wine itself.
|
||||||
|
|
||||||
* [serialports]
|
* [serialports]
|
||||||
|
|
||||||
|
@ -126,10 +120,9 @@ default: none
|
||||||
Used to specify which messages will be included in the logfile.
|
Used to specify which messages will be included in the logfile.
|
||||||
|
|
||||||
|
|
||||||
|
4. RUNNING PROGRAMS
|
||||||
|
|
||||||
3. RUNNING PROGRAMS
|
When invoking Wine, you must specify the entire path to the executable,
|
||||||
|
|
||||||
When invoking wine, you must specify the entire path to the executable,
|
|
||||||
or a filename only.
|
or a filename only.
|
||||||
|
|
||||||
For example: to run Windows' solitaire:
|
For example: to run Windows' solitaire:
|
||||||
|
@ -141,410 +134,22 @@ For example: to run Windows' solitaire:
|
||||||
|
|
||||||
wine /usr/windows/sol.exe (using a unixfilename)
|
wine /usr/windows/sol.exe (using a unixfilename)
|
||||||
|
|
||||||
note: the path of the file will also be added to the path when
|
Note: the path of the file will also be added to the path when
|
||||||
a full name is supplied on the commandline.
|
a full name is supplied on the commandline.
|
||||||
|
|
||||||
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
||||||
So, occassionally it will crash.
|
So, occasionally it may crash.
|
||||||
|
|
||||||
|
|
||||||
|
5. GETTING MORE INFORMATION
|
||||||
|
|
||||||
4. EXAMPLE CONFIGFILE
|
The best place to get help or to report bugs is the Usenet newsgroup
|
||||||
|
comp.emulators.ms-windows.wine. The Wine FAQ is posted there every
|
||||||
|
month.
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
If you add something, or fix a bug, please send a patch to
|
||||||
[drives]
|
wine-new@amscons.com for inclusion in the next release.
|
||||||
a=/mnt/fd0
|
|
||||||
c=/dos
|
|
||||||
d=~/Wine
|
|
||||||
|
|
||||||
[wine]
|
--
|
||||||
windows=c:\windows
|
Alexandre Julliard
|
||||||
system=c:\windows\system
|
julliard@lamisun.epfl.ch
|
||||||
temp=c:\temp
|
|
||||||
path=c:\windows;c:\windows\system;c:\winapps\word\;c:\winapps\pctools
|
|
||||||
systemresources=./sysres.dll
|
|
||||||
|
|
||||||
[serialports]
|
|
||||||
com1=/dev/cua1
|
|
||||||
com2=/dev/cua1
|
|
||||||
|
|
||||||
[parallelports]
|
|
||||||
lpt1=/dev/lp0
|
|
||||||
|
|
||||||
[spy]
|
|
||||||
;File=CON
|
|
||||||
;File=spy.log
|
|
||||||
Exclude=WM_TIMER;WM_SETCURSOR;WM_MOUSEMOVE;WM_NCHITTEST;WM_NCACTIVATE;WM_GETDLGCODE;
|
|
||||||
Include=WM_COMMAND;
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
5. BUILD:
|
|
||||||
|
|
||||||
The documentation for the build program is in the file build-spec.txt
|
|
||||||
|
|
||||||
|
|
||||||
6. FINALE:
|
|
||||||
|
|
||||||
Good luck,
|
|
||||||
|
|
||||||
If you successfully add anything, please send me a copy.
|
|
||||||
|
|
||||||
Bob Amstadt
|
|
||||||
bob@amscons.com
|
|
||||||
|
|
||||||
|
|
||||||
7. WHAT'S NEW
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940602: (see ChangeLog for details)
|
|
||||||
- CLOCK.EXE runs.
|
|
||||||
- ABORT command added to debugger.
|
|
||||||
- Windows environment is now imported from the UNIX environment.
|
|
||||||
- Use of save unders and backing store are now the default. Resource
|
|
||||||
and command line options have been added to disable these things.
|
|
||||||
- Assorted new driver functions
|
|
||||||
- GetAsyncKeyState()
|
|
||||||
- More metafile support
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940524: (see ChangeLog for details)
|
|
||||||
- New menu functions
|
|
||||||
- EnumObjects()
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940518: (see ChangeLog for details)
|
|
||||||
- debugger improvements
|
|
||||||
- bug fixes to get some dialog boxes working.
|
|
||||||
- skeleton for passing MCI functions.
|
|
||||||
- beginnings of metafile support.
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940510: (see ChangeLog for details)
|
|
||||||
- debugger improvements
|
|
||||||
- mmsystem
|
|
||||||
- ShellAbout() and AboutDlgProc()
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940505: (see ChangeLog for details)
|
|
||||||
- faster color_stretch()
|
|
||||||
- SetSysMenu(), GetCursor(), GetDesktopWindow()
|
|
||||||
- WSAGetXbyY() now non-blocking
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940420: (see ChangeLog for details)
|
|
||||||
- new property functions
|
|
||||||
- new listbox and combo box functions
|
|
||||||
- GrayString() and CallGrayStringProc()
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940412: (see ChangeLog for details)
|
|
||||||
- menuing improvements
|
|
||||||
- drawing performance improvements
|
|
||||||
- beginnings of hooks
|
|
||||||
- MDI maximizing and tiling
|
|
||||||
- improvements in winsock implementation
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940405: (see ChangeLog for details)
|
|
||||||
- Mouse activation of menus working again
|
|
||||||
- GetprocAddress()
|
|
||||||
- SetDIBitsToDevice()
|
|
||||||
- FindWindow()
|
|
||||||
- int 10hm 25h and 26h
|
|
||||||
- in, inb, out, outb emulation
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940329: (see ChangeLog for details)
|
|
||||||
- MDI: child windows can be created, activated and cascaded.
|
|
||||||
- -depth option
|
|
||||||
- support for dithered brushes
|
|
||||||
- GetNearestColor(), RealizeDefaultPalette(),
|
|
||||||
GetSystemPaletteEntries(), and SelectPalette()
|
|
||||||
- System colors read from WIN.INI
|
|
||||||
- Keyboard menu manipulation (mouse is temporarily broken)
|
|
||||||
- GetFreeSystemResources()
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940322: (see ChangeLog for details)
|
|
||||||
- Speed improvements in bitmaps and mouse messages
|
|
||||||
- More MDI support. More to come next week...
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940315: (see ChangeLog for details)
|
|
||||||
- Beginnings of MDI support. More to come next week...
|
|
||||||
- Stress DLL
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940309: (see ChangeLog for details)
|
|
||||||
- New "exclude" and "include" filters for spy feature. See sample
|
|
||||||
wine.ini for details.
|
|
||||||
- -desktop and -name options (see ChangeLog)
|
|
||||||
- GetFreeSpace() and CreateIcon()
|
|
||||||
- and many many bug fixes!
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940301: (see ChangeLog for details)
|
|
||||||
- NEW Configure script to set compile time options!
|
|
||||||
- Support for filesystems with short (less than 14 chars) filenames.
|
|
||||||
- Clipboard functions!
|
|
||||||
- and more...
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940223: (see ChangeLog for details)
|
|
||||||
- FreeBSD support
|
|
||||||
- FloodFill()
|
|
||||||
- Desktop window support
|
|
||||||
- Menu fixes
|
|
||||||
- and more...
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940216: (see ChangeLog for details)
|
|
||||||
- Many many bug fixes
|
|
||||||
- Switched to using Imakefile's instead of Makefile's.
|
|
||||||
- Lot's of changes for libwine.a
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940209: (see ChangeLog for details)
|
|
||||||
- Many many bug fixes
|
|
||||||
- Minor directory structure reorganization
|
|
||||||
- New GetModule*() functions.
|
|
||||||
- WINSOCK DLL
|
|
||||||
- First stab at Wine as a library
|
|
||||||
|
|
||||||
WHAT'S NEW with Wine-940201: (see ChangeLog for details)
|
|
||||||
- Support for huge data structures.
|
|
||||||
- FreeBSD support.
|
|
||||||
- Many many bug fixes
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.8: (see ChangeLog for details)
|
|
||||||
- Eliminated Xt-dependent code. Thanks to Alexandre and Martin.
|
|
||||||
- EnumWindows() and EnumChildWindows()
|
|
||||||
- Activating and deactivating of windows.
|
|
||||||
- More work on system menus.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.7: (see ChangeLog for details)
|
|
||||||
- Eliminated Xt-dependent code. Thanks to Alexandre and Martin.
|
|
||||||
- Other bug fixes.
|
|
||||||
- IsWIndowEnabled() and EnableWindow() now implemented.
|
|
||||||
- New command line options.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.6: (see ChangeLog for details)
|
|
||||||
- Working towards elimination of Xt-dependent code. Thanks to
|
|
||||||
Alexandre and Martin.
|
|
||||||
- Other bug fixes.
|
|
||||||
- I added a rudimentary spy facility which can be turned
|
|
||||||
on from the wine.ini file. See the sample wine.ini
|
|
||||||
for details
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.5: (see ChangeLog for details)
|
|
||||||
- Working towards elimination of Xt-dependent code.
|
|
||||||
- StretchBlt()
|
|
||||||
- GetClassName() & GetClassInfo()
|
|
||||||
- Implemented loader relocation types 5 and 6.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.14: (see ChangeLog for details)
|
|
||||||
- Bug fixes and enhancements
|
|
||||||
- Comm functions
|
|
||||||
- Text caret functions
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.13: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- GetCapture()
|
|
||||||
- More keyboard handling
|
|
||||||
- Polyline() and Polygon()
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.12: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- New DOS file functions
|
|
||||||
- Experimental Imakefiles
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.11: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- New cursor functions
|
|
||||||
- New file system handling
|
|
||||||
- Atoms
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.10: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- More scroll bar functions
|
|
||||||
- More icon and cursor handling
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.9: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- real MessageBox()
|
|
||||||
- New resource functions
|
|
||||||
- Icon functions
|
|
||||||
- Selector manipulation functions
|
|
||||||
- Catch()/Throw()
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.7: (see ChangeLog for details)
|
|
||||||
- More dialog box functions
|
|
||||||
- More DOS interrupts
|
|
||||||
- NetBSD compatibility patches
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.5: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- focus routines
|
|
||||||
- dialog box functions
|
|
||||||
- improvements to control windows
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.4: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- New static control class
|
|
||||||
- Preliminary listbox, combobox and scrollbar controls
|
|
||||||
- System initialization file is now called "wine.ini", and
|
|
||||||
may be located in the user's current directory, the
|
|
||||||
user's home directory or any directory specified by
|
|
||||||
the WINEPATH environment variable.
|
|
||||||
- The loader now searches the directories specified by the
|
|
||||||
WINEPATH environment variable for programs and DLLs.
|
|
||||||
- Internal debugger now works on 386BSD.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.3: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- Resource loading now able to load DLL resources
|
|
||||||
- Button control now based on GDI calls
|
|
||||||
- Preliminary system color support
|
|
||||||
- Miscellaneous window functions
|
|
||||||
- Limited debugging facility (sometimes hangs)
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.2: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- 32-bit callback functions allowed
|
|
||||||
- .INI file handling
|
|
||||||
- lstr* functions and ANSI<->OEM conversion functions.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.1: (see ChangeLog for details)
|
|
||||||
- Bug fixes
|
|
||||||
- Memory usage changes.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.0: (see ChangeLog for details)
|
|
||||||
- Wine now compiles and runs under NetBSD. Patches are
|
|
||||||
required for NetBSD.
|
|
||||||
- Wine stat patches included. Add "-DWINESTAT" to the definition
|
|
||||||
of COPTS in the main Makefile to activate.
|
|
||||||
- Preliminary keyboard handling.
|
|
||||||
- Button control window implemented.
|
|
||||||
- many other new functions added.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.3.1: (see ChangeLog for details)
|
|
||||||
- LineDDA() completed
|
|
||||||
- numerous bug fixes
|
|
||||||
- INT 1Ah implemented
|
|
||||||
- SOUND DLL implemented
|
|
||||||
- More of WIN87EM DLL implemented
|
|
||||||
- OpenFile() and friends implemented
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.3.0: (see ChangeLog for details)
|
|
||||||
- Mouse capture
|
|
||||||
- Text justification and underlining
|
|
||||||
- Clipping
|
|
||||||
- LoadBitmap() completed
|
|
||||||
- Code generated by the Borland compiler should now work
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.8: (see ChangeLog for details)
|
|
||||||
- Text functions from Alexandre
|
|
||||||
- INT 21h from Eric
|
|
||||||
- Menu improvements from David
|
|
||||||
- Bug fixes and GetProcAddress() stub from me
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.7: (see ChangeLog for details)
|
|
||||||
- sol.exe gets further. I did some debugging and now solitaire
|
|
||||||
stops when it tries to call GetTextExtent(). Any volunteers?
|
|
||||||
- Many DC updates from Alexandre.
|
|
||||||
- Menu updates to support underlining characters from David Metcalfe.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.6: (see ChangeLog for details)
|
|
||||||
- More region updates from Alexandre
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.5: (see ChangeLog for details)
|
|
||||||
- Regions implemented by Alexandre
|
|
||||||
- More menuing code from me
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.4: (see ChangeLog for details)
|
|
||||||
- Many improvements to GDI from Alexandre
|
|
||||||
- Many improvements to menu handling by me.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.3: (see ChangeLog for details)
|
|
||||||
- Bug fixes with SendMessage() and PostMessage()
|
|
||||||
- Preliminary menu support
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.2: (see ChangeLog for details)
|
|
||||||
- Misc bug fixes
|
|
||||||
- More bitmap code
|
|
||||||
- Timers
|
|
||||||
- Memory DC's
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.1:
|
|
||||||
- I have placed things into sub-directories. The organization is
|
|
||||||
not finalized. I imagine that the directory structure will
|
|
||||||
change as is necessary. Files in the ./misc directory need
|
|
||||||
to be split apart and placed in apropriate directories.
|
|
||||||
- Tons of code from Alexandre. He has constructed the framework
|
|
||||||
for handling GDI objects. He has also provided code for DCEs.
|
|
||||||
- Local heap functions have been completed.
|
|
||||||
- Bug fixes in global.c and win.c
|
|
||||||
- New function GlobalQuickAlloc() combines GlobalAlloc() and
|
|
||||||
GlobalLock() into a single function call.
|
|
||||||
- New patch kit for Linux 0.99 pl11 kernel. Thanks to Linus
|
|
||||||
who has graciously included our patches into the ALPHA patch
|
|
||||||
release cycle.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.2.0:
|
|
||||||
- Alexandre Julliard has provided a replacement for the Tcl code.
|
|
||||||
The new code uses Xlib and Xt directly with no intervening
|
|
||||||
interpretted language. This should reduce the learning
|
|
||||||
curve for casual hackers.
|
|
||||||
- I changed all GLOBAL_ names to Global.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.1.1:
|
|
||||||
- I have completed global memory allocation, but I don't like it.
|
|
||||||
It is not 100% compatible with Windows. I need some more kernel
|
|
||||||
modifications for 100% compatibility.
|
|
||||||
- Alexandre Julliard has provided written better emulation for
|
|
||||||
the Windows message queue.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.1.0:
|
|
||||||
- Latest patches from Alexandre Julliard.
|
|
||||||
- minor bug fix in if1632.S
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.0.5:
|
|
||||||
- Patches from Alexandre Julliard. Some integration with Tcl.
|
|
||||||
- Generic interface for callback procedures. This will allow
|
|
||||||
callbacks into DLLs.
|
|
||||||
- MakeProcInstance() has been implemented but untested.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.0.4:
|
|
||||||
- Eric Youngdale modified wine.c and selector.c to allow loading
|
|
||||||
of Windows DLLs.
|
|
||||||
- Added global memory allocation routines (GlobalAlloc, GlobalFree,
|
|
||||||
and GlobalLock)
|
|
||||||
- Bitmap resource loading into global memory.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.0.3:
|
|
||||||
- Fixed bug with sector sizes.
|
|
||||||
- Registers at program startup are now set correctly.
|
|
||||||
- Segment fixups for relocatable-segment internal entry points.
|
|
||||||
- Fixed bug in DOS PSP structure.
|
|
||||||
- Some resource loading is done.
|
|
||||||
- Added "return" ordinal type to build program.
|
|
||||||
- Added comment capability to build program.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.0.2:
|
|
||||||
|
|
||||||
- Again thanks to Eric Youngdale for some very useful comments.
|
|
||||||
- The Windows startup code created by Micrsoft C 7.0 now runs
|
|
||||||
to completion.
|
|
||||||
- Added a new patch to the kernel to increase the usable size of
|
|
||||||
the ldt to the full 32 entries currently allowed.
|
|
||||||
- Imported name relocations are now supported.
|
|
||||||
- Source code for my infamous test program is now included.
|
|
||||||
- A handful of basic Windows functions are now emulated. See
|
|
||||||
"kernel.spec" for examples of how to use the build program.
|
|
||||||
|
|
||||||
WHAT'S NEW with version 0.0.1:
|
|
||||||
|
|
||||||
- Eric Youngdale contributed countless improvements in memory
|
|
||||||
efficiency, bug fixes, and relocation.
|
|
||||||
- The build program has been completed. It now lets you specify
|
|
||||||
how the main DLL entry point should interface to your emulation
|
|
||||||
library routines. A brief description of how to build these
|
|
||||||
specifications is included in the file "build-spec.txt".
|
|
||||||
- The code to dispatch builtin DLL calls is complete, but untested.
|
|
||||||
|
|
|
@ -8,24 +8,24 @@ XCOMM First, dll description to files etc
|
||||||
#ifndef MakeDllFromSpec
|
#ifndef MakeDllFromSpec
|
||||||
#ifndef NewBuild
|
#ifndef NewBuild
|
||||||
#ifndef ShortNames
|
#ifndef ShortNames
|
||||||
#define MakeDllFromSpec(name,objfile) @@\
|
#define MakeDllFromSpec(name) @@\
|
||||||
Concat(dll_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/build @@\
|
Concat(dll_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/build @@\
|
||||||
$(TOP)/tools/build name.spec @@\
|
$(TOP)/tools/build name.spec @@\
|
||||||
|
|
||||||
#else /* ShortNames */
|
#else /* ShortNames */
|
||||||
#define MakeDllFromSpec(name,objfile) @@\
|
#define MakeDllFromSpec(name) @@\
|
||||||
Concat(dll_,name.S) Concat(dtb_,name.c): name.spec $(TOP)/tools/build @@\
|
Concat(dll_,name.S) Concat(dtb_,name.c): name.spec $(TOP)/tools/build @@\
|
||||||
$(TOP)/tools/build name.spec @@\
|
$(TOP)/tools/build name.spec @@\
|
||||||
|
|
||||||
#endif /* ShortNames */
|
#endif /* ShortNames */
|
||||||
#else /* NewBuild */
|
#else /* NewBuild */
|
||||||
#ifndef ShortNames
|
#ifndef ShortNames
|
||||||
#define MakeDllFromSpec(name,objfile) @@\
|
#define MakeDllFromSpec(name) @@\
|
||||||
Concat(dll_,name.S) Concat(rly_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/newbuild @@\
|
Concat(dll_,name.S) Concat(rly_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/newbuild @@\
|
||||||
$(TOP)/tools/newbuild name.spec @@\
|
$(TOP)/tools/newbuild name.spec @@\
|
||||||
|
|
||||||
#else /* ShortNames */
|
#else /* ShortNames */
|
||||||
#define MakeDllFromSpec(name,objfile) @@\
|
#define MakeDllFromSpec(name) @@\
|
||||||
Concat(dll_,name.S) Concat(rly_,name.S) Concat(dtb_,name.c): name.spec $(TOP)/tools/newbuild @@\
|
Concat(dll_,name.S) Concat(rly_,name.S) Concat(dtb_,name.c): name.spec $(TOP)/tools/newbuild @@\
|
||||||
$(TOP)/tools/newbuild name.spec @@\
|
$(TOP)/tools/newbuild name.spec @@\
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -138,6 +138,7 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
|
if (GetCapture() != hWnd) break;
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
|
SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
|
||||||
GetClientRect( hWnd, &rect );
|
GetClientRect( hWnd, &rect );
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#include "../Wine.tmpl"
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
#define IHavSubDirs
|
#define IHaveSubdirs
|
||||||
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'
|
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
|
||||||
|
'LD=$(LD)'
|
||||||
|
|
||||||
MODULE = debugger
|
MODULE = debugger
|
||||||
|
|
||||||
|
@ -16,21 +17,22 @@ SRCS = \
|
||||||
lex.yy.c \
|
lex.yy.c \
|
||||||
info.c
|
info.c
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
SUBDIRS_OBJS = \
|
||||||
|
opcodes/opcodes.o \
|
||||||
|
readline/readline.o
|
||||||
|
|
||||||
|
OBJS = $(SRCS:.c=.o) $(SUBDIRS_OBJS)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All the SUBDIR stuff
|
* All the SUBDIR stuff
|
||||||
*/
|
*/
|
||||||
MakeSubdirs($(SUBDIRS))
|
MakeSubdirs($(SUBDIRS))
|
||||||
MakefileSubdirs($(SUBDIRS))
|
|
||||||
DependSubdirs($(SUBDIRS))
|
DependSubdirs($(SUBDIRS))
|
||||||
CleanSubdirs($(SUBDIRS))
|
|
||||||
IncludesSubdirs($(SUBDIRS))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The main act
|
* The main act
|
||||||
*/
|
*/
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
|
|
||||||
depend:: dbg.tab.c dbg.tab.h lex.yy.c
|
depend:: dbg.tab.c dbg.tab.h lex.yy.c
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ OBJS = $(SRCS:.c=.o)
|
||||||
#undef xi386
|
#undef xi386
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -13,7 +13,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
#include "../Wine.tmpl"
|
|
||||||
|
|
||||||
MODULE = etc
|
|
||||||
|
|
||||||
AllTarget()
|
|
||||||
|
|
||||||
depend::
|
|
||||||
|
|
||||||
includes::
|
|
|
@ -39,23 +39,23 @@ OBJS = $(CALLOBJS) $(DLLOBJS) $(SRCS:.c=.o) $(DLLOBJS:.o=_tab.o) $(DLLOBJS:dll_.
|
||||||
/*
|
/*
|
||||||
* If you add a new spec file, copy one of these lines
|
* If you add a new spec file, copy one of these lines
|
||||||
*/
|
*/
|
||||||
MakeDllFromSpec(commdlg,$(TOP)/$(MODULE))
|
MakeDllFromSpec(commdlg)
|
||||||
MakeDllFromSpec(gdi,$(TOP)/$(MODULE))
|
MakeDllFromSpec(gdi)
|
||||||
MakeDllFromSpec(kernel,$(TOP)/$(MODULE))
|
MakeDllFromSpec(kernel)
|
||||||
MakeDllFromSpec(keyboard,$(TOP)/$(MODULE))
|
MakeDllFromSpec(keyboard)
|
||||||
MakeDllFromSpec(shell,$(TOP)/$(MODULE))
|
MakeDllFromSpec(shell)
|
||||||
MakeDllFromSpec(mmsystem,$(TOP)/$(MODULE))
|
MakeDllFromSpec(mmsystem)
|
||||||
MakeDllFromSpec(mouse,$(TOP)/$(MODULE))
|
MakeDllFromSpec(mouse)
|
||||||
MakeDllFromSpec(sound,$(TOP)/$(MODULE))
|
MakeDllFromSpec(sound)
|
||||||
MakeDllFromSpec(stress,$(TOP)/$(MODULE))
|
MakeDllFromSpec(stress)
|
||||||
MakeDllFromSpec(system,$(TOP)/$(MODULE))
|
MakeDllFromSpec(system)
|
||||||
MakeDllFromSpec(toolhelp,$(TOP)/$(MODULE))
|
MakeDllFromSpec(toolhelp)
|
||||||
MakeDllFromSpec(unixlib,$(TOP)/$(MODULE))
|
MakeDllFromSpec(unixlib)
|
||||||
MakeDllFromSpec(user,$(TOP)/$(MODULE))
|
MakeDllFromSpec(user)
|
||||||
MakeDllFromSpec(win87em,$(TOP)/$(MODULE))
|
MakeDllFromSpec(win87em)
|
||||||
MakeDllFromSpec(winsock,$(TOP)/$(MODULE))
|
MakeDllFromSpec(winsock)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
#ifndef WINELIB
|
#ifndef WINELIB
|
||||||
|
@ -63,7 +63,7 @@ pop.h: $(TOP)/tools/build
|
||||||
$(TOP)/tools/build -p
|
$(TOP)/tools/build -p
|
||||||
|
|
||||||
call.o: call.S pop.h
|
call.o: call.S pop.h
|
||||||
gcc -I. -c -o call.o call.S
|
$(CC) -I. -c -o call.o call.S
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -15,7 +15,6 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/head.h>
|
#include <linux/head.h>
|
||||||
#include <linux/ldt.h>
|
#include <linux/ldt.h>
|
||||||
#include <linux/segment.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "neexe.h"
|
#include "neexe.h"
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
#include "../Wine.tmpl"
|
|
||||||
|
|
||||||
MODULE = include
|
|
||||||
|
|
||||||
HEADERS = \
|
|
||||||
atom.h \
|
|
||||||
callback.h \
|
|
||||||
class.h \
|
|
||||||
combo.h \
|
|
||||||
cursor.h \
|
|
||||||
dce.h \
|
|
||||||
dialog.h \
|
|
||||||
dlls.h \
|
|
||||||
files.h \
|
|
||||||
gdi.h \
|
|
||||||
heap.h \
|
|
||||||
icon.h \
|
|
||||||
int21.h \
|
|
||||||
listbox.h \
|
|
||||||
menu.h \
|
|
||||||
message.h \
|
|
||||||
neexe.h \
|
|
||||||
prototypes.h \
|
|
||||||
regfunc.h \
|
|
||||||
scroll.h \
|
|
||||||
segmem.h \
|
|
||||||
user.h \
|
|
||||||
win.h \
|
|
||||||
windows.h \
|
|
||||||
wine.h
|
|
||||||
|
|
||||||
AllTarget()
|
|
||||||
|
|
||||||
depend::
|
|
||||||
|
|
||||||
includes::
|
|
|
@ -1,21 +1,35 @@
|
||||||
/*
|
/*
|
||||||
* GDI bitmap definitions
|
* GDI bitmap definitions
|
||||||
*
|
*
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993, 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BITMAP_H
|
#ifndef BITMAP_H
|
||||||
#define BITMAP_H
|
#define BITMAP_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
/* objects/bitmap.c */
|
||||||
extern BOOL BITMAP_Init(void);
|
extern BOOL BITMAP_Init(void);
|
||||||
|
|
||||||
|
/* objects/dib.c */
|
||||||
|
extern int DIB_GetImageWidthBytes( int width, int depth );
|
||||||
|
extern int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse );
|
||||||
|
|
||||||
/* GCs used for B&W and color bitmap operations */
|
/* GCs used for B&W and color bitmap operations */
|
||||||
extern GC BITMAP_monoGC, BITMAP_colorGC;
|
extern GC BITMAP_monoGC, BITMAP_colorGC;
|
||||||
|
|
||||||
#define BITMAP_GC(bmp) \
|
#define BITMAP_GC(bmp) \
|
||||||
(((bmp)->bitmap.bmBitsPixel == 1) ? BITMAP_monoGC : BITMAP_colorGC)
|
(((bmp)->bitmap.bmBitsPixel == 1) ? BITMAP_monoGC : BITMAP_colorGC)
|
||||||
|
|
||||||
|
#define XCREATEIMAGE(image,width,height,bpp) \
|
||||||
|
{ \
|
||||||
|
int width_bytes = DIB_GetImageWidthBytes( (width), (bpp) ); \
|
||||||
|
(image) = XCreateImage(display, DefaultVisualOfScreen(screen), \
|
||||||
|
(bpp), ZPixmap, 0, malloc( (height)*width_bytes ), \
|
||||||
|
(width), (height), 32, width_bytes ); \
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* BITMAP_H */
|
#endif /* BITMAP_H */
|
||||||
|
|
|
@ -5,10 +5,13 @@
|
||||||
|
|
||||||
extern HPALETTE COLOR_Init(void);
|
extern HPALETTE COLOR_Init(void);
|
||||||
extern int COLOR_ToPhysical( DC *dc, COLORREF color );
|
extern int COLOR_ToPhysical( DC *dc, COLORREF color );
|
||||||
extern void COLOR_SetMapping( DC *dc, HANDLE, WORD );
|
extern void COLOR_SetMapping( DC *dc, HANDLE map, HANDLE revMap, WORD size );
|
||||||
extern BOOL COLOR_IsSolid( COLORREF color );
|
extern BOOL COLOR_IsSolid( COLORREF color );
|
||||||
|
|
||||||
extern Colormap COLOR_WinColormap;
|
extern Colormap COLOR_WinColormap;
|
||||||
extern int COLOR_mapEGAPixel[16];
|
extern int COLOR_mapEGAPixel[16];
|
||||||
|
extern int* COLOR_PaletteToPixel;
|
||||||
|
extern int* COLOR_PixelToPalette;
|
||||||
|
extern int COLOR_ColormapSize;
|
||||||
|
|
||||||
#endif /* __WINE_COLOR_H */
|
#endif /* __WINE_COLOR_H */
|
||||||
|
|
|
@ -203,7 +203,8 @@ typedef struct
|
||||||
/* X physical palette information */
|
/* X physical palette information */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
HANDLE hMapping;
|
HANDLE hMapping; /* Color mapping table (or 0 for identity) */
|
||||||
|
HANDLE hRevMapping; /* Reverse color mapping table */
|
||||||
WORD mappingSize;
|
WORD mappingSize;
|
||||||
} X_PHYSPALETTE;
|
} X_PHYSPALETTE;
|
||||||
|
|
||||||
|
|
|
@ -57,10 +57,6 @@ extern void SpyInit(void);
|
||||||
|
|
||||||
extern BOOL WIDGETS_Init(void);
|
extern BOOL WIDGETS_Init(void);
|
||||||
|
|
||||||
/* objects/dib.c */
|
|
||||||
|
|
||||||
extern int DIB_BitmapInfoSize(BITMAPINFO *info, WORD coloruse);
|
|
||||||
|
|
||||||
/* objects/palette.c */
|
/* objects/palette.c */
|
||||||
|
|
||||||
extern BOOL PALETTE_Init(void);
|
extern BOOL PALETTE_Init(void);
|
||||||
|
|
|
@ -19,7 +19,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -9,7 +9,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -29,7 +29,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
14
misc/main.c
14
misc/main.c
|
@ -31,12 +31,14 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994";
|
||||||
|
|
||||||
extern ButtonTexts ButtonText;
|
extern ButtonTexts ButtonText;
|
||||||
|
|
||||||
static char people[] = "People who have generously donated time to the Wine " \
|
static const char people[] = "Wine is available thanks to the work of "\
|
||||||
"project include Bob Amstadt, Martin Ayotte, Erik Bos, John Brezak, "\
|
"Bob Amstadt, Dag Asheim, Martin Ayotte, Erik Bos, John Brezak, "\
|
||||||
"Andrew Bulhak, John Burton, Peter Galbavy, Jeffery Hsu, Miguel de Icaza, " \
|
"Andrew Bulhak, John Burton, Paul Falstad, Peter Galbavy, Jeffrey Hsu, "\
|
||||||
"Alexandre Julliard, Scott A. Laird, Peter MacDonald, David Metcalfe, " \
|
"Miguel de Icaza, Alexandre Julliard, Jon Konrath, Scott A. Laird, "\
|
||||||
"John Richardson, Johannes Ruscheinski, Yngvi Sigurjonsson, Linus Torvalds, " \
|
"Martin von Loewis, Kenneth MacDonald, Peter MacDonald, David Metcalfe, "\
|
||||||
"Carl Williams, Karl Guenter Wuensch, and Eric Youngdale. ";
|
"Michael Patra, John Richardson, Johannes Ruscheinski, Yngvi Sigurjonsson, "\
|
||||||
|
"Rick Sladkey, William Smith, Jon Tombs, Linus Torvalds, Carl Williams, "\
|
||||||
|
"Karl Guenter Wuensch, and Eric Youngdale.";
|
||||||
|
|
||||||
#define WINE_CLASS "Wine" /* Class name for resources */
|
#define WINE_CLASS "Wine" /* Class name for resources */
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -12,7 +12,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -24,7 +24,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
896
objects/bitblt.c
896
objects/bitblt.c
|
@ -1,10 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* GDI bit-blit operations
|
* GDI bit-blit operations
|
||||||
*
|
*
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993, 1994 Alexandre Julliard
|
||||||
*
|
*/
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
@ -14,13 +13,503 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "metafile.h"
|
#include "metafile.h"
|
||||||
|
#include "bitmap.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "stddebug.h"
|
#include "stddebug.h"
|
||||||
/* #define DEBUG_GDI */
|
/* #define DEBUG_GDI */
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
|
||||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
#define TMP 0 /* Temporary drawable */
|
||||||
|
#define DST 1 /* Destination drawable */
|
||||||
|
#define SRC 2 /* Source drawable */
|
||||||
|
#define PAT 3 /* Pattern (brush) in destination DC */
|
||||||
|
|
||||||
|
/* Build the ROP arguments */
|
||||||
|
#define OP_ARGS(src,dst) (((src) << 2) | (dst))
|
||||||
|
|
||||||
|
/* Build the ROP code */
|
||||||
|
#define OP(src,dst,rop) (OP_ARGS(src,dst) << 4 | (rop))
|
||||||
|
|
||||||
|
#define MAX_OP_LEN 6
|
||||||
|
|
||||||
|
static const unsigned char BITBLT_Opcodes[256][MAX_OP_LEN] =
|
||||||
|
{
|
||||||
|
{ OP(PAT,DST,GXclear) }, /* 0x00 0 */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXnor) }, /* 0x01 ~(D|(P|S)) */
|
||||||
|
{ OP(PAT,SRC,GXnor), OP(SRC,DST,GXand) }, /* 0x02 D&~(P|S) */
|
||||||
|
{ OP(PAT,SRC,GXnor) }, /* 0x03 ~(P|S) */
|
||||||
|
{ OP(PAT,DST,GXnor), OP(SRC,DST,GXand) }, /* 0x04 S&~(D|P) */
|
||||||
|
{ OP(PAT,DST,GXnor) }, /* 0x05 ~(D|P) */
|
||||||
|
{ OP(SRC,DST,GXequiv), OP(PAT,DST,GXnor), }, /* 0x06 ~(P|~(D^S)) */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXnor) }, /* 0x07 ~(P|(D&S)) */
|
||||||
|
{ OP(PAT,DST,GXandInverted), OP(SRC,DST,GXand) },/* 0x08 S&D&~P */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXnor) }, /* 0x09 ~(P|(D^S)) */
|
||||||
|
{ OP(PAT,DST,GXandInverted) }, /* 0x0a D&~P */
|
||||||
|
{ OP(SRC,DST,GXandReverse), OP(PAT,DST,GXnor) }, /* 0x0b ~(P|(S&~D)) */
|
||||||
|
{ OP(PAT,SRC,GXandInverted) }, /* 0x0c S&~P */
|
||||||
|
{ OP(SRC,DST,GXandInverted), OP(PAT,DST,GXnor) },/* 0x0d ~(P|(D&~S)) */
|
||||||
|
{ OP(SRC,DST,GXnor), OP(PAT,DST,GXnor) }, /* 0x0e ~(P|~(D|S)) */
|
||||||
|
{ OP(PAT,DST,GXcopyInverted) }, /* 0x0f ~P */
|
||||||
|
{ OP(SRC,DST,GXnor), OP(PAT,DST,GXand) }, /* 0x10 P&~(S|D) */
|
||||||
|
{ OP(SRC,DST,GXnor) }, /* 0x11 ~(D|S) */
|
||||||
|
{ OP(PAT,DST,GXequiv), OP(SRC,DST,GXnor) }, /* 0x12 ~(S|~(D^P)) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXnor) }, /* 0x13 ~(S|(D&P)) */
|
||||||
|
{ OP(PAT,SRC,GXequiv), OP(SRC,DST,GXnor) }, /* 0x14 ~(D|~(P^S)) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXnor) }, /* 0x15 ~(D|(P&S)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXnand),
|
||||||
|
OP(TMP,DST,GXand), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x16 P^S^(D&~(P&S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,SRC,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x17 ~S^((S^P)&(S^D))*/
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXand) }, /* 0x18 (S^P)&(D^P) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXnand),
|
||||||
|
OP(TMP,DST,GXand), OP(SRC,DST,GXequiv) }, /* 0x19 ~S^(D&~(P&S)) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x1a P^(D|(S&P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXxor),
|
||||||
|
OP(TMP,DST,GXand), OP(SRC,DST,GXequiv) }, /* 0x1b ~S^(D&(P^S)) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x1c P^(S|(D&P)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXequiv) }, /* 0x1d ~D^(S&(D^P)) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXxor) }, /* 0x1e P^(D|S) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXnand) }, /* 0x1f ~(P&(D|S)) */
|
||||||
|
{ OP(PAT,SRC,GXandReverse), OP(SRC,DST,GXand) }, /* 0x20 D&(P&~S) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXnor) }, /* 0x21 ~(S|(D^P)) */
|
||||||
|
{ OP(SRC,DST,GXandInverted) }, /* 0x22 ~S&D */
|
||||||
|
{ OP(PAT,DST,GXandReverse), OP(SRC,DST,GXnor) }, /* 0x23 ~(S|(P&~D)) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXand) }, /* 0x24 (S^P)&(S^D) */
|
||||||
|
{ OP(PAT,SRC,GXnand), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x25 ~P^(D&~(S&P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXand),
|
||||||
|
OP(TMP,DST,GXor), OP(SRC,DST,GXxor) }, /* 0x26 S^(D|(S&P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXequiv),
|
||||||
|
OP(TMP,DST,GXor), OP(SRC,DST,GXxor) }, /* 0x27 S^(D|~(P^S)) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXand) }, /* 0x28 D&(P^S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,TMP,GXand),
|
||||||
|
OP(TMP,DST,GXor), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x29 ~P^S^(D|(P&S)) */
|
||||||
|
{ OP(PAT,SRC,GXnand), OP(SRC,DST,GXand) }, /* 0x2a D&~(P&S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXxor),
|
||||||
|
OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x2b ~S^((P^S)&(P^D))*/
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x2c S^(P&(S|D)) */
|
||||||
|
{ OP(SRC,DST,GXorReverse), OP(PAT,DST,GXxor) }, /* 0x2d P^(S|~D) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x2e P^(S|(D^P)) */
|
||||||
|
{ OP(SRC,DST,GXorReverse), OP(PAT,DST,GXnand) }, /* 0x2f ~(P&(S|~D)) */
|
||||||
|
{ OP(PAT,SRC,GXandReverse) }, /* 0x30 P&~S */
|
||||||
|
{ OP(PAT,DST,GXandInverted), OP(SRC,DST,GXnor) },/* 0x31 ~(S|(D&~P)) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x32 S^(D|P|S) */
|
||||||
|
{ OP(SRC,DST,GXcopyInverted) }, /* 0x33 ~S */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x34 S^(P|(D&S)) */
|
||||||
|
{ OP(SRC,DST,GXequiv), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x35 S^(P|~(D^S)) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXxor) }, /* 0x36 S^(D|P) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXnand) }, /* 0x37 ~(S&(D|P)) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x38 P^(S&(D|P)) */
|
||||||
|
{ OP(PAT,DST,GXorReverse), OP(SRC,DST,GXxor) }, /* 0x39 S^(P|~D) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x3a S^(P|(D^S)) */
|
||||||
|
{ OP(PAT,DST,GXorReverse), OP(SRC,DST,GXnand) }, /* 0x3b ~(S&(P|~D)) */
|
||||||
|
{ OP(PAT,SRC,GXxor) }, /* 0x3c P^S */
|
||||||
|
{ OP(SRC,DST,GXnor), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x3d S^(P|~(D|S)) */
|
||||||
|
{ OP(SRC,DST,GXandInverted), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x3e S^(P|(D&~S)) */
|
||||||
|
{ OP(PAT,SRC,GXnand) }, /* 0x3f ~(P&S) */
|
||||||
|
{ OP(SRC,DST,GXandReverse), OP(PAT,DST,GXand) }, /* 0x40 P&S&~D */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXnor) }, /* 0x41 ~(D|(P^S)) */
|
||||||
|
{ OP(DST,SRC,GXxor), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXand) }, /* 0x42 (S^D)&(P^D) */
|
||||||
|
{ OP(SRC,DST,GXnand), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0x43 ~S^(P&~(D&S)) */
|
||||||
|
{ OP(SRC,DST,GXandReverse) }, /* 0x44 S&~D */
|
||||||
|
{ OP(PAT,SRC,GXandReverse), OP(SRC,DST,GXnor) }, /* 0x45 ~(D|(P&~S)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor) }, /* 0x46 D^(S|(P&D)) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x47 ~P^(S&(D^P)) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXand) }, /* 0x48 S&(P^D) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x49 ~P^D^(S|(P&D)) */
|
||||||
|
{ OP(DST,SRC,GXor), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x4a D^(P&(S|D)) */
|
||||||
|
{ OP(SRC,DST,GXorInverted), OP(PAT,DST,GXxor) }, /* 0x4b P^(D|~S) */
|
||||||
|
{ OP(PAT,DST,GXnand), OP(SRC,DST,GXand) }, /* 0x4c S&~(D&P) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,SRC,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x4d ~S^((S^P)|(S^D))*/
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x4e P^(D|(S^P)) */
|
||||||
|
{ OP(SRC,DST,GXorInverted), OP(PAT,DST,GXnand) },/* 0x4f ~(P&(D|~S)) */
|
||||||
|
{ OP(PAT,DST,GXandReverse) }, /* 0x50 P&~D */
|
||||||
|
{ OP(PAT,SRC,GXandInverted), OP(SRC,DST,GXnor) },/* 0x51 ~(D|(S&~P)) */
|
||||||
|
{ OP(DST,SRC,GXand), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x52 D^(P|(S&D)) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0x53 ~S^(P&(D^S)) */
|
||||||
|
{ OP(PAT,SRC,GXnor), OP(SRC,DST,GXnor) }, /* 0x54 ~(D|~(P|S)) */
|
||||||
|
{ OP(PAT,DST,GXinvert) }, /* 0x55 ~D */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXxor) }, /* 0x56 D^(P|S) */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXnand) }, /* 0x57 ~(D&(P|S)) */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0x58 P^(D&(P|S)) */
|
||||||
|
{ OP(PAT,SRC,GXorReverse), OP(SRC,DST,GXxor) }, /* 0x59 D^(P|~S) */
|
||||||
|
{ OP(PAT,DST,GXxor) }, /* 0x5a D^P */
|
||||||
|
{ OP(DST,SRC,GXnor), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x5b D^(P|~(S|D)) */
|
||||||
|
{ OP(DST,SRC,GXxor), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x5c D^(P|(S^D)) */
|
||||||
|
{ OP(PAT,SRC,GXorReverse), OP(SRC,DST,GXnand) }, /* 0x5d ~(D&(P|~S)) */
|
||||||
|
{ OP(DST,SRC,GXandInverted), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x5e D^(P|(S&~D)) */
|
||||||
|
{ OP(PAT,DST,GXnand) }, /* 0x5f ~(D&P) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXand) }, /* 0x60 P&(D^S) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXor), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x61 ~D^S^(P|(D&S)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0x62 D^(S&(P|D)) */
|
||||||
|
{ OP(PAT,DST,GXorInverted), OP(SRC,DST,GXxor) }, /* 0x63 S^(D|~P) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0x64 S^(D&(P|S)) */
|
||||||
|
{ OP(PAT,SRC,GXorInverted), OP(SRC,DST,GXxor) }, /* 0x65 D^(S|~P) */
|
||||||
|
{ OP(SRC,DST,GXxor) }, /* 0x66 S^D */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXnor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor) }, /* 0x67 S^(D|~(S|P) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXnor),
|
||||||
|
OP(PAT,DST,GXor), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x68 ~D^S^(P|~(D|S))*/
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXequiv) }, /* 0x69 ~P^(D^S) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXxor) }, /* 0x6a D^(P&S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x6b ~P^S^(D&(P|S)) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXxor) }, /* 0x6c S^(D&P) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x6d ~P^D^(S&(P|D)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXorReverse),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0x6e S^(D&(P|~S)) */
|
||||||
|
{ OP(SRC,DST,GXequiv), OP(PAT,DST,GXnand) }, /* 0x6f ~(P&~(S^D)) */
|
||||||
|
{ OP(SRC,DST,GXnand), OP(PAT,DST,GXand) }, /* 0x70 P&~(D&S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(DST,SRC,GXxor),
|
||||||
|
OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x71 ~S^((S^D)&(P^D))*/
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor) }, /* 0x72 S^(D|(P^S)) */
|
||||||
|
{ OP(PAT,DST,GXorInverted), OP(SRC,DST,GXnand) },/* 0x73 ~(S&(D|~P)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor) }, /* 0x74 D^(S|(P^D)) */
|
||||||
|
{ OP(PAT,SRC,GXorInverted), OP(SRC,DST,GXnand) },/* 0x75 ~(D&(S|~P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXandReverse),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXxor) }, /* 0x76 S^(D|(P&~S)) */
|
||||||
|
{ OP(SRC,DST,GXnand) }, /* 0x77 ~(S&D) */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXxor) }, /* 0x78 P^(D&S) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXand), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0x79 ~D^S^(P&(D|S)) */
|
||||||
|
{ OP(DST,SRC,GXorInverted), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x7a D^(P&(S|~D)) */
|
||||||
|
{ OP(PAT,DST,GXequiv), OP(SRC,DST,GXnand) }, /* 0x7b ~(S&~(D^P)) */
|
||||||
|
{ OP(SRC,DST,GXorInverted), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0x7c S^(P&(D|~S)) */
|
||||||
|
{ OP(PAT,SRC,GXequiv), OP(SRC,DST,GXnand) }, /* 0x7d ~(D&~(P^S)) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXor) }, /* 0x7e (S^P)|(S^D) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXnand) }, /* 0x7f ~(D&P&S) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXand) }, /* 0x80 D&P&S */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXnor) }, /* 0x81 ~((S^P)|(S^D)) */
|
||||||
|
{ OP(PAT,SRC,GXequiv), OP(SRC,DST,GXand) }, /* 0x82 D&~(P^S) */
|
||||||
|
{ OP(SRC,DST,GXorInverted), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0x83 ~S^(P&(D|~S)) */
|
||||||
|
{ OP(PAT,DST,GXequiv), OP(SRC,DST,GXand) }, /* 0x84 S&~(D^P) */
|
||||||
|
{ OP(PAT,SRC,GXorInverted), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0x85 ~P^(D&(S|~P)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXand), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x86 D^S^(P&(D|S)) */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXequiv) }, /* 0x87 ~P^(D&S) */
|
||||||
|
{ OP(SRC,DST,GXand) }, /* 0x88 S&D */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXandReverse),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0x89 ~S^(D|(P&~S)) */
|
||||||
|
{ OP(PAT,SRC,GXorInverted), OP(SRC,DST,GXand) }, /* 0x8a D&(S|~P) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0x8b ~D^(S|(P^D)) */
|
||||||
|
{ OP(PAT,DST,GXorInverted), OP(SRC,DST,GXand) }, /* 0x8c S&(D|~P) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0x8d ~S^(D|(P^S)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(DST,SRC,GXxor),
|
||||||
|
OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x8e S^((S^D)&(P^D))*/
|
||||||
|
{ OP(SRC,DST,GXnand), OP(PAT,DST,GXnand) }, /* 0x8f ~(P&~(D&S)) */
|
||||||
|
{ OP(SRC,DST,GXequiv), OP(PAT,DST,GXand) }, /* 0x90 P&~(D^S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXorReverse),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXequiv) }, /* 0x91 ~S^(D&(P|~S)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(PAT,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x92 D^P^(S&(D|P)) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXequiv) }, /* 0x93 ~S^(P&D) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(PAT,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x94 S^P^(D&(P|S)) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXequiv) }, /* 0x95 ~D^(P&S) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXxor) }, /* 0x96 D^P^S */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXnor),
|
||||||
|
OP(SRC,DST,GXor), OP(PAT,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x97 S^P^(D|~(P|S)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXnor),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0x98 ~S^(D|~(P|S)) */
|
||||||
|
{ OP(SRC,DST,GXequiv) }, /* 0x99 ~S^D */
|
||||||
|
{ OP(PAT,SRC,GXandReverse), OP(SRC,DST,GXxor) }, /* 0x9a D^(P&~S) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXequiv) }, /* 0x9b ~S^(D&(P|S)) */
|
||||||
|
{ OP(PAT,DST,GXandReverse), OP(SRC,DST,GXxor) }, /* 0x9c S^(P&~D) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXequiv) }, /* 0x9d ~D^(S&(P|D)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXor), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0x9e D^S^(P|(D&S)) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXnand) }, /* 0x9f ~(P&(D^S)) */
|
||||||
|
{ OP(PAT,DST,GXand) }, /* 0xa0 D&P */
|
||||||
|
{ OP(PAT,SRC,GXandInverted), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xa1 ~P^(D|(S&~P)) */
|
||||||
|
{ OP(PAT,SRC,GXorReverse), OP(SRC,DST,GXand) }, /* 0xa2 D&(P|~S) */
|
||||||
|
{ OP(DST,SRC,GXxor), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xa3 ~D^(P|(S^D)) */
|
||||||
|
{ OP(PAT,SRC,GXnor), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xa4 ~P^(D|~(S|P)) */
|
||||||
|
{ OP(PAT,DST,GXequiv) }, /* 0xa5 ~P^D */
|
||||||
|
{ OP(PAT,SRC,GXandInverted), OP(SRC,DST,GXxor) },/* 0xa6 D^(S&~P) */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xa7 ~P^(D&(S|P)) */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXand) }, /* 0xa8 D&(P|S) */
|
||||||
|
{ OP(PAT,SRC,GXor), OP(SRC,DST,GXequiv) }, /* 0xa9 ~D^(P|S) */
|
||||||
|
{ OP(SRC,DST,GXnoop) }, /* 0xaa D */
|
||||||
|
{ OP(PAT,SRC,GXnor), OP(SRC,DST,GXor) }, /* 0xab D|~(P|S) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0xac S^(P&(D^S)) */
|
||||||
|
{ OP(DST,SRC,GXand), OP(PAT,SRC,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xad ~D^(P|(S&D)) */
|
||||||
|
{ OP(PAT,SRC,GXandInverted), OP(SRC,DST,GXor) }, /* 0xae D|(S&~P) */
|
||||||
|
{ OP(PAT,DST,GXorInverted) }, /* 0xaf D|~P */
|
||||||
|
{ OP(SRC,DST,GXorInverted), OP(PAT,DST,GXand) }, /* 0xb0 P&(D|~S) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xb1 ~P^(D|(S^P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,SRC,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0xb2 S^((S^P)|(S^D))*/
|
||||||
|
{ OP(PAT,DST,GXnand), OP(SRC,DST,GXnand) }, /* 0xb3 ~(S&~(D&P)) */
|
||||||
|
{ OP(SRC,DST,GXandReverse), OP(PAT,DST,GXxor) }, /* 0xb4 P^(S&~D) */
|
||||||
|
{ OP(DST,SRC,GXor), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xb5 ~D^(P&(S|D)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(PAT,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0xb6 D^P^(S|(D&P)) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXnand) }, /* 0xb7 ~(S&(D^P)) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0xb8 P^(S&(D^P)) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0xb9 ~D^(S|(P&D)) */
|
||||||
|
{ OP(PAT,SRC,GXandReverse), OP(SRC,DST,GXor) }, /* 0xba D|(P&~S) */
|
||||||
|
{ OP(SRC,DST,GXorInverted) }, /* 0xbb ~S|D */
|
||||||
|
{ OP(SRC,DST,GXnand), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0xbc S^(P&~(D&S)) */
|
||||||
|
{ OP(DST,SRC,GXxor), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXnand) }, /* 0xbd ~((S^D)&(P^D)) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXor) }, /* 0xbe D|(P^S) */
|
||||||
|
{ OP(PAT,SRC,GXnand), OP(SRC,DST,GXor) }, /* 0xbf D|~(P&S) */
|
||||||
|
{ OP(PAT,SRC,GXand) }, /* 0xc0 P&S */
|
||||||
|
{ OP(SRC,DST,GXandInverted), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xc1 ~S^(P|(D&~S)) */
|
||||||
|
{ OP(SRC,DST,GXnor), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xc2 ~S^(P|~(D|S)) */
|
||||||
|
{ OP(PAT,SRC,GXequiv) }, /* 0xc3 ~P^S */
|
||||||
|
{ OP(PAT,DST,GXorReverse), OP(SRC,DST,GXand) }, /* 0xc4 S&(P|~D) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xc5 ~S^(P|(D^S)) */
|
||||||
|
{ OP(PAT,DST,GXandInverted), OP(SRC,DST,GXxor) },/* 0xc6 S^(D&~P) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xc7 ~P^(S&(D|P)) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXand) }, /* 0xc8 S&(D|P) */
|
||||||
|
{ OP(PAT,DST,GXor), OP(SRC,DST,GXequiv) }, /* 0xc9 ~S^(P|D) */
|
||||||
|
{ OP(DST,SRC,GXxor), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0xca D^(P&(S^D)) */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXor),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xcb ~S^(P|(D&S)) */
|
||||||
|
{ OP(SRC,DST,GXcopy) }, /* 0xcc S */
|
||||||
|
{ OP(PAT,DST,GXnor), OP(SRC,DST,GXor) }, /* 0xcd S|~(D|P) */
|
||||||
|
{ OP(PAT,DST,GXandInverted), OP(SRC,DST,GXor) }, /* 0xce S|(D&~P) */
|
||||||
|
{ OP(PAT,SRC,GXorInverted) }, /* 0xcf S|~P */
|
||||||
|
{ OP(SRC,DST,GXorReverse), OP(PAT,DST,GXand) }, /* 0xd0 P&(S|~D) */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xd1 ~P^(S|(D^P)) */
|
||||||
|
{ OP(SRC,DST,GXandInverted), OP(PAT,DST,GXxor) },/* 0xd2 P^(D&~S) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXand),
|
||||||
|
OP(SRC,DST,GXequiv) }, /* 0xd3 ~S^(P&(D|S)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXxor),
|
||||||
|
OP(PAT,DST,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0xd4 S^((S^P)&(D^P))*/
|
||||||
|
{ OP(PAT,SRC,GXnand), OP(SRC,DST,GXnand) }, /* 0xd5 ~(D&~(P&S)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(PAT,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0xd6 S^P^(D|(P&S)) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXnand) }, /* 0xd7 ~(D&(P^S)) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(PAT,DST,GXxor) }, /* 0xd8 P^(D&(S^P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXor), OP(TMP,DST,GXequiv) }, /* 0xd9 ~S^(D|(P&S)) */
|
||||||
|
{ OP(DST,SRC,GXnand), OP(PAT,SRC,GXand),
|
||||||
|
OP(SRC,DST,GXxor) }, /* 0xda D^(P&~(S&D)) */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXnand) }, /* 0xdb ~((S^P)&(S^D)) */
|
||||||
|
{ OP(PAT,DST,GXandReverse), OP(SRC,DST,GXor) }, /* 0xdc S|(P&~D) */
|
||||||
|
{ OP(SRC,DST,GXorReverse) }, /* 0xdd S|~D */
|
||||||
|
{ OP(PAT,DST,GXxor), OP(SRC,DST,GXor) }, /* 0xde S|(D^P) */
|
||||||
|
{ OP(PAT,DST,GXnand), OP(SRC,DST,GXor) }, /* 0xdf S|~(D&P) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXand) }, /* 0xe0 P&(D|S) */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXequiv) }, /* 0xe1 ~P^(D|S) */
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0xe2 D^(S&(P^D)) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xe3 ~P^(S|(D&P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXxor),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0xe4 S^(D&(P^S)) */
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXor),
|
||||||
|
OP(PAT,DST,GXequiv) }, /* 0xe5 ~P^(D|(S&P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(PAT,SRC,GXnand),
|
||||||
|
OP(SRC,DST,GXand), OP(TMP,DST,GXxor) }, /* 0xe6 S^(D&~(P&S)) */
|
||||||
|
{ OP(PAT,SRC,GXxor), OP(PAT,DST,GXxor),
|
||||||
|
OP(SRC,DST,GXnand) }, /* 0xe7 ~((S^P)&(D^P)) */
|
||||||
|
{ OP(SRC,TMP,GXcopy), OP(SRC,DST,GXxor),
|
||||||
|
OP(PAT,SRC,GXxor), OP(SRC,DST,GXand),
|
||||||
|
OP(TMP,DST,GXxor) }, /* 0xe8 S^((S^P)&(S^D))*/
|
||||||
|
{ OP(DST,TMP,GXcopy), OP(SRC,DST,GXnand),
|
||||||
|
OP(PAT,DST,GXand), OP(SRC,DST,GXxor),
|
||||||
|
OP(TMP,DST,GXequiv) }, /* 0xe9 ~D^S^(P&~(S&D))*/
|
||||||
|
{ OP(PAT,SRC,GXand), OP(SRC,DST,GXor) }, /* 0xea D|(P&S) */
|
||||||
|
{ OP(PAT,SRC,GXequiv), OP(SRC,DST,GXor) }, /* 0xeb D|~(P^S) */
|
||||||
|
{ OP(PAT,DST,GXand), OP(SRC,DST,GXor) }, /* 0xec S|(D&P) */
|
||||||
|
{ OP(PAT,DST,GXequiv), OP(SRC,DST,GXor) }, /* 0xed S|~(D^P) */
|
||||||
|
{ OP(SRC,DST,GXor) }, /* 0xee S|D */
|
||||||
|
{ OP(PAT,DST,GXorInverted), OP(SRC,DST,GXor) }, /* 0xef S|D|~P */
|
||||||
|
{ OP(PAT,DST,GXcopy) }, /* 0xf0 P */
|
||||||
|
{ OP(SRC,DST,GXnor), OP(PAT,DST,GXor) }, /* 0xf1 P|~(D|S) */
|
||||||
|
{ OP(SRC,DST,GXandInverted), OP(PAT,DST,GXor) }, /* 0xf2 P|(D&~S) */
|
||||||
|
{ OP(PAT,SRC,GXorReverse) }, /* 0xf3 P|~S */
|
||||||
|
{ OP(SRC,DST,GXandReverse), OP(PAT,DST,GXor) }, /* 0xf4 P|(S&~D) */
|
||||||
|
{ OP(PAT,DST,GXorReverse) }, /* 0xf5 P|~D */
|
||||||
|
{ OP(SRC,DST,GXxor), OP(PAT,DST,GXor) }, /* 0xf6 P|(D^S) */
|
||||||
|
{ OP(SRC,DST,GXnand), OP(PAT,DST,GXor) }, /* 0xf7 P|~(S&D) */
|
||||||
|
{ OP(SRC,DST,GXand), OP(PAT,DST,GXor) }, /* 0xf8 P|(D&S) */
|
||||||
|
{ OP(SRC,DST,GXequiv), OP(PAT,DST,GXor) }, /* 0xf9 P|~(D^S) */
|
||||||
|
{ OP(PAT,DST,GXor) }, /* 0xfa D|P */
|
||||||
|
{ OP(PAT,SRC,GXorReverse), OP(SRC,DST,GXor) }, /* 0xfb D|P|~S */
|
||||||
|
{ OP(PAT,SRC,GXor) }, /* 0xfc P|S */
|
||||||
|
{ OP(SRC,DST,GXorReverse), OP(PAT,DST,GXor) }, /* 0xfd P|S|~D */
|
||||||
|
{ OP(SRC,DST,GXor), OP(PAT,DST,GXor) }, /* 0xfe P|D|S */
|
||||||
|
{ OP(PAT,DST,GXset) } /* 0xff 1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BITBLT_TEST /* Opcodes test */
|
||||||
|
|
||||||
|
static int do_bitop( int s, int d, int rop )
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
switch(rop)
|
||||||
|
{
|
||||||
|
case GXclear: res = 0; break;
|
||||||
|
case GXand: res = s & d; break;
|
||||||
|
case GXandReverse: res = s & ~d; break;
|
||||||
|
case GXcopy: res = s; break;
|
||||||
|
case GXandInverted: res = ~s & d; break;
|
||||||
|
case GXnoop: res = d; break;
|
||||||
|
case GXxor: res = s ^ d; break;
|
||||||
|
case GXor: res = s | d; break;
|
||||||
|
case GXnor: res = ~(s | d); break;
|
||||||
|
case GXequiv: res = ~s ^ d; break;
|
||||||
|
case GXinvert: res = ~d; break;
|
||||||
|
case GXorReverse: res = s | ~d; break;
|
||||||
|
case GXcopyInverted: res = ~s; break;
|
||||||
|
case GXorInverted: res = ~s | d; break;
|
||||||
|
case GXnand: res = ~(s & d); break;
|
||||||
|
case GXset: res = 1; break;
|
||||||
|
}
|
||||||
|
return res & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
int rop, i, res, src, dst, pat, tmp, dstUsed;
|
||||||
|
const BYTE *opcode;
|
||||||
|
|
||||||
|
for (rop = 0; rop < 256; rop++)
|
||||||
|
{
|
||||||
|
res = dstUsed = 0;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
pat = (i >> 2) & 1;
|
||||||
|
src = (i >> 1) & 1;
|
||||||
|
dst = i & 1;
|
||||||
|
for (opcode = BITBLT_Opcodes[rop]; *opcode; opcode++)
|
||||||
|
{
|
||||||
|
switch(*opcode >> 4)
|
||||||
|
{
|
||||||
|
case OP_ARGS(DST,TMP):
|
||||||
|
tmp = do_bitop( dst, tmp, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
case OP_ARGS(DST,SRC):
|
||||||
|
src = do_bitop( dst, src, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
case OP_ARGS(SRC,TMP):
|
||||||
|
tmp = do_bitop( src, tmp, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
case OP_ARGS(SRC,DST):
|
||||||
|
dst = do_bitop( src, dst, *opcode & 0xf );
|
||||||
|
dstUsed = 1;
|
||||||
|
break;
|
||||||
|
case OP_ARGS(PAT,TMP):
|
||||||
|
tmp = do_bitop( pat, tmp, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
case OP_ARGS(PAT,DST):
|
||||||
|
dst = do_bitop( pat, dst, *opcode & 0xf );
|
||||||
|
dstUsed = 1;
|
||||||
|
break;
|
||||||
|
case OP_ARGS(PAT,SRC):
|
||||||
|
src = do_bitop( pat, src, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
case OP_ARGS(TMP,DST):
|
||||||
|
dst = do_bitop( tmp, dst, *opcode & 0xf );
|
||||||
|
dstUsed = 1;
|
||||||
|
break;
|
||||||
|
case OP_ARGS(TMP,SRC):
|
||||||
|
src = do_bitop( tmp, src, *opcode & 0xf );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf( "Invalid opcode %x\n", *opcode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dstUsed) dst = src;
|
||||||
|
if (dst) res |= 1 << i;
|
||||||
|
}
|
||||||
|
if (res != rop) printf( "%02x: ERROR, res=%02x\n", rop, res );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BITBLT_TEST */
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* BITBLT_GetImage
|
* BITBLT_GetImage
|
||||||
|
@ -28,41 +517,191 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
static XImage *BITBLT_GetImage( HDC hdc, int x, int y, int width, int height )
|
static XImage *BITBLT_GetImage( HDC hdc, int x, int y, int width, int height )
|
||||||
{
|
{
|
||||||
XImage *image;
|
XImage *image;
|
||||||
RECT rect;
|
RECT rect, tmpRect, clipRect;
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
|
||||||
GetClipBox( hdc, &rect );
|
GetClipBox( hdc, &clipRect );
|
||||||
OffsetRect( &rect, dc->w.DCOrgX, dc->w.DCOrgY );
|
OffsetRect( &clipRect, dc->w.DCOrgX, dc->w.DCOrgY );
|
||||||
if ((x >= rect.left) && (y >= rect.top)
|
SetRect( &tmpRect, x, y, x+width, y+height );
|
||||||
&& (x+width < rect.right) && (y+height < rect.bottom))
|
IntersectRect( &rect, &tmpRect, &clipRect );
|
||||||
|
if (EqualRect(&rect,&tmpRect))
|
||||||
{
|
{
|
||||||
image = XGetImage( display, dc->u.x.drawable, x, y, width, height,
|
image = XGetImage( display, dc->u.x.drawable, x, y, width, height,
|
||||||
AllPlanes, ZPixmap );
|
AllPlanes, ZPixmap );
|
||||||
}
|
}
|
||||||
else /* Get only the visible sub-image */
|
else /* Get only the visible sub-image */
|
||||||
{
|
{
|
||||||
int width_bytes = ((dc->w.bitsPerPixel == 24 ? 32 : dc->w.bitsPerPixel)
|
XCREATEIMAGE( image, width, height, dc->w.bitsPerPixel );
|
||||||
* width + 31) / 32 * 4;
|
|
||||||
char *data = malloc( height * width_bytes );
|
|
||||||
image = XCreateImage( display, DefaultVisualOfScreen(screen),
|
|
||||||
dc->w.bitsPerPixel, ZPixmap, 0, data,
|
|
||||||
width, height, 32, width_bytes );
|
|
||||||
if (image && !IsRectEmpty(&rect))
|
if (image && !IsRectEmpty(&rect))
|
||||||
{
|
{
|
||||||
int x1, y1, x2, y2;
|
XGetSubImage( display, dc->u.x.drawable, rect.left, rect.top,
|
||||||
x1 = max( x, rect.left );
|
rect.right-rect.left, rect.bottom-rect.top,
|
||||||
y1 = max( y, rect.top );
|
AllPlanes, ZPixmap, image, rect.left-x, rect.top-y );
|
||||||
x2 = min( x + width, rect.right );
|
|
||||||
y2 = min( y + height, rect.bottom );
|
|
||||||
if ((x1 < x2) && (y1 < y2))
|
|
||||||
XGetSubImage( display, dc->u.x.drawable, x1, y1, x2-x1, y2-y1,
|
|
||||||
AllPlanes, ZPixmap, image, x1-x, y1-y );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* BITBLT_GetArea
|
||||||
|
*
|
||||||
|
* Retrieve an area of the source DC. If necessary, the area is
|
||||||
|
* mapped to colormap-independent colors.
|
||||||
|
*/
|
||||||
|
static void BITBLT_GetArea( HDC hdcSrc, HDC hdcDst, Pixmap pixmap, GC gc,
|
||||||
|
int x, int y, int width, int height )
|
||||||
|
{
|
||||||
|
XImage *srcImage, *dstImage;
|
||||||
|
DC * dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
||||||
|
DC * dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC );
|
||||||
|
|
||||||
|
if ((dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel) &&
|
||||||
|
(!COLOR_PixelToPalette || (dcDst->w.bitsPerPixel == 1)))
|
||||||
|
{
|
||||||
|
XCopyArea( display, dcSrc->u.x.drawable, pixmap, gc,
|
||||||
|
x, y, width, height, 0, 0 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((dcSrc->w.bitsPerPixel == 1) && (dcDst->w.bitsPerPixel != 1))
|
||||||
|
{
|
||||||
|
XSetBackground( display, gc, COLOR_PixelToPalette ?
|
||||||
|
COLOR_PixelToPalette[dcDst->w.textPixel] :
|
||||||
|
dcDst->w.textPixel );
|
||||||
|
XSetForeground( display, gc, COLOR_PixelToPalette ?
|
||||||
|
COLOR_PixelToPalette[dcDst->w.backgroundPixel] :
|
||||||
|
dcDst->w.backgroundPixel );
|
||||||
|
XCopyPlane( display, dcSrc->u.x.drawable, pixmap, gc,
|
||||||
|
x, y, width, height, 0, 0, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
srcImage = BITBLT_GetImage( hdcSrc, x, y, width, height );
|
||||||
|
if (dcSrc->w.bitsPerPixel != dcDst->w.bitsPerPixel)
|
||||||
|
{
|
||||||
|
XCREATEIMAGE( dstImage, width, height, dcDst->w.bitsPerPixel );
|
||||||
|
for (y = 0; y < height; y++)
|
||||||
|
for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
XPutPixel( dstImage, x, y, (XGetPixel( srcImage, x, y ) ==
|
||||||
|
dcSrc->w.backgroundPixel) );
|
||||||
|
}
|
||||||
|
XDestroyImage( srcImage );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (y = 0; y < height; y++)
|
||||||
|
for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
XPutPixel( srcImage, x, y,
|
||||||
|
COLOR_PixelToPalette[XGetPixel( srcImage, x, y)] );
|
||||||
|
}
|
||||||
|
dstImage = srcImage;
|
||||||
|
}
|
||||||
|
XPutImage( display, pixmap, gc, dstImage, 0, 0, 0, 0, width, height );
|
||||||
|
XDestroyImage( dstImage );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* BITBLT_PutArea
|
||||||
|
*
|
||||||
|
* Put an area back into an hdc, possibly applying a mapping
|
||||||
|
* to every pixel in the process.
|
||||||
|
*/
|
||||||
|
static void BITBLT_PutArea( HDC hdc, Pixmap pixmap, GC gc,
|
||||||
|
int x, int y, int width, int height )
|
||||||
|
{
|
||||||
|
XImage *image;
|
||||||
|
int x1, y1;
|
||||||
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
|
||||||
|
if (!COLOR_PaletteToPixel)
|
||||||
|
{
|
||||||
|
XCopyArea( display, pixmap, dc->u.x.drawable, gc,
|
||||||
|
0, 0, width, height, x, y );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image = XGetImage( display, pixmap, 0, 0, width, height,
|
||||||
|
AllPlanes, ZPixmap );
|
||||||
|
for (y1 = 0; y1 < height; y1++)
|
||||||
|
for (x1 = 0; x1 < width; x1++)
|
||||||
|
{
|
||||||
|
XPutPixel( image, x1, y1,
|
||||||
|
COLOR_PaletteToPixel[XGetPixel( image, x1, y1)] );
|
||||||
|
}
|
||||||
|
XPutImage( display, dc->u.x.drawable, gc, image,
|
||||||
|
0, 0, x, y, width, height );
|
||||||
|
XDestroyImage( image );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* BITBLT_SelectBrush
|
||||||
|
*
|
||||||
|
* Select the brush into a GC.
|
||||||
|
*/
|
||||||
|
static BOOL BITBLT_SelectBrush( DC * dc, GC gc )
|
||||||
|
{
|
||||||
|
XGCValues val;
|
||||||
|
XImage *image;
|
||||||
|
Pixmap pixmap = 0;
|
||||||
|
int x, y, mask = 0;
|
||||||
|
|
||||||
|
if (dc->u.x.brush.style == BS_NULL) return FALSE;
|
||||||
|
if (dc->u.x.brush.pixel == -1)
|
||||||
|
{
|
||||||
|
val.foreground = dc->w.backgroundPixel;
|
||||||
|
val.background = dc->w.textPixel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val.foreground = dc->u.x.brush.pixel;
|
||||||
|
val.background = dc->w.backgroundPixel;
|
||||||
|
}
|
||||||
|
if (COLOR_PixelToPalette)
|
||||||
|
{
|
||||||
|
val.foreground = COLOR_PixelToPalette[val.foreground];
|
||||||
|
val.background = COLOR_PixelToPalette[val.background];
|
||||||
|
}
|
||||||
|
val.fill_style = dc->u.x.brush.fillStyle;
|
||||||
|
if ((val.fill_style==FillStippled) || (val.fill_style==FillOpaqueStippled))
|
||||||
|
{
|
||||||
|
if (dc->w.backgroundMode==OPAQUE) val.fill_style = FillOpaqueStippled;
|
||||||
|
val.stipple = dc->u.x.brush.pixmap;
|
||||||
|
mask = GCStipple;
|
||||||
|
}
|
||||||
|
else if (val.fill_style == FillTiled)
|
||||||
|
{
|
||||||
|
if (COLOR_PixelToPalette)
|
||||||
|
{
|
||||||
|
pixmap = XCreatePixmap( display, rootWindow, 8, 8, screenDepth );
|
||||||
|
image = XGetImage( display, dc->u.x.brush.pixmap, 0, 0, 8, 8,
|
||||||
|
AllPlanes, ZPixmap );
|
||||||
|
for (y = 0; y < 8; y++)
|
||||||
|
for (x = 0; x < 8; x++)
|
||||||
|
XPutPixel( image, x, y,
|
||||||
|
COLOR_PixelToPalette[XGetPixel( image, x, y)] );
|
||||||
|
XPutImage( display, pixmap, gc, image, 0, 0, 0, 0, 8, 8 );
|
||||||
|
XDestroyImage( image );
|
||||||
|
val.tile = pixmap;
|
||||||
|
}
|
||||||
|
else val.tile = dc->u.x.brush.pixmap;
|
||||||
|
mask = GCTile;
|
||||||
|
}
|
||||||
|
val.ts_x_origin = dc->w.DCOrgX + dc->w.brushOrgX;
|
||||||
|
val.ts_y_origin = dc->w.DCOrgY + dc->w.brushOrgY;
|
||||||
|
XChangeGC( display, gc,
|
||||||
|
GCForeground | GCBackground | GCFillStyle |
|
||||||
|
GCTileStipXOrigin | GCTileStipYOrigin | mask,
|
||||||
|
&val );
|
||||||
|
if (pixmap) XFreePixmap( display, pixmap );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* PatBlt (GDI.29)
|
* PatBlt (GDI.29)
|
||||||
*/
|
*/
|
||||||
|
@ -122,56 +761,189 @@ BOOL PatBlt( HDC hdc, short left, short top,
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* BitBlt (GDI.34)
|
* BitBlt (GDI.34)
|
||||||
*/
|
*/
|
||||||
BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height,
|
BOOL BitBlt( HDC hdcDst, short xDst, short yDst, short width, short height,
|
||||||
HDC hdcSrc, short xSrc, short ySrc, DWORD rop )
|
HDC hdcSrc, short xSrc, short ySrc, DWORD rop )
|
||||||
{
|
{
|
||||||
int xs1, xs2, ys1, ys2;
|
DC *dcDst, *dcSrc;
|
||||||
int xd1, xd2, yd1, yd2;
|
BOOL usePat, useSrc, useDst, destUsed;
|
||||||
DWORD saverop = rop;
|
RECT dstRect, tmpRect, clipRect;
|
||||||
DC *dcDest, *dcSrc;
|
const BYTE *opcode;
|
||||||
|
Pixmap srcPixmap = 0, dstPixmap = 0, tmpPixmap = 0;
|
||||||
|
GC tmpGC = 0;
|
||||||
|
|
||||||
|
usePat = (((rop >> 4) & 0x0f0000) != (rop & 0x0f0000));
|
||||||
|
useSrc = (((rop >> 2) & 0x330000) != (rop & 0x330000));
|
||||||
|
useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
|
||||||
|
|
||||||
dprintf_gdi(stddeb, "BitBlt: %04x %d,%d %dx%d %04x %d,%d %06lx\n",
|
dprintf_gdi(stddeb, "BitBlt: %04x %d,%d %dx%d %04x %d,%d %06lx\n",
|
||||||
hdcDest, xDest, yDest, width, height, hdcSrc, xSrc, ySrc, rop);
|
hdcDst, xDst, yDst, width, height, hdcSrc, xSrc, ySrc, rop);
|
||||||
|
|
||||||
if (width == 0 || height == 0) return FALSE;
|
if (!useSrc)
|
||||||
if ((rop & 0xcc0000) == ((rop & 0x330000) << 2))
|
return PatBlt( hdcDst, xDst, yDst, width, height, rop );
|
||||||
return PatBlt( hdcDest, xDest, yDest, width, height, rop );
|
|
||||||
|
dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC );
|
||||||
|
if (!dcDst)
|
||||||
|
{
|
||||||
|
dcDst = (DC *)GDI_GetObjPtr(hdcDst, METAFILE_DC_MAGIC);
|
||||||
|
if (!dcDst) return FALSE;
|
||||||
|
MF_BitBlt(dcDst, xDst, yDst, width, height,
|
||||||
|
hdcSrc, xSrc, ySrc, rop);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
||||||
|
if (!dcSrc) return FALSE;
|
||||||
|
|
||||||
|
if ((width * dcSrc->w.VportExtX / dcSrc->w.WndExtX !=
|
||||||
|
width * dcDst->w.VportExtX / dcDst->w.WndExtX) ||
|
||||||
|
(height * dcSrc->w.VportExtY / dcSrc->w.WndExtY !=
|
||||||
|
height * dcDst->w.VportExtY / dcDst->w.WndExtY))
|
||||||
|
return StretchBlt( hdcDst, xDst, yDst, width, height,
|
||||||
|
hdcSrc, xSrc, ySrc, width, height, rop );
|
||||||
|
|
||||||
|
xSrc = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc );
|
||||||
|
ySrc = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc );
|
||||||
|
xDst = dcDst->w.DCOrgX + XLPTODP( dcDst, xDst );
|
||||||
|
yDst = dcDst->w.DCOrgY + YLPTODP( dcDst, yDst );
|
||||||
|
width = width * dcDst->w.VportExtX / dcDst->w.WndExtX;
|
||||||
|
height = height * dcDst->w.VportExtY / dcDst->w.WndExtY;
|
||||||
|
|
||||||
|
tmpRect.left = min( xDst, xDst + width );
|
||||||
|
tmpRect.top = min( yDst, yDst + height );
|
||||||
|
tmpRect.right = max( xDst, xDst + width );
|
||||||
|
tmpRect.bottom = max( yDst, yDst + height );
|
||||||
|
|
||||||
|
GetClipBox( hdcDst, &clipRect );
|
||||||
|
OffsetRect( &clipRect, dcDst->w.DCOrgX, dcDst->w.DCOrgY );
|
||||||
|
if (!IntersectRect( &dstRect, &tmpRect, &clipRect )) return TRUE;
|
||||||
|
|
||||||
|
xSrc += dstRect.left - xDst;
|
||||||
|
ySrc += dstRect.top - yDst;
|
||||||
|
xDst = dstRect.left;
|
||||||
|
yDst = dstRect.top;
|
||||||
|
width = dstRect.right - dstRect.left;
|
||||||
|
height = dstRect.bottom - dstRect.top;
|
||||||
|
|
||||||
|
if (rop == SRCCOPY) /* Optimisation for SRCCOPY */
|
||||||
|
{
|
||||||
|
DC_SetupGCForText( dcDst );
|
||||||
|
if (dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel)
|
||||||
|
{
|
||||||
|
XCopyArea( display, dcSrc->u.x.drawable, dcDst->u.x.drawable,
|
||||||
|
dcDst->u.x.gc, xSrc, ySrc, width, height, xDst, yDst );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (dcSrc->w.bitsPerPixel == 1)
|
||||||
|
{
|
||||||
|
XCopyPlane( display, dcSrc->u.x.drawable,
|
||||||
|
dcDst->u.x.drawable, dcDst->u.x.gc,
|
||||||
|
xSrc, ySrc, width, height, xDst, yDst, 1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rop >>= 16;
|
rop >>= 16;
|
||||||
|
|
||||||
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
/* printf( "BitBlt: applying rop %lx\n", rop ); */
|
||||||
if (!dcSrc) return FALSE;
|
tmpGC = XCreateGC( display, rootWindow, 0, NULL );
|
||||||
dcDest = (DC *) GDI_GetObjPtr( hdcDest, DC_MAGIC );
|
srcPixmap = XCreatePixmap( display, rootWindow, width, height,
|
||||||
if (!dcDest)
|
dcDst->w.bitsPerPixel );
|
||||||
|
dstPixmap = XCreatePixmap( display, rootWindow, width, height,
|
||||||
|
dcDst->w.bitsPerPixel );
|
||||||
|
if (useSrc)
|
||||||
|
BITBLT_GetArea( hdcSrc, hdcDst, srcPixmap, tmpGC,
|
||||||
|
xSrc, ySrc, width, height );
|
||||||
|
if (useDst)
|
||||||
|
BITBLT_GetArea( hdcDst, hdcDst, dstPixmap, tmpGC,
|
||||||
|
xDst, yDst, width, height );
|
||||||
|
if (usePat)
|
||||||
|
BITBLT_SelectBrush( dcDst, tmpGC );
|
||||||
|
destUsed = FALSE;
|
||||||
|
|
||||||
|
for (opcode = BITBLT_Opcodes[rop & 0xff]; *opcode; opcode++)
|
||||||
{
|
{
|
||||||
dcDest = (DC *)GDI_GetObjPtr(hdcDest, METAFILE_DC_MAGIC);
|
switch(*opcode >> 4)
|
||||||
if (!dcDest) return FALSE;
|
{
|
||||||
MF_BitBlt(dcDest, xDest, yDest, width, height,
|
case OP_ARGS(DST,TMP):
|
||||||
hdcSrc, xSrc, ySrc, saverop);
|
if (!tmpPixmap) tmpPixmap = XCreatePixmap( display, rootWindow,
|
||||||
return TRUE;
|
width, height,
|
||||||
|
dcDst->w.bitsPerPixel );
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, dstPixmap, tmpPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(DST,SRC):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, dstPixmap, srcPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(SRC,TMP):
|
||||||
|
if (!tmpPixmap) tmpPixmap = XCreatePixmap( display, rootWindow,
|
||||||
|
width, height,
|
||||||
|
dcDst->w.bitsPerPixel );
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, srcPixmap, tmpPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(SRC,DST):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, srcPixmap, dstPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
destUsed = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(PAT,TMP):
|
||||||
|
if (!tmpPixmap) tmpPixmap = XCreatePixmap( display, rootWindow,
|
||||||
|
width, height,
|
||||||
|
dcDst->w.bitsPerPixel );
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XFillRectangle( display, tmpPixmap, tmpGC, 0, 0, width, height );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(PAT,DST):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XFillRectangle( display, dstPixmap, tmpGC, 0, 0, width, height );
|
||||||
|
destUsed = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(PAT,SRC):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XFillRectangle( display, srcPixmap, tmpGC, 0, 0, width, height );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(TMP,SRC):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, tmpPixmap, srcPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_ARGS(TMP,DST):
|
||||||
|
XSetFunction( display, tmpGC, *opcode & 0x0f );
|
||||||
|
XCopyArea( display, tmpPixmap, dstPixmap, tmpGC,
|
||||||
|
0, 0, width, height, 0, 0 );
|
||||||
|
destUsed = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
XSetFunction( display, dcDst->u.x.gc, GXcopy );
|
||||||
xs1 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc );
|
BITBLT_PutArea( hdcDst, destUsed ? dstPixmap : srcPixmap,
|
||||||
xs2 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc + width );
|
dcDst->u.x.gc, xDst, yDst, width, height );
|
||||||
ys1 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc );
|
XFreePixmap( display, dstPixmap );
|
||||||
ys2 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc + height );
|
XFreePixmap( display, srcPixmap );
|
||||||
xd1 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest );
|
if (tmpPixmap) XFreePixmap( display, tmpPixmap );
|
||||||
xd2 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest + width );
|
XFreeGC( display, tmpGC );
|
||||||
yd1 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest );
|
return TRUE;
|
||||||
yd2 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest + height );
|
#if 0
|
||||||
|
|
||||||
if ((abs(xs2-xs1) != abs(xd2-xd1)) || (abs(ys2-ys1) != abs(yd2-yd1)))
|
|
||||||
return FALSE; /* Should call StretchBlt here */
|
|
||||||
|
|
||||||
DC_SetupGCForText( dcDest );
|
|
||||||
if (((rop & 0x0f) == (rop >> 4))&&(rop!=0xbb))
|
if (((rop & 0x0f) == (rop >> 4))&&(rop!=0xbb))
|
||||||
/* FIXME: Test, whether more than just 0xbb has to be excluded */
|
/* FIXME: Test, whether more than just 0xbb has to be excluded */
|
||||||
{
|
{
|
||||||
XSetFunction( display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f] );
|
XSetFunction( display, dcDst->u.x.gc, DC_XROPfunction[rop & 0x0f] );
|
||||||
if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
|
if (dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel)
|
||||||
{
|
{
|
||||||
XCopyArea( display, dcSrc->u.x.drawable,
|
XCopyArea( display, dcSrc->u.x.drawable,
|
||||||
dcDest->u.x.drawable, dcDest->u.x.gc,
|
dcDst->u.x.drawable, dcDst->u.x.gc,
|
||||||
min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
|
min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
|
||||||
min(xd1,xd2), min(yd1,yd2) );
|
min(xd1,xd2), min(yd1,yd2) );
|
||||||
}
|
}
|
||||||
|
@ -194,7 +966,7 @@ BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height,
|
||||||
/* HDC hdcBrush = CreateCompatibleDC(hdcDest);
|
/* HDC hdcBrush = CreateCompatibleDC(hdcDest);
|
||||||
DC *dcBrush;*/
|
DC *dcBrush;*/
|
||||||
RECT r = {min(xDest,xDest+width), min(yDest,yDest+height),
|
RECT r = {min(xDest,xDest+width), min(yDest,yDest+height),
|
||||||
MAX(xDest,xDest+width), MAX(yDest,yDest+height)};
|
max(xDest,xDest+width), max(yDest,yDest+height)};
|
||||||
HBRUSH cur_brush=SelectObject(hdcDest, GetStockObject(BLACK_BRUSH));
|
HBRUSH cur_brush=SelectObject(hdcDest, GetStockObject(BLACK_BRUSH));
|
||||||
SelectObject(hdcDest, cur_brush);
|
SelectObject(hdcDest, cur_brush);
|
||||||
/* FillRect(hdcBrush, &r, cur_brush);*/
|
/* FillRect(hdcBrush, &r, cur_brush);*/
|
||||||
|
@ -286,6 +1058,7 @@ BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height,
|
||||||
XDestroyImage(bxi);
|
XDestroyImage(bxi);
|
||||||
/*DeleteDC(hdcBrush);*/
|
/*DeleteDC(hdcBrush);*/
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,4 +1367,3 @@ BOOL StretchBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short h
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ HBITMAP CreateBitmapIndirect( BITMAP * bmp )
|
||||||
hbitmap = 0;
|
hbitmap = 0;
|
||||||
}
|
}
|
||||||
else if (bmp->bmBits) /* Set bitmap bits */
|
else if (bmp->bmBits) /* Set bitmap bits */
|
||||||
SetBitmapBits( hbitmap, bmp->bmHeight*bmp->bmWidthBytes, bmp->bmBits );
|
SetBitmapBits( hbitmap, bmpObjPtr->bitmap.bmHeight*bmpObjPtr->bitmap.bmWidthBytes, bmp->bmBits );
|
||||||
return hbitmap;
|
return hbitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
#include "prototypes.h"
|
|
||||||
#include "metafile.h"
|
#include "metafile.h"
|
||||||
#include "stddebug.h"
|
#include "stddebug.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
|
|
|
@ -2,15 +2,13 @@
|
||||||
* DC clipping functions
|
* DC clipping functions
|
||||||
*
|
*
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*
|
*/
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "metafile.h"
|
#include "metafile.h"
|
||||||
#include "stddebug.h"
|
#include "stddebug.h"
|
||||||
/* #define DEBUG_CLIPPING */
|
/* #define DEBUG_CLIPPING */
|
||||||
/* #undef DEBUG_CLIPPING */
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -129,7 +127,7 @@ int OffsetClipRgn( HDC hdc, short x, short y )
|
||||||
|
|
||||||
if (dc->w.hClipRgn)
|
if (dc->w.hClipRgn)
|
||||||
{
|
{
|
||||||
int retval = OffsetRgn( dc->w.hClipRgn, x, y );
|
int retval = OffsetRgn( dc->w.hClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
|
||||||
CLIPPING_UpdateGCRegion( dc );
|
CLIPPING_UpdateGCRegion( dc );
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -163,6 +161,11 @@ static int CLIPPING_IntersectClipRect( DC * dc, short left, short top,
|
||||||
HRGN tempRgn, newRgn;
|
HRGN tempRgn, newRgn;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
|
||||||
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
|
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
|
||||||
if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
|
if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
|
||||||
{
|
{
|
||||||
|
@ -237,6 +240,11 @@ static int CLIPPING_IntersectVisRect( DC * dc, short left, short top,
|
||||||
HRGN tempRgn, newRgn;
|
HRGN tempRgn, newRgn;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
|
||||||
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
|
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
|
||||||
if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
|
if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
|
||||||
{
|
{
|
||||||
|
@ -312,10 +320,7 @@ BOOL RectVisible( HDC hdc, LPRECT rect )
|
||||||
if (!dc) return FALSE;
|
if (!dc) return FALSE;
|
||||||
dprintf_clipping(stddeb,"RectVisible: %d %p\n", hdc, rect );
|
dprintf_clipping(stddeb,"RectVisible: %d %p\n", hdc, rect );
|
||||||
if (!dc->w.hGCClipRgn) return FALSE;
|
if (!dc->w.hGCClipRgn) return FALSE;
|
||||||
tmpRect.left = XLPTODP(dc, rect->left);
|
LPtoDP( hdc, (LPPOINT)rect, 2 );
|
||||||
tmpRect.top = YLPTODP(dc, rect->top);
|
|
||||||
tmpRect.right = XLPTODP(dc, rect->right);
|
|
||||||
tmpRect.bottom = YLPTODP(dc, rect->bottom);
|
|
||||||
return RectInRegion( dc->w.hGCClipRgn, &tmpRect );
|
return RectInRegion( dc->w.hGCClipRgn, &tmpRect );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,10 +330,13 @@ BOOL RectVisible( HDC hdc, LPRECT rect )
|
||||||
*/
|
*/
|
||||||
int GetClipBox( HDC hdc, LPRECT rect )
|
int GetClipBox( HDC hdc, LPRECT rect )
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
if (!dc) return ERROR;
|
if (!dc) return ERROR;
|
||||||
dprintf_clipping(stddeb, "GetClipBox: %d %p\n", hdc, rect );
|
dprintf_clipping(stddeb, "GetClipBox: %d %p\n", hdc, rect );
|
||||||
return GetRgnBox( dc->w.hGCClipRgn, rect );
|
ret = GetRgnBox( dc->w.hGCClipRgn, rect );
|
||||||
|
DPtoLP( hdc, (LPPOINT)rect, 2 );
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
102
objects/color.c
102
objects/color.c
|
@ -48,10 +48,14 @@ static PALETTEENTRY COLOR_sysPaletteEntries[NB_RESERVED_COLORS] =
|
||||||
};
|
};
|
||||||
|
|
||||||
static HANDLE hSysColorTranslation = 0;
|
static HANDLE hSysColorTranslation = 0;
|
||||||
|
static HANDLE hRevSysColorTranslation = 0;
|
||||||
|
|
||||||
/* Map an EGA index (0..15) to a pixel value. Used for dithering. */
|
/* Map an EGA index (0..15) to a pixel value. Used for dithering. */
|
||||||
int COLOR_mapEGAPixel[16];
|
int COLOR_mapEGAPixel[16];
|
||||||
|
|
||||||
|
int* COLOR_PaletteToPixel = NULL;
|
||||||
|
int* COLOR_PixelToPalette = NULL;
|
||||||
|
int COLOR_ColormapSize = 0;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* COLOR_BuildMap
|
* COLOR_BuildMap
|
||||||
|
@ -93,16 +97,29 @@ static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
|
||||||
*/
|
*/
|
||||||
static HPALETTE COLOR_InitPalette(void)
|
static HPALETTE COLOR_InitPalette(void)
|
||||||
{
|
{
|
||||||
int i, size;
|
int i, size, pixel;
|
||||||
XColor color;
|
XColor color;
|
||||||
HPALETTE hpalette;
|
HPALETTE hpalette;
|
||||||
LOGPALETTE * palPtr;
|
LOGPALETTE * palPtr;
|
||||||
WORD *colorTranslation;
|
WORD *colorTranslation, *revTranslation;
|
||||||
|
|
||||||
if (!(hSysColorTranslation = GDI_HEAP_ALLOC( GMEM_MOVEABLE,
|
|
||||||
sizeof(WORD)*NB_RESERVED_COLORS ))) return FALSE;
|
|
||||||
colorTranslation = (WORD *) GDI_HEAP_ADDR( hSysColorTranslation );
|
|
||||||
size = DefaultVisual( display, DefaultScreen(display) )->map_entries;
|
size = DefaultVisual( display, DefaultScreen(display) )->map_entries;
|
||||||
|
COLOR_ColormapSize = size;
|
||||||
|
if (!(hSysColorTranslation = GDI_HEAP_ALLOC( GMEM_MOVEABLE,
|
||||||
|
sizeof(WORD)*NB_RESERVED_COLORS )))
|
||||||
|
return FALSE;
|
||||||
|
if (!(hRevSysColorTranslation = GDI_HEAP_ALLOC( GMEM_MOVEABLE,
|
||||||
|
sizeof(WORD)*size )))
|
||||||
|
return FALSE;
|
||||||
|
colorTranslation = (WORD *) GDI_HEAP_ADDR( hSysColorTranslation );
|
||||||
|
revTranslation = (WORD *) GDI_HEAP_ADDR( hRevSysColorTranslation );
|
||||||
|
|
||||||
|
if (COLOR_WinColormap == DefaultColormapOfScreen(screen))
|
||||||
|
{
|
||||||
|
COLOR_PaletteToPixel = (int *)malloc( sizeof(int) * size );
|
||||||
|
COLOR_PixelToPalette = (int *)malloc( sizeof(int) * size );
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < NB_RESERVED_COLORS; i++)
|
for (i = 0; i < NB_RESERVED_COLORS; i++)
|
||||||
{
|
{
|
||||||
color.red = COLOR_sysPaletteEntries[i].peRed * 65535 / 255;
|
color.red = COLOR_sysPaletteEntries[i].peRed * 65535 / 255;
|
||||||
|
@ -110,34 +127,38 @@ static HPALETTE COLOR_InitPalette(void)
|
||||||
color.blue = COLOR_sysPaletteEntries[i].peBlue * 65535 / 255;
|
color.blue = COLOR_sysPaletteEntries[i].peBlue * 65535 / 255;
|
||||||
color.flags = DoRed | DoGreen | DoBlue;
|
color.flags = DoRed | DoGreen | DoBlue;
|
||||||
|
|
||||||
|
if (i < NB_RESERVED_COLORS/2)
|
||||||
|
{
|
||||||
|
/* Bottom half of the colormap */
|
||||||
|
pixel = i;
|
||||||
|
if (pixel >= size/2) continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Top half of the colormap */
|
||||||
|
pixel = size - NB_RESERVED_COLORS + i;
|
||||||
|
if (pixel < size/2) continue;
|
||||||
|
}
|
||||||
if (COLOR_WinColormap != DefaultColormapOfScreen(screen))
|
if (COLOR_WinColormap != DefaultColormapOfScreen(screen))
|
||||||
{
|
{
|
||||||
if (i < NB_RESERVED_COLORS/2)
|
color.pixel = pixel;
|
||||||
{
|
|
||||||
/* Bottom half of the colormap */
|
|
||||||
color.pixel = i;
|
|
||||||
if (color.pixel >= size/2) continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Top half of the colormap */
|
|
||||||
color.pixel = size - NB_RESERVED_COLORS + i;
|
|
||||||
if (color.pixel < size/2) continue;
|
|
||||||
}
|
|
||||||
XStoreColor( display, COLOR_WinColormap, &color );
|
XStoreColor( display, COLOR_WinColormap, &color );
|
||||||
}
|
}
|
||||||
else if (!XAllocColor( display, COLOR_WinColormap, &color ))
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Warning: Not enough free colors. Try using the -privatemap option.\n" );
|
if (!XAllocColor( display, COLOR_WinColormap, &color ))
|
||||||
color.pixel = color.red = color.green = color.blue = 0;
|
{
|
||||||
}
|
fprintf(stderr, "Warning: Not enough free colors. Try using the -privatemap option.\n" );
|
||||||
|
color.pixel = color.red = color.green = color.blue = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
COLOR_PaletteToPixel[pixel] = color.pixel;
|
||||||
|
COLOR_PixelToPalette[color.pixel] = pixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
colorTranslation[i] = color.pixel;
|
colorTranslation[i] = color.pixel;
|
||||||
#if 0
|
revTranslation[color.pixel] = i;
|
||||||
/* Put the allocated colors back in the list */
|
|
||||||
COLOR_sysPaletteEntries[i].peRed = color.red >> 8;
|
|
||||||
COLOR_sysPaletteEntries[i].peGreen = color.green >> 8;
|
|
||||||
COLOR_sysPaletteEntries[i].peBlue = color.blue >> 8;
|
|
||||||
#endif
|
|
||||||
/* Set EGA mapping if color in the first or last eight */
|
/* Set EGA mapping if color in the first or last eight */
|
||||||
if (i < 8)
|
if (i < 8)
|
||||||
COLOR_mapEGAPixel[i] = color.pixel;
|
COLOR_mapEGAPixel[i] = color.pixel;
|
||||||
|
@ -232,7 +253,7 @@ int COLOR_ToPhysical( DC *dc, COLORREF color )
|
||||||
WORD index = 0;
|
WORD index = 0;
|
||||||
WORD *mapping;
|
WORD *mapping;
|
||||||
|
|
||||||
if (dc && !dc->u.x.pal.hMapping) return 0;
|
if (screenDepth > 8) return color;
|
||||||
switch(color >> 24)
|
switch(color >> 24)
|
||||||
{
|
{
|
||||||
case 0: /* RGB */
|
case 0: /* RGB */
|
||||||
|
@ -256,7 +277,8 @@ int COLOR_ToPhysical( DC *dc, COLORREF color )
|
||||||
if (index >= NB_RESERVED_COLORS) return 0;
|
if (index >= NB_RESERVED_COLORS) return 0;
|
||||||
mapping = (WORD *) GDI_HEAP_ADDR( hSysColorTranslation );
|
mapping = (WORD *) GDI_HEAP_ADDR( hSysColorTranslation );
|
||||||
}
|
}
|
||||||
return mapping[index];
|
if (mapping) return mapping[index];
|
||||||
|
else return index; /* Identity mapping */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -265,12 +287,16 @@ int COLOR_ToPhysical( DC *dc, COLORREF color )
|
||||||
*
|
*
|
||||||
* Set the color-mapping table in a DC.
|
* Set the color-mapping table in a DC.
|
||||||
*/
|
*/
|
||||||
void COLOR_SetMapping( DC *dc, HANDLE map, WORD size )
|
void COLOR_SetMapping( DC *dc, HANDLE map, HANDLE revMap, WORD size )
|
||||||
{
|
{
|
||||||
WORD *pmap, *pnewmap;
|
WORD *pmap, *pnewmap;
|
||||||
|
WORD i;
|
||||||
|
|
||||||
if (dc->u.x.pal.hMapping && (dc->u.x.pal.hMapping != hSysColorTranslation))
|
if (dc->u.x.pal.hMapping && (dc->u.x.pal.hMapping != hSysColorTranslation))
|
||||||
GDI_HEAP_FREE( dc->u.x.pal.hMapping );
|
GDI_HEAP_FREE( dc->u.x.pal.hMapping );
|
||||||
|
if (dc->u.x.pal.hRevMapping &&
|
||||||
|
(dc->u.x.pal.hRevMapping != hRevSysColorTranslation))
|
||||||
|
GDI_HEAP_FREE( dc->u.x.pal.hRevMapping );
|
||||||
if (map && (map != hSysColorTranslation))
|
if (map && (map != hSysColorTranslation))
|
||||||
{
|
{
|
||||||
/* Copy mapping table */
|
/* Copy mapping table */
|
||||||
|
@ -278,8 +304,17 @@ void COLOR_SetMapping( DC *dc, HANDLE map, WORD size )
|
||||||
pmap = (WORD *) GDI_HEAP_ADDR( map );
|
pmap = (WORD *) GDI_HEAP_ADDR( map );
|
||||||
pnewmap = (WORD *) GDI_HEAP_ADDR( dc->u.x.pal.hMapping );
|
pnewmap = (WORD *) GDI_HEAP_ADDR( dc->u.x.pal.hMapping );
|
||||||
memcpy( pnewmap, pmap, sizeof(WORD)*size );
|
memcpy( pnewmap, pmap, sizeof(WORD)*size );
|
||||||
|
/* Build reverse table */
|
||||||
|
dc->u.x.pal.hRevMapping = GDI_HEAP_ALLOC( GMEM_MOVEABLE,
|
||||||
|
sizeof(WORD)*COLOR_ColormapSize );
|
||||||
|
pmap = (WORD *) GDI_HEAP_ADDR( dc->u.x.pal.hRevMapping );
|
||||||
|
for (i = 0; i < size; i++) pmap[pnewmap[i]] = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc->u.x.pal.hMapping = map;
|
||||||
|
dc->u.x.pal.hRevMapping = map ? hRevSysColorTranslation : 0;
|
||||||
}
|
}
|
||||||
else dc->u.x.pal.hMapping = map;
|
|
||||||
dc->u.x.pal.mappingSize = size;
|
dc->u.x.pal.mappingSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,6 +341,7 @@ WORD RealizeDefaultPalette( HDC hdc )
|
||||||
DC *dc;
|
DC *dc;
|
||||||
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
|
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
|
||||||
dc->w.hPalette = STOCK_DEFAULT_PALETTE;
|
dc->w.hPalette = STOCK_DEFAULT_PALETTE;
|
||||||
COLOR_SetMapping( dc, hSysColorTranslation, NB_RESERVED_COLORS );
|
COLOR_SetMapping( dc, hSysColorTranslation,
|
||||||
|
hRevSysColorTranslation, NB_RESERVED_COLORS );
|
||||||
return NB_RESERVED_COLORS;
|
return NB_RESERVED_COLORS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ int DC_SetupGCForBrush( DC * dc )
|
||||||
}
|
}
|
||||||
val.function = DC_XROPfunction[dc->w.ROPmode-1];
|
val.function = DC_XROPfunction[dc->w.ROPmode-1];
|
||||||
val.fill_style = dc->u.x.brush.fillStyle;
|
val.fill_style = dc->u.x.brush.fillStyle;
|
||||||
if (val.fill_style == FillStippled)
|
if ((val.fill_style==FillStippled) || (val.fill_style==FillOpaqueStippled))
|
||||||
{
|
{
|
||||||
if (dc->w.backgroundMode==OPAQUE) val.fill_style = FillOpaqueStippled;
|
if (dc->w.backgroundMode==OPAQUE) val.fill_style = FillOpaqueStippled;
|
||||||
val.stipple = dc->u.x.brush.pixmap;
|
val.stipple = dc->u.x.brush.pixmap;
|
||||||
|
@ -244,7 +244,8 @@ HDC GetDCState( HDC hdc )
|
||||||
newdc->w.hClipRgn = CreateRectRgn( 0, 0, 0, 0 );
|
newdc->w.hClipRgn = CreateRectRgn( 0, 0, 0, 0 );
|
||||||
CombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
|
CombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
|
||||||
}
|
}
|
||||||
COLOR_SetMapping( newdc, dc->u.x.pal.hMapping, dc->u.x.pal.mappingSize );
|
COLOR_SetMapping( newdc, dc->u.x.pal.hMapping,
|
||||||
|
dc->u.x.pal.hRevMapping, dc->u.x.pal.mappingSize );
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +280,8 @@ void SetDCState( HDC hdc, HDC hdcs )
|
||||||
|
|
||||||
SelectObject( hdc, dcs->w.hBrush );
|
SelectObject( hdc, dcs->w.hBrush );
|
||||||
SelectObject( hdc, dcs->w.hFont );
|
SelectObject( hdc, dcs->w.hFont );
|
||||||
COLOR_SetMapping( dc, dcs->u.x.pal.hMapping, dcs->u.x.pal.mappingSize );
|
COLOR_SetMapping( dc, dcs->u.x.pal.hMapping,
|
||||||
|
dcs->u.x.pal.hRevMapping, dcs->u.x.pal.mappingSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* GDI device independent bitmaps
|
* GDI device-independent bitmaps
|
||||||
*
|
*
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993,1994 Alexandre Julliard
|
||||||
*
|
*/
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
@ -17,23 +16,32 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
static int get_bpp(int depth)
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DIB_GetImageWidthBytes
|
||||||
|
*
|
||||||
|
* Return the width of an X image in bytes
|
||||||
|
*/
|
||||||
|
int DIB_GetImageWidthBytes( int width, int depth )
|
||||||
{
|
{
|
||||||
switch(depth) {
|
int words;
|
||||||
case 4:
|
|
||||||
case 8:
|
switch(depth)
|
||||||
return 1;
|
{
|
||||||
case 15:
|
case 1: words = (width + 31) / 32; break;
|
||||||
case 16:
|
case 4: words = (width + 7) / 8; break;
|
||||||
return 2;
|
case 8: words = (width + 3) / 4; break;
|
||||||
case 24:
|
case 15:
|
||||||
return 4;
|
case 16: words = (width + 1) / 2; break;
|
||||||
default:
|
case 24: words = width; break;
|
||||||
fprintf(stderr, "DIB: unsupported depth %d!\n", depth);
|
default:
|
||||||
exit(1);
|
fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
|
||||||
}
|
exit(1);
|
||||||
|
}
|
||||||
|
return 4 * words;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DIB_BitmapInfoSize
|
* DIB_BitmapInfoSize
|
||||||
*
|
*
|
||||||
|
@ -61,11 +69,11 @@ static XImage *DIB_DIBmpToImage( BITMAPINFOHEADER * bmp, void * bmpData )
|
||||||
{
|
{
|
||||||
extern void _XInitImageFuncPtrs( XImage* );
|
extern void _XInitImageFuncPtrs( XImage* );
|
||||||
XImage * image;
|
XImage * image;
|
||||||
int bytesPerLine = bmp->biWidth * get_bpp(bmp->biBitCount);
|
|
||||||
|
|
||||||
image = XCreateImage( display, DefaultVisualOfScreen( screen ),
|
image = XCreateImage(display, DefaultVisualOfScreen( screen ),
|
||||||
bmp->biBitCount, ZPixmap, 0, bmpData,
|
bmp->biBitCount, ZPixmap, 0, bmpData,
|
||||||
bmp->biWidth, bmp->biHeight, 32, bytesPerLine );
|
bmp->biWidth, bmp->biHeight, 32,
|
||||||
|
DIB_GetImageWidthBytes(bmp->biWidth,bmp->biBitCount));
|
||||||
if (!image) return 0;
|
if (!image) return 0;
|
||||||
image->byte_order = MSBFirst;
|
image->byte_order = MSBFirst;
|
||||||
image->bitmap_bit_order = MSBFirst;
|
image->bitmap_bit_order = MSBFirst;
|
||||||
|
@ -359,7 +367,7 @@ static void DIB_SetImageBits_RLE8(WORD lines,
|
||||||
dprintf_bitmap(stddeb,
|
dprintf_bitmap(stddeb,
|
||||||
"DIB_SetImageBits_RLE8(): "
|
"DIB_SetImageBits_RLE8(): "
|
||||||
"Delta to last line of bitmap "
|
"Delta to last line of bitmap "
|
||||||
"(wrongly??) causes loop exit\n");
|
"(wrongly?) causes loop exit\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -448,8 +456,7 @@ static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits,
|
||||||
{
|
{
|
||||||
int *colorMapping;
|
int *colorMapping;
|
||||||
XImage *bmpImage;
|
XImage *bmpImage;
|
||||||
void *bmpData;
|
int i, colors;
|
||||||
int i, colors, widthBytes;
|
|
||||||
|
|
||||||
/* Build the color mapping table */
|
/* Build the color mapping table */
|
||||||
|
|
||||||
|
@ -477,12 +484,7 @@ static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transfer the pixels */
|
/* Transfer the pixels */
|
||||||
widthBytes = info->bmiHeader.biWidth * get_bpp(depth);
|
XCREATEIMAGE(bmpImage, info->bmiHeader.biWidth, lines, depth );
|
||||||
|
|
||||||
bmpData = malloc( lines * widthBytes );
|
|
||||||
bmpImage = XCreateImage( display, DefaultVisualOfScreen(screen),
|
|
||||||
depth, ZPixmap, 0, bmpData,
|
|
||||||
info->bmiHeader.biWidth, lines, 32, widthBytes );
|
|
||||||
|
|
||||||
switch(info->bmiHeader.biBitCount)
|
switch(info->bmiHeader.biBitCount)
|
||||||
{
|
{
|
||||||
|
|
|
@ -85,12 +85,7 @@ static char *imageData = NULL;
|
||||||
*/
|
*/
|
||||||
BOOL DITHER_Init(void)
|
BOOL DITHER_Init(void)
|
||||||
{
|
{
|
||||||
int bytes_per_line = (screenDepth * MATRIX_SIZE + 7) / 8;
|
XCREATEIMAGE( ditherImage, MATRIX_SIZE, MATRIX_SIZE, screenDepth );
|
||||||
if (!(imageData = (char *) malloc( bytes_per_line * MATRIX_SIZE )))
|
|
||||||
return FALSE;
|
|
||||||
ditherImage = XCreateImage( display, DefaultVisualOfScreen(screen),
|
|
||||||
screenDepth, ZPixmap, 0, imageData,
|
|
||||||
MATRIX_SIZE, MATRIX_SIZE, 8, bytes_per_line );
|
|
||||||
return (ditherImage != NULL);
|
return (ditherImage != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,8 +99,6 @@ Pixmap DITHER_DitherColor( DC *dc, COLORREF color )
|
||||||
unsigned int x, y;
|
unsigned int x, y;
|
||||||
Pixmap pixmap;
|
Pixmap pixmap;
|
||||||
|
|
||||||
/* printf( "Dither: %x\n", color ); */
|
|
||||||
|
|
||||||
if (color != prevColor)
|
if (color != prevColor)
|
||||||
{
|
{
|
||||||
int r = GetRValue( color ) * DITHER_LEVELS;
|
int r = GetRValue( color ) * DITHER_LEVELS;
|
||||||
|
@ -113,8 +106,6 @@ Pixmap DITHER_DitherColor( DC *dc, COLORREF color )
|
||||||
int b = GetBValue( color ) * DITHER_LEVELS;
|
int b = GetBValue( color ) * DITHER_LEVELS;
|
||||||
const int *pmatrix = dither_matrix;
|
const int *pmatrix = dither_matrix;
|
||||||
|
|
||||||
/* WORD *mapping = (WORD *) GDI_HEAP_ADDR( dc->u.x.pal.hMapping );*/
|
|
||||||
|
|
||||||
for (y = 0; y < MATRIX_SIZE; y++)
|
for (y = 0; y < MATRIX_SIZE; y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < MATRIX_SIZE; x++)
|
for (x = 0; x < MATRIX_SIZE; x++)
|
||||||
|
|
|
@ -243,10 +243,6 @@ HANDLE GDI_AllocObject( WORD size, WORD magic )
|
||||||
HANDLE handle = GDI_HEAP_ALLOC( GMEM_MOVEABLE, size );
|
HANDLE handle = GDI_HEAP_ALLOC( GMEM_MOVEABLE, size );
|
||||||
if (!handle) return 0;
|
if (!handle) return 0;
|
||||||
obj = (GDIOBJHDR *) GDI_HEAP_ADDR( handle );
|
obj = (GDIOBJHDR *) GDI_HEAP_ADDR( handle );
|
||||||
if (obj == NULL) {
|
|
||||||
fprintf(stderr,"GDI_AllocObject // Error trying to get GDI_HEAD_ADDR !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
obj->hNext = 0;
|
obj->hNext = 0;
|
||||||
obj->wMagic = magic;
|
obj->wMagic = magic;
|
||||||
obj->dwCount = ++count;
|
obj->dwCount = ++count;
|
||||||
|
|
|
@ -178,7 +178,7 @@ HPALETTE GDISelectPalette( HDC hdc, HPALETTE hpal )
|
||||||
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
|
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
|
||||||
prev = dc->w.hPalette;
|
prev = dc->w.hPalette;
|
||||||
dc->w.hPalette = hpal;
|
dc->w.hPalette = hpal;
|
||||||
if (hpal != STOCK_DEFAULT_PALETTE) COLOR_SetMapping( dc, 0, 0 );
|
if (hpal != STOCK_DEFAULT_PALETTE) COLOR_SetMapping( dc, 0, 0, 0 );
|
||||||
else RealizeDefaultPalette( hdc ); /* Always realize default palette */
|
else RealizeDefaultPalette( hdc ); /* Always realize default palette */
|
||||||
return prev;
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,6 +588,45 @@ int CombineRgn( HRGN hDest, HRGN hSrc1, HRGN hSrc2, short mode )
|
||||||
return ERROR;
|
return ERROR;
|
||||||
region = &destObj->region;
|
region = &destObj->region;
|
||||||
|
|
||||||
|
/* Some optimizations for null regions */
|
||||||
|
|
||||||
|
if (src1Obj->region.type == NULLREGION)
|
||||||
|
{
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case RGN_AND:
|
||||||
|
case RGN_DIFF:
|
||||||
|
if (region->xrgn) XDestroyRegion( region->xrgn );
|
||||||
|
if (region->pixmap) XFreePixmap( display, region->pixmap );
|
||||||
|
region->type = NULLREGION;
|
||||||
|
region->xrgn = 0;
|
||||||
|
return NULLREGION;
|
||||||
|
case RGN_OR:
|
||||||
|
case RGN_XOR:
|
||||||
|
return REGION_CopyRegion( src2Obj, destObj );
|
||||||
|
default:
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (src2Obj->region.type == NULLREGION)
|
||||||
|
{
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case RGN_AND:
|
||||||
|
if (region->xrgn) XDestroyRegion( region->xrgn );
|
||||||
|
if (region->pixmap) XFreePixmap( display, region->pixmap );
|
||||||
|
region->type = NULLREGION;
|
||||||
|
region->xrgn = 0;
|
||||||
|
return NULLREGION;
|
||||||
|
case RGN_OR:
|
||||||
|
case RGN_XOR:
|
||||||
|
case RGN_DIFF:
|
||||||
|
return REGION_CopyRegion( src1Obj, destObj );
|
||||||
|
default:
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (src1Obj->region.xrgn && src2Obj->region.xrgn)
|
if (src1Obj->region.xrgn && src2Obj->region.xrgn)
|
||||||
{
|
{
|
||||||
/* Perform the operation with X regions */
|
/* Perform the operation with X regions */
|
||||||
|
|
|
@ -8,7 +8,7 @@ MODULE = rc
|
||||||
echo "#include \"windows.h\"" >$*.rct
|
echo "#include \"windows.h\"" >$*.rct
|
||||||
echo WINDOWS_H_ENDS_HERE >>$*.rct
|
echo WINDOWS_H_ENDS_HERE >>$*.rct
|
||||||
cat $< >>$*.rct
|
cat $< >>$*.rct
|
||||||
gcc -E -x c -P $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ./winerc -o $* -v -p $*
|
$(CC) -E -x c -P $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ./winerc -o $* -v -p $*
|
||||||
$(RM) $*.rct
|
$(RM) $*.rct
|
||||||
|
|
||||||
XCOMM This would be nicer, but it breaks gcc (2.5.8 on Linux) --AJ
|
XCOMM This would be nicer, but it breaks gcc (2.5.8 on Linux) --AJ
|
||||||
|
@ -18,7 +18,7 @@ RCSRCS = sysres.rc sysresbm.rc
|
||||||
|
|
||||||
RCOBJS = $(RCSRCS:.rc=.o)
|
RCOBJS = $(RCSRCS:.rc=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(RCOBJS))
|
WineRelocatableTarget($(MODULE),,$(RCOBJS))
|
||||||
|
|
||||||
$(RCOBJS): winerc $(TOP)/include/windows.h
|
$(RCOBJS): winerc $(TOP)/include/windows.h
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
all::
|
|
||||||
|
|
||||||
depend::
|
|
||||||
|
|
||||||
clean::
|
|
||||||
|
|
||||||
includes::
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -31,7 +31,7 @@ SRCS = \
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
WineRelocatableTarget($(MODULE),,$(OBJS))
|
||||||
DependTarget()
|
DependTarget()
|
||||||
|
|
||||||
includes::
|
includes::
|
||||||
|
|
|
@ -484,7 +484,9 @@ COLORREF GetPixel( HDC hdc, short x, short y )
|
||||||
{
|
{
|
||||||
PALETTEENTRY entry;
|
PALETTEENTRY entry;
|
||||||
XImage * image;
|
XImage * image;
|
||||||
|
WORD * mapping;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
if (!dc) return 0;
|
if (!dc) return 0;
|
||||||
|
|
||||||
|
@ -492,8 +494,11 @@ COLORREF GetPixel( HDC hdc, short x, short y )
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!PtVisible( hdc, x, y )) return 0;
|
||||||
|
|
||||||
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||||
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||||
|
#if 0
|
||||||
if ((x < 0) || (y < 0)) return 0;
|
if ((x < 0) || (y < 0)) return 0;
|
||||||
|
|
||||||
if (!(dc->w.flags & DC_MEMORY))
|
if (!(dc->w.flags & DC_MEMORY))
|
||||||
|
@ -505,11 +510,16 @@ COLORREF GetPixel( HDC hdc, short x, short y )
|
||||||
if (win_attr.map_state != IsViewable) return 0;
|
if (win_attr.map_state != IsViewable) return 0;
|
||||||
if ((x >= win_attr.width) || (y >= win_attr.height)) return 0;
|
if ((x >= win_attr.width) || (y >= win_attr.height)) return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
image = XGetImage( display, dc->u.x.drawable, x, y,
|
image = XGetImage( display, dc->u.x.drawable, x, y,
|
||||||
1, 1, AllPlanes, ZPixmap );
|
1, 1, AllPlanes, ZPixmap );
|
||||||
GetPaletteEntries( dc->w.hPalette, XGetPixel( image, 0, 0 ), 1, &entry );
|
pixel = XGetPixel( image, 0, 0 );
|
||||||
XDestroyImage( image );
|
XDestroyImage( image );
|
||||||
|
|
||||||
|
if (screenDepth > 8) return pixel;
|
||||||
|
mapping = (WORD *) GDI_HEAP_ADDR( dc->u.x.pal.hRevMapping );
|
||||||
|
if (mapping) pixel = mapping[pixel];
|
||||||
|
GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
|
||||||
return RGB( entry.peRed, entry.peGreen, entry.peBlue );
|
return RGB( entry.peRed, entry.peGreen, entry.peBlue );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
GetRgnBox( InquireVisRgn(lps->hdc), &lps->rcPaint );
|
GetRgnBox( InquireVisRgn(lps->hdc), &lps->rcPaint );
|
||||||
|
DPtoLP( lps->hdc, (LPPOINT)&lps->rcPaint, 2 );
|
||||||
|
|
||||||
SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
|
SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
|
||||||
DeleteObject( hrgnUpdate );
|
DeleteObject( hrgnUpdate );
|
||||||
|
@ -71,6 +72,7 @@ void FillWindow( HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush )
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetClientRect( hwnd, &rect );
|
GetClientRect( hwnd, &rect );
|
||||||
|
DPtoLP( hdc, (LPPOINT)&rect, 2 );
|
||||||
PaintRect( hwndParent, hwnd, hdc, hbrush, &rect );
|
PaintRect( hwndParent, hwnd, hdc, hbrush, &rect );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue