Death to afb.
Planar framebuffer people, please talk to wfb for all your 1988 hardware needs.
This commit is contained in:
parent
c76fddeea2
commit
20ea99c655
|
@ -9,10 +9,6 @@ if XTRAP
|
||||||
XTRAP_DIR=XTrap
|
XTRAP_DIR=XTrap
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if AFB
|
|
||||||
AFB_DIR=afb
|
|
||||||
endif
|
|
||||||
|
|
||||||
if MFB
|
if MFB
|
||||||
MFB_DIR=mfb
|
MFB_DIR=mfb
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
noinst_LTLIBRARIES = libafb.la
|
|
||||||
|
|
||||||
AM_CFLAGS = $(DIX_CFLAGS)
|
|
||||||
|
|
||||||
libafb_gen_sources = afbbltC.c afbbltX.c afbbltCI.c afbbltO.c afbbltG.c afbtileC.c afbtileG.c afbseg.c
|
|
||||||
|
|
||||||
DISTCLEANFILES = $(libafb_gen_sources)
|
|
||||||
|
|
||||||
libafb_la_SOURCES = afbgc.c afbwindow.c afbfont.c afbfillrct.c afbpixmap.c \
|
|
||||||
afbimage.c afbline.c afbbres.c afbhrzvert.c afbbresd.c afbpushpxl.c afbply1rct.c \
|
|
||||||
afbzerarc.c afbfillarc.c afbfillsp.c afbsetsp.c afbscrinit.c afbplygblt.c \
|
|
||||||
afbclip.c afbgetsp.c afbpolypnt.c afbbitblt.c afbcmap.c afbimggblt.c afbpntarea.c \
|
|
||||||
afbmisc.c afbtegblt.c $(libafb_gen_sources)
|
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)/mfb -I$(top_srcdir)/hw/xfree86/os-support
|
|
||||||
|
|
||||||
EXTRA_DIST = afbline.c afbblt.c afbtile.c README Xdaniver.doc
|
|
||||||
|
|
||||||
afbseg.c:
|
|
||||||
echo "#define POLYSEGMENT" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbline.c\"" >> $@
|
|
||||||
|
|
||||||
afbbltC.c:
|
|
||||||
echo "#define MROP Mcopy" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbblt.c\"" >> $@
|
|
||||||
|
|
||||||
afbbltX.c:
|
|
||||||
echo "#define MROP Mxor" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbblt.c\"" >> $@
|
|
||||||
|
|
||||||
afbbltCI.c:
|
|
||||||
echo "#define MROP McopyInverted" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbblt.c\"" >> $@
|
|
||||||
|
|
||||||
afbbltO.c:
|
|
||||||
echo "#define MROP Mor" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbblt.c\"" >> $@
|
|
||||||
|
|
||||||
afbbltG.c:
|
|
||||||
echo "#define MROP 0" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbblt.c\"" >> $@
|
|
||||||
|
|
||||||
afbtileC.c:
|
|
||||||
echo "#define MROP Mcopy" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbtile.c\"" >> $@
|
|
||||||
|
|
||||||
afbtileG.c:
|
|
||||||
echo "#define MROP 0" > $@
|
|
||||||
echo "#include \"$(srcdir)/afbtile.c\"" >> $@
|
|
||||||
|
|
||||||
sdk_HEADERS = afb.h
|
|
10
afb/README
10
afb/README
|
@ -1,10 +0,0 @@
|
||||||
|
|
||||||
All stuff in this directory is based on Xdaniver (read Xdaniver.doc).
|
|
||||||
|
|
||||||
Actually this is the same code as in the ilbm directory, except that here the
|
|
||||||
conversion from normal bitplanes to interleaved bitplanes didn't happen.
|
|
||||||
|
|
||||||
--
|
|
||||||
Geert Uytterhoeven Geert.Uytterhoeven@cs.kuleuven.ac.be
|
|
||||||
Wavelets, Linux/m68k on Amiga http://www.cs.kuleuven.ac.be/~geert/
|
|
||||||
Department of Computer Science -- Katholieke Universiteit Leuven -- Belgium
|
|
218
afb/Xdaniver.doc
218
afb/Xdaniver.doc
|
@ -1,218 +0,0 @@
|
||||||
|
|
||||||
What is it?
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Xdaniver is a fast, colour X11R6 server for the Amiga's custom chip set
|
|
||||||
under NetBSD 1.0 and NetBSD-current, supporting all the Amiga's display
|
|
||||||
depths from 1 to 4 (upto 16 colours) on ECS machines and 1 to 8 (upto 256
|
|
||||||
colours) on AGA machines (though, not all resolutions are available, see
|
|
||||||
General Information below).
|
|
||||||
|
|
||||||
Xdaniver is designed to be a drop-in replacement for the Xmono server provided
|
|
||||||
with the X11R6 binary distribution supplied by Bernd Ernesti available from
|
|
||||||
ftp.uni-regensburg.de or one of its mirrors.
|
|
||||||
|
|
||||||
Unlike previous colour X servers for the Amiga that emulate a chunky pixel
|
|
||||||
screen in fast RAM, use the standard frame buffer drivers provided with the
|
|
||||||
X11R6 source code to draw and then use a chunky to planar conversion routine
|
|
||||||
to write the results to the screen (all very slow), Xdaniver uses a heavily
|
|
||||||
modified mono frame buffer driver to draw directly using the Amiga's planar
|
|
||||||
format. The net result is much faster drawing and support for all the Amiga's
|
|
||||||
custom display depths but, as usual, the fewer planes used, the faster the
|
|
||||||
drawing operations of the X server. Even so, on my A1200 with a 33Mhz 68030,
|
|
||||||
I'm getting reasonable performance when using 8 bit planes in Dbl NTSC mode.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
You will need to have first obtained and installed the X11R6 binary
|
|
||||||
distribution available from ftp.uni-regensburg.de in
|
|
||||||
/pub/NetBSD-Amiga/contrib/X11 or one of its mirrors. Xdaniver has been
|
|
||||||
compiled to expect font and configuration files sitting under
|
|
||||||
/usr/local/X11R6, if your setup is different you will need to provide a
|
|
||||||
symbolic link from /usr/local/X11R6 to where your tree resides or supply
|
|
||||||
several command line flags to the server.
|
|
||||||
|
|
||||||
To get Xdaniver running as the default X server, copy the uncompressed binary
|
|
||||||
into /usr/local/X11R6/bin, remove the current X file from that directory
|
|
||||||
(which is a symbolic link to Xmono) and replace it with a link to Xdaniver:
|
|
||||||
|
|
||||||
gzip -d < X11R6.Xdaniver.1.01.tar.gz | tar xvf -
|
|
||||||
mv Xdaniver /usr/local/X11R6/bin
|
|
||||||
cd /usr/local/X11R6/bin
|
|
||||||
rm X
|
|
||||||
ln -s Xdaniver X
|
|
||||||
|
|
||||||
Note that on some setups, the devices /dev/kbd, /dev/mouse and /dev/view??
|
|
||||||
have been created to be accessable only by superuser; Xdaniver needs to open
|
|
||||||
these devices. To workaround this problem, log on as superuser and then
|
|
||||||
either make Xdaniver setuid root:
|
|
||||||
|
|
||||||
chown root Xdaniver
|
|
||||||
chmod 4755 Xdaniver
|
|
||||||
|
|
||||||
or give everyone access the devices:
|
|
||||||
|
|
||||||
chmod 666 /dev/kbd /dev/mouse /dev/view??
|
|
||||||
|
|
||||||
the latter option is a possible cause of a security hole if your machine is
|
|
||||||
ever used multi-user.
|
|
||||||
|
|
||||||
General Information
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
The default resolution of the server is 700x430 and the default depth 4. AGA
|
|
||||||
users might what to increase the display depth by editing the startx script
|
|
||||||
and providing a -depth <depth> argument to Xdaniver on the xinit line of the
|
|
||||||
script. As always, the lower the depth, the faster the drawing and window
|
|
||||||
manipulation of the server.
|
|
||||||
|
|
||||||
The resolution can be altered similarly by suppling -width <width> and
|
|
||||||
-height <height> arguments to the server.
|
|
||||||
|
|
||||||
The NetBSD kernel selects actual screen modes by picking a mode who's
|
|
||||||
natural, non-overscanned size best-fits the requested resolution.
|
|
||||||
Unfortunately, for AGA users, the 1.0 kernel only has support for the
|
|
||||||
Dbl-NTSC AGA display mode and only this mode has support for depths greater
|
|
||||||
than 4. The NetBSD-current (work-in-progress) kernel also has support for
|
|
||||||
Dbl-PAL but still no support for the Super72 or other super-hires modes
|
|
||||||
(perhaps some kind, kernel-hacker could add support for them ?).
|
|
||||||
|
|
||||||
If you have a 2 button mouse (like me) you might want to try and use the 3
|
|
||||||
button mouse emulation. On other systems, it is usual for the left and right
|
|
||||||
buttons to be provided and emulate the middle button by pressing both
|
|
||||||
buttons together, however, the middle button is tends to be used more than
|
|
||||||
the right button so I have provided two options:
|
|
||||||
|
|
||||||
-emulateright (or -3), the two physical mouse buttons act as left and middle
|
|
||||||
and pressing them both together emulates the right button.
|
|
||||||
|
|
||||||
-emulatemiddle (or -2), the two physical mouse buttons act as left and right
|
|
||||||
and pressing them both together emulated the middle button.
|
|
||||||
|
|
||||||
When using screen depths of less than 6 (4 is the maximum for ECS machines)
|
|
||||||
the lack of possible colours on screen at once causes problems for many X
|
|
||||||
applications. Specifying -cc 2 as a command line argument to Xdaniver
|
|
||||||
causes the server to switch the default visual type from PsuedoColor to
|
|
||||||
StaticColor; to put it simply, the server prefills the colormap with a
|
|
||||||
selection of 16 colours (depth 4) and when an application asks for a
|
|
||||||
particular colour, its gets allocated one that is closest to one from the
|
|
||||||
selection of 16. This removes the 'WARNING: Cannot allocate colormap entry
|
|
||||||
for "XXX"' errors but at the expense of applications not being able to get
|
|
||||||
the precise colour they wanted. Also, some badly written X applications fail
|
|
||||||
altogether when presented with a StaticColor visual.
|
|
||||||
|
|
||||||
Bugs/Limitations
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The limited choice of display resolutions for AGA/ECS machines is a real
|
|
||||||
pain - requires a kernel change to fix. Worse still, the kernel specifies
|
|
||||||
the maximum overscan resolution on the Dbl-NTSC to be 724x482 but selecting
|
|
||||||
anything more than 702x430 on my machine causes the screen either sheer
|
|
||||||
diagonally (as if the bytes per row calculation in Xdaniver or the kernel is
|
|
||||||
wrong) or completely loose sync (suggesting a custom chip register sync
|
|
||||||
calculation bug). As other, non-aga modes aren't affected when selection
|
|
||||||
overscan both problems seem to point to a kernel driver bug. Also, depths
|
|
||||||
greater than 4 for AGA users are only supported by the kernel in the Dbl-NTSC
|
|
||||||
mode (and Dbl-PAL with the current-NetBSD kernel).
|
|
||||||
|
|
||||||
I know of one bug so-far (there will be more), The PutImage request of an XY
|
|
||||||
format image expects the bitplane order to be the reverse of that specified
|
|
||||||
in the X protocol but since virtually all applications use the Z (chunky)
|
|
||||||
format, you are unlikely to come across this problem.
|
|
||||||
|
|
||||||
The PutImage request of Z format images is a little slow - when I have time
|
|
||||||
I'll try and add one of the fast assembly chunky-to-planar routines developed
|
|
||||||
for doom style games/demos. Unfortunately, the current crop all require a
|
|
||||||
picture size that is a multiple of 32 pixels and so cannot be used out-of-the-
|
|
||||||
box.
|
|
||||||
|
|
||||||
Some extra performance could easily be squeezed out of the terminal font
|
|
||||||
drawing code (used by xterm) - when I have time I'll add the code.
|
|
||||||
|
|
||||||
The Amiga's blitter and sprites are totally unused and will remain so
|
|
||||||
until/if someone else adds support to the kernel. The blitter would help
|
|
||||||
speed up screen scrolling and window manipulation and sprite support could
|
|
||||||
be used for the X pointer shape (if small enough) which would speed up all
|
|
||||||
drawing operations (no need to remove the software based pointer shape
|
|
||||||
first, draw, then replace the pointer shape).
|
|
||||||
|
|
||||||
I removed the X image extension (XIE) from the X server as it increased the
|
|
||||||
size of the binary by some 400k. I haven't come across any applications that
|
|
||||||
need it yet (I haven't been looking!) so if you need the extension for some
|
|
||||||
reason send me e-mail and I'll build a server with the extension included.
|
|
||||||
|
|
||||||
The 3 button mouse emulation is very simple - to emulate the 3rd button you
|
|
||||||
have to press both button precisely at the same moment - I've got quite good
|
|
||||||
at it now. When I have some spare time I'll add a timer so you will have a
|
|
||||||
few milli-seconds between one button being pressed and the next and it still
|
|
||||||
being registered as the emulated button.
|
|
||||||
|
|
||||||
AGA users don't forget to provide the -A flag to loadbsd to enable the one
|
|
||||||
AGA mode in the 1.0 kernel but only if you have a VGA, multisync or dual-scan
|
|
||||||
monitor, of course !
|
|
||||||
|
|
||||||
Xdaniver has been tested on:
|
|
||||||
|
|
||||||
A1200, 33Mhz 68030, 8Mb RAM and NetBSD 1.0 by myself.
|
|
||||||
A4000/40, 12Mb RAM and NetBSD 1.0 by Andreas Holzhammer.
|
|
||||||
A3000, 12Mb RAM and NetBSD 1.0 by Charlie Root, Stuart Park and others.
|
|
||||||
A3000, 25Mhz 68040, 18Mb RAM and NetBSD-current by Michael K. Sanders.
|
|
||||||
A2000, 8Mb RAM and NetBSD (version unknown) by Hubert Feyrer.
|
|
||||||
|
|
||||||
Release and Bug Fix History
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
1.0 - First release
|
|
||||||
|
|
||||||
1.01 Bugs fixed:
|
|
||||||
- Narrow (<32 pixels) Z format GetImage requests corrupted the stack
|
|
||||||
and could cause the server to core dump. (Xpaint caused this problem)
|
|
||||||
- Drawing dots (PolyPoint request) into a clipped window caused a
|
|
||||||
c pointer to go out of range, causing a core dump (xv showed this
|
|
||||||
problem).
|
|
||||||
|
|
||||||
New features:
|
|
||||||
- Simple 3 button mouse emulation using a 2 button mouse; specify
|
|
||||||
-emulate_middle (or -2) or -emulate_right (or -3) on the server's
|
|
||||||
command line and press both mouse buttons together emulate the 'missing'
|
|
||||||
button.
|
|
||||||
- Basic beep sound support added by sending bell characters to the
|
|
||||||
console.
|
|
||||||
- Source code released.
|
|
||||||
|
|
||||||
Disclaimer and Copyright Notices
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Multi-depth planar frame buffer code:
|
|
||||||
Copyright (c) 1995 by Daniver Limited.
|
|
||||||
|
|
||||||
Large portions:
|
|
||||||
Copyright (c) 1994 by Eduardo Horvath.
|
|
||||||
Copyright (c) 1987-1995 by the Regents of the University of California.
|
|
||||||
Copyright (c) 1987 by Sun Microsystems, Inc. Mountain View, CA.
|
|
||||||
Copyright (c) 1987-1995 by X Consortium.
|
|
||||||
Copyright (c) 1987, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
Copyright (c) 1989 Network Computing Devices, Inc., Mountain View, California.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted, provided
|
|
||||||
that the above copyright notice appear in all copies. The Daniver Limited,
|
|
||||||
the above companies and individuals makes no representations about the
|
|
||||||
suitability of this software for any purpose. It is provided "as is" without
|
|
||||||
express or implied warranty.
|
|
||||||
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
Thanks to Bernd Ernesti for making the operating system server source code
|
|
||||||
available for others to use and Eduardo Horvath and Andy Heffernan, who (I
|
|
||||||
think) did the original Xmono server port.
|
|
||||||
|
|
||||||
Also, many thanks to the first brave users who tested Xdaniver for me on other
|
|
||||||
Amiga setups and found a few bugs in the process.
|
|
||||||
|
|
||||||
Gary Henderson.
|
|
||||||
|
|
||||||
Daytime: garyh@wet.sbi.com
|
|
||||||
Home: gary@daniver.demon.co.uk
|
|
972
afb/afb.h
972
afb/afb.h
|
@ -1,972 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
/* Monochrome Frame Buffer definitions
|
|
||||||
written by drewry, september 1986
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "pixmap.h"
|
|
||||||
#include "region.h"
|
|
||||||
#include "gc.h"
|
|
||||||
#include "colormap.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "privates.h"
|
|
||||||
#include "mibstore.h"
|
|
||||||
#include "mfb.h"
|
|
||||||
|
|
||||||
extern int afbInverseAlu[];
|
|
||||||
/* warning: PixelType definition duplicated in maskbits.h */
|
|
||||||
#ifndef PixelType
|
|
||||||
#define PixelType CARD32
|
|
||||||
#endif /* PixelType */
|
|
||||||
|
|
||||||
#define AFB_MAX_DEPTH 8
|
|
||||||
|
|
||||||
/* afbbitblt.c */
|
|
||||||
|
|
||||||
extern void afbDoBitblt(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern RegionPtr afbCopyArea(
|
|
||||||
DrawablePtr /*pSrcDrawable*/,
|
|
||||||
DrawablePtr /*pDstDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*srcx*/,
|
|
||||||
int /*srcy*/,
|
|
||||||
int /*width*/,
|
|
||||||
int /*height*/,
|
|
||||||
int /*dstx*/,
|
|
||||||
int /*dsty*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbbltC.c */
|
|
||||||
|
|
||||||
extern void afbDoBitbltCopy(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbbltCI.c */
|
|
||||||
|
|
||||||
extern void afbDoBitbltCopyInverted(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbbltG.c */
|
|
||||||
|
|
||||||
extern void afbDoBitbltGeneral(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbbltO.c */
|
|
||||||
|
|
||||||
extern void afbDoBitbltOr(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbbltX.c */
|
|
||||||
|
|
||||||
extern void afbDoBitbltXor(
|
|
||||||
DrawablePtr /*pSrc*/,
|
|
||||||
DrawablePtr /*pDst*/,
|
|
||||||
int /*alu*/,
|
|
||||||
RegionPtr /*prgnDst*/,
|
|
||||||
DDXPointPtr /*pptSrc*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbbres.c */
|
|
||||||
|
|
||||||
extern void afbBresS(
|
|
||||||
PixelType * /*addrl*/,
|
|
||||||
int /*nlwidth*/,
|
|
||||||
int /*sizeDst*/,
|
|
||||||
int /*depthDst*/,
|
|
||||||
int /*signdx*/,
|
|
||||||
int /*signdy*/,
|
|
||||||
int /*axis*/,
|
|
||||||
int /*x1*/,
|
|
||||||
int /*y1*/,
|
|
||||||
int /*e*/,
|
|
||||||
int /*e1*/,
|
|
||||||
int /*e2*/,
|
|
||||||
int /*len*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
/* afbbresd.c */
|
|
||||||
|
|
||||||
extern void afbBresD(
|
|
||||||
int * /*pdashIndex*/,
|
|
||||||
unsigned char * /*pDash*/,
|
|
||||||
int /*numInDashList*/,
|
|
||||||
int * /*pdashOffset*/,
|
|
||||||
int /*isDoubleDash*/,
|
|
||||||
PixelType * /*addrl*/,
|
|
||||||
int /*nlwidth*/,
|
|
||||||
int /*sizeDst*/,
|
|
||||||
int /*depthDst*/,
|
|
||||||
int /*signdx*/,
|
|
||||||
int /*signdy*/,
|
|
||||||
int /*axis*/,
|
|
||||||
int /*x1*/,
|
|
||||||
int /*y1*/,
|
|
||||||
int /*e*/,
|
|
||||||
int /*e1*/,
|
|
||||||
int /*e2*/,
|
|
||||||
int /*len*/,
|
|
||||||
unsigned char * /*rrops*/,
|
|
||||||
unsigned char * /*bgrrops*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbclip.c */
|
|
||||||
|
|
||||||
extern RegionPtr afbPixmapToRegion(
|
|
||||||
PixmapPtr /*pPix*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbcmap.c */
|
|
||||||
|
|
||||||
extern int afbListInstalledColormaps(
|
|
||||||
ScreenPtr /*pScreen*/,
|
|
||||||
Colormap * /*pmaps*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbInstallColormap(
|
|
||||||
ColormapPtr /*pmap*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbUninstallColormap(
|
|
||||||
ColormapPtr /*pmap*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbResolveColor(
|
|
||||||
unsigned short * /*pred*/,
|
|
||||||
unsigned short * /*pgreen*/,
|
|
||||||
unsigned short * /*pblue*/,
|
|
||||||
VisualPtr /*pVisual*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbInitializeColormap(
|
|
||||||
ColormapPtr /*pmap*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbInitVisuals(
|
|
||||||
VisualPtr * /*visualp*/,
|
|
||||||
DepthPtr * /*depthp*/,
|
|
||||||
int * /*nvisualp*/,
|
|
||||||
int * /*ndepthp*/,
|
|
||||||
int * /*rootDepthp*/,
|
|
||||||
VisualID * /*defaultVisp*/,
|
|
||||||
unsigned long /*sizes*/,
|
|
||||||
int /*bitsPerRGB*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbfillarc.c */
|
|
||||||
|
|
||||||
extern void afbPolyFillArcSolid(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*narcs*/,
|
|
||||||
xArc * /*parcs*/
|
|
||||||
);
|
|
||||||
/* afbfillrct.c */
|
|
||||||
|
|
||||||
extern void afbPolyFillRect(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*nrectFill*/,
|
|
||||||
xRectangle * /*prectInit*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbply1rct.c */
|
|
||||||
extern void afbFillPolygonSolid(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*mode*/,
|
|
||||||
int /*shape*/,
|
|
||||||
int /*count*/,
|
|
||||||
DDXPointPtr /*ptsIn*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbfillsp.c */
|
|
||||||
|
|
||||||
extern void afbSolidFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbStippleFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbTileFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbUnnaturalTileFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbUnnaturalStippleFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbOpaqueStippleFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbUnnaturalOpaqueStippleFS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*nInit*/,
|
|
||||||
DDXPointPtr /*pptInit*/,
|
|
||||||
int * /*pwidthInit*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbfont.c */
|
|
||||||
|
|
||||||
extern Bool afbRealizeFont(
|
|
||||||
ScreenPtr /*pscr*/,
|
|
||||||
FontPtr /*pFont*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbUnrealizeFont(
|
|
||||||
ScreenPtr /*pscr*/,
|
|
||||||
FontPtr /*pFont*/
|
|
||||||
);
|
|
||||||
/* afbgc.c */
|
|
||||||
|
|
||||||
extern Bool afbCreateGC(
|
|
||||||
GCPtr /*pGC*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbReduceRop(
|
|
||||||
int /*alu*/,
|
|
||||||
Pixel /*src*/,
|
|
||||||
unsigned long /*planemask*/,
|
|
||||||
int /*depth*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbgetsp.c */
|
|
||||||
|
|
||||||
extern void afbGetSpans(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
int /*wMax*/,
|
|
||||||
DDXPointPtr /*ppt*/,
|
|
||||||
int * /*pwidth*/,
|
|
||||||
int /*nspans*/,
|
|
||||||
char * /*pdstStart*/
|
|
||||||
);
|
|
||||||
/* afbhrzvert.c */
|
|
||||||
|
|
||||||
extern void afbHorzS(
|
|
||||||
PixelType * /*addrl*/,
|
|
||||||
int /*nlwidth*/,
|
|
||||||
int /*sizeDst*/,
|
|
||||||
int /*depthDst*/,
|
|
||||||
int /*x1*/,
|
|
||||||
int /*y1*/,
|
|
||||||
int /*len*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbVertS(
|
|
||||||
PixelType * /*addrl*/,
|
|
||||||
int /*nlwidth*/,
|
|
||||||
int /*sizeDst*/,
|
|
||||||
int /*depthDst*/,
|
|
||||||
int /*x1*/,
|
|
||||||
int /*y1*/,
|
|
||||||
int /*len*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
/* afbigbblak.c */
|
|
||||||
|
|
||||||
extern void afbImageGlyphBlt (
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*x*/,
|
|
||||||
int /*y*/,
|
|
||||||
unsigned int /*nglyph*/,
|
|
||||||
CharInfoPtr * /*ppci*/,
|
|
||||||
pointer /*pglyphBase*/
|
|
||||||
);
|
|
||||||
/* afbigbwht.c */
|
|
||||||
|
|
||||||
/* afbimage.c */
|
|
||||||
|
|
||||||
extern void afbPutImage(
|
|
||||||
DrawablePtr /*dst*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*depth*/,
|
|
||||||
int /*x*/,
|
|
||||||
int /*y*/,
|
|
||||||
int /*w*/,
|
|
||||||
int /*h*/,
|
|
||||||
int /*leftPad*/,
|
|
||||||
int /*format*/,
|
|
||||||
char * /*pImage*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbGetImage(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
int /*sx*/,
|
|
||||||
int /*sy*/,
|
|
||||||
int /*w*/,
|
|
||||||
int /*h*/,
|
|
||||||
unsigned int /*format*/,
|
|
||||||
unsigned long /*planeMask*/,
|
|
||||||
char * /*pdstLine*/
|
|
||||||
);
|
|
||||||
/* afbline.c */
|
|
||||||
|
|
||||||
extern void afbLineSS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*mode*/,
|
|
||||||
int /*npt*/,
|
|
||||||
DDXPointPtr /*pptInit*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbLineSD(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*mode*/,
|
|
||||||
int /*npt*/,
|
|
||||||
DDXPointPtr /*pptInit*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbmisc.c */
|
|
||||||
|
|
||||||
extern void afbQueryBestSize(
|
|
||||||
int /*class*/,
|
|
||||||
unsigned short * /*pwidth*/,
|
|
||||||
unsigned short * /*pheight*/,
|
|
||||||
ScreenPtr /*pScreen*/
|
|
||||||
);
|
|
||||||
/* afbpntarea.c */
|
|
||||||
|
|
||||||
extern void afbSolidFillArea(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbStippleAreaPPW(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
PixmapPtr /*pstipple*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
extern void afbStippleArea(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
PixmapPtr /*pstipple*/,
|
|
||||||
int /*xOff*/,
|
|
||||||
int /*yOff*/,
|
|
||||||
unsigned char * /*rrops*/
|
|
||||||
);
|
|
||||||
/* afbplygblt.c */
|
|
||||||
|
|
||||||
extern void afbPolyGlyphBlt(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*x*/,
|
|
||||||
int /*y*/,
|
|
||||||
unsigned int /*nglyph*/,
|
|
||||||
CharInfoPtr * /*ppci*/,
|
|
||||||
pointer /*pglyphBase*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbpixmap.c */
|
|
||||||
|
|
||||||
extern PixmapPtr afbCreatePixmap(
|
|
||||||
ScreenPtr /*pScreen*/,
|
|
||||||
int /*width*/,
|
|
||||||
int /*height*/,
|
|
||||||
int /*depth*/,
|
|
||||||
unsigned /*usage_hint*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbDestroyPixmap(
|
|
||||||
PixmapPtr /*pPixmap*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbXRotatePixmap(
|
|
||||||
PixmapPtr /*pPix*/,
|
|
||||||
int /*rw*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbYRotatePixmap(
|
|
||||||
PixmapPtr /*pPix*/,
|
|
||||||
int /*rh*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbCopyRotatePixmap(
|
|
||||||
PixmapPtr /*psrcPix*/,
|
|
||||||
PixmapPtr * /*ppdstPix*/,
|
|
||||||
int /*xrot*/,
|
|
||||||
int /*yrot*/
|
|
||||||
);
|
|
||||||
/* afbpolypnt.c */
|
|
||||||
|
|
||||||
extern void afbPolyPoint(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*mode*/,
|
|
||||||
int /*npt*/,
|
|
||||||
xPoint * /*pptInit*/
|
|
||||||
);
|
|
||||||
/* afbpushpxl.c */
|
|
||||||
|
|
||||||
extern void afbPushPixels(
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
PixmapPtr /*pBitMap*/,
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
int /*dx*/,
|
|
||||||
int /*dy*/,
|
|
||||||
int /*xOrg*/,
|
|
||||||
int /*yOrg*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbscrinit.c */
|
|
||||||
|
|
||||||
extern Bool afbScreenInit(
|
|
||||||
ScreenPtr /*pScreen*/,
|
|
||||||
pointer /*pbits*/,
|
|
||||||
int /*xsize*/,
|
|
||||||
int /*ysize*/,
|
|
||||||
int /*dpix*/,
|
|
||||||
int /*dpiy*/,
|
|
||||||
int /*width*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbseg.c */
|
|
||||||
|
|
||||||
extern void afbSegmentSS(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*nseg*/,
|
|
||||||
xSegment * /*pSeg*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbSegmentSD(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*nseg*/,
|
|
||||||
xSegment * /*pSeg*/
|
|
||||||
);
|
|
||||||
/* afbsetsp.c */
|
|
||||||
|
|
||||||
extern void afbSetSpans(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
char * /*psrc*/,
|
|
||||||
DDXPointPtr /*ppt*/,
|
|
||||||
int * /*pwidth*/,
|
|
||||||
int /*nspans*/,
|
|
||||||
int /*fSorted*/
|
|
||||||
);
|
|
||||||
/* afbtegblt.c */
|
|
||||||
|
|
||||||
extern void afbTEGlyphBlt(
|
|
||||||
DrawablePtr /*pDrawable*/,
|
|
||||||
GCPtr/*pGC*/,
|
|
||||||
int /*x*/,
|
|
||||||
int /*y*/,
|
|
||||||
unsigned int /*nglyph*/,
|
|
||||||
CharInfoPtr * /*ppci*/,
|
|
||||||
pointer /*pglyphBase*/
|
|
||||||
);
|
|
||||||
/* afbtileC.c */
|
|
||||||
|
|
||||||
extern void afbTileAreaPPWCopy(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbtileG.c */
|
|
||||||
|
|
||||||
extern void afbTileAreaPPWGeneral(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbTileAreaCopy(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
int /*xOff*/,
|
|
||||||
int /*yOff*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbtileG.c */
|
|
||||||
|
|
||||||
extern void afbTileAreaGeneral(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
int /*xOff*/,
|
|
||||||
int /*yOff*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbOpaqueStippleAreaPPWCopy(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
unsigned char */*rropsOS*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbtileG.c */
|
|
||||||
|
|
||||||
extern void afbOpaqueStippleAreaPPWGeneral(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
unsigned char */*rropsOS*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbOpaqueStippleAreaCopy(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
int /*xOff*/,
|
|
||||||
int /*yOff*/,
|
|
||||||
unsigned char */*rropsOS*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
/* afbtileG.c */
|
|
||||||
|
|
||||||
extern void afbOpaqueStippleAreaGeneral(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
int /*nbox*/,
|
|
||||||
BoxPtr /*pbox*/,
|
|
||||||
int /*alu*/,
|
|
||||||
PixmapPtr /*ptile*/,
|
|
||||||
int /*xOff*/,
|
|
||||||
int /*yOff*/,
|
|
||||||
unsigned char */*rropsOS*/,
|
|
||||||
unsigned long /*planemask*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/* afbwindow.c */
|
|
||||||
|
|
||||||
extern Bool afbCreateWindow(
|
|
||||||
WindowPtr /*pWin*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbDestroyWindow(
|
|
||||||
WindowPtr /*pWin*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbMapWindow(
|
|
||||||
WindowPtr /*pWindow*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbPositionWindow(
|
|
||||||
WindowPtr /*pWin*/,
|
|
||||||
int /*x*/,
|
|
||||||
int /*y*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbUnmapWindow(
|
|
||||||
WindowPtr /*pWindow*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void afbCopyWindow(
|
|
||||||
WindowPtr /*pWin*/,
|
|
||||||
DDXPointRec /*ptOldOrg*/,
|
|
||||||
RegionPtr /*prgnSrc*/
|
|
||||||
);
|
|
||||||
|
|
||||||
extern Bool afbChangeWindowAttributes(
|
|
||||||
WindowPtr /*pWin*/,
|
|
||||||
unsigned long /*mask*/
|
|
||||||
);
|
|
||||||
/* afbzerarc.c */
|
|
||||||
|
|
||||||
extern void afbZeroPolyArcSS(
|
|
||||||
DrawablePtr /*pDraw*/,
|
|
||||||
GCPtr /*pGC*/,
|
|
||||||
int /*narcs*/,
|
|
||||||
xArc * /*parcs*/
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
|
||||||
private field of pixmap
|
|
||||||
pixmap.devPrivate = (PixelType *)pointer_to_bits
|
|
||||||
pixmap.devKind = width_of_pixmap_in_bytes
|
|
||||||
|
|
||||||
private field of screen
|
|
||||||
a pixmap, for which we allocate storage. devPrivate is a pointer to
|
|
||||||
the bits in the hardware framebuffer. note that devKind can be poked to
|
|
||||||
make the code work for framebuffers that are wider than their
|
|
||||||
displayable screen (e.g. the early vsII, which displayed 960 pixels
|
|
||||||
across, but was 1024 in the hardware.)
|
|
||||||
|
|
||||||
private field of GC
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char rrops[AFB_MAX_DEPTH]; /* reduction of rasterop to 1 of 3 */
|
|
||||||
unsigned char rropOS[AFB_MAX_DEPTH]; /* rop for opaque stipple */
|
|
||||||
} afbPrivGC;
|
|
||||||
typedef afbPrivGC *afbPrivGCPtr;
|
|
||||||
|
|
||||||
extern DevPrivateKey afbScreenPrivateKey;
|
|
||||||
extern DevPrivateKey afbGCPrivateKey;
|
|
||||||
extern DevPrivateKey afbWindowPrivateKey;
|
|
||||||
#ifdef PIXMAP_PER_WINDOW
|
|
||||||
extern DevPrivateKey frameWindowPrivateKey;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define afbGetGCPrivate(pGC) \
|
|
||||||
((afbPrivGC *)dixLookupPrivate(&(pGC)->devPrivates, afbGCPrivateKey))
|
|
||||||
|
|
||||||
/* Common macros for extracting drawing information */
|
|
||||||
|
|
||||||
#define afbGetTypedWidth(pDrawable,wtype)( \
|
|
||||||
(((pDrawable)->type == DRAWABLE_WINDOW) ? \
|
|
||||||
(int)(((PixmapPtr)dixLookupPrivate(&(pDrawable)->pScreen->devPrivates, afbScreenPrivateKey)->devKind) : \
|
|
||||||
(int)(((PixmapPtr)pDrawable)->devKind)) / sizeof (wtype))
|
|
||||||
|
|
||||||
#define afbGetByteWidth(pDrawable) afbGetTypedWidth(pDrawable, unsigned char)
|
|
||||||
|
|
||||||
#define afbGetPixelWidth(pDrawable) afbGetTypedWidth(pDrawable, PixelType)
|
|
||||||
|
|
||||||
#define afbGetTypedWidthAndPointer(pDrawable, width, pointer, wtype, ptype) {\
|
|
||||||
PixmapPtr _pPix; \
|
|
||||||
if ((pDrawable)->type == DRAWABLE_WINDOW) \
|
|
||||||
_pPix = (PixmapPtr)dixLookupPrivate(&(pDrawable)->pScreen->devPrivates, afbScreenPrivateKey); \
|
|
||||||
else \
|
|
||||||
_pPix = (PixmapPtr)(pDrawable); \
|
|
||||||
(pointer) = (ptype *) _pPix->devPrivate.ptr; \
|
|
||||||
(width) = ((int) _pPix->devKind) / sizeof (wtype); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define afbGetPixelWidthSizeDepthAndPointer(pDrawable, width, size, dep, pointer) {\
|
|
||||||
PixmapPtr _pPix; \
|
|
||||||
if ((pDrawable)->type == DRAWABLE_WINDOW) \
|
|
||||||
_pPix = (PixmapPtr)dixLookupPrivate(&(pDrawable)->pScreen->devPrivates, afbScreenPrivateKey); \
|
|
||||||
else \
|
|
||||||
_pPix = (PixmapPtr)(pDrawable); \
|
|
||||||
(pointer) = (PixelType *)_pPix->devPrivate.ptr; \
|
|
||||||
(width) = ((int)_pPix->devKind) / sizeof (PixelType); \
|
|
||||||
(size) = (width) * _pPix->drawable.height; \
|
|
||||||
(dep) = _pPix->drawable.depth; (void)(dep); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define afbGetByteWidthAndPointer(pDrawable, width, pointer) \
|
|
||||||
afbGetTypedWidthAndPointer(pDrawable, width, pointer, unsigned char, unsigned char)
|
|
||||||
|
|
||||||
#define afbGetPixelWidthAndPointer(pDrawable, width, pointer) \
|
|
||||||
afbGetTypedWidthAndPointer(pDrawable, width, pointer, PixelType, PixelType)
|
|
||||||
|
|
||||||
#define afbGetWindowTypedWidthAndPointer(pWin, width, pointer, wtype, ptype) {\
|
|
||||||
PixmapPtr _pPix = (PixmapPtr)dixLookupPrivate(&(pWin)->drawable.pScreen->devPrivates, afbScreenPrivateKey); \
|
|
||||||
(pointer) = (ptype *) _pPix->devPrivate.ptr; \
|
|
||||||
(width) = ((int) _pPix->devKind) / sizeof (wtype); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define afbGetWindowPixelWidthAndPointer(pWin, width, pointer) \
|
|
||||||
afbGetWindowTypedWidthAndPointer(pWin, width, pointer, PixelType, PixelType)
|
|
||||||
|
|
||||||
#define afbGetWindowByteWidthAndPointer(pWin, width, pointer) \
|
|
||||||
afbGetWindowTypedWidthAndPointer(pWin, width, pointer, char, char)
|
|
||||||
|
|
||||||
/* afb uses the following macros to calculate addresses in drawables.
|
|
||||||
* To support banked framebuffers, the macros come in four flavors.
|
|
||||||
* All four collapse into the same definition on unbanked devices.
|
|
||||||
*
|
|
||||||
* afbScanlineFoo - calculate address and do bank switching
|
|
||||||
* afbScanlineFooNoBankSwitch - calculate address, don't bank switch
|
|
||||||
* afbScanlineFooSrc - calculate address, switch source bank
|
|
||||||
* afbScanlineFooDst - calculate address, switch destination bank
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The NoBankSwitch versions are the same for banked and unbanked cases */
|
|
||||||
|
|
||||||
#define afbScanlineIncNoBankSwitch(_ptr, _off) _ptr += (_off)
|
|
||||||
#define afbScanlineOffsetNoBankSwitch(_ptr, _off) ((_ptr) + (_off))
|
|
||||||
#define afbScanlineDeltaNoBankSwitch(_ptr, _y, _w) \
|
|
||||||
afbScanlineOffsetNoBankSwitch(_ptr, (_y) * (_w))
|
|
||||||
#define afbScanlineNoBankSwitch(_ptr, _x, _y, _w) \
|
|
||||||
afbScanlineOffsetNoBankSwitch(_ptr, (_y) * (_w) + ((_x) >> MFB_PWSH))
|
|
||||||
|
|
||||||
#ifdef MFB_LINE_BANK
|
|
||||||
|
|
||||||
#include "afblinebank.h" /* get macro definitions from this file */
|
|
||||||
|
|
||||||
#else /* !MFB_LINE_BANK - unbanked case */
|
|
||||||
|
|
||||||
#define afbScanlineInc(_ptr, _off) afbScanlineIncNoBankSwitch(_ptr, _off)
|
|
||||||
#define afbScanlineIncSrc(_ptr, _off) afbScanlineInc(_ptr, _off)
|
|
||||||
#define afbScanlineIncDst(_ptr, _off) afbScanlineInc(_ptr, _off)
|
|
||||||
|
|
||||||
#define afbScanlineOffset(_ptr, _off) afbScanlineOffsetNoBankSwitch(_ptr, _off)
|
|
||||||
#define afbScanlineOffsetSrc(_ptr, _off) afbScanlineOffset(_ptr, _off)
|
|
||||||
#define afbScanlineOffsetDst(_ptr, _off) afbScanlineOffset(_ptr, _off)
|
|
||||||
|
|
||||||
#define afbScanlineSrc(_ptr, _x, _y, _w) afbScanline(_ptr, _x, _y, _w)
|
|
||||||
#define afbScanlineDst(_ptr, _x, _y, _w) afbScanline(_ptr, _x, _y, _w)
|
|
||||||
|
|
||||||
#define afbScanlineDeltaSrc(_ptr, _y, _w) afbScanlineDelta(_ptr, _y, _w)
|
|
||||||
#define afbScanlineDeltaDst(_ptr, _y, _w) afbScanlineDelta(_ptr, _y, _w)
|
|
||||||
|
|
||||||
#endif /* MFB_LINE_BANK */
|
|
||||||
|
|
||||||
#define afbScanlineDelta(_ptr, _y, _w) \
|
|
||||||
afbScanlineOffset(_ptr, (_y) * (_w))
|
|
||||||
|
|
||||||
#define afbScanline(_ptr, _x, _y, _w) \
|
|
||||||
afbScanlineOffset(_ptr, (_y) * (_w) + ((_x) >> MFB_PWSH))
|
|
||||||
|
|
||||||
/* precomputed information about each glyph for GlyphBlt code.
|
|
||||||
this saves recalculating the per glyph information for each box.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _afbpos{
|
|
||||||
int xpos; /* xposition of glyph's origin */
|
|
||||||
int xchar; /* x position mod 32 */
|
|
||||||
int leftEdge;
|
|
||||||
int rightEdge;
|
|
||||||
int topEdge;
|
|
||||||
int bottomEdge;
|
|
||||||
PixelType *pdstBase; /* longword with character origin */
|
|
||||||
int widthGlyph; /* width in bytes of this glyph */
|
|
||||||
} afbTEXTPOS;
|
|
||||||
|
|
||||||
/* reduced raster ops for afb */
|
|
||||||
#define RROP_BLACK GXclear
|
|
||||||
#define RROP_WHITE GXset
|
|
||||||
#define RROP_NOP GXnoop
|
|
||||||
#define RROP_INVERT GXinvert
|
|
||||||
#define RROP_COPY GXcopy
|
|
||||||
|
|
||||||
/* macros for afbbitblt.c, afbfillsp.c
|
|
||||||
these let the code do one switch on the rop per call, rather
|
|
||||||
than a switch on the rop per item (span or rectangle.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define fnCLEAR(src, dst) (0)
|
|
||||||
#define fnAND(src, dst) (src & dst)
|
|
||||||
#define fnANDREVERSE(src, dst) (src & ~dst)
|
|
||||||
#define fnCOPY(src, dst) (src)
|
|
||||||
#define fnANDINVERTED(src, dst) (~src & dst)
|
|
||||||
#define fnNOOP(src, dst) (dst)
|
|
||||||
#define fnXOR(src, dst) (src ^ dst)
|
|
||||||
#define fnOR(src, dst) (src | dst)
|
|
||||||
#define fnNOR(src, dst) (~(src | dst))
|
|
||||||
#define fnEQUIV(src, dst) (~src ^ dst)
|
|
||||||
#define fnINVERT(src, dst) (~dst)
|
|
||||||
#define fnORREVERSE(src, dst) (src | ~dst)
|
|
||||||
#define fnCOPYINVERTED(src, dst) (~src)
|
|
||||||
#define fnORINVERTED(src, dst) (~src | dst)
|
|
||||||
#define fnNAND(src, dst) (~(src & dst))
|
|
||||||
#undef fnSET
|
|
||||||
#define fnSET(src, dst) (~0)
|
|
||||||
|
|
||||||
/* Using a "switch" statement is much faster in most cases
|
|
||||||
* since the compiler can do a look-up table or multi-way branch
|
|
||||||
* instruction, depending on the architecture. The result on
|
|
||||||
* A Sun 3/50 is at least 2.5 times faster, assuming a uniform
|
|
||||||
* distribution of RasterOp operation types.
|
|
||||||
*
|
|
||||||
* However, doing some profiling on a running system reveals
|
|
||||||
* GXcopy is the operation over 99.5% of the time and
|
|
||||||
* GXxor is the next most frequent (about .4%), so we make special
|
|
||||||
* checks for those first.
|
|
||||||
*
|
|
||||||
* Note that this requires a change to the "calling sequence"
|
|
||||||
* since we can't engineer a "switch" statement to have an lvalue.
|
|
||||||
*/
|
|
||||||
#undef DoRop
|
|
||||||
#define DoRop(result, alu, src, dst) \
|
|
||||||
{ \
|
|
||||||
if (alu == GXcopy) \
|
|
||||||
result = fnCOPY (src, dst); \
|
|
||||||
else if (alu == GXxor) \
|
|
||||||
result = fnXOR (src, dst); \
|
|
||||||
else \
|
|
||||||
switch (alu) { \
|
|
||||||
case GXclear: \
|
|
||||||
result = fnCLEAR (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXand: \
|
|
||||||
result = fnAND (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXandReverse: \
|
|
||||||
result = fnANDREVERSE (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXandInverted: \
|
|
||||||
result = fnANDINVERTED (src, dst); \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
case GXnoop: \
|
|
||||||
result = fnNOOP (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXor: \
|
|
||||||
result = fnOR (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXnor: \
|
|
||||||
result = fnNOR (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXequiv: \
|
|
||||||
result = fnEQUIV (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXinvert: \
|
|
||||||
result = fnINVERT (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXorReverse: \
|
|
||||||
result = fnORREVERSE (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXcopyInverted: \
|
|
||||||
result = fnCOPYINVERTED (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXorInverted: \
|
|
||||||
result = fnORINVERTED (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXnand: \
|
|
||||||
result = fnNAND (src, dst); \
|
|
||||||
break; \
|
|
||||||
case GXset: \
|
|
||||||
result = fnSET (src, dst); \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* C expression fragments for various operations. These get passed in
|
|
||||||
* as -D's on the compile command line. See afb/Imakefile. This
|
|
||||||
* fixes XBUG 6319.
|
|
||||||
*
|
|
||||||
* This seems like a good place to point out that afb's use of the
|
|
||||||
* words black and white is an unfortunate misnomer. In afb code, black
|
|
||||||
* means zero, and white means one.
|
|
||||||
*/
|
|
||||||
#define MFB_OPEQ_WHITE |=
|
|
||||||
#define MFB_OPEQ_BLACK &=~
|
|
||||||
#define MFB_OPEQ_INVERT ^=
|
|
||||||
#define MFB_EQWHOLEWORD_WHITE =~0
|
|
||||||
#define MFB_EQWHOLEWORD_BLACK =0
|
|
||||||
#define MFB_EQWHOLEWORD_INVERT ^=~0
|
|
||||||
#define MFB_OP_WHITE /* nothing */
|
|
||||||
#define MFB_OP_BLACK ~
|
|
343
afb/afbbitblt.c
343
afb/afbbitblt.c
|
@ -1,343 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xprotostr.h>
|
|
||||||
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "mi.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/* CopyArea and CopyPlane for a monchrome frame buffer
|
|
||||||
|
|
||||||
|
|
||||||
clip the source rectangle to the source's available bits. (this
|
|
||||||
avoids copying unnecessary pieces that will just get exposed anyway.)
|
|
||||||
this becomes the new shape of the destination.
|
|
||||||
clip the destination region to the composite clip in the
|
|
||||||
GC. this requires translating the destination region to (dstx, dsty).
|
|
||||||
build a list of source points, one for each rectangle in the
|
|
||||||
destination. this is a simple translation.
|
|
||||||
go do the multiple rectangle copies
|
|
||||||
do graphics exposures
|
|
||||||
*/
|
|
||||||
/** Optimized for drawing pixmaps into windows, especially when drawing into
|
|
||||||
** unobscured windows. Calls to the general-purpose region code were
|
|
||||||
** replaced with rectangle-to-rectangle clipping comparisions. This is
|
|
||||||
** possible, since the pixmap is a single rectangle. In an unobscured
|
|
||||||
** window, the destination clip is also a single rectangle, and region
|
|
||||||
** code can be avoided entirely. This is a big savings, since the region
|
|
||||||
** code uses XAlloc() and makes many function calls.
|
|
||||||
**
|
|
||||||
** In addition, if source is a pixmap, there is no need to call the
|
|
||||||
** expensive miHandleExposures() routine. Instead, we simply return NULL.
|
|
||||||
**
|
|
||||||
** Previously, drawing a pixmap into an unobscured window executed at least
|
|
||||||
** 8 XAlloc()'s, 30 function calls, and hundreds of lines of code.
|
|
||||||
**
|
|
||||||
** Now, the same operation requires no XAlloc()'s, no region function calls,
|
|
||||||
** and much less overhead. Nice for drawing lots of small pixmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
afbDoBitblt(DrawablePtr pSrc, DrawablePtr pDst, int alu, RegionPtr prgnDst, DDXPointPtr pptSrc, long unsigned int planemask)
|
|
||||||
{
|
|
||||||
switch (alu) {
|
|
||||||
case GXcopy:
|
|
||||||
afbDoBitbltCopy(pSrc, pDst, alu, prgnDst, pptSrc, planemask);
|
|
||||||
break;
|
|
||||||
case GXxor:
|
|
||||||
afbDoBitbltXor(pSrc, pDst, alu, prgnDst, pptSrc, planemask);
|
|
||||||
break;
|
|
||||||
case GXcopyInverted:
|
|
||||||
afbDoBitbltCopyInverted(pSrc, pDst, alu, prgnDst, pptSrc, planemask);
|
|
||||||
break;
|
|
||||||
case GXor:
|
|
||||||
afbDoBitbltOr(pSrc, pDst, alu, prgnDst, pptSrc, planemask);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
afbDoBitbltGeneral(pSrc, pDst, alu, prgnDst, pptSrc, planemask);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef void (*afb_blit_func)
|
|
||||||
(DrawablePtr, DrawablePtr, int, RegionPtr, DDXPointPtr, unsigned long);
|
|
||||||
|
|
||||||
static RegionPtr
|
|
||||||
afbBitBlt(register DrawablePtr pSrcDrawable, register DrawablePtr pDstDrawable, register GC *pGC, int srcx, int srcy, int width, int height, int dstx, int dsty, afb_blit_func doBitBlt, long unsigned int planemask)
|
|
||||||
{
|
|
||||||
RegionPtr prgnSrcClip = NULL; /* may be a new region, or just a copy */
|
|
||||||
Bool freeSrcClip = FALSE;
|
|
||||||
|
|
||||||
RegionPtr prgnExposed;
|
|
||||||
RegionRec rgnDst;
|
|
||||||
DDXPointPtr pptSrc;
|
|
||||||
register DDXPointPtr ppt;
|
|
||||||
register BoxPtr pbox;
|
|
||||||
int i;
|
|
||||||
register int dx;
|
|
||||||
register int dy;
|
|
||||||
xRectangle origSource;
|
|
||||||
DDXPointRec origDest;
|
|
||||||
int numRects;
|
|
||||||
BoxRec fastBox;
|
|
||||||
int fastClip = 0; /* for fast clipping with pixmap source */
|
|
||||||
int fastExpose = 0; /* for fast exposures with pixmap source */
|
|
||||||
|
|
||||||
origSource.x = srcx;
|
|
||||||
origSource.y = srcy;
|
|
||||||
origSource.width = width;
|
|
||||||
origSource.height = height;
|
|
||||||
origDest.x = dstx;
|
|
||||||
origDest.y = dsty;
|
|
||||||
|
|
||||||
if ((pSrcDrawable != pDstDrawable) && pSrcDrawable->pScreen->SourceValidate)
|
|
||||||
(*pSrcDrawable->pScreen->SourceValidate)(pSrcDrawable, srcx, srcy, width,
|
|
||||||
height);
|
|
||||||
|
|
||||||
srcx += pSrcDrawable->x;
|
|
||||||
srcy += pSrcDrawable->y;
|
|
||||||
|
|
||||||
/* clip the source */
|
|
||||||
|
|
||||||
if (pSrcDrawable->type == DRAWABLE_PIXMAP)
|
|
||||||
if ((pSrcDrawable == pDstDrawable) && (pGC->clientClipType == CT_NONE))
|
|
||||||
prgnSrcClip = pGC->pCompositeClip;
|
|
||||||
else
|
|
||||||
fastClip = 1;
|
|
||||||
else if (pGC->subWindowMode == IncludeInferiors)
|
|
||||||
if (!((WindowPtr)pSrcDrawable)->parent)
|
|
||||||
/*
|
|
||||||
* special case bitblt from root window in
|
|
||||||
* IncludeInferiors mode; just like from a pixmap
|
|
||||||
*/
|
|
||||||
fastClip = 1;
|
|
||||||
else if ((pSrcDrawable == pDstDrawable) && (pGC->clientClipType == CT_NONE))
|
|
||||||
prgnSrcClip = pGC->pCompositeClip;
|
|
||||||
else {
|
|
||||||
prgnSrcClip = NotClippedByChildren((WindowPtr)pSrcDrawable);
|
|
||||||
freeSrcClip = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
prgnSrcClip = &((WindowPtr)pSrcDrawable)->clipList;
|
|
||||||
|
|
||||||
fastBox.x1 = srcx;
|
|
||||||
fastBox.y1 = srcy;
|
|
||||||
fastBox.x2 = srcx + width;
|
|
||||||
fastBox.y2 = srcy + height;
|
|
||||||
|
|
||||||
/* Don't create a source region if we are doing a fast clip */
|
|
||||||
if (fastClip) {
|
|
||||||
fastExpose = 1;
|
|
||||||
/*
|
|
||||||
* clip the source; if regions extend beyond the source size,
|
|
||||||
* make sure exposure events get sent
|
|
||||||
*/
|
|
||||||
if (fastBox.x1 < pSrcDrawable->x) {
|
|
||||||
fastBox.x1 = pSrcDrawable->x;
|
|
||||||
fastExpose = 0;
|
|
||||||
}
|
|
||||||
if (fastBox.y1 < pSrcDrawable->y) {
|
|
||||||
fastBox.y1 = pSrcDrawable->y;
|
|
||||||
fastExpose = 0;
|
|
||||||
}
|
|
||||||
if (fastBox.x2 > pSrcDrawable->x + (int)pSrcDrawable->width) {
|
|
||||||
fastBox.x2 = pSrcDrawable->x + (int)pSrcDrawable->width;
|
|
||||||
fastExpose = 0;
|
|
||||||
}
|
|
||||||
if (fastBox.y2 > pSrcDrawable->y + (int)pSrcDrawable->height) {
|
|
||||||
fastBox.y2 = pSrcDrawable->y + (int)pSrcDrawable->height;
|
|
||||||
fastExpose = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
REGION_INIT(pGC->pScreen, &rgnDst, &fastBox, 1);
|
|
||||||
REGION_INTERSECT(pGC->pScreen, &rgnDst, &rgnDst, prgnSrcClip);
|
|
||||||
}
|
|
||||||
|
|
||||||
dstx += pDstDrawable->x;
|
|
||||||
dsty += pDstDrawable->y;
|
|
||||||
|
|
||||||
if (pDstDrawable->type == DRAWABLE_WINDOW)
|
|
||||||
if (!((WindowPtr)pDstDrawable)->realized) {
|
|
||||||
if (!fastClip)
|
|
||||||
REGION_UNINIT(pGC->pScreen, &rgnDst);
|
|
||||||
if (freeSrcClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, prgnSrcClip);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dx = srcx - dstx;
|
|
||||||
dy = srcy - dsty;
|
|
||||||
|
|
||||||
/* Translate and clip the dst to the destination composite clip */
|
|
||||||
if (fastClip) {
|
|
||||||
RegionPtr cclip;
|
|
||||||
|
|
||||||
/* Translate the region directly */
|
|
||||||
fastBox.x1 -= dx;
|
|
||||||
fastBox.x2 -= dx;
|
|
||||||
fastBox.y1 -= dy;
|
|
||||||
fastBox.y2 -= dy;
|
|
||||||
|
|
||||||
/* If the destination composite clip is one rectangle we can
|
|
||||||
do the clip directly. Otherwise we have to create a full
|
|
||||||
blown region and call intersect */
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
if (REGION_NUM_RECTS(cclip) == 1) {
|
|
||||||
BoxPtr pBox = REGION_RECTS(cclip);
|
|
||||||
|
|
||||||
if (fastBox.x1 < pBox->x1)
|
|
||||||
fastBox.x1 = pBox->x1;
|
|
||||||
if (fastBox.x2 > pBox->x2)
|
|
||||||
fastBox.x2 = pBox->x2;
|
|
||||||
if (fastBox.y1 < pBox->y1)
|
|
||||||
fastBox.y1 = pBox->y1;
|
|
||||||
if (fastBox.y2 > pBox->y2)
|
|
||||||
fastBox.y2 = pBox->y2;
|
|
||||||
|
|
||||||
/* Check to see if the region is empty */
|
|
||||||
if (fastBox.x1 >= fastBox.x2 || fastBox.y1 >= fastBox.y2) {
|
|
||||||
REGION_NULL(pGC->pScreen, &rgnDst);
|
|
||||||
} else {
|
|
||||||
REGION_INIT(pGC->pScreen, &rgnDst, &fastBox, 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* We must turn off fastClip now, since we must create
|
|
||||||
a full blown region. It is intersected with the
|
|
||||||
composite clip below. */
|
|
||||||
fastClip = 0;
|
|
||||||
REGION_INIT(pGC->pScreen, &rgnDst, &fastBox,1);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
REGION_TRANSLATE(pGC->pScreen, &rgnDst, -dx, -dy);
|
|
||||||
|
|
||||||
if (!fastClip) {
|
|
||||||
REGION_INTERSECT(pGC->pScreen, &rgnDst, &rgnDst,
|
|
||||||
pGC->pCompositeClip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do bit blitting */
|
|
||||||
numRects = REGION_NUM_RECTS(&rgnDst);
|
|
||||||
if (numRects && width && height) {
|
|
||||||
if(!(pptSrc = (DDXPointPtr)xalloc(numRects *
|
|
||||||
sizeof(DDXPointRec)))) {
|
|
||||||
REGION_UNINIT(pGC->pScreen, &rgnDst);
|
|
||||||
if (freeSrcClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, prgnSrcClip);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
pbox = REGION_RECTS(&rgnDst);
|
|
||||||
ppt = pptSrc;
|
|
||||||
for (i = numRects; --i >= 0; pbox++, ppt++) {
|
|
||||||
ppt->x = pbox->x1 + dx;
|
|
||||||
ppt->y = pbox->y1 + dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*doBitBlt)(pSrcDrawable, pDstDrawable, pGC->alu, &rgnDst, pptSrc,
|
|
||||||
planemask);
|
|
||||||
|
|
||||||
xfree(pptSrc);
|
|
||||||
}
|
|
||||||
|
|
||||||
prgnExposed = NULL;
|
|
||||||
if (pGC->fExpose) {
|
|
||||||
/* Pixmap sources generate a NoExposed (we return NULL to do this) */
|
|
||||||
if (!fastExpose)
|
|
||||||
prgnExposed = miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
|
|
||||||
origSource.x, origSource.y,
|
|
||||||
(int)origSource.width,
|
|
||||||
(int)origSource.height, origDest.x,
|
|
||||||
origDest.y, (unsigned long)0);
|
|
||||||
}
|
|
||||||
REGION_UNINIT(pGC->pScreen, &rgnDst);
|
|
||||||
if (freeSrcClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, prgnSrcClip);
|
|
||||||
return prgnExposed;
|
|
||||||
}
|
|
||||||
|
|
||||||
RegionPtr
|
|
||||||
afbCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GC *pGC, int srcx, int srcy, int width, int height, int dstx, int dsty)
|
|
||||||
{
|
|
||||||
afb_blit_func doBitBlt;
|
|
||||||
|
|
||||||
switch (pGC->alu) {
|
|
||||||
case GXcopy:
|
|
||||||
doBitBlt = afbDoBitbltCopy;
|
|
||||||
break;
|
|
||||||
case GXxor:
|
|
||||||
doBitBlt = afbDoBitbltXor;
|
|
||||||
break;
|
|
||||||
case GXcopyInverted:
|
|
||||||
doBitBlt = afbDoBitbltCopyInverted;
|
|
||||||
break;
|
|
||||||
case GXor:
|
|
||||||
doBitBlt = afbDoBitbltOr;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
doBitBlt = afbDoBitbltGeneral;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(afbBitBlt(pSrcDrawable, pDstDrawable, pGC, srcx, srcy,
|
|
||||||
width, height, dstx, dsty, doBitBlt, pGC->planemask));
|
|
||||||
}
|
|
563
afb/afbblt.c
563
afb/afbblt.c
|
@ -1,563 +0,0 @@
|
||||||
/*
|
|
||||||
* afb copy area
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Copyright (c) 1989 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
Author: Keith Packard
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "fastblt.h"
|
|
||||||
#include "mergerop.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
MROP_NAME(afbDoBitblt)(pSrc, pDst, alu, prgnDst, pptSrc, planemask)
|
|
||||||
DrawablePtr pSrc, pDst;
|
|
||||||
int alu;
|
|
||||||
RegionPtr prgnDst;
|
|
||||||
DDXPointPtr pptSrc;
|
|
||||||
unsigned long planemask;
|
|
||||||
{
|
|
||||||
PixelType *psrcBase, *pdstBase; /* start of src and dst bitmaps */
|
|
||||||
int widthSrc, widthDst; /* add to get to same position in next line */
|
|
||||||
int sizeSrc, sizeDst;
|
|
||||||
|
|
||||||
BoxPtr pbox;
|
|
||||||
int nbox;
|
|
||||||
|
|
||||||
BoxPtr pboxTmp, pboxNext, pboxBase, pboxNew1, pboxNew2;
|
|
||||||
/* temporaries for shuffling rectangles */
|
|
||||||
DDXPointPtr pptTmp, pptNew1, pptNew2;
|
|
||||||
/* shuffling boxes entails shuffling the
|
|
||||||
source points too */
|
|
||||||
int w, h;
|
|
||||||
int xdir; /* 1 = left right, -1 = right left/ */
|
|
||||||
int ydir; /* 1 = top down, -1 = bottom up */
|
|
||||||
|
|
||||||
PixelType *psrcLine, *pdstLine;
|
|
||||||
/* pointers to line with current src and dst */
|
|
||||||
register PixelType *psrc; /* pointer to current src longword */
|
|
||||||
register PixelType *pdst; /* pointer to current dst longword */
|
|
||||||
|
|
||||||
MROP_DECLARE_REG()
|
|
||||||
|
|
||||||
/* following used for looping through a line */
|
|
||||||
PixelType startmask, endmask; /* masks for writing ends of dst */
|
|
||||||
int nlMiddle; /* whole longwords in dst */
|
|
||||||
int xoffSrc, xoffDst;
|
|
||||||
register int leftShift, rightShift;
|
|
||||||
register PixelType bits;
|
|
||||||
register PixelType bits1;
|
|
||||||
register int nl; /* temp copy of nlMiddle */
|
|
||||||
|
|
||||||
int careful;
|
|
||||||
int depthSrc;
|
|
||||||
int depthDst;
|
|
||||||
|
|
||||||
MROP_INITIALIZE(alu,0);
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pSrc, widthSrc, sizeSrc, depthSrc,
|
|
||||||
psrcBase);
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDst, widthDst, sizeDst, depthDst,
|
|
||||||
pdstBase);
|
|
||||||
|
|
||||||
/* Special case where depth of dest pixmap is 1 but source pixmap isn't
|
|
||||||
* Used for GetImage to copy a plane from a source pixmap to a particular
|
|
||||||
* dest pixmap plane.
|
|
||||||
* Note: planemask should have only one bit set or several planes from
|
|
||||||
* the source will be copied to the same dest plane.
|
|
||||||
*/
|
|
||||||
if (depthDst == 1 && depthDst != depthSrc)
|
|
||||||
sizeDst = 0;
|
|
||||||
|
|
||||||
/* XXX we have to err on the side of safety when both are windows,
|
|
||||||
* because we don't know if IncludeInferiors is being used.
|
|
||||||
*/
|
|
||||||
careful = ((pSrc == pDst) ||
|
|
||||||
((pSrc->type == DRAWABLE_WINDOW) &&
|
|
||||||
(pDst->type == DRAWABLE_WINDOW)));
|
|
||||||
|
|
||||||
pbox = REGION_RECTS(prgnDst);
|
|
||||||
nbox = REGION_NUM_RECTS(prgnDst);
|
|
||||||
|
|
||||||
pboxNew1 = NULL;
|
|
||||||
pptNew1 = NULL;
|
|
||||||
pboxNew2 = NULL;
|
|
||||||
pptNew2 = NULL;
|
|
||||||
if (careful && (pptSrc->y < pbox->y1)) {
|
|
||||||
/* walk source botttom to top */
|
|
||||||
ydir = -1;
|
|
||||||
widthSrc = -widthSrc;
|
|
||||||
widthDst = -widthDst;
|
|
||||||
|
|
||||||
if (nbox > 1) {
|
|
||||||
/* keep ordering in each band, reverse order of bands */
|
|
||||||
pboxNew1 = (BoxPtr)xalloc(sizeof(BoxRec)*nbox);
|
|
||||||
if(!pboxNew1)
|
|
||||||
return;
|
|
||||||
pptNew1 = (DDXPointPtr)xalloc(sizeof(DDXPointRec)*nbox);
|
|
||||||
if(!pptNew1) {
|
|
||||||
xfree(pboxNew1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pboxBase = pboxNext = pbox+nbox-1;
|
|
||||||
while (pboxBase >= pbox) {
|
|
||||||
while ((pboxNext >= pbox) &&
|
|
||||||
(pboxBase->y1 == pboxNext->y1))
|
|
||||||
pboxNext--;
|
|
||||||
pboxTmp = pboxNext+1;
|
|
||||||
pptTmp = pptSrc + (pboxTmp - pbox);
|
|
||||||
while (pboxTmp <= pboxBase) {
|
|
||||||
*pboxNew1++ = *pboxTmp++;
|
|
||||||
*pptNew1++ = *pptTmp++;
|
|
||||||
}
|
|
||||||
pboxBase = pboxNext;
|
|
||||||
}
|
|
||||||
pboxNew1 -= nbox;
|
|
||||||
pbox = pboxNew1;
|
|
||||||
pptNew1 -= nbox;
|
|
||||||
pptSrc = pptNew1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* walk source top to bottom */
|
|
||||||
ydir = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (careful && (pptSrc->x < pbox->x1)) {
|
|
||||||
/* walk source right to left */
|
|
||||||
xdir = -1;
|
|
||||||
|
|
||||||
if (nbox > 1) {
|
|
||||||
/* reverse order of rects in each band */
|
|
||||||
pboxNew2 = (BoxPtr)xalloc(sizeof(BoxRec) * nbox);
|
|
||||||
pptNew2 = (DDXPointPtr)xalloc(sizeof(DDXPointRec) * nbox);
|
|
||||||
if(!pboxNew2 || !pptNew2) {
|
|
||||||
if (pptNew2)
|
|
||||||
xfree(pptNew2);
|
|
||||||
if (pboxNew2)
|
|
||||||
xfree(pboxNew2);
|
|
||||||
if (pboxNew1) {
|
|
||||||
xfree(pptNew1);
|
|
||||||
xfree(pboxNew1);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pboxBase = pboxNext = pbox;
|
|
||||||
while (pboxBase < pbox+nbox) {
|
|
||||||
while ((pboxNext < pbox+nbox) && (pboxNext->y1 == pboxBase->y1))
|
|
||||||
pboxNext++;
|
|
||||||
pboxTmp = pboxNext;
|
|
||||||
pptTmp = pptSrc + (pboxTmp - pbox);
|
|
||||||
while (pboxTmp != pboxBase) {
|
|
||||||
*pboxNew2++ = *--pboxTmp;
|
|
||||||
*pptNew2++ = *--pptTmp;
|
|
||||||
}
|
|
||||||
pboxBase = pboxNext;
|
|
||||||
}
|
|
||||||
pboxNew2 -= nbox;
|
|
||||||
pbox = pboxNew2;
|
|
||||||
pptNew2 -= nbox;
|
|
||||||
pptSrc = pptNew2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* walk source left to right */
|
|
||||||
xdir = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(nbox--) {
|
|
||||||
int d;
|
|
||||||
for (d = 0; d < depthSrc; d++) {
|
|
||||||
PixelType *psrcB;
|
|
||||||
PixelType *pdstB;
|
|
||||||
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
psrcB = psrcBase + sizeSrc * d; /* @@@ NEXT PLANE @@@ */
|
|
||||||
pdstB = pdstBase + sizeDst * d; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
h = pbox->y2 - pbox->y1;
|
|
||||||
|
|
||||||
if (ydir == -1) { /* start at last scanline of rectangle */
|
|
||||||
psrcLine = afbScanlineDeltaSrc(psrcB, -(pptSrc->y+h-1), widthSrc);
|
|
||||||
pdstLine = afbScanlineDeltaDst(pdstB, -(pbox->y2-1), widthDst);
|
|
||||||
} else { /* start at first scanline */
|
|
||||||
psrcLine = afbScanlineDeltaSrc(psrcB, pptSrc->y, widthSrc);
|
|
||||||
pdstLine = afbScanlineDeltaDst(pdstB, pbox->y1, widthDst);
|
|
||||||
}
|
|
||||||
if ((pbox->x1 & PIM) + w <= PPW) {
|
|
||||||
maskpartialbits (pbox->x1, w, startmask);
|
|
||||||
endmask = 0;
|
|
||||||
nlMiddle = 0;
|
|
||||||
} else {
|
|
||||||
maskbits(pbox->x1, w, startmask, endmask, nlMiddle);
|
|
||||||
}
|
|
||||||
if (xdir == 1) {
|
|
||||||
xoffSrc = pptSrc->x & PIM;
|
|
||||||
xoffDst = pbox->x1 & PIM;
|
|
||||||
pdstLine += (pbox->x1 >> PWSH);
|
|
||||||
psrcLine += (pptSrc->x >> PWSH);
|
|
||||||
#ifdef DO_UNALIGNED_BITBLT
|
|
||||||
nl = xoffSrc - xoffDst;
|
|
||||||
psrcLine = (PixelType *)(((unsigned char *) psrcLine) + nl);
|
|
||||||
#else
|
|
||||||
if (xoffSrc == xoffDst)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
while (h--) {
|
|
||||||
psrc = psrcLine;
|
|
||||||
pdst = pdstLine;
|
|
||||||
if (startmask) {
|
|
||||||
*pdst = MROP_MASK(*psrc, *pdst, startmask);
|
|
||||||
psrc++;
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
|
|
||||||
#ifdef LARGE_INSTRUCTION_CACHE
|
|
||||||
#ifdef FAST_CONSTANT_OFFSET_MODE
|
|
||||||
|
|
||||||
psrc += nl & (UNROLL-1);
|
|
||||||
pdst += nl & (UNROLL-1);
|
|
||||||
|
|
||||||
#define BodyOdd(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
|
|
||||||
#define BodyEven(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
|
|
||||||
|
|
||||||
#define LoopReset \
|
|
||||||
pdst += UNROLL; \
|
|
||||||
psrc += UNROLL;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define BodyOdd(n) *pdst = MROP_SOLID (*psrc, *pdst); pdst++; psrc++;
|
|
||||||
#define BodyEven(n) BodyOdd(n)
|
|
||||||
|
|
||||||
#define LoopReset ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
PackedLoop
|
|
||||||
|
|
||||||
#undef BodyOdd
|
|
||||||
#undef BodyEven
|
|
||||||
#undef LoopReset
|
|
||||||
|
|
||||||
#else
|
|
||||||
#ifdef NOTDEF
|
|
||||||
/* you'd think this would be faster --
|
|
||||||
* a single instruction instead of 6
|
|
||||||
* but measurements show it to be ~15% slower
|
|
||||||
*/
|
|
||||||
while ((nl -= 6) >= 0) {
|
|
||||||
asm ("moveml %1+,#0x0c0f;moveml#0x0c0f,%0"
|
|
||||||
: "=m" (*(char *)pdst)
|
|
||||||
: "m" (*(char *)psrc)
|
|
||||||
: "d0", "d1", "d2", "d3",
|
|
||||||
"a2", "a3");
|
|
||||||
pdst += 6;
|
|
||||||
}
|
|
||||||
nl += 6;
|
|
||||||
while (nl--)
|
|
||||||
*pdst++ = *psrc++;
|
|
||||||
#endif
|
|
||||||
DuffL(nl, label1,
|
|
||||||
*pdst = MROP_SOLID (*psrc, *pdst);
|
|
||||||
pdst++; psrc++;)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (endmask)
|
|
||||||
*pdst = MROP_MASK(*psrc, *pdst, endmask);
|
|
||||||
afbScanlineIncDst(pdstLine, widthDst);
|
|
||||||
afbScanlineIncSrc(psrcLine, widthSrc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifndef DO_UNALIGNED_BITBLT
|
|
||||||
else {
|
|
||||||
if (xoffSrc > xoffDst) {
|
|
||||||
leftShift = (xoffSrc - xoffDst);
|
|
||||||
rightShift = PPW - leftShift;
|
|
||||||
} else {
|
|
||||||
rightShift = (xoffDst - xoffSrc);
|
|
||||||
leftShift = PPW - rightShift;
|
|
||||||
}
|
|
||||||
while (h--) {
|
|
||||||
psrc = psrcLine;
|
|
||||||
pdst = pdstLine;
|
|
||||||
bits = 0;
|
|
||||||
if (xoffSrc > xoffDst)
|
|
||||||
bits = *psrc++;
|
|
||||||
if (startmask) {
|
|
||||||
bits1 = BitLeft(bits,leftShift);
|
|
||||||
bits = *psrc++;
|
|
||||||
bits1 |= BitRight(bits,rightShift);
|
|
||||||
*pdst = MROP_MASK(bits1, *pdst, startmask);
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
|
|
||||||
#ifdef LARGE_INSTRUCTION_CACHE
|
|
||||||
bits1 = bits;
|
|
||||||
|
|
||||||
#ifdef FAST_CONSTANT_OFFSET_MODE
|
|
||||||
|
|
||||||
psrc += nl & (UNROLL-1);
|
|
||||||
pdst += nl & (UNROLL-1);
|
|
||||||
|
|
||||||
#define BodyOdd(n) \
|
|
||||||
bits = psrc[-n]; \
|
|
||||||
pdst[-n] = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), pdst[-n]);
|
|
||||||
|
|
||||||
#define BodyEven(n) \
|
|
||||||
bits1 = psrc[-n]; \
|
|
||||||
pdst[-n] = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), pdst[-n]);
|
|
||||||
|
|
||||||
#define LoopReset \
|
|
||||||
pdst += UNROLL; \
|
|
||||||
psrc += UNROLL;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define BodyOdd(n) \
|
|
||||||
bits = *psrc++; \
|
|
||||||
*pdst = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), *pdst); \
|
|
||||||
pdst++;
|
|
||||||
|
|
||||||
#define BodyEven(n) \
|
|
||||||
bits1 = *psrc++; \
|
|
||||||
*pdst = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), *pdst); \
|
|
||||||
pdst++;
|
|
||||||
|
|
||||||
#define LoopReset ;
|
|
||||||
|
|
||||||
#endif /* !FAST_CONSTANT_OFFSET_MODE */
|
|
||||||
|
|
||||||
PackedLoop
|
|
||||||
|
|
||||||
#undef BodyOdd
|
|
||||||
#undef BodyEven
|
|
||||||
#undef LoopReset
|
|
||||||
|
|
||||||
#else
|
|
||||||
DuffL(nl,label2,
|
|
||||||
bits1 = BitLeft(bits, leftShift);
|
|
||||||
bits = *psrc++;
|
|
||||||
*pdst = MROP_SOLID (bits1 | BitRight(bits, rightShift), *pdst);
|
|
||||||
pdst++;
|
|
||||||
)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (endmask) {
|
|
||||||
bits1 = BitLeft(bits, leftShift);
|
|
||||||
if (BitLeft(endmask, rightShift)) {
|
|
||||||
bits = *psrc;
|
|
||||||
bits1 |= BitRight(bits, rightShift);
|
|
||||||
}
|
|
||||||
*pdst = MROP_MASK (bits1, *pdst, endmask);
|
|
||||||
}
|
|
||||||
afbScanlineIncDst(pdstLine, widthDst);
|
|
||||||
afbScanlineIncSrc(psrcLine, widthSrc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* DO_UNALIGNED_BITBLT */
|
|
||||||
} else { /* xdir == -1 */
|
|
||||||
xoffSrc = (pptSrc->x + w - 1) & PIM;
|
|
||||||
xoffDst = (pbox->x2 - 1) & PIM;
|
|
||||||
pdstLine += ((pbox->x2-1) >> PWSH) + 1;
|
|
||||||
psrcLine += ((pptSrc->x+w - 1) >> PWSH) + 1;
|
|
||||||
#ifdef DO_UNALIGNED_BITBLT
|
|
||||||
nl = xoffSrc - xoffDst;
|
|
||||||
psrcLine = (PixelType *)
|
|
||||||
(((unsigned char *) psrcLine) + nl);
|
|
||||||
#else
|
|
||||||
if (xoffSrc == xoffDst)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
while (h--) {
|
|
||||||
psrc = psrcLine;
|
|
||||||
pdst = pdstLine;
|
|
||||||
if (endmask) {
|
|
||||||
pdst--;
|
|
||||||
psrc--;
|
|
||||||
*pdst = MROP_MASK (*psrc, *pdst, endmask);
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
|
|
||||||
#ifdef LARGE_INSTRUCTION_CACHE
|
|
||||||
#ifdef FAST_CONSTANT_OFFSET_MODE
|
|
||||||
psrc -= nl & (UNROLL - 1);
|
|
||||||
pdst -= nl & (UNROLL - 1);
|
|
||||||
|
|
||||||
#define BodyOdd(n) pdst[n-1] = MROP_SOLID (psrc[n-1], pdst[n-1]);
|
|
||||||
|
|
||||||
#define BodyEven(n) BodyOdd(n)
|
|
||||||
|
|
||||||
#define LoopReset \
|
|
||||||
pdst -= UNROLL;\
|
|
||||||
psrc -= UNROLL;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define BodyOdd(n) --pdst; --psrc; *pdst = MROP_SOLID(*psrc, *pdst);
|
|
||||||
#define BodyEven(n) BodyOdd(n)
|
|
||||||
#define LoopReset ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
PackedLoop
|
|
||||||
|
|
||||||
#undef BodyOdd
|
|
||||||
#undef BodyEven
|
|
||||||
#undef LoopReset
|
|
||||||
|
|
||||||
#else
|
|
||||||
DuffL(nl,label3,
|
|
||||||
--pdst; --psrc; *pdst = MROP_SOLID (*psrc, *pdst);)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (startmask) {
|
|
||||||
--pdst;
|
|
||||||
--psrc;
|
|
||||||
*pdst = MROP_MASK(*psrc, *pdst, startmask);
|
|
||||||
}
|
|
||||||
afbScanlineIncDst(pdstLine, widthDst);
|
|
||||||
afbScanlineIncSrc(psrcLine, widthSrc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifndef DO_UNALIGNED_BITBLT
|
|
||||||
else {
|
|
||||||
if (xoffDst > xoffSrc) {
|
|
||||||
rightShift = (xoffDst - xoffSrc);
|
|
||||||
leftShift = PPW - rightShift;
|
|
||||||
} else {
|
|
||||||
leftShift = (xoffSrc - xoffDst);
|
|
||||||
rightShift = PPW - leftShift;
|
|
||||||
}
|
|
||||||
while (h--) {
|
|
||||||
psrc = psrcLine;
|
|
||||||
pdst = pdstLine;
|
|
||||||
bits = 0;
|
|
||||||
if (xoffDst > xoffSrc)
|
|
||||||
bits = *--psrc;
|
|
||||||
if (endmask) {
|
|
||||||
bits1 = BitRight(bits, rightShift);
|
|
||||||
bits = *--psrc;
|
|
||||||
bits1 |= BitLeft(bits, leftShift);
|
|
||||||
pdst--;
|
|
||||||
*pdst = MROP_MASK(bits1, *pdst, endmask);
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
|
|
||||||
#ifdef LARGE_INSTRUCTION_CACHE
|
|
||||||
bits1 = bits;
|
|
||||||
#ifdef FAST_CONSTANT_OFFSET_MODE
|
|
||||||
psrc -= nl & (UNROLL - 1);
|
|
||||||
pdst -= nl & (UNROLL - 1);
|
|
||||||
|
|
||||||
#define BodyOdd(n) \
|
|
||||||
bits = psrc[n-1]; \
|
|
||||||
pdst[n-1] = MROP_SOLID(BitRight(bits1, rightShift) | BitLeft(bits, leftShift),pdst[n-1]);
|
|
||||||
|
|
||||||
#define BodyEven(n) \
|
|
||||||
bits1 = psrc[n-1]; \
|
|
||||||
pdst[n-1] = MROP_SOLID(BitRight(bits, rightShift) | BitLeft(bits1, leftShift),pdst[n-1]);
|
|
||||||
|
|
||||||
#define LoopReset \
|
|
||||||
pdst -= UNROLL; \
|
|
||||||
psrc -= UNROLL;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define BodyOdd(n) \
|
|
||||||
bits = *--psrc; --pdst; \
|
|
||||||
*pdst = MROP_SOLID(BitRight(bits1, rightShift) | BitLeft(bits, leftShift),*pdst);
|
|
||||||
|
|
||||||
#define BodyEven(n) \
|
|
||||||
bits1 = *--psrc; --pdst; \
|
|
||||||
*pdst = MROP_SOLID(BitRight(bits, rightShift) | BitLeft(bits1, leftShift),*pdst);
|
|
||||||
|
|
||||||
#define LoopReset ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PackedLoop
|
|
||||||
|
|
||||||
#undef BodyOdd
|
|
||||||
#undef BodyEven
|
|
||||||
#undef LoopReset
|
|
||||||
|
|
||||||
#else
|
|
||||||
DuffL(nl, label4,
|
|
||||||
bits1 = BitRight(bits, rightShift);
|
|
||||||
bits = *--psrc;
|
|
||||||
--pdst;
|
|
||||||
*pdst = MROP_SOLID(bits1 | BitLeft(bits, leftShift),*pdst);
|
|
||||||
)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (startmask) {
|
|
||||||
bits1 = BitRight(bits, rightShift);
|
|
||||||
if (BitRight (startmask, leftShift)) {
|
|
||||||
bits = *--psrc;
|
|
||||||
bits1 |= BitLeft(bits, leftShift);
|
|
||||||
}
|
|
||||||
--pdst;
|
|
||||||
*pdst = MROP_MASK(bits1, *pdst, startmask);
|
|
||||||
}
|
|
||||||
afbScanlineIncDst(pdstLine, widthDst);
|
|
||||||
afbScanlineIncSrc(psrcLine, widthSrc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
pptSrc++;
|
|
||||||
}
|
|
||||||
if (pboxNew2) {
|
|
||||||
xfree(pptNew2);
|
|
||||||
xfree(pboxNew2);
|
|
||||||
}
|
|
||||||
if (pboxNew1) {
|
|
||||||
xfree(pptNew1);
|
|
||||||
xfree(pboxNew1);
|
|
||||||
}
|
|
||||||
}
|
|
323
afb/afbbres.c
323
afb/afbbres.c
|
@ -1,323 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "misc.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "miline.h"
|
|
||||||
|
|
||||||
/* Solid bresenham line */
|
|
||||||
/* NOTES
|
|
||||||
e2 is used less often than e1, so it's not in a register
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
afbBresS(addrlbase, nlwidth, sizeDst, depthDst, signdx, signdy, axis, x1, y1,
|
|
||||||
e, e1, e2, len, rrops)
|
|
||||||
PixelType *addrlbase; /* pointer to base of bitmap */
|
|
||||||
int nlwidth; /* width in longwords of bitmap */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int signdx, signdy; /* signs of directions */
|
|
||||||
int axis; /* major axis (Y_AXIS or X_AXIS) */
|
|
||||||
int x1, y1; /* initial point */
|
|
||||||
register int e; /* error accumulator */
|
|
||||||
register int e1; /* bresenham increments */
|
|
||||||
int e2;
|
|
||||||
int len; /* length of line */
|
|
||||||
unsigned char *rrops;
|
|
||||||
{
|
|
||||||
register int yinc; /* increment to next scanline, in bytes */
|
|
||||||
register PixelType *addrl; /* bitmask long pointer */
|
|
||||||
register PixelType bit; /* current bit being set/cleared/etc. */
|
|
||||||
PixelType leftbit = mfbGetmask(0); /* leftmost bit to process in new word */
|
|
||||||
PixelType rightbit = mfbGetmask(PPW-1); /* rightmost bit to process in new word */
|
|
||||||
|
|
||||||
register int e3 = e2-e1;
|
|
||||||
PixelType tmp;
|
|
||||||
int saveE;
|
|
||||||
int saveLen;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
/* point to longword containing first point */
|
|
||||||
yinc = signdy * nlwidth;
|
|
||||||
e = e-e1; /* to make looping easier */
|
|
||||||
|
|
||||||
if (!len)
|
|
||||||
return;
|
|
||||||
|
|
||||||
saveLen = len;
|
|
||||||
saveE = e;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(addrlbase, x1, y1, nlwidth);
|
|
||||||
addrlbase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
len = saveLen;
|
|
||||||
e = saveE;
|
|
||||||
bit = mfbGetmask(x1 & PIM);
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
if (axis == X_AXIS) {
|
|
||||||
if (signdx > 0) {
|
|
||||||
tmp = *addrl;
|
|
||||||
for (;;) {
|
|
||||||
tmp &= ~bit;
|
|
||||||
if (!--len)
|
|
||||||
break;
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
*addrl = tmp;
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
if (!bit) {
|
|
||||||
bit = leftbit;
|
|
||||||
addrl ++;
|
|
||||||
}
|
|
||||||
tmp = *addrl;
|
|
||||||
} else if (!bit) {
|
|
||||||
*addrl = tmp;
|
|
||||||
bit = leftbit;
|
|
||||||
addrl ++;
|
|
||||||
tmp = *addrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*addrl = tmp;
|
|
||||||
} else {
|
|
||||||
tmp = *addrl;
|
|
||||||
for (;;) {
|
|
||||||
tmp &= ~bit;
|
|
||||||
if (!--len)
|
|
||||||
break;
|
|
||||||
e += e1;
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (e >= 0) {
|
|
||||||
*addrl = tmp;
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
if (!bit) {
|
|
||||||
bit = rightbit;
|
|
||||||
addrl --;
|
|
||||||
}
|
|
||||||
tmp = *addrl;
|
|
||||||
} else if (!bit) {
|
|
||||||
*addrl = tmp;
|
|
||||||
bit = rightbit;
|
|
||||||
addrl --;
|
|
||||||
tmp = *addrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*addrl = tmp;
|
|
||||||
}
|
|
||||||
} /* if X_AXIS */ else {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
*addrl &= ~bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
*addrl &= ~bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit;addrl --; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* else Y_AXIS */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
if (axis == X_AXIS) {
|
|
||||||
if (signdx > 0) {
|
|
||||||
tmp = *addrl;
|
|
||||||
for (;;) {
|
|
||||||
tmp |= bit;
|
|
||||||
if (!--len)
|
|
||||||
break;
|
|
||||||
e += e1;
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (e >= 0) {
|
|
||||||
*addrl = tmp;
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
if (!bit) {
|
|
||||||
bit = leftbit;
|
|
||||||
addrl ++;
|
|
||||||
}
|
|
||||||
tmp = *addrl;
|
|
||||||
} else if (!bit) {
|
|
||||||
*addrl = tmp;
|
|
||||||
bit = leftbit;
|
|
||||||
addrl ++;
|
|
||||||
tmp = *addrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*addrl = tmp;
|
|
||||||
} else {
|
|
||||||
tmp = *addrl;
|
|
||||||
for (;;) {
|
|
||||||
tmp |= bit;
|
|
||||||
if (!--len)
|
|
||||||
break;
|
|
||||||
e += e1;
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (e >= 0) {
|
|
||||||
*addrl = tmp;
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
if (!bit) {
|
|
||||||
bit = rightbit;
|
|
||||||
addrl --;
|
|
||||||
}
|
|
||||||
tmp = *addrl;
|
|
||||||
} else if (!bit) {
|
|
||||||
*addrl = tmp;
|
|
||||||
bit = rightbit;
|
|
||||||
addrl --;
|
|
||||||
tmp = *addrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*addrl = tmp;
|
|
||||||
}
|
|
||||||
} /* if X_AXIS */ else {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
*addrl |= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
*addrl |= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit;addrl --; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* else Y_AXIS */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
if (axis == X_AXIS) {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit;addrl --; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* if X_AXIS */ else {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit; addrl --; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* else Y_AXIS */
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
}
|
|
214
afb/afbbresd.c
214
afb/afbbresd.c
|
@ -1,214 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "misc.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "miline.h"
|
|
||||||
|
|
||||||
/* Dashed bresenham line */
|
|
||||||
|
|
||||||
#define StepDash\
|
|
||||||
if (!--dashRemaining) { \
|
|
||||||
if (++ dashIndex == numInDashList) \
|
|
||||||
dashIndex = 0; \
|
|
||||||
dashRemaining = pDash[dashIndex]; \
|
|
||||||
rop = fgrop; \
|
|
||||||
if (dashIndex & 1) \
|
|
||||||
rop = bgrop; \
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbBresD(pdashIndex, pDash, numInDashList, pdashOffset, isDoubleDash,
|
|
||||||
addrlbase, nlwidth, sizeDst, depthDst,
|
|
||||||
signdx, signdy, axis, x1, y1, e, e1, e2, len, rrops, bgrrops)
|
|
||||||
int *pdashIndex; /* current dash */
|
|
||||||
unsigned char *pDash; /* dash list */
|
|
||||||
int numInDashList; /* total length of dash list */
|
|
||||||
int *pdashOffset; /* offset into current dash */
|
|
||||||
int isDoubleDash;
|
|
||||||
PixelType *addrlbase; /* pointer to base of bitmap */
|
|
||||||
int nlwidth; /* width in longwords of bitmap */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int signdx, signdy; /* signs of directions */
|
|
||||||
int axis; /* major axis (Y_AXIS or X_AXIS) */
|
|
||||||
int x1, y1; /* initial point */
|
|
||||||
register int e; /* error accumulator */
|
|
||||||
register int e1; /* bresenham increments */
|
|
||||||
int e2;
|
|
||||||
int len; /* length of line */
|
|
||||||
unsigned char *rrops;
|
|
||||||
unsigned char *bgrrops;
|
|
||||||
{
|
|
||||||
register int yinc; /* increment to next scanline, in bytes */
|
|
||||||
register PixelType *addrl;
|
|
||||||
register int e3 = e2-e1;
|
|
||||||
register unsigned long bit;
|
|
||||||
PixelType leftbit = mfbGetmask(0); /* leftmost bit to process in new word */
|
|
||||||
PixelType rightbit = mfbGetmask(PPW-1); /* rightmost bit to process in new word */
|
|
||||||
int dashIndex;
|
|
||||||
int dashOffset;
|
|
||||||
int dashRemaining;
|
|
||||||
int rop;
|
|
||||||
int fgrop;
|
|
||||||
int bgrop;
|
|
||||||
int saveE;
|
|
||||||
int saveLen;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
dashOffset = *pdashOffset;
|
|
||||||
dashIndex = *pdashIndex;
|
|
||||||
dashRemaining = pDash[dashIndex] - dashOffset;
|
|
||||||
/* point to longword containing first point */
|
|
||||||
|
|
||||||
yinc = signdy * nlwidth;
|
|
||||||
e = e-e1; /* to make looping easier */
|
|
||||||
|
|
||||||
saveE = e;
|
|
||||||
saveLen = len;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(addrlbase, x1, y1, nlwidth);
|
|
||||||
addrlbase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
fgrop = rrops[d];
|
|
||||||
bgrop = bgrrops[d];
|
|
||||||
|
|
||||||
e = saveE;
|
|
||||||
len = saveLen;
|
|
||||||
bit = mfbGetmask(x1 & PIM);
|
|
||||||
|
|
||||||
rop = fgrop;
|
|
||||||
if (!isDoubleDash)
|
|
||||||
bgrop = -1;
|
|
||||||
if (dashIndex & 1)
|
|
||||||
rop = bgrop;
|
|
||||||
|
|
||||||
if (axis == X_AXIS) {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
if (rop == RROP_BLACK)
|
|
||||||
*addrl &= ~bit;
|
|
||||||
else if (rop == RROP_WHITE)
|
|
||||||
*addrl |= bit;
|
|
||||||
else if (rop == RROP_INVERT)
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
StepDash
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
if (rop == RROP_BLACK)
|
|
||||||
*addrl &= ~bit;
|
|
||||||
else if (rop == RROP_WHITE)
|
|
||||||
*addrl |= bit;
|
|
||||||
else if (rop == RROP_INVERT)
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit;addrl --; }
|
|
||||||
StepDash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* if X_AXIS */ else {
|
|
||||||
if (signdx > 0) {
|
|
||||||
while(len--) {
|
|
||||||
if (rop == RROP_BLACK)
|
|
||||||
*addrl &= ~bit;
|
|
||||||
else if (rop == RROP_WHITE)
|
|
||||||
*addrl |= bit;
|
|
||||||
else if (rop == RROP_INVERT)
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRRIGHT(bit,1);
|
|
||||||
if (!bit) { bit = leftbit;addrl ++; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
StepDash
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while(len--) {
|
|
||||||
if (rop == RROP_BLACK)
|
|
||||||
*addrl &= ~bit;
|
|
||||||
else if (rop == RROP_WHITE)
|
|
||||||
*addrl |= bit;
|
|
||||||
else if (rop == RROP_INVERT)
|
|
||||||
*addrl ^= bit;
|
|
||||||
e += e1;
|
|
||||||
if (e >= 0) {
|
|
||||||
bit = SCRLEFT(bit,1);
|
|
||||||
if (!bit) { bit = rightbit;addrl --; }
|
|
||||||
e += e3;
|
|
||||||
}
|
|
||||||
afbScanlineInc(addrl, yinc);
|
|
||||||
StepDash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* else Y_AXIS */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
*pdashIndex = dashIndex;
|
|
||||||
*pdashOffset = pDash[dashIndex] - dashRemaining;
|
|
||||||
}
|
|
248
afb/afbclip.c
248
afb/afbclip.c
|
@ -1,248 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "gc.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "mi.h"
|
|
||||||
#include "afb.h"
|
|
||||||
|
|
||||||
#define ADDRECT(reg,r,fr,rx1,ry1,rx2,ry2) \
|
|
||||||
if (((rx1) < (rx2)) && ((ry1) < (ry2)) && \
|
|
||||||
(!((reg)->data->numRects && \
|
|
||||||
((r-1)->y1 == (ry1)) && \
|
|
||||||
((r-1)->y2 == (ry2)) && \
|
|
||||||
((r-1)->x1 <= (rx1)) && \
|
|
||||||
((r-1)->x2 >= (rx2))))) \
|
|
||||||
{ \
|
|
||||||
if ((reg)->data->numRects == (reg)->data->size) \
|
|
||||||
{ \
|
|
||||||
miRectAlloc(reg, 1); \
|
|
||||||
fr = REGION_BOXPTR(reg); \
|
|
||||||
r = fr + (reg)->data->numRects; \
|
|
||||||
} \
|
|
||||||
r->x1 = (rx1); \
|
|
||||||
r->y1 = (ry1); \
|
|
||||||
r->x2 = (rx2); \
|
|
||||||
r->y2 = (ry2); \
|
|
||||||
(reg)->data->numRects++; \
|
|
||||||
if(r->x1 < (reg)->extents.x1) \
|
|
||||||
(reg)->extents.x1 = r->x1; \
|
|
||||||
if(r->x2 > (reg)->extents.x2) \
|
|
||||||
(reg)->extents.x2 = r->x2; \
|
|
||||||
r++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert bitmap clip mask into clipping region.
|
|
||||||
* First, goes through each line and makes boxes by noting the transitions
|
|
||||||
* from 0 to 1 and 1 to 0.
|
|
||||||
* Then it coalesces the current line with the previous if they have boxes
|
|
||||||
* at the same X coordinates.
|
|
||||||
*/
|
|
||||||
RegionPtr
|
|
||||||
afbPixmapToRegion(pPix)
|
|
||||||
PixmapPtr pPix;
|
|
||||||
{
|
|
||||||
register RegionPtr pReg;
|
|
||||||
register PixelType *pw, w;
|
|
||||||
register int ib;
|
|
||||||
int width, h, base, rx1 = 0, crects;
|
|
||||||
PixelType *pwLineEnd;
|
|
||||||
int irectPrevStart, irectLineStart;
|
|
||||||
register BoxPtr prectO, prectN;
|
|
||||||
BoxPtr FirstRect, rects, prectLineStart;
|
|
||||||
Bool fInBox, fSame;
|
|
||||||
register PixelType mask0 = mfbGetmask(0);
|
|
||||||
PixelType *pwLine;
|
|
||||||
int nWidth;
|
|
||||||
|
|
||||||
pReg = REGION_CREATE(pPix->drawable.pScreen, NULL, 1);
|
|
||||||
if(!pReg)
|
|
||||||
return NullRegion;
|
|
||||||
FirstRect = REGION_BOXPTR(pReg);
|
|
||||||
rects = FirstRect;
|
|
||||||
|
|
||||||
pwLine = (PixelType *) pPix->devPrivate.ptr;
|
|
||||||
nWidth = pPix->devKind / PGSZB;
|
|
||||||
|
|
||||||
width = pPix->drawable.width;
|
|
||||||
pReg->extents.x1 = width - 1;
|
|
||||||
pReg->extents.x2 = 0;
|
|
||||||
irectPrevStart = -1;
|
|
||||||
for(h = 0; h < pPix->drawable.height; h++) {
|
|
||||||
pw = pwLine;
|
|
||||||
pwLine += nWidth;
|
|
||||||
irectLineStart = rects - FirstRect;
|
|
||||||
/* If the Screen left most bit of the word is set, we're starting in
|
|
||||||
* a box */
|
|
||||||
if(*pw & mask0) {
|
|
||||||
fInBox = TRUE;
|
|
||||||
rx1 = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fInBox = FALSE;
|
|
||||||
/* Process all words which are fully in the pixmap */
|
|
||||||
pwLineEnd = pw + (width >> PWSH);
|
|
||||||
for (base = 0; pw < pwLineEnd; base += PPW) {
|
|
||||||
w = *pw++;
|
|
||||||
if (fInBox) {
|
|
||||||
if (!~w)
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if (!w)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for(ib = 0; ib < PPW; ib++) {
|
|
||||||
/* If the Screen left most bit of the word is set, we're
|
|
||||||
* starting a box */
|
|
||||||
if(w & mask0) {
|
|
||||||
if(!fInBox) {
|
|
||||||
rx1 = base + ib;
|
|
||||||
/* start new box */
|
|
||||||
fInBox = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(fInBox) {
|
|
||||||
/* end box */
|
|
||||||
ADDRECT(pReg, rects, FirstRect,
|
|
||||||
rx1, h, base + ib, h + 1);
|
|
||||||
fInBox = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Shift the word VISUALLY left one. */
|
|
||||||
w = SCRLEFT(w, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(width & PIM) {
|
|
||||||
/* Process final partial word on line */
|
|
||||||
w = *pw++;
|
|
||||||
for(ib = 0; ib < (width & PIM); ib++) {
|
|
||||||
/* If the Screen left most bit of the word is set, we're
|
|
||||||
* starting a box */
|
|
||||||
if(w & mask0) {
|
|
||||||
if(!fInBox) {
|
|
||||||
rx1 = base + ib;
|
|
||||||
/* start new box */
|
|
||||||
fInBox = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(fInBox) {
|
|
||||||
/* end box */
|
|
||||||
ADDRECT(pReg, rects, FirstRect,
|
|
||||||
rx1, h, base + ib, h + 1);
|
|
||||||
fInBox = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Shift the word VISUALLY left one. */
|
|
||||||
w = SCRLEFT(w, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If scanline ended with last bit set, end the box */
|
|
||||||
if(fInBox) {
|
|
||||||
ADDRECT(pReg, rects, FirstRect,
|
|
||||||
rx1, h, base + (width & PIM), h + 1);
|
|
||||||
}
|
|
||||||
/* if all rectangles on this line have the same x-coords as
|
|
||||||
* those on the previous line, then add 1 to all the previous y2s and
|
|
||||||
* throw away all the rectangles from this line
|
|
||||||
*/
|
|
||||||
fSame = FALSE;
|
|
||||||
if(irectPrevStart != -1) {
|
|
||||||
crects = irectLineStart - irectPrevStart;
|
|
||||||
if(crects == ((rects - FirstRect) - irectLineStart)) {
|
|
||||||
prectO = FirstRect + irectPrevStart;
|
|
||||||
prectN = prectLineStart = FirstRect + irectLineStart;
|
|
||||||
fSame = TRUE;
|
|
||||||
while(prectO < prectLineStart) {
|
|
||||||
if((prectO->x1 != prectN->x1) || (prectO->x2 != prectN->x2)) {
|
|
||||||
fSame = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
prectO++;
|
|
||||||
prectN++;
|
|
||||||
}
|
|
||||||
if (fSame) {
|
|
||||||
prectO = FirstRect + irectPrevStart;
|
|
||||||
while(prectO < prectLineStart) {
|
|
||||||
prectO->y2 += 1;
|
|
||||||
prectO++;
|
|
||||||
}
|
|
||||||
rects -= crects;
|
|
||||||
pReg->data->numRects -= crects;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!fSame)
|
|
||||||
irectPrevStart = irectLineStart;
|
|
||||||
}
|
|
||||||
if (!pReg->data->numRects)
|
|
||||||
pReg->extents.x1 = pReg->extents.x2 = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pReg->extents.y1 = REGION_BOXPTR(pReg)->y1;
|
|
||||||
pReg->extents.y2 = REGION_END(pReg)->y2;
|
|
||||||
if (pReg->data->numRects == 1) {
|
|
||||||
xfree(pReg->data);
|
|
||||||
pReg->data = (RegDataPtr)NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (!miValidRegion(pReg))
|
|
||||||
FatalError("Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__);
|
|
||||||
#endif
|
|
||||||
return(pReg);
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/************************************************************
|
|
||||||
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this
|
|
||||||
software and its documentation for any purpose and without
|
|
||||||
fee is hereby granted, provided that the above copyright no-
|
|
||||||
tice appear in all copies and that both that copyright no-
|
|
||||||
tice and this permission notice appear in supporting docu-
|
|
||||||
mentation, and that the names of Sun or X Consortium
|
|
||||||
not be used in advertising or publicity pertaining to
|
|
||||||
distribution of the software without specific prior
|
|
||||||
written permission. Sun and X Consortium make no
|
|
||||||
representations about the suitability of this software for
|
|
||||||
any purpose. It is provided "as is" without any express or
|
|
||||||
implied warranty.
|
|
||||||
|
|
||||||
SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
|
|
||||||
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI-
|
|
||||||
ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
||||||
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
||||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
||||||
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
********************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "colormapst.h"
|
|
||||||
#include "resource.h"
|
|
||||||
#include "micmap.h"
|
|
||||||
#include "afb.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
afbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
|
|
||||||
{
|
|
||||||
return miListInstalledColormaps(pScreen, pmaps);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
afbInstallColormap(ColormapPtr pmap)
|
|
||||||
{
|
|
||||||
miInstallColormap(pmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbUninstallColormap(ColormapPtr pmap)
|
|
||||||
{
|
|
||||||
miUninstallColormap(pmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbResolveColor(short unsigned int *pred, short unsigned int *pgreen, short unsigned int *pblue, register VisualPtr pVisual)
|
|
||||||
{
|
|
||||||
miResolveColor(pred, pgreen, pblue, pVisual);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbInitializeColormap(register ColormapPtr pmap)
|
|
||||||
{
|
|
||||||
return miInitializeColormap(pmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Given a list of formats for a screen, create a list
|
|
||||||
* of visuals and depths for the screen which correspond to
|
|
||||||
* the set which can be used with this version of afb.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbInitVisuals(VisualPtr *visualp, DepthPtr *depthp, int *nvisualp, int *ndepthp, int *rootDepthp, VisualID *defaultVisp, long unsigned int sizes, int bitsPerRGB)
|
|
||||||
{
|
|
||||||
return miInitVisuals(visualp, depthp, nvisualp, ndepthp, rootDepthp,
|
|
||||||
defaultVisp, sizes, bitsPerRGB, -1);
|
|
||||||
}
|
|
347
afb/afbfillarc.c
347
afb/afbfillarc.c
|
@ -1,347 +0,0 @@
|
||||||
/************************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1989 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
********************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xprotostr.h>
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "mifillarc.h"
|
|
||||||
#include "mi.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbFillEllipseSolid(DrawablePtr pDraw, xArc *arc, register unsigned char *rrops)
|
|
||||||
{
|
|
||||||
int x, y, e;
|
|
||||||
int yk, xk, ym, xm, dx, dy, xorg, yorg;
|
|
||||||
register int slw;
|
|
||||||
miFillArcRec info;
|
|
||||||
PixelType *addrlt, *addrlb;
|
|
||||||
register PixelType *pdst;
|
|
||||||
PixelType *addrl;
|
|
||||||
register int n;
|
|
||||||
register int d;
|
|
||||||
int nlwidth;
|
|
||||||
register int xpos;
|
|
||||||
PixelType startmask, endmask;
|
|
||||||
int nlmiddle;
|
|
||||||
int depthDst;
|
|
||||||
int sizeDst;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
addrlt);
|
|
||||||
miFillArcSetup(arc, &info);
|
|
||||||
MIFILLARCSETUP();
|
|
||||||
xorg += pDraw->x;
|
|
||||||
yorg += pDraw->y;
|
|
||||||
addrlb = addrlt;
|
|
||||||
addrlt += nlwidth * (yorg - y);
|
|
||||||
addrlb += nlwidth * (yorg + y + dy);
|
|
||||||
while (y) {
|
|
||||||
addrlt += nlwidth;
|
|
||||||
addrlb -= nlwidth;
|
|
||||||
MIFILLARCSTEP(slw);
|
|
||||||
if (!slw)
|
|
||||||
continue;
|
|
||||||
xpos = xorg - x;
|
|
||||||
pdst = addrl = afbScanlineOffset(addrlt, (xpos >> PWSH));
|
|
||||||
if (((xpos & PIM) + slw) < PPW) {
|
|
||||||
maskpartialbits(xpos, slw, startmask);
|
|
||||||
for (d = 0; d < depthDst; d++, pdst += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*pdst &= ~startmask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*pdst |= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*pdst ^= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (miFillArcLower(slw)) {
|
|
||||||
pdst = afbScanlineOffset(addrlb, (xpos >> PWSH));
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, pdst += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*pdst &= ~startmask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*pdst |= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*pdst ^= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
maskbits(xpos, slw, startmask, endmask, nlmiddle);
|
|
||||||
for (d = 0; d < depthDst; d++, addrl += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
n = nlmiddle;
|
|
||||||
pdst = addrl;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ &= ~startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ = 0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst &= ~endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ |= startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ = ~0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst |= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ ^= startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ ^= ~0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst ^= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!miFillArcLower(slw))
|
|
||||||
continue;
|
|
||||||
addrl = afbScanlineOffset(addrlb, (xpos >> PWSH));
|
|
||||||
for (d = 0; d < depthDst; d++, addrl += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
n = nlmiddle;
|
|
||||||
pdst = addrl;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ &= ~startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ = 0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst &= ~endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ |= startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ = ~0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst |= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
if (startmask)
|
|
||||||
*pdst++ ^= startmask;
|
|
||||||
while (n--)
|
|
||||||
*pdst++ ^= ~0;
|
|
||||||
if (endmask)
|
|
||||||
*pdst ^= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FILLSPAN(xl,xr,addr) \
|
|
||||||
if (xr >= xl) { \
|
|
||||||
width = xr - xl + 1; \
|
|
||||||
addrl = afbScanlineOffset(addr, (xl >> PWSH)); \
|
|
||||||
if (((xl & PIM) + width) < PPW) { \
|
|
||||||
maskpartialbits(xl, width, startmask); \
|
|
||||||
for (pdst = addrl, d = 0; d < depthDst; d++, pdst += sizeDst) { /* @@@ NEXT PLANE @@@ */ \
|
|
||||||
switch (rrops[d]) { \
|
|
||||||
case RROP_BLACK: \
|
|
||||||
*pdst &= ~startmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_WHITE: \
|
|
||||||
*pdst |= startmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_INVERT: \
|
|
||||||
*pdst ^= startmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_NOP: \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
maskbits(xl, width, startmask, endmask, nlmiddle); \
|
|
||||||
for (d = 0; d < depthDst; d++, addrl += sizeDst) { /* @@@ NEXT PLANE @@@ */ \
|
|
||||||
n = nlmiddle; \
|
|
||||||
pdst = addrl; \
|
|
||||||
switch (rrops[d]) { \
|
|
||||||
case RROP_BLACK: \
|
|
||||||
if (startmask) \
|
|
||||||
*pdst++ &= ~startmask; \
|
|
||||||
while (n--) \
|
|
||||||
*pdst++ = 0; \
|
|
||||||
if (endmask) \
|
|
||||||
*pdst &= ~endmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_WHITE: \
|
|
||||||
if (startmask) \
|
|
||||||
*pdst++ |= startmask; \
|
|
||||||
while (n--) \
|
|
||||||
*pdst++ = ~0; \
|
|
||||||
if (endmask) \
|
|
||||||
*pdst |= endmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_INVERT: \
|
|
||||||
if (startmask) \
|
|
||||||
*pdst++ ^= startmask; \
|
|
||||||
while (n--) \
|
|
||||||
*pdst++ ^= ~0; \
|
|
||||||
if (endmask) \
|
|
||||||
*pdst ^= endmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_NOP: \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FILLSLICESPANS(flip,addr) \
|
|
||||||
if (!flip) { \
|
|
||||||
FILLSPAN(xl, xr, addr); \
|
|
||||||
} else { \
|
|
||||||
xc = xorg - x; \
|
|
||||||
FILLSPAN(xc, xr, addr); \
|
|
||||||
xc += slw - 1; \
|
|
||||||
FILLSPAN(xl, xc, addr); \
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbFillArcSliceSolidCopy(DrawablePtr pDraw, GCPtr pGC, xArc *arc, register unsigned char *rrops)
|
|
||||||
{
|
|
||||||
PixelType *addrl;
|
|
||||||
register PixelType *pdst;
|
|
||||||
register int n;
|
|
||||||
register int d;
|
|
||||||
int yk, xk, ym, xm, dx, dy, xorg, yorg, slw;
|
|
||||||
register int x, y, e;
|
|
||||||
miFillArcRec info;
|
|
||||||
miArcSliceRec slice;
|
|
||||||
int xl, xr, xc;
|
|
||||||
PixelType *addrlt, *addrlb;
|
|
||||||
int nlwidth;
|
|
||||||
int width;
|
|
||||||
PixelType startmask, endmask;
|
|
||||||
int nlmiddle;
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
addrlt);
|
|
||||||
miFillArcSetup(arc, &info);
|
|
||||||
miFillArcSliceSetup(arc, &slice, pGC);
|
|
||||||
MIFILLARCSETUP();
|
|
||||||
xorg += pDraw->x;
|
|
||||||
yorg += pDraw->y;
|
|
||||||
addrlb = addrlt;
|
|
||||||
addrlt = afbScanlineDeltaNoBankSwitch(addrlt, yorg - y, nlwidth);
|
|
||||||
addrlb = afbScanlineDeltaNoBankSwitch(addrlb, yorg + y + dy, nlwidth);
|
|
||||||
slice.edge1.x += pDraw->x;
|
|
||||||
slice.edge2.x += pDraw->x;
|
|
||||||
while (y > 0) {
|
|
||||||
afbScanlineIncNoBankSwitch(addrlt, nlwidth);
|
|
||||||
afbScanlineIncNoBankSwitch(addrlb, -nlwidth);
|
|
||||||
MIFILLARCSTEP(slw);
|
|
||||||
MIARCSLICESTEP(slice.edge1);
|
|
||||||
MIARCSLICESTEP(slice.edge2);
|
|
||||||
if (miFillSliceUpper(slice)) {
|
|
||||||
MIARCSLICEUPPER(xl, xr, slice, slw);
|
|
||||||
FILLSLICESPANS(slice.flip_top, addrlt);
|
|
||||||
}
|
|
||||||
if (miFillSliceLower(slice)) {
|
|
||||||
MIARCSLICELOWER(xl, xr, slice, slw);
|
|
||||||
FILLSLICESPANS(slice.flip_bot, addrlb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbPolyFillArcSolid(register DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs)
|
|
||||||
{
|
|
||||||
afbPrivGC *priv;
|
|
||||||
register xArc *arc;
|
|
||||||
register int i;
|
|
||||||
BoxRec box;
|
|
||||||
RegionPtr cclip;
|
|
||||||
unsigned char *rrops;
|
|
||||||
|
|
||||||
priv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
rrops = priv->rrops;
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
for (arc = parcs, i = narcs; --i >= 0; arc++) {
|
|
||||||
if (miFillArcEmpty(arc))
|
|
||||||
continue;
|
|
||||||
if (miCanFillArc(arc)) {
|
|
||||||
box.x1 = arc->x + pDraw->x;
|
|
||||||
box.y1 = arc->y + pDraw->y;
|
|
||||||
box.x2 = box.x1 + (int)arc->width + 1;
|
|
||||||
box.y2 = box.y1 + (int)arc->height + 1;
|
|
||||||
if (RECT_IN_REGION(pDraw->pScreen, cclip, &box) == rgnIN) {
|
|
||||||
if ((arc->angle2 >= FULLCIRCLE) ||
|
|
||||||
(arc->angle2 <= -FULLCIRCLE))
|
|
||||||
afbFillEllipseSolid(pDraw, arc, rrops);
|
|
||||||
else
|
|
||||||
afbFillArcSliceSolidCopy(pDraw, pGC, arc, rrops);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
miPolyFillArc(pDraw, pGC, 1, arc);
|
|
||||||
}
|
|
||||||
}
|
|
292
afb/afbfillrct.c
292
afb/afbfillrct.c
|
@ -1,292 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xprotostr.h>
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#define MODEQ(a, b) ((a) %= (b))
|
|
||||||
|
|
||||||
/*
|
|
||||||
filled rectangles.
|
|
||||||
translate the rectangles, clip them, and call the
|
|
||||||
helper function in the GC.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NUM_STACK_RECTS 1024
|
|
||||||
|
|
||||||
void
|
|
||||||
afbPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill, xRectangle *prectInit)
|
|
||||||
|
|
||||||
|
|
||||||
/* number of rectangles to fill */
|
|
||||||
/* Pointer to first rectangle to fill */
|
|
||||||
{
|
|
||||||
xRectangle *prect;
|
|
||||||
RegionPtr prgnClip;
|
|
||||||
register BoxPtr pbox;
|
|
||||||
register BoxPtr pboxClipped;
|
|
||||||
BoxPtr pboxClippedBase;
|
|
||||||
BoxPtr pextent;
|
|
||||||
BoxRec stackRects[NUM_STACK_RECTS];
|
|
||||||
int numRects;
|
|
||||||
int n;
|
|
||||||
int xorg, yorg;
|
|
||||||
afbPrivGC *priv;
|
|
||||||
unsigned char *rrops;
|
|
||||||
unsigned char *rropsOS;
|
|
||||||
|
|
||||||
priv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
prgnClip = pGC->pCompositeClip;
|
|
||||||
rrops = priv->rrops;
|
|
||||||
rropsOS = priv->rropOS;
|
|
||||||
|
|
||||||
prect = prectInit;
|
|
||||||
xorg = pDrawable->x;
|
|
||||||
yorg = pDrawable->y;
|
|
||||||
if (xorg || yorg) {
|
|
||||||
prect = prectInit;
|
|
||||||
n = nrectFill;
|
|
||||||
Duff(n, prect->x += xorg; prect->y += yorg; prect++);
|
|
||||||
}
|
|
||||||
|
|
||||||
prect = prectInit;
|
|
||||||
|
|
||||||
numRects = REGION_NUM_RECTS(prgnClip) * nrectFill;
|
|
||||||
if (numRects > NUM_STACK_RECTS) {
|
|
||||||
pboxClippedBase = (BoxPtr)xalloc(numRects * sizeof(BoxRec));
|
|
||||||
if (!pboxClippedBase)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pboxClippedBase = stackRects;
|
|
||||||
|
|
||||||
pboxClipped = pboxClippedBase;
|
|
||||||
|
|
||||||
if (REGION_NUM_RECTS(prgnClip) == 1) {
|
|
||||||
int x1, y1, x2, y2, bx2, by2;
|
|
||||||
|
|
||||||
pextent = REGION_RECTS(prgnClip);
|
|
||||||
x1 = pextent->x1;
|
|
||||||
y1 = pextent->y1;
|
|
||||||
x2 = pextent->x2;
|
|
||||||
y2 = pextent->y2;
|
|
||||||
while (nrectFill--) {
|
|
||||||
if ((pboxClipped->x1 = prect->x) < x1)
|
|
||||||
pboxClipped->x1 = x1;
|
|
||||||
|
|
||||||
if ((pboxClipped->y1 = prect->y) < y1)
|
|
||||||
pboxClipped->y1 = y1;
|
|
||||||
|
|
||||||
bx2 = (int) prect->x + (int) prect->width;
|
|
||||||
if (bx2 > x2)
|
|
||||||
bx2 = x2;
|
|
||||||
pboxClipped->x2 = bx2;
|
|
||||||
|
|
||||||
by2 = (int) prect->y + (int) prect->height;
|
|
||||||
if (by2 > y2)
|
|
||||||
by2 = y2;
|
|
||||||
pboxClipped->y2 = by2;
|
|
||||||
|
|
||||||
prect++;
|
|
||||||
if ((pboxClipped->x1 < pboxClipped->x2) &&
|
|
||||||
(pboxClipped->y1 < pboxClipped->y2)) {
|
|
||||||
pboxClipped++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int x1, y1, x2, y2, bx2, by2;
|
|
||||||
|
|
||||||
pextent = REGION_EXTENTS(pGC->pScreen, prgnClip);
|
|
||||||
x1 = pextent->x1;
|
|
||||||
y1 = pextent->y1;
|
|
||||||
x2 = pextent->x2;
|
|
||||||
y2 = pextent->y2;
|
|
||||||
while (nrectFill--) {
|
|
||||||
BoxRec box;
|
|
||||||
|
|
||||||
if ((box.x1 = prect->x) < x1)
|
|
||||||
box.x1 = x1;
|
|
||||||
|
|
||||||
if ((box.y1 = prect->y) < y1)
|
|
||||||
box.y1 = y1;
|
|
||||||
|
|
||||||
bx2 = (int) prect->x + (int) prect->width;
|
|
||||||
if (bx2 > x2)
|
|
||||||
bx2 = x2;
|
|
||||||
box.x2 = bx2;
|
|
||||||
|
|
||||||
by2 = (int) prect->y + (int) prect->height;
|
|
||||||
if (by2 > y2)
|
|
||||||
by2 = y2;
|
|
||||||
box.y2 = by2;
|
|
||||||
|
|
||||||
prect++;
|
|
||||||
|
|
||||||
if ((box.x1 >= box.x2) || (box.y1 >= box.y2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
n = REGION_NUM_RECTS (prgnClip);
|
|
||||||
pbox = REGION_RECTS(prgnClip);
|
|
||||||
|
|
||||||
/* clip the rectangle to each box in the clip region
|
|
||||||
this is logically equivalent to calling Intersect()
|
|
||||||
*/
|
|
||||||
while(n--) {
|
|
||||||
pboxClipped->x1 = max(box.x1, pbox->x1);
|
|
||||||
pboxClipped->y1 = max(box.y1, pbox->y1);
|
|
||||||
pboxClipped->x2 = min(box.x2, pbox->x2);
|
|
||||||
pboxClipped->y2 = min(box.y2, pbox->y2);
|
|
||||||
pbox++;
|
|
||||||
|
|
||||||
/* see if clipping left anything */
|
|
||||||
if(pboxClipped->x1 < pboxClipped->x2 &&
|
|
||||||
pboxClipped->y1 < pboxClipped->y2) {
|
|
||||||
pboxClipped++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pboxClipped != pboxClippedBase) {
|
|
||||||
switch (pGC->fillStyle) {
|
|
||||||
case FillSolid:
|
|
||||||
afbSolidFillArea(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, rrops);
|
|
||||||
break;
|
|
||||||
case FillTiled:
|
|
||||||
switch (pGC->alu) {
|
|
||||||
case GXcopy:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
afbTileAreaPPWCopy(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, GXcopy,
|
|
||||||
pGC->pRotatedPixmap, pGC->planemask);
|
|
||||||
else
|
|
||||||
afbTileAreaCopy (pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, GXcopy,
|
|
||||||
pGC->tile.pixmap,
|
|
||||||
pGC->patOrg.x, pGC->patOrg.y,
|
|
||||||
pGC->planemask);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
afbTileAreaPPWGeneral(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->alu,
|
|
||||||
pGC->pRotatedPixmap,
|
|
||||||
pGC->planemask);
|
|
||||||
else
|
|
||||||
afbTileAreaGeneral(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->alu,
|
|
||||||
pGC->tile.pixmap,
|
|
||||||
pGC->patOrg.x, pGC->patOrg.y,
|
|
||||||
pGC->planemask);
|
|
||||||
break;
|
|
||||||
} /* switch (alu) */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FillStippled:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
afbStippleAreaPPW(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->pRotatedPixmap, rrops);
|
|
||||||
else
|
|
||||||
afbStippleArea(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->stipple,
|
|
||||||
pGC->patOrg.x, pGC->patOrg.y, rrops);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FillOpaqueStippled:
|
|
||||||
switch (pGC->alu) {
|
|
||||||
case GXcopy:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
afbOpaqueStippleAreaPPWCopy(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, GXcopy,
|
|
||||||
pGC->pRotatedPixmap,
|
|
||||||
rropsOS, pGC->planemask);
|
|
||||||
else
|
|
||||||
afbOpaqueStippleAreaCopy(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, GXcopy,
|
|
||||||
pGC->stipple,
|
|
||||||
pGC->patOrg.x, pGC->patOrg.y, rropsOS,
|
|
||||||
pGC->planemask);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
afbOpaqueStippleAreaPPWGeneral(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->alu,
|
|
||||||
pGC->pRotatedPixmap,
|
|
||||||
rropsOS,
|
|
||||||
pGC->planemask);
|
|
||||||
else
|
|
||||||
afbOpaqueStippleAreaGeneral(pDrawable, pboxClipped-pboxClippedBase,
|
|
||||||
pboxClippedBase, pGC->alu,
|
|
||||||
pGC->stipple,
|
|
||||||
pGC->patOrg.x, pGC->patOrg.y,
|
|
||||||
rropsOS,
|
|
||||||
pGC->planemask);
|
|
||||||
break;
|
|
||||||
} /* switch (alu) */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pboxClippedBase != stackRects)
|
|
||||||
xfree(pboxClippedBase);
|
|
||||||
}
|
|
1130
afb/afbfillsp.c
1130
afb/afbfillsp.c
File diff suppressed because it is too large
Load Diff
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include <X11/fonts/fontstruct.h>
|
|
||||||
#include "dixfontstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
Bool
|
|
||||||
afbRealizeFont( pscr, pFont)
|
|
||||||
ScreenPtr pscr;
|
|
||||||
FontPtr pFont;
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
Bool
|
|
||||||
afbUnrealizeFont( pscr, pFont)
|
|
||||||
ScreenPtr pscr;
|
|
||||||
FontPtr pFont;
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
685
afb/afbgc.c
685
afb/afbgc.c
|
@ -1,685 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include "dixfontstr.h"
|
|
||||||
#include <X11/fonts/fontstruct.h>
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "region.h"
|
|
||||||
|
|
||||||
#include "mistruct.h"
|
|
||||||
#include "migc.h"
|
|
||||||
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
static void afbDestroyGC(GCPtr);
|
|
||||||
static void afbValidateGC(GCPtr, unsigned long, DrawablePtr);
|
|
||||||
|
|
||||||
static GCFuncs afbFuncs = {
|
|
||||||
afbValidateGC,
|
|
||||||
miChangeGC,
|
|
||||||
miCopyGC,
|
|
||||||
afbDestroyGC,
|
|
||||||
miChangeClip,
|
|
||||||
miDestroyClip,
|
|
||||||
miCopyClip
|
|
||||||
};
|
|
||||||
|
|
||||||
static GCOps afbGCOps = {
|
|
||||||
afbSolidFS,
|
|
||||||
afbSetSpans,
|
|
||||||
afbPutImage,
|
|
||||||
afbCopyArea,
|
|
||||||
miCopyPlane,
|
|
||||||
afbPolyPoint,
|
|
||||||
afbLineSS,
|
|
||||||
afbSegmentSS,
|
|
||||||
miPolyRectangle,
|
|
||||||
afbZeroPolyArcSS,
|
|
||||||
afbFillPolygonSolid,
|
|
||||||
afbPolyFillRect,
|
|
||||||
afbPolyFillArcSolid,
|
|
||||||
miPolyText8,
|
|
||||||
miPolyText16,
|
|
||||||
miImageText8,
|
|
||||||
miImageText16,
|
|
||||||
afbTEGlyphBlt,
|
|
||||||
afbPolyGlyphBlt,
|
|
||||||
afbPushPixels
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbReduceOpaqueStipple(PixelType fg, PixelType bg, unsigned long planemask,
|
|
||||||
int depth, unsigned char *rop)
|
|
||||||
{
|
|
||||||
register int d;
|
|
||||||
register Pixel mask = 1;
|
|
||||||
|
|
||||||
bg ^= fg;
|
|
||||||
|
|
||||||
for (d = 0; d < depth; d++, mask <<= 1) {
|
|
||||||
if (!(planemask & mask))
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
else if (!(bg & mask)) {
|
|
||||||
/* Both fg and bg have a 0 or 1 in this plane */
|
|
||||||
if (fg & mask)
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
else
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
} else {
|
|
||||||
/* Both fg and bg have different bits on this plane */
|
|
||||||
if (fg & mask)
|
|
||||||
rop[d] = RROP_COPY;
|
|
||||||
else
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbCreateGC(pGC)
|
|
||||||
register GCPtr pGC;
|
|
||||||
{
|
|
||||||
afbPrivGC *pPriv;
|
|
||||||
|
|
||||||
pGC->clientClip = NULL;
|
|
||||||
pGC->clientClipType = CT_NONE;
|
|
||||||
|
|
||||||
/* some of the output primitives aren't really necessary, since
|
|
||||||
they will be filled in ValidateGC because of dix/CreateGC()
|
|
||||||
setting all the change bits. Others are necessary because although
|
|
||||||
they depend on being a monochrome frame buffer, they don't change
|
|
||||||
*/
|
|
||||||
|
|
||||||
pGC->ops = &afbGCOps;
|
|
||||||
pGC->funcs = &afbFuncs;
|
|
||||||
|
|
||||||
/* afb wants to translate before scan convesion */
|
|
||||||
pGC->miTranslate = 1;
|
|
||||||
|
|
||||||
pPriv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
afbReduceRop(pGC->alu, pGC->fgPixel, pGC->planemask, pGC->depth,
|
|
||||||
pPriv->rrops);
|
|
||||||
afbReduceOpaqueStipple(pGC->fgPixel, pGC->bgPixel, pGC->planemask,
|
|
||||||
pGC->depth, pPriv->rropOS);
|
|
||||||
|
|
||||||
pGC->fExpose = TRUE;
|
|
||||||
pGC->pRotatedPixmap = NullPixmap;
|
|
||||||
pGC->freeCompClip = FALSE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbComputeCompositeClip(GCPtr pGC, DrawablePtr pDrawable)
|
|
||||||
{
|
|
||||||
if (pDrawable->type == DRAWABLE_WINDOW) {
|
|
||||||
WindowPtr pWin = (WindowPtr) pDrawable;
|
|
||||||
RegionPtr pregWin;
|
|
||||||
Bool freeTmpClip, freeCompClip;
|
|
||||||
|
|
||||||
if (pGC->subWindowMode == IncludeInferiors) {
|
|
||||||
pregWin = NotClippedByChildren(pWin);
|
|
||||||
freeTmpClip = TRUE;
|
|
||||||
} else {
|
|
||||||
pregWin = &pWin->clipList;
|
|
||||||
freeTmpClip = FALSE;
|
|
||||||
}
|
|
||||||
freeCompClip = pGC->freeCompClip;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if there is no client clip, we can get by with just keeping the
|
|
||||||
* pointer we got, and remembering whether or not should destroy (or
|
|
||||||
* maybe re-use) it later. this way, we avoid unnecessary copying of
|
|
||||||
* regions. (this wins especially if many clients clip by children
|
|
||||||
* and have no client clip.)
|
|
||||||
*/
|
|
||||||
if (pGC->clientClipType == CT_NONE) {
|
|
||||||
if (freeCompClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, pGC->pCompositeClip);
|
|
||||||
pGC->pCompositeClip = pregWin;
|
|
||||||
pGC->freeCompClip = freeTmpClip;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* we need one 'real' region to put into the composite clip. if
|
|
||||||
* pregWin the current composite clip are real, we can get rid of
|
|
||||||
* one. if pregWin is real and the current composite clip isn't,
|
|
||||||
* use pregWin for the composite clip. if the current composite
|
|
||||||
* clip is real and pregWin isn't, use the current composite
|
|
||||||
* clip. if neither is real, create a new region.
|
|
||||||
*/
|
|
||||||
|
|
||||||
REGION_TRANSLATE(pGC->pScreen, pGC->clientClip,
|
|
||||||
pDrawable->x + pGC->clipOrg.x,
|
|
||||||
pDrawable->y + pGC->clipOrg.y);
|
|
||||||
|
|
||||||
if (freeCompClip) {
|
|
||||||
REGION_INTERSECT(pGC->pScreen, pGC->pCompositeClip, pregWin,
|
|
||||||
pGC->clientClip);
|
|
||||||
if (freeTmpClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, pregWin);
|
|
||||||
} else if (freeTmpClip) {
|
|
||||||
REGION_INTERSECT(pGC->pScreen, pregWin, pregWin, pGC->clientClip);
|
|
||||||
pGC->pCompositeClip = pregWin;
|
|
||||||
} else {
|
|
||||||
pGC->pCompositeClip = REGION_CREATE(pGC->pScreen, NullBox, 0);
|
|
||||||
REGION_INTERSECT(pGC->pScreen, pGC->pCompositeClip,
|
|
||||||
pregWin, pGC->clientClip);
|
|
||||||
}
|
|
||||||
pGC->freeCompClip = TRUE;
|
|
||||||
REGION_TRANSLATE(pGC->pScreen, pGC->clientClip,
|
|
||||||
-(pDrawable->x + pGC->clipOrg.x),
|
|
||||||
-(pDrawable->y + pGC->clipOrg.y));
|
|
||||||
}
|
|
||||||
} /* end of composite clip for a window */
|
|
||||||
else {
|
|
||||||
BoxRec pixbounds;
|
|
||||||
|
|
||||||
/* XXX should we translate by drawable.x/y here ? */
|
|
||||||
pixbounds.x1 = 0;
|
|
||||||
pixbounds.y1 = 0;
|
|
||||||
pixbounds.x2 = pDrawable->width;
|
|
||||||
pixbounds.y2 = pDrawable->height;
|
|
||||||
|
|
||||||
if (pGC->freeCompClip) {
|
|
||||||
REGION_RESET(pGC->pScreen, pGC->pCompositeClip, &pixbounds);
|
|
||||||
} else {
|
|
||||||
pGC->freeCompClip = TRUE;
|
|
||||||
pGC->pCompositeClip = REGION_CREATE(pGC->pScreen, &pixbounds, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pGC->clientClipType == CT_REGION) {
|
|
||||||
REGION_TRANSLATE(pGC->pScreen, pGC->pCompositeClip, -pGC->clipOrg.x,
|
|
||||||
-pGC->clipOrg.y);
|
|
||||||
REGION_INTERSECT(pGC->pScreen, pGC->pCompositeClip,
|
|
||||||
pGC->pCompositeClip, pGC->clientClip);
|
|
||||||
REGION_TRANSLATE(pGC->pScreen, pGC->pCompositeClip, pGC->clipOrg.x,
|
|
||||||
pGC->clipOrg.y);
|
|
||||||
}
|
|
||||||
} /* end of composite clip for pixmap */
|
|
||||||
} /* end afbComputeCompositeClip */
|
|
||||||
|
|
||||||
/* Clipping conventions
|
|
||||||
if the drawable is a window
|
|
||||||
CT_REGION ==> pCompositeClip really is the composite
|
|
||||||
CT_other ==> pCompositeClip is the window clip region
|
|
||||||
if the drawable is a pixmap
|
|
||||||
CT_REGION ==> pCompositeClip is the translated client region
|
|
||||||
clipped to the pixmap boundary
|
|
||||||
CT_other ==> pCompositeClip is the pixmap bounding box
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
static void
|
|
||||||
afbValidateGC(pGC, changes, pDrawable)
|
|
||||||
register GCPtr pGC;
|
|
||||||
unsigned long changes;
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
{
|
|
||||||
register afbPrivGCPtr devPriv;
|
|
||||||
int mask; /* stateChanges */
|
|
||||||
int index; /* used for stepping through bitfields */
|
|
||||||
int xrot, yrot; /* rotations for tile and stipple pattern */
|
|
||||||
/* flags for changing the proc vector
|
|
||||||
and updating things in devPriv
|
|
||||||
*/
|
|
||||||
int new_rotate, new_rrop, new_line, new_text, new_fill;
|
|
||||||
DDXPointRec oldOrg; /* origin of thing GC was last used with */
|
|
||||||
|
|
||||||
oldOrg = pGC->lastWinOrg;
|
|
||||||
|
|
||||||
pGC->lastWinOrg.x = pDrawable->x;
|
|
||||||
pGC->lastWinOrg.y = pDrawable->y;
|
|
||||||
|
|
||||||
/* we need to re-rotate the tile if the previous window/pixmap
|
|
||||||
origin (oldOrg) differs from the new window/pixmap origin
|
|
||||||
(pGC->lastWinOrg)
|
|
||||||
*/
|
|
||||||
new_rotate = (oldOrg.x != pGC->lastWinOrg.x) ||
|
|
||||||
(oldOrg.y != pGC->lastWinOrg.y);
|
|
||||||
|
|
||||||
|
|
||||||
devPriv = (afbPrivGCPtr)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if the client clip is different or moved OR
|
|
||||||
the subwindowMode has changed OR
|
|
||||||
the window's clip has changed since the last validation
|
|
||||||
we need to recompute the composite clip
|
|
||||||
*/
|
|
||||||
if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) ||
|
|
||||||
(pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS)))
|
|
||||||
afbComputeCompositeClip(pGC, pDrawable);
|
|
||||||
|
|
||||||
new_rrop = FALSE;
|
|
||||||
new_line = FALSE;
|
|
||||||
new_text = FALSE;
|
|
||||||
new_fill = FALSE;
|
|
||||||
|
|
||||||
mask = changes;
|
|
||||||
while (mask) {
|
|
||||||
index = lowbit(mask);
|
|
||||||
mask &= ~index;
|
|
||||||
|
|
||||||
/* this switch acculmulates a list of which procedures
|
|
||||||
might have to change due to changes in the GC. in
|
|
||||||
some cases (e.g. changing one 16 bit tile for another)
|
|
||||||
we might not really need a change, but the code is
|
|
||||||
being paranoid.
|
|
||||||
this sort of batching wins if, for example, the alu
|
|
||||||
and the font have been changed, or any other pair
|
|
||||||
of items that both change the same thing.
|
|
||||||
*/
|
|
||||||
switch (index) {
|
|
||||||
case GCPlaneMask:
|
|
||||||
case GCFunction:
|
|
||||||
case GCForeground:
|
|
||||||
new_rrop = TRUE;
|
|
||||||
break;
|
|
||||||
case GCBackground:
|
|
||||||
new_rrop = TRUE; /* for opaque stipples */
|
|
||||||
break;
|
|
||||||
case GCLineStyle:
|
|
||||||
case GCLineWidth:
|
|
||||||
case GCJoinStyle:
|
|
||||||
new_line = TRUE;
|
|
||||||
break;
|
|
||||||
case GCCapStyle:
|
|
||||||
break;
|
|
||||||
case GCFillStyle:
|
|
||||||
new_fill = TRUE;
|
|
||||||
break;
|
|
||||||
case GCFillRule:
|
|
||||||
break;
|
|
||||||
case GCTile:
|
|
||||||
if(pGC->tileIsPixel)
|
|
||||||
break;
|
|
||||||
new_rotate = TRUE;
|
|
||||||
new_fill = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCStipple:
|
|
||||||
if(pGC->stipple == (PixmapPtr)NULL)
|
|
||||||
break;
|
|
||||||
new_rotate = TRUE;
|
|
||||||
new_fill = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCTileStipXOrigin:
|
|
||||||
new_rotate = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCTileStipYOrigin:
|
|
||||||
new_rotate = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCFont:
|
|
||||||
new_text = TRUE;
|
|
||||||
break;
|
|
||||||
case GCSubwindowMode:
|
|
||||||
break;
|
|
||||||
case GCGraphicsExposures:
|
|
||||||
break;
|
|
||||||
case GCClipXOrigin:
|
|
||||||
break;
|
|
||||||
case GCClipYOrigin:
|
|
||||||
break;
|
|
||||||
case GCClipMask:
|
|
||||||
break;
|
|
||||||
case GCDashOffset:
|
|
||||||
break;
|
|
||||||
case GCDashList:
|
|
||||||
break;
|
|
||||||
case GCArcMode:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* deal with the changes we've collected .
|
|
||||||
new_rrop must be done first because subsequent things
|
|
||||||
depend on it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(new_rotate || new_fill) {
|
|
||||||
Bool new_pix = FALSE;
|
|
||||||
|
|
||||||
/* figure out how much to rotate */
|
|
||||||
xrot = pGC->patOrg.x;
|
|
||||||
yrot = pGC->patOrg.y;
|
|
||||||
xrot += pDrawable->x;
|
|
||||||
yrot += pDrawable->y;
|
|
||||||
|
|
||||||
switch (pGC->fillStyle) {
|
|
||||||
case FillTiled:
|
|
||||||
/* copy current tile and stipple */
|
|
||||||
if (!pGC->tileIsPixel &&
|
|
||||||
(pGC->tile.pixmap->drawable.width <= PPW) &&
|
|
||||||
!(pGC->tile.pixmap->drawable.width &
|
|
||||||
(pGC->tile.pixmap->drawable.width - 1))) {
|
|
||||||
afbCopyRotatePixmap(pGC->tile.pixmap, &pGC->pRotatedPixmap,
|
|
||||||
xrot, yrot);
|
|
||||||
new_pix = TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FillStippled:
|
|
||||||
case FillOpaqueStippled:
|
|
||||||
if (pGC->stipple && (pGC->stipple->drawable.width <= PPW) &&
|
|
||||||
!(pGC->stipple->drawable.width &
|
|
||||||
(pGC->stipple->drawable.width - 1))) {
|
|
||||||
afbCopyRotatePixmap(pGC->stipple, &pGC->pRotatedPixmap,
|
|
||||||
xrot, yrot);
|
|
||||||
new_pix = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* destroy any previously rotated tile or stipple */
|
|
||||||
if (!new_pix && pGC->pRotatedPixmap) {
|
|
||||||
(*pDrawable->pScreen->DestroyPixmap)(pGC->pRotatedPixmap);
|
|
||||||
pGC->pRotatedPixmap = (PixmapPtr)NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* duck out here when the GC is unchanged
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!changes)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (new_rrop || new_fill) {
|
|
||||||
afbReduceRop(pGC->alu, pGC->fgPixel, pGC->planemask, pDrawable->depth,
|
|
||||||
devPriv->rrops);
|
|
||||||
afbReduceOpaqueStipple(pGC->fgPixel, pGC->bgPixel, pGC->planemask,
|
|
||||||
pGC->depth, devPriv->rropOS);
|
|
||||||
new_fill = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_line || new_fill || new_text) {
|
|
||||||
if (!pGC->ops->devPrivate.val) {
|
|
||||||
pGC->ops = miCreateGCOps(pGC->ops);
|
|
||||||
pGC->ops->devPrivate.val = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_line || new_fill) {
|
|
||||||
if (pGC->lineWidth == 0) {
|
|
||||||
if (pGC->lineStyle == LineSolid && pGC->fillStyle == FillSolid)
|
|
||||||
pGC->ops->PolyArc = afbZeroPolyArcSS;
|
|
||||||
else
|
|
||||||
pGC->ops->PolyArc = miZeroPolyArc;
|
|
||||||
} else
|
|
||||||
pGC->ops->PolyArc = miPolyArc;
|
|
||||||
if (pGC->lineStyle == LineSolid) {
|
|
||||||
if(pGC->lineWidth == 0) {
|
|
||||||
if (pGC->fillStyle == FillSolid) {
|
|
||||||
pGC->ops->PolySegment = afbSegmentSS;
|
|
||||||
pGC->ops->Polylines = afbLineSS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pGC->ops->PolySegment = miPolySegment;
|
|
||||||
pGC->ops->Polylines = miZeroLine;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pGC->ops->PolySegment = miPolySegment;
|
|
||||||
pGC->ops->Polylines = miWideLine;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(pGC->lineWidth == 0 && pGC->fillStyle == FillSolid) {
|
|
||||||
pGC->ops->PolySegment = afbSegmentSD;
|
|
||||||
pGC->ops->Polylines = afbLineSD;
|
|
||||||
} else {
|
|
||||||
pGC->ops->PolySegment = miPolySegment;
|
|
||||||
pGC->ops->Polylines = miWideDash;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_text || new_fill) {
|
|
||||||
if ((pGC->font) &&
|
|
||||||
(FONTMAXBOUNDS(pGC->font,rightSideBearing) -
|
|
||||||
FONTMINBOUNDS(pGC->font,leftSideBearing) > 32 ||
|
|
||||||
FONTMINBOUNDS(pGC->font,characterWidth) < 0)) {
|
|
||||||
pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
|
|
||||||
pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
|
|
||||||
} else {
|
|
||||||
/* special case ImageGlyphBlt for terminal emulator fonts */
|
|
||||||
if ((pGC->font) &&
|
|
||||||
TERMINALFONT(pGC->font)) {
|
|
||||||
pGC->ops->ImageGlyphBlt = afbTEGlyphBlt;
|
|
||||||
} else {
|
|
||||||
pGC->ops->ImageGlyphBlt = afbImageGlyphBlt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now do PolyGlyphBlt */
|
|
||||||
if (pGC->fillStyle == FillSolid) {
|
|
||||||
pGC->ops->PolyGlyphBlt = afbPolyGlyphBlt;
|
|
||||||
} else {
|
|
||||||
pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_fill) {
|
|
||||||
/* install a suitable fillspans and pushpixels */
|
|
||||||
pGC->ops->PushPixels = afbPushPixels;
|
|
||||||
pGC->ops->FillPolygon = miFillPolygon;
|
|
||||||
pGC->ops->PolyFillArc = miPolyFillArc;
|
|
||||||
|
|
||||||
switch (pGC->fillStyle) {
|
|
||||||
case FillSolid:
|
|
||||||
pGC->ops->FillSpans = afbSolidFS;
|
|
||||||
pGC->ops->FillPolygon = afbFillPolygonSolid;
|
|
||||||
pGC->ops->PolyFillArc = afbPolyFillArcSolid;
|
|
||||||
break;
|
|
||||||
case FillTiled:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
pGC->ops->FillSpans = afbTileFS;
|
|
||||||
else
|
|
||||||
pGC->ops->FillSpans = afbUnnaturalTileFS;
|
|
||||||
break;
|
|
||||||
case FillOpaqueStippled:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
pGC->ops->FillSpans = afbOpaqueStippleFS;
|
|
||||||
else
|
|
||||||
pGC->ops->FillSpans = afbUnnaturalOpaqueStippleFS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FillStippled:
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
pGC->ops->FillSpans = afbStippleFS;
|
|
||||||
else
|
|
||||||
pGC->ops->FillSpans = afbUnnaturalStippleFS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end of new_fill */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbDestroyGC(pGC)
|
|
||||||
GCPtr pGC;
|
|
||||||
{
|
|
||||||
if (pGC->pRotatedPixmap)
|
|
||||||
(*pGC->pScreen->DestroyPixmap)(pGC->pRotatedPixmap);
|
|
||||||
if (pGC->freeCompClip)
|
|
||||||
REGION_DESTROY(pGC->pScreen, pGC->pCompositeClip);
|
|
||||||
miDestroyGCOps(pGC->ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbReduceRop(alu, src, planemask, depth, rop)
|
|
||||||
register int alu;
|
|
||||||
register Pixel src;
|
|
||||||
register unsigned long planemask;
|
|
||||||
int depth;
|
|
||||||
register unsigned char *rop;
|
|
||||||
{
|
|
||||||
register int d;
|
|
||||||
register Pixel mask = 1;
|
|
||||||
|
|
||||||
for (d = 0; d < depth; d++, mask <<= 1) {
|
|
||||||
if (!(planemask & mask))
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
else if ((src & mask) == 0) /* src is black */
|
|
||||||
switch (alu) {
|
|
||||||
case GXclear:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXand:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXandReverse:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXcopy:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXandInverted:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXnoop:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXxor:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXor:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXnor:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXequiv:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXinvert:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXorReverse:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXcopyInverted:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXorInverted:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXnand:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXset:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else /* src is white */
|
|
||||||
switch (alu) {
|
|
||||||
case GXclear:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXand:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXandReverse:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXcopy:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXandInverted:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXnoop:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXxor:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXor:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXnor:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXequiv:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXinvert:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXorReverse:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
case GXcopyInverted:
|
|
||||||
rop[d] = RROP_BLACK;
|
|
||||||
break;
|
|
||||||
case GXorInverted:
|
|
||||||
rop[d] = RROP_NOP;
|
|
||||||
break;
|
|
||||||
case GXnand:
|
|
||||||
rop[d] = RROP_INVERT;
|
|
||||||
break;
|
|
||||||
case GXset:
|
|
||||||
rop[d] = RROP_WHITE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
165
afb/afbgetsp.c
165
afb/afbgetsp.c
|
@ -1,165 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
|
|
||||||
#include "misc.h"
|
|
||||||
#include "region.h"
|
|
||||||
#include "gc.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#include "servermd.h"
|
|
||||||
|
|
||||||
/* GetSpans -- for each span, gets bits from drawable starting at ppt[i]
|
|
||||||
* and continuing for pwidth[i] bits
|
|
||||||
* Each scanline returned will be server scanline padded, i.e., it will come
|
|
||||||
* out to an integral number of words.
|
|
||||||
*/
|
|
||||||
/*ARGSUSED*/
|
|
||||||
void
|
|
||||||
afbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pchardstStart)
|
|
||||||
DrawablePtr pDrawable; /* drawable from which to get bits */
|
|
||||||
int wMax; /* largest value of all *pwidths */
|
|
||||||
register DDXPointPtr ppt; /* points to start copying from */
|
|
||||||
int *pwidth; /* list of number of bits to copy */
|
|
||||||
int nspans; /* number of scanlines to copy */
|
|
||||||
char *pchardstStart; /* where to put the bits */
|
|
||||||
{
|
|
||||||
PixelType *pdstStart = (PixelType *)pchardstStart;
|
|
||||||
register PixelType *pdst; /* where to put the bits */
|
|
||||||
register PixelType *psrc; /* where to get the bits */
|
|
||||||
register PixelType tmpSrc; /* scratch buffer for bits */
|
|
||||||
PixelType *psrcBase; /* start of src bitmap */
|
|
||||||
int widthSrc; /* width of pixmap in bytes */
|
|
||||||
int sizeSrc;
|
|
||||||
int depthSrc;
|
|
||||||
register DDXPointPtr pptLast; /* one past last point to get */
|
|
||||||
int xEnd; /* last pixel to copy from */
|
|
||||||
register int nstart;
|
|
||||||
register int d;
|
|
||||||
int nend = 0;
|
|
||||||
int srcStartOver;
|
|
||||||
PixelType startmask, endmask;
|
|
||||||
unsigned int srcBit;
|
|
||||||
int nlMiddle, nl;
|
|
||||||
int w;
|
|
||||||
|
|
||||||
pptLast = ppt + nspans;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthSrc, sizeSrc, depthSrc,
|
|
||||||
psrcBase);
|
|
||||||
pdst = pdstStart;
|
|
||||||
|
|
||||||
while(ppt < pptLast) {
|
|
||||||
/* XXX should this really be << PWSH, or * 8, or * PGSZB? */
|
|
||||||
xEnd = min(ppt->x + *pwidth, widthSrc << PWSH);
|
|
||||||
pwidth++;
|
|
||||||
for (d = 0; d < depthSrc; d++) {
|
|
||||||
psrc = afbScanline(psrcBase, ppt->x, ppt->y, widthSrc);
|
|
||||||
psrcBase += sizeSrc; /* @@@ NEXT PLANE @@@ */
|
|
||||||
w = xEnd - ppt->x;
|
|
||||||
srcBit = ppt->x & PIM;
|
|
||||||
|
|
||||||
if (srcBit + w <= PPW)
|
|
||||||
{
|
|
||||||
getandputbits0(psrc, srcBit, w, pdst);
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
maskbits(ppt->x, w, startmask, endmask, nlMiddle);
|
|
||||||
if (startmask)
|
|
||||||
nstart = PPW - srcBit;
|
|
||||||
else
|
|
||||||
nstart = 0;
|
|
||||||
if (endmask)
|
|
||||||
nend = xEnd & PIM;
|
|
||||||
srcStartOver = srcBit + nstart > PLST;
|
|
||||||
if (startmask)
|
|
||||||
{
|
|
||||||
getandputbits0(psrc, srcBit, nstart, pdst);
|
|
||||||
if(srcStartOver)
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
#ifdef FASTPUTBITS
|
|
||||||
Duff(nl, putbits(*psrc, nstart, PPW, pdst); psrc++; pdst++;);
|
|
||||||
#else
|
|
||||||
while (nl--)
|
|
||||||
{
|
|
||||||
tmpSrc = *psrc;
|
|
||||||
putbits(tmpSrc, nstart, PPW, pdst);
|
|
||||||
psrc++;
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (endmask)
|
|
||||||
{
|
|
||||||
putbits(*psrc, nstart, nend, pdst);
|
|
||||||
if(nstart + nend > PPW)
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
if (startmask || endmask)
|
|
||||||
pdst++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ppt++;
|
|
||||||
}
|
|
||||||
}
|
|
209
afb/afbhrzvert.c
209
afb/afbhrzvert.c
|
@ -1,209 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
|
|
||||||
#include "gc.h"
|
|
||||||
#include "window.h"
|
|
||||||
#include "pixmap.h"
|
|
||||||
#include "region.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/* horizontal solid line
|
|
||||||
abs(len) > 1
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbHorzS(pbase, nlwidth, sizeDst, depthDst, x1, y1, len, rrops)
|
|
||||||
PixelType *pbase; /* pointer to base of bitmap */
|
|
||||||
register int nlwidth; /* width in longwords of bitmap */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int x1; /* initial point */
|
|
||||||
int y1;
|
|
||||||
int len; /* length of line */
|
|
||||||
register unsigned char *rrops;
|
|
||||||
{
|
|
||||||
register PixelType *addrl;
|
|
||||||
register PixelType startmask;
|
|
||||||
register PixelType endmask;
|
|
||||||
register int nlmiddle;
|
|
||||||
register int d;
|
|
||||||
int saveNLmiddle;
|
|
||||||
|
|
||||||
/* force the line to go left to right
|
|
||||||
but don't draw the last point
|
|
||||||
*/
|
|
||||||
if (len < 0) {
|
|
||||||
x1 += len;
|
|
||||||
x1 += 1;
|
|
||||||
len = -len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* all bits inside same longword */
|
|
||||||
if ( ((x1 & PIM) + len) < PPW) {
|
|
||||||
maskpartialbits(x1, len, startmask);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(pbase, x1, y1, nlwidth);
|
|
||||||
pbase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*addrl &= ~startmask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*addrl |= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*addrl ^= startmask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
} else {
|
|
||||||
maskbits(x1, len, startmask, endmask, nlmiddle);
|
|
||||||
saveNLmiddle = nlmiddle;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(pbase, x1, y1, nlwidth);
|
|
||||||
pbase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
nlmiddle = saveNLmiddle;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
if (startmask)
|
|
||||||
*addrl++ &= ~startmask;
|
|
||||||
Duff (nlmiddle, *addrl++ = 0x0);
|
|
||||||
if (endmask)
|
|
||||||
*addrl &= ~endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
if (startmask)
|
|
||||||
*addrl++ |= startmask;
|
|
||||||
Duff (nlmiddle, *addrl++ = ~0);
|
|
||||||
if (endmask)
|
|
||||||
*addrl |= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
if (startmask)
|
|
||||||
*addrl++ ^= startmask;
|
|
||||||
Duff (nlmiddle, *addrl++ ^= ~0);
|
|
||||||
if (endmask)
|
|
||||||
*addrl ^= endmask;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vertical solid line
|
|
||||||
this uses do loops because pcc (Ultrix 1.2, bsd 4.2) generates
|
|
||||||
better code. sigh. we know that len will never be 0 or 1, so
|
|
||||||
it's OK to use it.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbVertS(pbase, nlwidth, sizeDst, depthDst, x1, y1, len, rrops)
|
|
||||||
PixelType *pbase; /* pointer to base of bitmap */
|
|
||||||
register int nlwidth; /* width in longwords of bitmap */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int x1, y1; /* initial point */
|
|
||||||
register int len; /* length of line */
|
|
||||||
unsigned char *rrops;
|
|
||||||
{
|
|
||||||
register PixelType *addrl;
|
|
||||||
register PixelType bitmask;
|
|
||||||
int saveLen;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
if (len < 0) {
|
|
||||||
nlwidth = -nlwidth;
|
|
||||||
len = -len;
|
|
||||||
}
|
|
||||||
|
|
||||||
saveLen = len;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(pbase, x1, y1, nlwidth);
|
|
||||||
pbase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
len = saveLen;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
bitmask = mfbGetrmask(x1 & PIM);
|
|
||||||
Duff(len, *addrl &= bitmask; afbScanlineInc(addrl, nlwidth) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
bitmask = mfbGetmask(x1 & PIM);
|
|
||||||
Duff(len, *addrl |= bitmask; afbScanlineInc(addrl, nlwidth) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
bitmask = mfbGetmask(x1 & PIM);
|
|
||||||
Duff(len, *addrl ^= bitmask; afbScanlineInc(addrl, nlwidth) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
272
afb/afbimage.c
272
afb/afbimage.c
|
@ -1,272 +0,0 @@
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "servermd.h"
|
|
||||||
#include "mfb.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
afbPutImage(pDraw, pGC, depth, x, y, width, height, leftPad, format, pImage)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
GCPtr pGC;
|
|
||||||
int depth, x, y, width, height;
|
|
||||||
int leftPad;
|
|
||||||
int format;
|
|
||||||
char *pImage;
|
|
||||||
{
|
|
||||||
PixmapPtr pPixmap;
|
|
||||||
|
|
||||||
if ((width == 0) || (height == 0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (format != ZPixmap || depth == 1 || pDraw->depth == 1) {
|
|
||||||
pPixmap = GetScratchPixmapHeader(pDraw->pScreen, width+leftPad, height,
|
|
||||||
depth, depth,
|
|
||||||
BitmapBytePad(width+leftPad),
|
|
||||||
(pointer)pImage);
|
|
||||||
if (!pPixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pGC->fExpose = FALSE;
|
|
||||||
if (format == XYBitmap)
|
|
||||||
(void)(*pGC->ops->CopyPlane)((DrawablePtr)pPixmap, pDraw, pGC, leftPad,
|
|
||||||
0, width, height, x, y, 1);
|
|
||||||
else {
|
|
||||||
(void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, pDraw, pGC, leftPad,
|
|
||||||
0, width, height, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
pGC->fExpose = TRUE;
|
|
||||||
FreeScratchPixmapHeader(pPixmap);
|
|
||||||
} else {
|
|
||||||
/* Chunky to planar conversion required */
|
|
||||||
|
|
||||||
PixmapPtr pPixmap;
|
|
||||||
ScreenPtr pScreen = pDraw->pScreen;
|
|
||||||
int widthSrc;
|
|
||||||
int start_srcshift;
|
|
||||||
register int b;
|
|
||||||
register int dstshift;
|
|
||||||
register int shift_step;
|
|
||||||
register PixelType dst;
|
|
||||||
register PixelType srcbits;
|
|
||||||
register PixelType *pdst;
|
|
||||||
register PixelType *psrc;
|
|
||||||
int start_bit;
|
|
||||||
register int nl;
|
|
||||||
register int h;
|
|
||||||
register int d;
|
|
||||||
int sizeDst;
|
|
||||||
PixelType *pdstBase;
|
|
||||||
int widthDst;
|
|
||||||
int depthDst;
|
|
||||||
|
|
||||||
/* Create a tmp pixmap */
|
|
||||||
pPixmap = (pScreen->CreatePixmap)(pScreen, width, height, depth,
|
|
||||||
CREATE_PIXMAP_USAGE_SCRATCH);
|
|
||||||
if (!pPixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer((DrawablePtr)pPixmap, widthDst,
|
|
||||||
sizeDst, depthDst, pdstBase);
|
|
||||||
|
|
||||||
widthSrc = PixmapWidthInPadUnits(width, depth);
|
|
||||||
/* XXX: if depth == 8, use fast chunky to planar assembly function.*/
|
|
||||||
if (depth > 4) {
|
|
||||||
start_srcshift = 24;
|
|
||||||
shift_step = 8;
|
|
||||||
} else {
|
|
||||||
start_srcshift = 28;
|
|
||||||
shift_step = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (d = 0; d < depth; d++, pdstBase += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
start_bit = start_srcshift + d;
|
|
||||||
psrc = (PixelType *)pImage;
|
|
||||||
pdst = pdstBase;
|
|
||||||
h = height;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
dstshift = PPW - 1;
|
|
||||||
dst = 0;
|
|
||||||
nl = widthSrc;
|
|
||||||
while (nl--) {
|
|
||||||
srcbits = *psrc++;
|
|
||||||
for (b = start_bit; b >= 0; b -= shift_step) {
|
|
||||||
dst |= ((srcbits >> b) & 1) << dstshift;
|
|
||||||
if (--dstshift < 0) {
|
|
||||||
dstshift = PPW - 1;
|
|
||||||
*pdst++ = dst;
|
|
||||||
dst = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dstshift != PPW - 1)
|
|
||||||
*pdst++ = dst;
|
|
||||||
}
|
|
||||||
} /* for (d = ...) */
|
|
||||||
|
|
||||||
pGC->fExpose = FALSE;
|
|
||||||
(void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, pDraw, pGC, leftPad, 0,
|
|
||||||
width, height, x, y);
|
|
||||||
pGC->fExpose = TRUE;
|
|
||||||
(*pScreen->DestroyPixmap)(pPixmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbGetImage(pDrawable, sx, sy, width, height, format, planemask, pdstLine)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
int sx, sy, width, height;
|
|
||||||
unsigned int format;
|
|
||||||
unsigned long planemask;
|
|
||||||
char *pdstLine;
|
|
||||||
{
|
|
||||||
BoxRec box;
|
|
||||||
DDXPointRec ptSrc;
|
|
||||||
RegionRec rgnDst;
|
|
||||||
ScreenPtr pScreen;
|
|
||||||
PixmapPtr pPixmap;
|
|
||||||
|
|
||||||
if ((width == 0) || (height == 0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
pScreen = pDrawable->pScreen;
|
|
||||||
sx += pDrawable->x;
|
|
||||||
sy += pDrawable->y;
|
|
||||||
|
|
||||||
if (format == XYPixmap || pDrawable->depth == 1) {
|
|
||||||
pPixmap = GetScratchPixmapHeader(pScreen, width, height, 1, 1,
|
|
||||||
BitmapBytePad(width), (pointer)pdstLine);
|
|
||||||
if (!pPixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ptSrc.x = sx;
|
|
||||||
ptSrc.y = sy;
|
|
||||||
box.x1 = 0;
|
|
||||||
box.y1 = 0;
|
|
||||||
box.x2 = width;
|
|
||||||
box.y2 = height;
|
|
||||||
REGION_INIT(pScreen, &rgnDst, &box, 1);
|
|
||||||
|
|
||||||
pPixmap->drawable.depth = 1;
|
|
||||||
pPixmap->drawable.bitsPerPixel = 1;
|
|
||||||
/* dix layer only ever calls GetImage with 1 bit set in planemask
|
|
||||||
* when format is XYPixmap.
|
|
||||||
*/
|
|
||||||
afbDoBitblt(pDrawable, (DrawablePtr)pPixmap, GXcopy, &rgnDst, &ptSrc,
|
|
||||||
planemask);
|
|
||||||
|
|
||||||
FreeScratchPixmapHeader(pPixmap);
|
|
||||||
REGION_UNINIT(pScreen, &rgnDst);
|
|
||||||
} else {
|
|
||||||
/* Planar to chunky conversion required */
|
|
||||||
|
|
||||||
PixelType *psrcBits;
|
|
||||||
PixelType *psrcLine;
|
|
||||||
PixelType startmask, endmask;
|
|
||||||
int depthSrc;
|
|
||||||
int widthSrc;
|
|
||||||
int sizeSrc;
|
|
||||||
int sizeDst;
|
|
||||||
int widthDst;
|
|
||||||
register PixelType *psrc;
|
|
||||||
register PixelType *pdst;
|
|
||||||
register PixelType dst;
|
|
||||||
register PixelType srcbits;
|
|
||||||
register int d;
|
|
||||||
register int b;
|
|
||||||
register int dstshift;
|
|
||||||
register int shift_step;
|
|
||||||
register int start_endbit;
|
|
||||||
int start_startbit;
|
|
||||||
register int end_endbit = 0;
|
|
||||||
register int start_dstshift;
|
|
||||||
register int nl;
|
|
||||||
register int h;
|
|
||||||
int nlmiddle;
|
|
||||||
|
|
||||||
widthDst = PixmapWidthInPadUnits(width, pDrawable->depth);
|
|
||||||
sizeDst = widthDst * height;
|
|
||||||
|
|
||||||
/* Clear the dest image */
|
|
||||||
bzero(pdstLine, sizeDst << 2);
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthSrc, sizeSrc,
|
|
||||||
depthSrc, psrcBits);
|
|
||||||
|
|
||||||
psrcBits = afbScanline(psrcBits, sx, sy, widthSrc);
|
|
||||||
|
|
||||||
start_startbit = PPW - 1 - (sx & PIM);
|
|
||||||
if ((sx & PIM) + width < PPW) {
|
|
||||||
maskpartialbits(sx, width, startmask);
|
|
||||||
nlmiddle = 0;
|
|
||||||
endmask = 0;
|
|
||||||
start_endbit = PPW - ((sx + width) & PIM);
|
|
||||||
} else {
|
|
||||||
maskbits(sx, width, startmask, endmask, nlmiddle);
|
|
||||||
start_endbit = 0;
|
|
||||||
end_endbit = PPW - ((sx + width) & PIM);
|
|
||||||
}
|
|
||||||
/* ZPixmap images have either 4 or 8 bits per pixel dependent on
|
|
||||||
* depth.
|
|
||||||
*/
|
|
||||||
if (depthSrc > 4) {
|
|
||||||
start_dstshift = 24;
|
|
||||||
shift_step = 8;
|
|
||||||
} else {
|
|
||||||
start_dstshift = 28;
|
|
||||||
shift_step = 4;
|
|
||||||
}
|
|
||||||
#define SHIFT_BITS(start_bit,end_bit) \
|
|
||||||
for (b = (start_bit); b >= (end_bit); b--) { \
|
|
||||||
dst |= ((srcbits >> b) & 1) << dstshift; \
|
|
||||||
if ((dstshift -= shift_step) < 0) { \
|
|
||||||
dstshift = start_dstshift + d; \
|
|
||||||
*pdst++ = dst; \
|
|
||||||
dst = *pdst; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
|
|
||||||
for (d = 0; d < depthSrc; d++, psrcBits += sizeSrc) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
psrcLine = psrcBits;
|
|
||||||
pdst = (PixelType *)pdstLine;
|
|
||||||
h = height;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
psrc = psrcLine;
|
|
||||||
psrcLine += widthSrc;
|
|
||||||
dst = *pdst;
|
|
||||||
dstshift = start_dstshift + d;
|
|
||||||
|
|
||||||
if (startmask) {
|
|
||||||
srcbits = *psrc++ & startmask;
|
|
||||||
SHIFT_BITS(start_startbit, start_endbit);
|
|
||||||
}
|
|
||||||
|
|
||||||
nl = nlmiddle;
|
|
||||||
while (nl--) {
|
|
||||||
srcbits = *psrc++;
|
|
||||||
SHIFT_BITS(PPW - 1, 0);
|
|
||||||
}
|
|
||||||
if (endmask) {
|
|
||||||
srcbits = *psrc & endmask;
|
|
||||||
SHIFT_BITS(PPW - 1, end_endbit);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dstshift != start_dstshift + d)
|
|
||||||
*pdst++ = dst;
|
|
||||||
} /* while (h--) */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
||||||
}
|
|
472
afb/afbimggblt.c
472
afb/afbimggblt.c
|
@ -1,472 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include <X11/fonts/fontstruct.h>
|
|
||||||
#include "dixfontstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
we should eventually special-case fixed-width fonts for ImageText.
|
|
||||||
|
|
||||||
this works for fonts with glyphs <= 32 bits wide.
|
|
||||||
|
|
||||||
the clipping calculations are done for worst-case fonts.
|
|
||||||
we make no assumptions about the heights, widths, or bearings
|
|
||||||
of the glyphs. if we knew that the glyphs are all the same height,
|
|
||||||
we could clip the tops and bottoms per clipping box, rather
|
|
||||||
than per character per clipping box. if we knew that the glyphs'
|
|
||||||
left and right bearings were wlle-behaved, we could clip a single
|
|
||||||
character at the start, output until the last unclipped
|
|
||||||
character, and then clip the last one. this is all straightforward
|
|
||||||
to determine based on max-bounds and min-bounds from the font.
|
|
||||||
there is some inefficiency introduced in the per-character
|
|
||||||
clipping to make what's going on clearer.
|
|
||||||
|
|
||||||
(it is possible, for example, for a font to be defined in which the
|
|
||||||
next-to-last character in a font would be clipped out, but the last
|
|
||||||
one wouldn't. the code below deals with this.)
|
|
||||||
|
|
||||||
Image text looks at the bits in the glyph and the fg and bg in the
|
|
||||||
GC. it paints a rectangle, as defined in the protocol dcoument,
|
|
||||||
and the paints the characters.
|
|
||||||
|
|
||||||
the register allocations for startmask and endmask may not
|
|
||||||
be the right thing. are there two other deserving candidates?
|
|
||||||
xoff, pdst, pglyph, and tmpSrc seem like the right things, though.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
afbImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GC *pGC;
|
|
||||||
int x, y;
|
|
||||||
unsigned int nglyph;
|
|
||||||
CharInfoPtr *ppci; /* array of character info */
|
|
||||||
pointer pglyphBase; /* start of array of glyphs */
|
|
||||||
{
|
|
||||||
ExtentInfoRec info; /* used by QueryGlyphExtents() */
|
|
||||||
BoxRec bbox; /* string's bounding box */
|
|
||||||
xRectangle backrect;/* backing rectangle to paint.
|
|
||||||
in the general case, NOT necessarily
|
|
||||||
the same as the string's bounding box
|
|
||||||
*/
|
|
||||||
|
|
||||||
CharInfoPtr pci;
|
|
||||||
int xorg, yorg; /* origin of drawable in bitmap */
|
|
||||||
int widthDst; /* width of dst in longwords */
|
|
||||||
|
|
||||||
/* these keep track of the character origin */
|
|
||||||
PixelType *pdstBase;
|
|
||||||
/* points to longword with character origin */
|
|
||||||
int xchar; /* xorigin of char (mod 32) */
|
|
||||||
|
|
||||||
/* these are used for placing the glyph */
|
|
||||||
register int xoff; /* x offset of left edge of glyph (mod 32) */
|
|
||||||
register PixelType *pdst;
|
|
||||||
/* pointer to current longword in dst */
|
|
||||||
|
|
||||||
register int d;
|
|
||||||
int depthDst;
|
|
||||||
int sizeDst;
|
|
||||||
int hSave;
|
|
||||||
int w; /* width of glyph in bits */
|
|
||||||
int h; /* height of glyph */
|
|
||||||
int widthGlyph; /* width of glyph, in bytes */
|
|
||||||
unsigned char rrops[AFB_MAX_DEPTH];
|
|
||||||
register unsigned char *pglyph;
|
|
||||||
/* pointer to current row of glyph */
|
|
||||||
unsigned char *pglyphSave;
|
|
||||||
|
|
||||||
/* used for putting down glyph */
|
|
||||||
register PixelType tmpSrc;
|
|
||||||
/* for getting bits from glyph */
|
|
||||||
register PixelType startmask;
|
|
||||||
register PixelType endmask;
|
|
||||||
|
|
||||||
register int nFirst;/* bits of glyph in current longword */
|
|
||||||
PixelType *pdstSave;
|
|
||||||
int oldFill;
|
|
||||||
afbPrivGC *pPriv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
xorg = pDrawable->x;
|
|
||||||
yorg = pDrawable->y;
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthDst, sizeDst, depthDst,
|
|
||||||
pdstBase);
|
|
||||||
|
|
||||||
QueryGlyphExtents(pGC->font, ppci, (unsigned long)nglyph, &info);
|
|
||||||
|
|
||||||
backrect.x = x;
|
|
||||||
backrect.y = y - FONTASCENT(pGC->font);
|
|
||||||
backrect.width = info.overallWidth;
|
|
||||||
backrect.height = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font);
|
|
||||||
|
|
||||||
x += xorg;
|
|
||||||
y += yorg;
|
|
||||||
|
|
||||||
bbox.x1 = x + info.overallLeft;
|
|
||||||
bbox.x2 = x + info.overallRight;
|
|
||||||
bbox.y1 = y - info.overallAscent;
|
|
||||||
bbox.y2 = y + info.overallDescent;
|
|
||||||
|
|
||||||
oldFill = pGC->fillStyle;
|
|
||||||
pGC->fillStyle = FillSolid;
|
|
||||||
afbReduceRop (pGC->alu, pGC->bgPixel, pGC->planemask, pGC->depth,
|
|
||||||
pPriv->rrops);
|
|
||||||
afbPolyFillRect(pDrawable, pGC, 1, &backrect);
|
|
||||||
pGC->fillStyle = oldFill;
|
|
||||||
afbReduceRop (pGC->alu, pGC->fgPixel, pGC->planemask, pGC->depth,
|
|
||||||
pPriv->rrops);
|
|
||||||
afbReduceRop (GXcopy, pGC->fgPixel, pGC->planemask, pGC->depth, rrops);
|
|
||||||
|
|
||||||
/* the faint-hearted can open their eyes now */
|
|
||||||
|
|
||||||
switch (RECT_IN_REGION(pGC->pScreen, pGC->pCompositeClip, &bbox)) {
|
|
||||||
case rgnOUT:
|
|
||||||
break;
|
|
||||||
case rgnIN:
|
|
||||||
pdstBase = afbScanlineNoBankSwitch(pdstBase, x, y, widthDst);
|
|
||||||
xchar = x & PIM;
|
|
||||||
|
|
||||||
while(nglyph--) {
|
|
||||||
pci = *ppci;
|
|
||||||
pglyphSave = FONTGLYPHBITS(pglyphBase, pci);
|
|
||||||
w = pci->metrics.rightSideBearing - pci->metrics.leftSideBearing;
|
|
||||||
hSave = pci->metrics.ascent + pci->metrics.descent;
|
|
||||||
widthGlyph = GLYPHWIDTHBYTESPADDED(pci);
|
|
||||||
/* start at top scanline of glyph */
|
|
||||||
pdstSave = afbScanlineDelta(pdstBase, -pci->metrics.ascent,
|
|
||||||
widthDst);
|
|
||||||
|
|
||||||
/* find correct word in scanline and x offset within it
|
|
||||||
for left edge of glyph
|
|
||||||
*/
|
|
||||||
xoff = xchar + pci->metrics.leftSideBearing;
|
|
||||||
if (xoff > PLST) {
|
|
||||||
pdstSave++;
|
|
||||||
xoff &= PIM;
|
|
||||||
} else if (xoff < 0) {
|
|
||||||
xoff += PPW;
|
|
||||||
pdstSave--;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = hSave;
|
|
||||||
pdst = pdstSave;
|
|
||||||
pdstSave += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
pglyph = pglyphSave;
|
|
||||||
|
|
||||||
if ((xoff + w) <= PPW) {
|
|
||||||
/* glyph all in one longword */
|
|
||||||
maskpartialbits(xoff, w, startmask);
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst |= SCRRIGHT(tmpSrc, xoff) & startmask;
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* glyph crosses longword boundary */
|
|
||||||
maskPPWbits(xoff, w, startmask, endmask);
|
|
||||||
nFirst = PPW - xoff;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) &= ~(SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst |= SCRRIGHT(tmpSrc, xoff) & startmask;
|
|
||||||
*(pdst+1) |= SCRLEFT(tmpSrc, nFirst) & endmask;
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* glyph crosses longwords boundary */
|
|
||||||
} /* depth loop */
|
|
||||||
/* update character origin */
|
|
||||||
x += pci->metrics.characterWidth;
|
|
||||||
xchar += pci->metrics.characterWidth;
|
|
||||||
if (xchar > PLST) {
|
|
||||||
xchar -= PPW;
|
|
||||||
pdstBase++;
|
|
||||||
} else if (xchar < 0) {
|
|
||||||
xchar += PPW;
|
|
||||||
pdstBase--;
|
|
||||||
}
|
|
||||||
ppci++;
|
|
||||||
} /* while nglyph-- */
|
|
||||||
break;
|
|
||||||
case rgnPART:
|
|
||||||
{
|
|
||||||
afbTEXTPOS *ppos;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
RegionPtr cclip;
|
|
||||||
int xpos; /* x position of char origin */
|
|
||||||
int i;
|
|
||||||
BoxRec clip;
|
|
||||||
int leftEdge, rightEdge;
|
|
||||||
int topEdge, bottomEdge;
|
|
||||||
int glyphRow; /* first row of glyph not wholly
|
|
||||||
clipped out */
|
|
||||||
int glyphCol; /* leftmost visible column of glyph */
|
|
||||||
#if GETLEFTBITS_ALIGNMENT > 1
|
|
||||||
int getWidth; /* bits to get from glyph */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(!(ppos = (afbTEXTPOS *)xalloc(nglyph * sizeof(afbTEXTPOS))))
|
|
||||||
return;
|
|
||||||
|
|
||||||
pdstBase = afbScanlineNoBankSwitch(pdstBase, x, y, widthDst);
|
|
||||||
xpos = x;
|
|
||||||
xchar = xpos & PIM;
|
|
||||||
|
|
||||||
for (i = 0; i < nglyph; i++) {
|
|
||||||
pci = ppci[i];
|
|
||||||
|
|
||||||
ppos[i].xpos = xpos;
|
|
||||||
ppos[i].xchar = xchar;
|
|
||||||
ppos[i].leftEdge = xpos + pci->metrics.leftSideBearing;
|
|
||||||
ppos[i].rightEdge = xpos + pci->metrics.rightSideBearing;
|
|
||||||
ppos[i].topEdge = y - pci->metrics.ascent;
|
|
||||||
ppos[i].bottomEdge = y + pci->metrics.descent;
|
|
||||||
ppos[i].pdstBase = pdstBase;
|
|
||||||
ppos[i].widthGlyph = GLYPHWIDTHBYTESPADDED(pci);
|
|
||||||
|
|
||||||
xpos += pci->metrics.characterWidth;
|
|
||||||
xchar += pci->metrics.characterWidth;
|
|
||||||
if (xchar > PLST) {
|
|
||||||
xchar &= PIM;
|
|
||||||
pdstBase++;
|
|
||||||
} else if (xchar < 0) {
|
|
||||||
xchar += PPW;
|
|
||||||
pdstBase--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
pbox = REGION_RECTS(cclip);
|
|
||||||
nbox = REGION_NUM_RECTS(cclip);
|
|
||||||
|
|
||||||
/* HACK ALERT
|
|
||||||
since we continue out of the loop below so often, it
|
|
||||||
is easier to increment pbox at the top than at the end.
|
|
||||||
don't try this at home.
|
|
||||||
*/
|
|
||||||
pbox--;
|
|
||||||
while(nbox--) {
|
|
||||||
pbox++;
|
|
||||||
clip.x1 = max(bbox.x1, pbox->x1);
|
|
||||||
clip.y1 = max(bbox.y1, pbox->y1);
|
|
||||||
clip.x2 = min(bbox.x2, pbox->x2);
|
|
||||||
clip.y2 = min(bbox.y2, pbox->y2);
|
|
||||||
if ((clip.x2<=clip.x1) || (clip.y2<=clip.y1))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for(i=0; i<nglyph; i++) {
|
|
||||||
pci = ppci[i];
|
|
||||||
xchar = ppos[i].xchar;
|
|
||||||
|
|
||||||
/* clip the left and right edges */
|
|
||||||
if (ppos[i].leftEdge < clip.x1)
|
|
||||||
leftEdge = clip.x1;
|
|
||||||
else
|
|
||||||
leftEdge = ppos[i].leftEdge;
|
|
||||||
|
|
||||||
if (ppos[i].rightEdge > clip.x2)
|
|
||||||
rightEdge = clip.x2;
|
|
||||||
else
|
|
||||||
rightEdge = ppos[i].rightEdge;
|
|
||||||
|
|
||||||
w = rightEdge - leftEdge;
|
|
||||||
if (w <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* clip the top and bottom edges */
|
|
||||||
if (ppos[i].topEdge < clip.y1)
|
|
||||||
topEdge = clip.y1;
|
|
||||||
else
|
|
||||||
topEdge = ppos[i].topEdge;
|
|
||||||
|
|
||||||
if (ppos[i].bottomEdge > clip.y2)
|
|
||||||
bottomEdge = clip.y2;
|
|
||||||
else
|
|
||||||
bottomEdge = ppos[i].bottomEdge;
|
|
||||||
|
|
||||||
hSave = bottomEdge - topEdge;
|
|
||||||
if (hSave <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
glyphRow = (topEdge - y) + pci->metrics.ascent;
|
|
||||||
widthGlyph = ppos[i].widthGlyph;
|
|
||||||
pglyphSave = FONTGLYPHBITS(pglyphBase, pci);
|
|
||||||
pglyphSave += (glyphRow * widthGlyph);
|
|
||||||
|
|
||||||
glyphCol = (leftEdge - ppos[i].xpos) -
|
|
||||||
(pci->metrics.leftSideBearing);
|
|
||||||
#if GETLEFTBITS_ALIGNMENT > 1
|
|
||||||
getWidth = w + glyphCol;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pdstSave = afbScanlineDelta(ppos[i].pdstBase, -(y-topEdge),
|
|
||||||
widthDst);
|
|
||||||
xoff = xchar + (leftEdge - ppos[i].xpos);
|
|
||||||
if (xoff > PLST) {
|
|
||||||
xoff &= PIM;
|
|
||||||
pdstSave++;
|
|
||||||
} else if (xoff < 0) {
|
|
||||||
xoff += PPW;
|
|
||||||
pdstSave--;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = hSave;
|
|
||||||
pdst = pdstSave;
|
|
||||||
pdstSave += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
pglyph = pglyphSave;
|
|
||||||
|
|
||||||
if ((xoff + w) <= PPW) {
|
|
||||||
maskpartialbits(xoff, w, startmask);
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst |= SCRRIGHT(tmpSrc, xoff) & startmask;
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
maskPPWbits(xoff, w, startmask, endmask);
|
|
||||||
nFirst = PPW - xoff;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) &= ~(SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst |= SCRRIGHT(tmpSrc, xoff) & startmask;
|
|
||||||
*(pdst+1) |= SCRLEFT(tmpSrc, nFirst) & endmask;
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* depth */
|
|
||||||
} /* for each glyph */
|
|
||||||
} /* while nbox-- */
|
|
||||||
xfree(ppos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
707
afb/afbline.c
707
afb/afbline.c
|
@ -1,707 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "mistruct.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "miline.h"
|
|
||||||
|
|
||||||
/* single-pixel lines on a color frame buffer
|
|
||||||
|
|
||||||
NON-SLOPED LINES
|
|
||||||
horizontal lines are always drawn left to right; we have to
|
|
||||||
move the endpoints right by one after they're swapped.
|
|
||||||
horizontal lines will be confined to a single band of a
|
|
||||||
region. the code finds that band (giving up if the lower
|
|
||||||
bound of the band is above the line we're drawing); then it
|
|
||||||
finds the first box in that band that contains part of the
|
|
||||||
line. we clip the line to subsequent boxes in that band.
|
|
||||||
vertical lines are always drawn top to bottom (y-increasing.)
|
|
||||||
this requires adding one to the y-coordinate of each endpoint
|
|
||||||
after swapping.
|
|
||||||
|
|
||||||
SLOPED LINES
|
|
||||||
when clipping a sloped line, we bring the second point inside
|
|
||||||
the clipping box, rather than one beyond it, and then add 1 to
|
|
||||||
the length of the line before drawing it. this lets us use
|
|
||||||
the same box for finding the outcodes for both endpoints. since
|
|
||||||
the equation for clipping the second endpoint to an edge gives us
|
|
||||||
1 beyond the edge, we then have to move the point towards the
|
|
||||||
first point by one step on the major axis.
|
|
||||||
eventually, there will be a diagram here to explain what's going
|
|
||||||
on. the method uses Cohen-Sutherland outcodes to determine
|
|
||||||
outsideness, and a method similar to Pike's layers for doing the
|
|
||||||
actual clipping.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
afbSegmentSS(pDrawable, pGC, nseg, pSeg)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GCPtr pGC;
|
|
||||||
int nseg;
|
|
||||||
register xSegment *pSeg;
|
|
||||||
#else
|
|
||||||
afbLineSS(pDrawable, pGC, mode, npt, pptInit)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GCPtr pGC;
|
|
||||||
int mode; /* Origin or Previous */
|
|
||||||
int npt; /* number of points */
|
|
||||||
DDXPointPtr pptInit;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int nboxInit;
|
|
||||||
register int nbox;
|
|
||||||
BoxPtr pboxInit;
|
|
||||||
register BoxPtr pbox;
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
register DDXPointPtr ppt; /* pointer to list of translated points */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned int oc1; /* outcode of point 1 */
|
|
||||||
unsigned int oc2; /* outcode of point 2 */
|
|
||||||
|
|
||||||
PixelType *addrlBase; /* pointer to start of drawable */
|
|
||||||
int nlwidth; /* width in longwords of destination pixmap */
|
|
||||||
int xorg, yorg; /* origin of window */
|
|
||||||
|
|
||||||
int adx; /* abs values of dx and dy */
|
|
||||||
int ady;
|
|
||||||
int signdx; /* sign of dx and dy */
|
|
||||||
int signdy;
|
|
||||||
int e, e1, e2; /* bresenham error and increments */
|
|
||||||
int len; /* length of segment */
|
|
||||||
int axis; /* major axis */
|
|
||||||
int octant;
|
|
||||||
unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
|
|
||||||
int depthDst;
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
PixelType *addrl; /* address of destination pixmap */
|
|
||||||
int d;
|
|
||||||
#endif
|
|
||||||
int sizeDst;
|
|
||||||
unsigned char *rrops;
|
|
||||||
|
|
||||||
/* a bunch of temporaries */
|
|
||||||
register int y1, y2;
|
|
||||||
register int x1, x2;
|
|
||||||
RegionPtr cclip;
|
|
||||||
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
rrops = ((afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey))->rrops;
|
|
||||||
pboxInit = REGION_RECTS(cclip);
|
|
||||||
nboxInit = REGION_NUM_RECTS(cclip);
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, nlwidth, sizeDst, depthDst,
|
|
||||||
addrlBase);
|
|
||||||
|
|
||||||
xorg = pDrawable->x;
|
|
||||||
yorg = pDrawable->y;
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
while (nseg--)
|
|
||||||
#else
|
|
||||||
ppt = pptInit;
|
|
||||||
x2 = ppt->x + xorg;
|
|
||||||
y2 = ppt->y + yorg;
|
|
||||||
while(--npt)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
nbox = nboxInit;
|
|
||||||
pbox = pboxInit;
|
|
||||||
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
x1 = pSeg->x1 + xorg;
|
|
||||||
y1 = pSeg->y1 + yorg;
|
|
||||||
x2 = pSeg->x2 + xorg;
|
|
||||||
y2 = pSeg->y2 + yorg;
|
|
||||||
pSeg++;
|
|
||||||
#else
|
|
||||||
x1 = x2;
|
|
||||||
y1 = y2;
|
|
||||||
++ppt;
|
|
||||||
if (mode == CoordModePrevious) {
|
|
||||||
xorg = x1;
|
|
||||||
yorg = y1;
|
|
||||||
}
|
|
||||||
x2 = ppt->x + xorg;
|
|
||||||
y2 = ppt->y + yorg;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (x1 == x2) /* vertical line */
|
|
||||||
{
|
|
||||||
/* make the line go top to bottom of screen, keeping
|
|
||||||
endpoint semantics
|
|
||||||
*/
|
|
||||||
if (y1 > y2) {
|
|
||||||
register int tmp;
|
|
||||||
|
|
||||||
tmp = y2;
|
|
||||||
y2 = y1 + 1;
|
|
||||||
y1 = tmp + 1;
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (pGC->capStyle != CapNotLast)
|
|
||||||
y1--;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
else if (pGC->capStyle != CapNotLast)
|
|
||||||
y2++;
|
|
||||||
#endif
|
|
||||||
/* get to first band that might contain part of line */
|
|
||||||
while ((nbox) && (pbox->y2 <= y1)) {
|
|
||||||
pbox++;
|
|
||||||
nbox--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbox) {
|
|
||||||
/* stop when lower edge of box is beyond end of line */
|
|
||||||
while((nbox) && (y2 >= pbox->y1)) {
|
|
||||||
if ((x1 >= pbox->x1) && (x1 < pbox->x2)) {
|
|
||||||
int y1t, y2t;
|
|
||||||
/* this box has part of the line in it */
|
|
||||||
y1t = max(y1, pbox->y1);
|
|
||||||
y2t = min(y2, pbox->y2);
|
|
||||||
if (y1t != y2t)
|
|
||||||
afbVertS(addrlBase, nlwidth, sizeDst, depthDst, x1, y1t,
|
|
||||||
y2t-y1t, rrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
}
|
|
||||||
nbox--;
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
y2 = ppt->y + yorg;
|
|
||||||
#endif
|
|
||||||
} else if (y1 == y2) /* horizontal line */ {
|
|
||||||
/* force line from left to right, keeping
|
|
||||||
endpoint semantics
|
|
||||||
*/
|
|
||||||
if (x1 > x2) {
|
|
||||||
register int tmp;
|
|
||||||
|
|
||||||
tmp = x2;
|
|
||||||
x2 = x1 + 1;
|
|
||||||
x1 = tmp + 1;
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (pGC->capStyle != CapNotLast)
|
|
||||||
x1--;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
else if (pGC->capStyle != CapNotLast)
|
|
||||||
x2++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* find the correct band */
|
|
||||||
while( (nbox) && (pbox->y2 <= y1)) {
|
|
||||||
pbox++;
|
|
||||||
nbox--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* try to draw the line, if we haven't gone beyond it */
|
|
||||||
if ((nbox) && (pbox->y1 <= y1)) {
|
|
||||||
int tmp;
|
|
||||||
|
|
||||||
/* when we leave this band, we're done */
|
|
||||||
tmp = pbox->y1;
|
|
||||||
while((nbox) && (pbox->y1 == tmp)) {
|
|
||||||
int x1t, x2t;
|
|
||||||
|
|
||||||
if (pbox->x2 <= x1) {
|
|
||||||
/* skip boxes until one might contain start point */
|
|
||||||
nbox--;
|
|
||||||
pbox++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stop if left of box is beyond right of line */
|
|
||||||
if (pbox->x1 >= x2) {
|
|
||||||
nbox = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
x1t = max(x1, pbox->x1);
|
|
||||||
x2t = min(x2, pbox->x2);
|
|
||||||
if (x1t != x2t)
|
|
||||||
afbHorzS(addrlBase, nlwidth, sizeDst, depthDst, x1t, y1,
|
|
||||||
x2t-x1t, rrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
nbox--;
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
x2 = ppt->x + xorg;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else /* sloped line */
|
|
||||||
{
|
|
||||||
CalcLineDeltas(x1, y1, x2, y2, adx, ady,
|
|
||||||
signdx, signdy, 1, 1, octant);
|
|
||||||
|
|
||||||
if (adx > ady) {
|
|
||||||
axis = X_AXIS;
|
|
||||||
e1 = ady << 1;
|
|
||||||
e2 = e1 - (adx << 1);
|
|
||||||
e = e1 - adx;
|
|
||||||
} else {
|
|
||||||
axis = Y_AXIS;
|
|
||||||
e1 = adx << 1;
|
|
||||||
e2 = e1 - (ady << 1);
|
|
||||||
e = e1 - ady;
|
|
||||||
SetYMajorOctant(octant);
|
|
||||||
}
|
|
||||||
|
|
||||||
FIXUP_ERROR(e, octant, bias);
|
|
||||||
|
|
||||||
/* we have bresenham parameters and two points.
|
|
||||||
all we have to do now is clip and draw.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while(nbox--) {
|
|
||||||
oc1 = 0;
|
|
||||||
oc2 = 0;
|
|
||||||
OUTCODES(oc1, x1, y1, pbox);
|
|
||||||
OUTCODES(oc2, x2, y2, pbox);
|
|
||||||
if ((oc1 | oc2) == 0) {
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
len = adx;
|
|
||||||
else
|
|
||||||
len = ady;
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (pGC->capStyle != CapNotLast)
|
|
||||||
len++;
|
|
||||||
#endif
|
|
||||||
afbBresS(addrlBase, nlwidth, sizeDst, depthDst, signdx, signdy,
|
|
||||||
axis, x1, y1, e, e1, e2, len, rrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
break;
|
|
||||||
} else if (oc1 & oc2) {
|
|
||||||
pbox++;
|
|
||||||
} else {
|
|
||||||
int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2;
|
|
||||||
int clip1 = 0, clip2 = 0;
|
|
||||||
int clipdx, clipdy;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (miZeroClipLine(pbox->x1, pbox->y1, pbox->x2-1,
|
|
||||||
pbox->y2-1,
|
|
||||||
&new_x1, &new_y1, &new_x2, &new_y2,
|
|
||||||
adx, ady, &clip1, &clip2,
|
|
||||||
octant, bias, oc1, oc2) == -1) {
|
|
||||||
pbox++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
len = abs(new_x2 - new_x1);
|
|
||||||
else
|
|
||||||
len = abs(new_y2 - new_y1);
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (clip2 != 0 || pGC->capStyle != CapNotLast)
|
|
||||||
len++;
|
|
||||||
#else
|
|
||||||
len += (clip2 != 0);
|
|
||||||
#endif
|
|
||||||
if (len) {
|
|
||||||
/* unwind bresenham error term to first point */
|
|
||||||
if (clip1) {
|
|
||||||
clipdx = abs(new_x1 - x1);
|
|
||||||
clipdy = abs(new_y1 - y1);
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
err = e+((clipdy*e2) + ((clipdx-clipdy)*e1));
|
|
||||||
else
|
|
||||||
err = e+((clipdx*e2) + ((clipdy-clipdx)*e1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
err = e;
|
|
||||||
afbBresS(addrlBase, nlwidth, sizeDst, depthDst, signdx,
|
|
||||||
signdy, axis, new_x1, new_y1, err, e1, e2, len,
|
|
||||||
rrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
} /* while (nbox--) */
|
|
||||||
} /* sloped line */
|
|
||||||
} /* while (nline--) */
|
|
||||||
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
|
|
||||||
/* paint the last point if the end style isn't CapNotLast.
|
|
||||||
(Assume that a projecting, butt, or round cap that is one
|
|
||||||
pixel wide is the same as the single pixel of the endpoint.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((pGC->capStyle != CapNotLast) &&
|
|
||||||
((ppt->x + xorg != pptInit->x + pDrawable->x) ||
|
|
||||||
(ppt->y + yorg != pptInit->y + pDrawable->y) ||
|
|
||||||
(ppt == pptInit + 1))) {
|
|
||||||
nbox = nboxInit;
|
|
||||||
pbox = pboxInit;
|
|
||||||
while (nbox--) {
|
|
||||||
if ((x2 >= pbox->x1) && (y2 >= pbox->y1) && (x2 < pbox->x2) &&
|
|
||||||
(y2 < pbox->y2)) {
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(addrlBase, x2, y2, nlwidth);
|
|
||||||
addrlBase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
switch(rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*addrl &= mfbGetrmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*addrl |= mfbGetmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*addrl ^= mfbGetmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Draw dashed 1-pixel lines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
afbSegmentSD(pDrawable, pGC, nseg, pSeg)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
register GCPtr pGC;
|
|
||||||
int nseg;
|
|
||||||
register xSegment *pSeg;
|
|
||||||
#else
|
|
||||||
afbLineSD(pDrawable, pGC, mode, npt, pptInit)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
register GCPtr pGC;
|
|
||||||
int mode; /* Origin or Previous */
|
|
||||||
int npt; /* number of points */
|
|
||||||
DDXPointPtr pptInit;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int nboxInit;
|
|
||||||
register int nbox;
|
|
||||||
BoxPtr pboxInit;
|
|
||||||
register BoxPtr pbox;
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
register DDXPointPtr ppt; /* pointer to list of translated points */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
register unsigned int oc1; /* outcode of point 1 */
|
|
||||||
register unsigned int oc2; /* outcode of point 2 */
|
|
||||||
|
|
||||||
PixelType *addrlBase; /* address of destination pixmap */
|
|
||||||
int nlwidth; /* width in longwords of destination pixmap */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int xorg, yorg; /* origin of window */
|
|
||||||
|
|
||||||
int adx; /* abs values of dx and dy */
|
|
||||||
int ady;
|
|
||||||
int signdx; /* sign of dx and dy */
|
|
||||||
int signdy;
|
|
||||||
int e, e1, e2; /* bresenham error and increments */
|
|
||||||
int len; /* length of segment */
|
|
||||||
int axis; /* major axis */
|
|
||||||
int octant;
|
|
||||||
unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
|
|
||||||
int x1, x2, y1, y2;
|
|
||||||
RegionPtr cclip;
|
|
||||||
unsigned char *rrops;
|
|
||||||
unsigned char bgrrops[AFB_MAX_DEPTH];
|
|
||||||
unsigned char *pDash;
|
|
||||||
int dashOffset;
|
|
||||||
int numInDashList;
|
|
||||||
int dashIndex;
|
|
||||||
int isDoubleDash;
|
|
||||||
int dashIndexTmp, dashOffsetTmp;
|
|
||||||
int unclippedlen;
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
PixelType *addrl;
|
|
||||||
int d;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
rrops = ((afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey))->rrops;
|
|
||||||
pboxInit = REGION_RECTS(cclip);
|
|
||||||
nboxInit = REGION_NUM_RECTS(cclip);
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, nlwidth, sizeDst, depthDst,
|
|
||||||
addrlBase);
|
|
||||||
|
|
||||||
/* compute initial dash values */
|
|
||||||
|
|
||||||
pDash = (unsigned char *) pGC->dash;
|
|
||||||
numInDashList = pGC->numInDashList;
|
|
||||||
isDoubleDash = (pGC->lineStyle == LineDoubleDash);
|
|
||||||
dashIndex = 0;
|
|
||||||
dashOffset = 0;
|
|
||||||
miStepDash ((int)pGC->dashOffset, &dashIndex, pDash,
|
|
||||||
numInDashList, &dashOffset);
|
|
||||||
|
|
||||||
if (isDoubleDash)
|
|
||||||
afbReduceRop (pGC->alu, pGC->bgPixel, pGC->planemask, pGC->depth,
|
|
||||||
bgrrops);
|
|
||||||
|
|
||||||
xorg = pDrawable->x;
|
|
||||||
yorg = pDrawable->y;
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
while (nseg--)
|
|
||||||
#else
|
|
||||||
ppt = pptInit;
|
|
||||||
x2 = ppt->x + xorg;
|
|
||||||
y2 = ppt->y + yorg;
|
|
||||||
while(--npt)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
nbox = nboxInit;
|
|
||||||
pbox = pboxInit;
|
|
||||||
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
x1 = pSeg->x1 + xorg;
|
|
||||||
y1 = pSeg->y1 + yorg;
|
|
||||||
x2 = pSeg->x2 + xorg;
|
|
||||||
y2 = pSeg->y2 + yorg;
|
|
||||||
pSeg++;
|
|
||||||
#else
|
|
||||||
x1 = x2;
|
|
||||||
y1 = y2;
|
|
||||||
++ppt;
|
|
||||||
if (mode == CoordModePrevious) {
|
|
||||||
xorg = x1;
|
|
||||||
yorg = y1;
|
|
||||||
}
|
|
||||||
x2 = ppt->x + xorg;
|
|
||||||
y2 = ppt->y + yorg;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy,
|
|
||||||
1, 1, octant);
|
|
||||||
|
|
||||||
if (adx > ady) {
|
|
||||||
axis = X_AXIS;
|
|
||||||
e1 = ady << 1;
|
|
||||||
e2 = e1 - (adx << 1);
|
|
||||||
e = e1 - adx;
|
|
||||||
unclippedlen = adx;
|
|
||||||
} else {
|
|
||||||
axis = Y_AXIS;
|
|
||||||
e1 = adx << 1;
|
|
||||||
e2 = e1 - (ady << 1);
|
|
||||||
e = e1 - ady;
|
|
||||||
unclippedlen = ady;
|
|
||||||
SetYMajorOctant(octant);
|
|
||||||
}
|
|
||||||
|
|
||||||
FIXUP_ERROR(e, octant, bias);
|
|
||||||
|
|
||||||
/* we have bresenham parameters and two points.
|
|
||||||
all we have to do now is clip and draw.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while(nbox--) {
|
|
||||||
oc1 = 0;
|
|
||||||
oc2 = 0;
|
|
||||||
OUTCODES(oc1, x1, y1, pbox);
|
|
||||||
OUTCODES(oc2, x2, y2, pbox);
|
|
||||||
if ((oc1 | oc2) == 0) {
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (pGC->capStyle != CapNotLast)
|
|
||||||
unclippedlen++;
|
|
||||||
dashIndexTmp = dashIndex;
|
|
||||||
dashOffsetTmp = dashOffset;
|
|
||||||
afbBresD(&dashIndexTmp, pDash, numInDashList, &dashOffsetTmp,
|
|
||||||
isDoubleDash, addrlBase, nlwidth, sizeDst, depthDst,
|
|
||||||
signdx, signdy, axis, x1, y1, e, e1, e2, unclippedlen,
|
|
||||||
rrops, bgrrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
afbBresD(&dashIndex, pDash, numInDashList, &dashOffset,
|
|
||||||
isDoubleDash, addrlBase, nlwidth, sizeDst, depthDst,
|
|
||||||
signdx, signdy, axis, x1, y1, e, e1, e2, unclippedlen,
|
|
||||||
rrops, bgrrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
goto dontStep;
|
|
||||||
#endif
|
|
||||||
} else if (oc1 & oc2) {
|
|
||||||
pbox++;
|
|
||||||
} else /* have to clip */ {
|
|
||||||
int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2;
|
|
||||||
int clip1 = 0, clip2 = 0;
|
|
||||||
int clipdx, clipdy;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (miZeroClipLine(pbox->x1, pbox->y1, pbox->x2-1, pbox->y2-1,
|
|
||||||
&new_x1, &new_y1, &new_x2, &new_y2,
|
|
||||||
adx, ady, &clip1, &clip2,
|
|
||||||
octant, bias, oc1, oc2) == -1) {
|
|
||||||
pbox++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
dashIndexTmp = dashIndex;
|
|
||||||
dashOffsetTmp = dashOffset;
|
|
||||||
if (clip1) {
|
|
||||||
int dlen;
|
|
||||||
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
dlen = abs(new_x1 - x1);
|
|
||||||
else
|
|
||||||
dlen = abs(new_y1 - y1);
|
|
||||||
miStepDash (dlen, &dashIndexTmp, pDash,
|
|
||||||
numInDashList, &dashOffsetTmp);
|
|
||||||
}
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
len = abs(new_x2 - new_x1);
|
|
||||||
else
|
|
||||||
len = abs(new_y2 - new_y1);
|
|
||||||
#ifdef POLYSEGMENT
|
|
||||||
if (clip2 != 0 || pGC->capStyle != CapNotLast)
|
|
||||||
len++;
|
|
||||||
#else
|
|
||||||
len += (clip2 != 0);
|
|
||||||
#endif
|
|
||||||
if (len) {
|
|
||||||
/* unwind bresenham error term to first point */
|
|
||||||
if (clip1) {
|
|
||||||
clipdx = abs(new_x1 - x1);
|
|
||||||
clipdy = abs(new_y1 - y1);
|
|
||||||
if (axis == X_AXIS)
|
|
||||||
err = e+((clipdy*e2) + ((clipdx-clipdy)*e1));
|
|
||||||
else
|
|
||||||
err = e+((clipdx*e2) + ((clipdy-clipdx)*e1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
err = e;
|
|
||||||
afbBresD(&dashIndexTmp, pDash, numInDashList, &dashOffsetTmp,
|
|
||||||
isDoubleDash, addrlBase, nlwidth, sizeDst, depthDst,
|
|
||||||
signdx, signdy, axis, new_x1, new_y1, err, e1, e2,
|
|
||||||
len, rrops, bgrrops); /* @@@ NEXT PLANE PASSED @@@ */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
} /* while (nbox--) */
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
/*
|
|
||||||
* walk the dash list around to the next line
|
|
||||||
*/
|
|
||||||
miStepDash (unclippedlen, &dashIndex, pDash,
|
|
||||||
numInDashList, &dashOffset);
|
|
||||||
dontStep: ;
|
|
||||||
#endif
|
|
||||||
} /* while (nline--) */
|
|
||||||
|
|
||||||
#ifndef POLYSEGMENT
|
|
||||||
/* paint the last point if the end style isn't CapNotLast.
|
|
||||||
(Assume that a projecting, butt, or round cap that is one
|
|
||||||
pixel wide is the same as the single pixel of the endpoint.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((pGC->capStyle != CapNotLast) &&
|
|
||||||
((dashIndex & 1) == 0 || isDoubleDash) &&
|
|
||||||
((ppt->x + xorg != pptInit->x + pDrawable->x) ||
|
|
||||||
(ppt->y + yorg != pptInit->y + pDrawable->y) ||
|
|
||||||
(ppt == pptInit + 1))) {
|
|
||||||
nbox = nboxInit;
|
|
||||||
pbox = pboxInit;
|
|
||||||
while (nbox--) {
|
|
||||||
if ((x2 >= pbox->x1) && (y2 >= pbox->y1) && (x2 < pbox->x2) &&
|
|
||||||
(y2 < pbox->y2)) {
|
|
||||||
int rop;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
addrl = afbScanline(addrlBase, x2, y2, nlwidth);
|
|
||||||
addrlBase += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
rop = rrops[d];
|
|
||||||
if (dashIndex & 1)
|
|
||||||
rop = bgrrops[d];
|
|
||||||
|
|
||||||
switch (rop) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*addrl &= mfbGetrmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*addrl |= mfbGetmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
*addrl ^= mfbGetmask(x2 & PIM);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* for (d = ...) */
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "misc.h"
|
|
||||||
#include "cursor.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
void
|
|
||||||
afbQueryBestSize(class, pwidth, pheight, pScreen)
|
|
||||||
int class;
|
|
||||||
unsigned short *pwidth;
|
|
||||||
unsigned short *pheight;
|
|
||||||
ScreenPtr pScreen;
|
|
||||||
{
|
|
||||||
unsigned width, test;
|
|
||||||
|
|
||||||
switch(class) {
|
|
||||||
case CursorShape:
|
|
||||||
if (*pwidth > pScreen->width)
|
|
||||||
*pwidth = pScreen->width;
|
|
||||||
if (*pheight > pScreen->height)
|
|
||||||
*pheight = pScreen->height;
|
|
||||||
break;
|
|
||||||
case TileShape:
|
|
||||||
case StippleShape:
|
|
||||||
width = *pwidth;
|
|
||||||
if (!width) break;
|
|
||||||
/* Return the closes power of two not less than what they gave me */
|
|
||||||
test = 0x80000000;
|
|
||||||
/* Find the highest 1 bit in the width given */
|
|
||||||
while(!(test & width))
|
|
||||||
test >>= 1;
|
|
||||||
/* If their number is greater than that, bump up to the next
|
|
||||||
* power of two */
|
|
||||||
if((test - 1) & width)
|
|
||||||
test <<= 1;
|
|
||||||
*pwidth = test;
|
|
||||||
/* We don't care what height they use */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
299
afb/afbpixmap.c
299
afb/afbpixmap.c
|
@ -1,299 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
/* pixmap management
|
|
||||||
written by drewry, september 1986
|
|
||||||
|
|
||||||
on a monchrome device, a pixmap is a bitmap.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "mi.h"
|
|
||||||
|
|
||||||
#include "servermd.h"
|
|
||||||
#include "mfb.h"
|
|
||||||
|
|
||||||
PixmapPtr
|
|
||||||
afbCreatePixmap(pScreen, width, height, depth, usage_hint)
|
|
||||||
ScreenPtr pScreen;
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
int depth;
|
|
||||||
unsigned usage_hint;
|
|
||||||
{
|
|
||||||
PixmapPtr pPixmap;
|
|
||||||
size_t datasize;
|
|
||||||
size_t paddedWidth;
|
|
||||||
|
|
||||||
paddedWidth = BitmapBytePad(width);
|
|
||||||
|
|
||||||
if (paddedWidth > 32767 || height > 32767 || depth > 4)
|
|
||||||
return NullPixmap;
|
|
||||||
|
|
||||||
datasize = height * paddedWidth * depth;
|
|
||||||
pPixmap = AllocatePixmap(pScreen, datasize);
|
|
||||||
if (!pPixmap)
|
|
||||||
return(NullPixmap);
|
|
||||||
pPixmap->drawable.type = DRAWABLE_PIXMAP;
|
|
||||||
pPixmap->drawable.class = 0;
|
|
||||||
pPixmap->drawable.pScreen = pScreen;
|
|
||||||
pPixmap->drawable.depth = depth;
|
|
||||||
pPixmap->drawable.bitsPerPixel = depth;
|
|
||||||
pPixmap->drawable.id = 0;
|
|
||||||
pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
|
||||||
pPixmap->drawable.x = 0;
|
|
||||||
pPixmap->drawable.y = 0;
|
|
||||||
pPixmap->drawable.width = width;
|
|
||||||
pPixmap->drawable.height = height;
|
|
||||||
pPixmap->devKind = paddedWidth;
|
|
||||||
pPixmap->refcnt = 1;
|
|
||||||
pPixmap->devPrivate.ptr = datasize ?
|
|
||||||
(pointer)((char *)pPixmap + pScreen->totalPixmapSize) : NULL;
|
|
||||||
pPixmap->usage_hint = usage_hint;
|
|
||||||
return(pPixmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbDestroyPixmap(pPixmap)
|
|
||||||
PixmapPtr pPixmap;
|
|
||||||
{
|
|
||||||
if(--pPixmap->refcnt)
|
|
||||||
return(TRUE);
|
|
||||||
dixFreePrivates(pPixmap->devPrivates);
|
|
||||||
xfree(pPixmap);
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static PixmapPtr
|
|
||||||
afbCopyPixmap(PixmapPtr pSrc)
|
|
||||||
{
|
|
||||||
register PixmapPtr pDst;
|
|
||||||
int size;
|
|
||||||
ScreenPtr pScreen;
|
|
||||||
|
|
||||||
size = pSrc->drawable.height * pSrc->devKind * pSrc->drawable.depth;
|
|
||||||
pScreen = pSrc->drawable.pScreen;
|
|
||||||
pDst = (*pScreen->CreatePixmap)(pScreen,
|
|
||||||
pSrc->drawable.width,
|
|
||||||
pSrc->drawable.height,
|
|
||||||
pSrc->drawable.depth, 0);
|
|
||||||
if (!pDst)
|
|
||||||
return(NullPixmap);
|
|
||||||
memmove((char *)pDst->devPrivate.ptr, (char *)pSrc->devPrivate.ptr, size);
|
|
||||||
return(pDst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* replicates a pattern to be a full 32 bits wide.
|
|
||||||
relies on the fact that each scnaline is longword padded.
|
|
||||||
doesn't do anything if pixmap is not a factor of 32 wide.
|
|
||||||
changes width field of pixmap if successful, so that the fast
|
|
||||||
XRotatePixmap code gets used if we rotate the pixmap later.
|
|
||||||
|
|
||||||
calculate number of times to repeat
|
|
||||||
for each scanline of pattern
|
|
||||||
zero out area to be filled with replicate
|
|
||||||
left shift and or in original as many times as needed
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
afbPadPixmap(PixmapPtr pPixmap)
|
|
||||||
{
|
|
||||||
register int width = pPixmap->drawable.width;
|
|
||||||
register int h;
|
|
||||||
register PixelType mask;
|
|
||||||
register PixelType *p;
|
|
||||||
register PixelType bits; /* real pattern bits */
|
|
||||||
register int i;
|
|
||||||
int d;
|
|
||||||
int rep; /* repeat count for pattern */
|
|
||||||
|
|
||||||
if (width >= PPW)
|
|
||||||
return;
|
|
||||||
|
|
||||||
rep = PPW/width;
|
|
||||||
if (rep*width != PPW)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mask = mfbGetendtab(width);
|
|
||||||
|
|
||||||
p = (PixelType *)(pPixmap->devPrivate.ptr);
|
|
||||||
|
|
||||||
for (d = 0; d < pPixmap->drawable.depth; d++) {
|
|
||||||
for (h = 0; h < pPixmap->drawable.height; h++) {
|
|
||||||
*p &= mask;
|
|
||||||
bits = *p;
|
|
||||||
for(i = 1; i < rep; i++) {
|
|
||||||
bits = SCRRIGHT(bits, width);
|
|
||||||
*p |= bits;
|
|
||||||
}
|
|
||||||
p++; /* @@@ NEXT PLANE @@@ */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pPixmap->drawable.width = PPW;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Rotates pixmap pPix by w pixels to the right on the screen. Assumes that
|
|
||||||
* words are PPW bits wide, and that the least significant bit appears on the
|
|
||||||
* left.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbXRotatePixmap(pPix, rw)
|
|
||||||
PixmapPtr pPix;
|
|
||||||
register int rw;
|
|
||||||
{
|
|
||||||
register PixelType *pw, *pwFinal;
|
|
||||||
register PixelType t;
|
|
||||||
|
|
||||||
if (pPix == NullPixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pw = (PixelType *)pPix->devPrivate.ptr;
|
|
||||||
rw %= (int)pPix->drawable.width;
|
|
||||||
if (rw < 0)
|
|
||||||
rw += (int)pPix->drawable.width;
|
|
||||||
if(pPix->drawable.width == PPW) {
|
|
||||||
pwFinal = pw + pPix->drawable.height * pPix->drawable.depth;
|
|
||||||
while(pw < pwFinal) {
|
|
||||||
t = *pw;
|
|
||||||
*pw++ = SCRRIGHT(t, rw) |
|
|
||||||
(SCRLEFT(t, (PPW-rw)) & mfbGetendtab(rw));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* We no longer do this. Validate doesn't try to rotate odd-size
|
|
||||||
* tiles or stipples. afbUnnatural<tile/stipple>FS works directly off
|
|
||||||
* the unrotate tile/stipple in the GC
|
|
||||||
*/
|
|
||||||
ErrorF("X internal error: trying to rotate odd-sized pixmap.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Rotates pixmap pPix by h lines. Assumes that h is always less than
|
|
||||||
pPix->height
|
|
||||||
works on any width.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbYRotatePixmap(pPix, rh)
|
|
||||||
register PixmapPtr pPix;
|
|
||||||
int rh;
|
|
||||||
{
|
|
||||||
int nbyDown; /* bytes to move down to row 0; also offset of
|
|
||||||
row rh */
|
|
||||||
int nbyUp; /* bytes to move up to line rh; also
|
|
||||||
offset of first line moved down to 0 */
|
|
||||||
char *pbase;
|
|
||||||
char *ptmp;
|
|
||||||
int height;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
if (pPix == NullPixmap)
|
|
||||||
return;
|
|
||||||
height = (int) pPix->drawable.height;
|
|
||||||
rh %= height;
|
|
||||||
if (rh < 0)
|
|
||||||
rh += height;
|
|
||||||
|
|
||||||
nbyDown = rh * pPix->devKind;
|
|
||||||
nbyUp = (pPix->devKind * height) - nbyDown;
|
|
||||||
|
|
||||||
if(!(ptmp = (char *)xalloc(nbyUp)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (d = 0; d < pPix->drawable.depth; d++) {
|
|
||||||
pbase = (char *)pPix->devPrivate.ptr + pPix->devKind * height * d; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
memmove(ptmp, pbase, nbyUp); /* save the low rows */
|
|
||||||
memmove(pbase, pbase+nbyUp, nbyDown); /* slide the top rows down */
|
|
||||||
memmove(pbase+nbyDown, ptmp, nbyUp); /* move lower rows up to row rh */
|
|
||||||
}
|
|
||||||
xfree(ptmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbCopyRotatePixmap(psrcPix, ppdstPix, xrot, yrot)
|
|
||||||
register PixmapPtr psrcPix, *ppdstPix;
|
|
||||||
int xrot, yrot;
|
|
||||||
{
|
|
||||||
register PixmapPtr pdstPix;
|
|
||||||
|
|
||||||
if ((pdstPix = *ppdstPix) &&
|
|
||||||
(pdstPix->devKind == psrcPix->devKind) &&
|
|
||||||
(pdstPix->drawable.height == psrcPix->drawable.height) &&
|
|
||||||
(pdstPix->drawable.depth == psrcPix->drawable.depth)) {
|
|
||||||
memmove((char *)pdstPix->devPrivate.ptr,
|
|
||||||
(char *)psrcPix->devPrivate.ptr,
|
|
||||||
psrcPix->drawable.height * psrcPix->devKind *
|
|
||||||
psrcPix->drawable.depth);
|
|
||||||
pdstPix->drawable.width = psrcPix->drawable.width;
|
|
||||||
pdstPix->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
|
||||||
} else {
|
|
||||||
if (pdstPix)
|
|
||||||
/* FIX XBUG 6168 */
|
|
||||||
(*pdstPix->drawable.pScreen->DestroyPixmap)(pdstPix);
|
|
||||||
*ppdstPix = pdstPix = afbCopyPixmap(psrcPix);
|
|
||||||
if (!pdstPix)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
afbPadPixmap(pdstPix);
|
|
||||||
if (xrot)
|
|
||||||
afbXRotatePixmap(pdstPix, xrot);
|
|
||||||
if (yrot)
|
|
||||||
afbYRotatePixmap(pdstPix, yrot);
|
|
||||||
}
|
|
300
afb/afbply1rct.c
300
afb/afbply1rct.c
|
@ -1,300 +0,0 @@
|
||||||
/*
|
|
||||||
*
|
|
||||||
Copyright (c) 1990 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
*
|
|
||||||
* Author: Keith Packard, MIT X Consortium
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "mistruct.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#if defined(mips) || defined(sparc)
|
|
||||||
#define GetHighWord(x) (((int)(x)) >> 16)
|
|
||||||
#else
|
|
||||||
#define GetHighWord(x) (((int)(x)) / 65536)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IMAGE_BYTE_ORDER == MSBFirst
|
|
||||||
#define intToCoord(i,x,y) (((x) = GetHighWord(i)), ((y) = (int)((short) (i))))
|
|
||||||
#define coordToInt(x,y) (((x) << 16) | (y))
|
|
||||||
#define intToX(i) (GetHighWord(i))
|
|
||||||
#define intToY(i) ((int)((short) i))
|
|
||||||
#else
|
|
||||||
#define intToCoord(i,x,y) (((x) = (int)((short) (i))), ((y) = GetHighWord(i)))
|
|
||||||
#define coordToInt(x,y) (((y) << 16) | (x))
|
|
||||||
#define intToX(i) ((int)((short) (i)))
|
|
||||||
#define intToY(i) (GetHighWord(i))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
afbFillPolygonSolid (pDrawable, pGC, shape, mode, count, ptsIn)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GCPtr pGC;
|
|
||||||
int shape;
|
|
||||||
int mode;
|
|
||||||
int count;
|
|
||||||
DDXPointPtr ptsIn;
|
|
||||||
{
|
|
||||||
afbPrivGCPtr devPriv;
|
|
||||||
int nlwidth;
|
|
||||||
PixelType *addrl, *addr;
|
|
||||||
int maxy;
|
|
||||||
int origin;
|
|
||||||
register int vertex1, vertex2;
|
|
||||||
int c;
|
|
||||||
BoxPtr extents;
|
|
||||||
int clip;
|
|
||||||
int y;
|
|
||||||
int *vertex1p = NULL, *vertex2p;
|
|
||||||
int *endp;
|
|
||||||
int x1 = 0, x2 = 0;
|
|
||||||
int dx1 = 0, dx2 = 0;
|
|
||||||
int dy1 = 0, dy2 = 0;
|
|
||||||
int e1 = 0, e2 = 0;
|
|
||||||
int step1 = 0, step2 = 0;
|
|
||||||
int sign1 = 0, sign2 = 0;
|
|
||||||
int h;
|
|
||||||
int l, r;
|
|
||||||
PixelType mask, bits = ~((PixelType)0);
|
|
||||||
int nmiddle;
|
|
||||||
register unsigned char *rrops;
|
|
||||||
register int n;
|
|
||||||
register int d;
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
register PixelType *pdst;
|
|
||||||
|
|
||||||
devPriv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
if (mode == CoordModePrevious || shape != Convex ||
|
|
||||||
REGION_NUM_RECTS(pGC->pCompositeClip) != 1) {
|
|
||||||
miFillPolygon (pDrawable, pGC, shape, mode, count, ptsIn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
origin = *((int *) &pDrawable->x);
|
|
||||||
origin -= (origin & 0x8000) << 1;
|
|
||||||
extents = &pGC->pCompositeClip->extents;
|
|
||||||
vertex1 = *((int *) &extents->x1) - origin;
|
|
||||||
vertex2 = *((int *) &extents->x2) - origin - 0x00010001;
|
|
||||||
clip = 0;
|
|
||||||
y = 32767;
|
|
||||||
maxy = 0;
|
|
||||||
vertex2p = (int *) ptsIn;
|
|
||||||
endp = vertex2p + count;
|
|
||||||
while (count--) {
|
|
||||||
c = *vertex2p;
|
|
||||||
clip |= (c - vertex1) | (vertex2 - c);
|
|
||||||
c = intToY(c);
|
|
||||||
if (c < y) {
|
|
||||||
y = c;
|
|
||||||
vertex1p = vertex2p;
|
|
||||||
}
|
|
||||||
vertex2p++;
|
|
||||||
if (c > maxy)
|
|
||||||
maxy = c;
|
|
||||||
}
|
|
||||||
if (y == maxy)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (clip & 0x80008000) {
|
|
||||||
miFillPolygon (pDrawable, pGC, shape, mode, vertex2p - (int *) ptsIn, ptsIn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, nlwidth, sizeDst, depthDst,
|
|
||||||
addrl);
|
|
||||||
rrops = devPriv->rrops;
|
|
||||||
addrl = afbScanlineDelta(addrl, y + pDrawable->y, nlwidth);
|
|
||||||
origin = intToX(origin);
|
|
||||||
vertex2p = vertex1p;
|
|
||||||
vertex2 = vertex1 = *vertex2p++;
|
|
||||||
if (vertex2p == endp)
|
|
||||||
vertex2p = (int *) ptsIn;
|
|
||||||
#define Setup(c,x,vertex,dx,dy,e,sign,step) {\
|
|
||||||
x = intToX(vertex); \
|
|
||||||
if ((dy = intToY(c) - y)) { \
|
|
||||||
dx = intToX(c) - x; \
|
|
||||||
step = 0; \
|
|
||||||
if (dx >= 0) { \
|
|
||||||
e = 0; \
|
|
||||||
sign = 1; \
|
|
||||||
if (dx >= dy) {\
|
|
||||||
step = dx / dy; \
|
|
||||||
dx = dx % dy; \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
e = 1 - dy; \
|
|
||||||
sign = -1; \
|
|
||||||
dx = -dx; \
|
|
||||||
if (dx >= dy) { \
|
|
||||||
step = - (dx / dy); \
|
|
||||||
dx = dx % dy; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
x += origin; \
|
|
||||||
vertex = c; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define Step(x,dx,dy,e,sign,step) {\
|
|
||||||
x += step; \
|
|
||||||
if ((e += dx) > 0) { \
|
|
||||||
x += sign; \
|
|
||||||
e -= dy; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
for (;;) {
|
|
||||||
if (y == intToY(vertex1)) {
|
|
||||||
do {
|
|
||||||
if (vertex1p == (int *) ptsIn)
|
|
||||||
vertex1p = endp;
|
|
||||||
c = *--vertex1p;
|
|
||||||
Setup (c,x1,vertex1,dx1,dy1,e1,sign1,step1)
|
|
||||||
} while (y >= intToY(vertex1));
|
|
||||||
h = dy1;
|
|
||||||
} else {
|
|
||||||
Step(x1,dx1,dy1,e1,sign1,step1)
|
|
||||||
h = intToY(vertex1) - y;
|
|
||||||
}
|
|
||||||
if (y == intToY(vertex2)) {
|
|
||||||
do {
|
|
||||||
c = *vertex2p++;
|
|
||||||
if (vertex2p == endp)
|
|
||||||
vertex2p = (int *) ptsIn;
|
|
||||||
Setup (c,x2,vertex2,dx2,dy2,e2,sign2,step2)
|
|
||||||
} while (y >= intToY(vertex2));
|
|
||||||
if (dy2 < h)
|
|
||||||
h = dy2;
|
|
||||||
} else {
|
|
||||||
Step(x2,dx2,dy2,e2,sign2,step2)
|
|
||||||
if ((c = (intToY(vertex2) - y)) < h)
|
|
||||||
h = c;
|
|
||||||
}
|
|
||||||
/* fill spans for this segment */
|
|
||||||
y += h;
|
|
||||||
for (;;) {
|
|
||||||
l = x1;
|
|
||||||
r = x2;
|
|
||||||
nmiddle = x2 - x1;
|
|
||||||
if (nmiddle < 0) {
|
|
||||||
nmiddle = -nmiddle;
|
|
||||||
l = x2;
|
|
||||||
r = x1;
|
|
||||||
}
|
|
||||||
c = l & PIM;
|
|
||||||
l -= c;
|
|
||||||
l = l >> PWSH;
|
|
||||||
addr = addrl + l;
|
|
||||||
if (c + nmiddle < PPW) {
|
|
||||||
mask = SCRRIGHT (bits,c) ^ SCRRIGHT (bits,c+nmiddle);
|
|
||||||
for (pdst = addr, d = 0; d < depthDst; d++, pdst += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*pdst &= ~mask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*pdst |= mask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*pdst ^= mask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (c) {
|
|
||||||
mask = SCRRIGHT(bits, c);
|
|
||||||
for (pdst = addr, d = 0; d < depthDst; d++, pdst += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
*pdst &= ~mask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
*pdst |= mask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
*pdst ^= mask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nmiddle += c - PPW;
|
|
||||||
addr++;
|
|
||||||
}
|
|
||||||
nmiddle >>= PWSH;
|
|
||||||
mask = ~SCRRIGHT(bits, r & PIM);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, addr += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
n = nmiddle;
|
|
||||||
pdst = addr;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
Duff (n, *pdst++ = 0;)
|
|
||||||
if (mask)
|
|
||||||
*pdst &= ~mask;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
Duff (n, *pdst++ = ~0;);
|
|
||||||
if (mask)
|
|
||||||
*pdst |= mask;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
Duff (n, *pdst++ ^= ~0;);
|
|
||||||
if (mask)
|
|
||||||
*pdst ^= mask;
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!--h)
|
|
||||||
break;
|
|
||||||
afbScanlineInc(addrl, nlwidth);
|
|
||||||
Step(x1,dx1,dy1,e1,sign1,step1)
|
|
||||||
Step(x2,dx2,dy2,e2,sign2,step2)
|
|
||||||
}
|
|
||||||
if (y == maxy)
|
|
||||||
break;
|
|
||||||
afbScanlineInc(addrl, nlwidth);
|
|
||||||
}
|
|
||||||
}
|
|
463
afb/afbplygblt.c
463
afb/afbplygblt.c
|
@ -1,463 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include <X11/fonts/fontstruct.h>
|
|
||||||
#include "dixfontstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
this works for fonts with glyphs <= 32 bits wide.
|
|
||||||
|
|
||||||
the clipping calculations are done for worst-case fonts.
|
|
||||||
we make no assumptions about the heights, widths, or bearings
|
|
||||||
of the glyphs. if we knew that the glyphs are all the same height,
|
|
||||||
we could clip the tops and bottoms per clipping box, rather
|
|
||||||
than per character per clipping box. if we knew that the glyphs'
|
|
||||||
left and right bearings were wlle-behaved, we could clip a single
|
|
||||||
character at the start, output until the last unclipped
|
|
||||||
character, and then clip the last one. this is all straightforward
|
|
||||||
to determine based on max-bounds and min-bounds from the font.
|
|
||||||
there is some inefficiency introduced in the per-character
|
|
||||||
clipping to make what's going on clearer.
|
|
||||||
|
|
||||||
(it is possible, for example, for a font to be defined in which the
|
|
||||||
next-to-last character in a font would be clipped out, but the last
|
|
||||||
one wouldn't. the code below deals with this.)
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
afbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GC *pGC;
|
|
||||||
int x, y;
|
|
||||||
unsigned int nglyph;
|
|
||||||
CharInfoPtr *ppci; /* array of character info */
|
|
||||||
pointer pglyphBase; /* start of array of glyphs */
|
|
||||||
{
|
|
||||||
ExtentInfoRec info; /* used by QueryGlyphExtents() */
|
|
||||||
BoxRec bbox; /* string's bounding box */
|
|
||||||
|
|
||||||
CharInfoPtr pci;
|
|
||||||
int xorg, yorg; /* origin of drawable in bitmap */
|
|
||||||
int widthDst; /* width of dst in longwords */
|
|
||||||
|
|
||||||
/* these keep track of the character origin */
|
|
||||||
PixelType *pdstBase;
|
|
||||||
/* points to longword with character origin */
|
|
||||||
int xchar; /* xorigin of char (mod 32) */
|
|
||||||
|
|
||||||
/* these are used for placing the glyph */
|
|
||||||
register int xoff; /* x offset of left edge of glyph (mod 32) */
|
|
||||||
register PixelType *pdst; /* pointer to current longword in dst */
|
|
||||||
|
|
||||||
register int d;
|
|
||||||
int depthDst;
|
|
||||||
int sizeDst;
|
|
||||||
int hSave;
|
|
||||||
int w; /* width of glyph in bits */
|
|
||||||
int h; /* height of glyph */
|
|
||||||
int widthGlyph; /* width of glyph, in bytes */
|
|
||||||
unsigned char *rrops;
|
|
||||||
register unsigned char *pglyph;
|
|
||||||
/* pointer to current row of glyph */
|
|
||||||
unsigned char *pglyphSave;
|
|
||||||
|
|
||||||
/* used for putting down glyph */
|
|
||||||
register PixelType tmpSrc;
|
|
||||||
/* for getting bits from glyph */
|
|
||||||
register PixelType startmask;
|
|
||||||
register PixelType endmask;
|
|
||||||
|
|
||||||
register int nFirst; /* bits of glyph in current longword */
|
|
||||||
PixelType *pdstSave;
|
|
||||||
|
|
||||||
xorg = pDrawable->x;
|
|
||||||
yorg = pDrawable->y;
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthDst, sizeDst, depthDst,
|
|
||||||
pdstBase);
|
|
||||||
|
|
||||||
QueryGlyphExtents(pGC->font, ppci, (unsigned long)nglyph, &info);
|
|
||||||
|
|
||||||
x += xorg;
|
|
||||||
y += yorg;
|
|
||||||
|
|
||||||
bbox.x1 = x + info.overallLeft;
|
|
||||||
bbox.x2 = x + info.overallRight;
|
|
||||||
bbox.y1 = y - info.overallAscent;
|
|
||||||
bbox.y2 = y + info.overallDescent;
|
|
||||||
|
|
||||||
rrops = ((afbPrivGCPtr)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey))->rrops;
|
|
||||||
switch (RECT_IN_REGION(pGC->pScreen, pGC->pCompositeClip, &bbox)) {
|
|
||||||
case rgnOUT:
|
|
||||||
break;
|
|
||||||
case rgnIN:
|
|
||||||
pdstBase = afbScanlineNoBankSwitch(pdstBase, x, y, widthDst);
|
|
||||||
xchar = x & PIM;
|
|
||||||
|
|
||||||
while(nglyph--) {
|
|
||||||
pci = *ppci;
|
|
||||||
pglyphSave = FONTGLYPHBITS(pglyphBase, pci);
|
|
||||||
w = pci->metrics.rightSideBearing - pci->metrics.leftSideBearing;
|
|
||||||
hSave = pci->metrics.ascent + pci->metrics.descent;
|
|
||||||
widthGlyph = GLYPHWIDTHBYTESPADDED(pci);
|
|
||||||
/* start at top scanline of glyph */
|
|
||||||
pdstSave = afbScanlineDelta(pdstBase, -pci->metrics.ascent,
|
|
||||||
widthDst);
|
|
||||||
|
|
||||||
/* find correct word in scanline and x offset within it
|
|
||||||
for left edge of glyph
|
|
||||||
*/
|
|
||||||
xoff = xchar + pci->metrics.leftSideBearing;
|
|
||||||
if (xoff > PLST) {
|
|
||||||
pdstSave++;
|
|
||||||
xoff &= PIM;
|
|
||||||
} else if (xoff < 0) {
|
|
||||||
xoff += PPW;
|
|
||||||
pdstSave--;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = hSave;
|
|
||||||
pdst = pdstSave;
|
|
||||||
pdstSave += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
pglyph = pglyphSave;
|
|
||||||
|
|
||||||
if ((xoff + w) <= PPW) {
|
|
||||||
/* glyph all in one longword */
|
|
||||||
maskpartialbits(xoff, w, startmask);
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst |= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst ^= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* glyph crosses longword boundary */
|
|
||||||
maskPPWbits(xoff, w, startmask, endmask);
|
|
||||||
nFirst = PPW - xoff;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst |= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) |= (SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) &= ~(SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
getleftbits(pglyph, w, tmpSrc);
|
|
||||||
*pdst ^= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) ^= (SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* glyph crosses longwords boundary */
|
|
||||||
} /* depth loop */
|
|
||||||
/* update character origin */
|
|
||||||
x += pci->metrics.characterWidth;
|
|
||||||
xchar += pci->metrics.characterWidth;
|
|
||||||
if (xchar > PLST) {
|
|
||||||
xchar -= PPW;
|
|
||||||
pdstBase++;
|
|
||||||
} else if (xchar < 0) {
|
|
||||||
xchar += PPW;
|
|
||||||
pdstBase--;
|
|
||||||
}
|
|
||||||
ppci++;
|
|
||||||
} /* while nglyph-- */
|
|
||||||
break;
|
|
||||||
case rgnPART:
|
|
||||||
{
|
|
||||||
afbTEXTPOS *ppos;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
RegionPtr cclip;
|
|
||||||
int xpos; /* x position of char origin */
|
|
||||||
int i;
|
|
||||||
BoxRec clip;
|
|
||||||
int leftEdge, rightEdge;
|
|
||||||
int topEdge, bottomEdge;
|
|
||||||
int glyphRow; /* first row of glyph not wholly
|
|
||||||
clipped out */
|
|
||||||
int glyphCol; /* leftmost visible column of glyph */
|
|
||||||
#if GETLEFTBITS_ALIGNMENT > 1
|
|
||||||
int getWidth; /* bits to get from glyph */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(!(ppos = (afbTEXTPOS *)xalloc(nglyph * sizeof(afbTEXTPOS))))
|
|
||||||
return;
|
|
||||||
|
|
||||||
pdstBase = afbScanlineNoBankSwitch(pdstBase, x, y, widthDst);
|
|
||||||
xpos = x;
|
|
||||||
xchar = xpos & PIM;
|
|
||||||
|
|
||||||
for (i = 0; i < nglyph; i++) {
|
|
||||||
pci = ppci[i];
|
|
||||||
|
|
||||||
ppos[i].xpos = xpos;
|
|
||||||
ppos[i].xchar = xchar;
|
|
||||||
ppos[i].leftEdge = xpos + pci->metrics.leftSideBearing;
|
|
||||||
ppos[i].rightEdge = xpos + pci->metrics.rightSideBearing;
|
|
||||||
ppos[i].topEdge = y - pci->metrics.ascent;
|
|
||||||
ppos[i].bottomEdge = y + pci->metrics.descent;
|
|
||||||
ppos[i].pdstBase = pdstBase;
|
|
||||||
ppos[i].widthGlyph = GLYPHWIDTHBYTESPADDED(pci);
|
|
||||||
|
|
||||||
xpos += pci->metrics.characterWidth;
|
|
||||||
xchar += pci->metrics.characterWidth;
|
|
||||||
if (xchar > PLST) {
|
|
||||||
xchar &= PIM;
|
|
||||||
pdstBase++;
|
|
||||||
} else if (xchar < 0) {
|
|
||||||
xchar += PPW;
|
|
||||||
pdstBase--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
pbox = REGION_RECTS(cclip);
|
|
||||||
nbox = REGION_NUM_RECTS(cclip);
|
|
||||||
|
|
||||||
/* HACK ALERT
|
|
||||||
since we continue out of the loop below so often, it
|
|
||||||
is easier to increment pbox at the top than at the end.
|
|
||||||
don't try this at home.
|
|
||||||
*/
|
|
||||||
pbox--;
|
|
||||||
while(nbox--) {
|
|
||||||
pbox++;
|
|
||||||
clip.x1 = max(bbox.x1, pbox->x1);
|
|
||||||
clip.y1 = max(bbox.y1, pbox->y1);
|
|
||||||
clip.x2 = min(bbox.x2, pbox->x2);
|
|
||||||
clip.y2 = min(bbox.y2, pbox->y2);
|
|
||||||
if ((clip.x2<=clip.x1) || (clip.y2<=clip.y1))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for(i=0; i<nglyph; i++) {
|
|
||||||
pci = ppci[i];
|
|
||||||
xchar = ppos[i].xchar;
|
|
||||||
|
|
||||||
/* clip the left and right edges */
|
|
||||||
if (ppos[i].leftEdge < clip.x1)
|
|
||||||
leftEdge = clip.x1;
|
|
||||||
else
|
|
||||||
leftEdge = ppos[i].leftEdge;
|
|
||||||
|
|
||||||
if (ppos[i].rightEdge > clip.x2)
|
|
||||||
rightEdge = clip.x2;
|
|
||||||
else
|
|
||||||
rightEdge = ppos[i].rightEdge;
|
|
||||||
|
|
||||||
w = rightEdge - leftEdge;
|
|
||||||
if (w <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* clip the top and bottom edges */
|
|
||||||
if (ppos[i].topEdge < clip.y1)
|
|
||||||
topEdge = clip.y1;
|
|
||||||
else
|
|
||||||
topEdge = ppos[i].topEdge;
|
|
||||||
|
|
||||||
if (ppos[i].bottomEdge > clip.y2)
|
|
||||||
bottomEdge = clip.y2;
|
|
||||||
else
|
|
||||||
bottomEdge = ppos[i].bottomEdge;
|
|
||||||
|
|
||||||
hSave = bottomEdge - topEdge;
|
|
||||||
if (hSave <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
glyphRow = (topEdge - y) + pci->metrics.ascent;
|
|
||||||
widthGlyph = ppos[i].widthGlyph;
|
|
||||||
pglyphSave = FONTGLYPHBITS(pglyphBase, pci);
|
|
||||||
pglyphSave += (glyphRow * widthGlyph);
|
|
||||||
|
|
||||||
glyphCol = (leftEdge - ppos[i].xpos) -
|
|
||||||
(pci->metrics.leftSideBearing);
|
|
||||||
#if GETLEFTBITS_ALIGNMENT > 1
|
|
||||||
getWidth = w + glyphCol;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pdstSave = afbScanlineDelta(ppos[i].pdstBase, -(y-topEdge),
|
|
||||||
widthDst);
|
|
||||||
xoff = xchar + (leftEdge - ppos[i].xpos);
|
|
||||||
if (xoff > PLST) {
|
|
||||||
xoff &= PIM;
|
|
||||||
pdstSave++;
|
|
||||||
} else if (xoff < 0) {
|
|
||||||
xoff += PPW;
|
|
||||||
pdstSave--;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = hSave;
|
|
||||||
pdst = pdstSave;
|
|
||||||
pdstSave += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
pglyph = pglyphSave;
|
|
||||||
|
|
||||||
if ((xoff + w) <= PPW) {
|
|
||||||
maskpartialbits(xoff, w, startmask);
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst |= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst ^= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
maskPPWbits(xoff, w, startmask, endmask);
|
|
||||||
nFirst = PPW - xoff;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst |= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) |= (SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst &= ~(SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) &= ~(SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
getshiftedleftbits(pglyph, glyphCol, getWidth, tmpSrc);
|
|
||||||
*pdst ^= (SCRRIGHT(tmpSrc, xoff) & startmask);
|
|
||||||
*(pdst+1) ^= (SCRLEFT(tmpSrc, nFirst) & endmask);
|
|
||||||
pglyph += widthGlyph;
|
|
||||||
afbScanlineInc(pdst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* depth */
|
|
||||||
} /* for each glyph */
|
|
||||||
} /* while nbox-- */
|
|
||||||
xfree(ppos);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
655
afb/afbpntarea.c
655
afb/afbpntarea.c
|
@ -1,655 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
the solid fillers are called for rectangles and window backgrounds.
|
|
||||||
the boxes are already translated.
|
|
||||||
maybe this should always take a pixmap instead of a drawable?
|
|
||||||
|
|
||||||
NOTE:
|
|
||||||
iy = ++iy < tileHeight ? iy : 0
|
|
||||||
is equivalent to iy%= tileheight, and saves a division.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
void
|
|
||||||
afbSolidFillArea (pDraw, nbox, pbox, rrops)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
register unsigned char *rrops;
|
|
||||||
{
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
int w; /* width of current box */
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register PixelType *p; /* pointer to bits we're writing */
|
|
||||||
register int nlw; /* loop version of nlwMiddle */
|
|
||||||
register PixelType startmask;
|
|
||||||
register PixelType endmask;
|
|
||||||
/* masks for reggedy bits at either end of line */
|
|
||||||
register int nlwExtra;
|
|
||||||
/* to get from right of box to left of next span */
|
|
||||||
int nlwMiddle; /* number of longwords between sides of boxes */
|
|
||||||
PixelType *pbits; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
int saveH;
|
|
||||||
int depthDst;
|
|
||||||
int sizeDst;
|
|
||||||
register int d;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pbits);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
|
|
||||||
saveP = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
|
|
||||||
if ( ((pbox->x1 & PIM) + w) < PPW) {
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = saveH;
|
|
||||||
p = saveP;
|
|
||||||
saveP += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
maskpartialbits(pbox->x1, w, startmask);
|
|
||||||
nlwExtra = nlwidth;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
Duff(h, *p &= ~startmask; afbScanlineInc(p, nlwExtra));
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
Duff(h, *p |= startmask; afbScanlineInc(p, nlwExtra));
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
Duff(h, *p ^= startmask; afbScanlineInc(p, nlwExtra));
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ..) */
|
|
||||||
} else {
|
|
||||||
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
h = saveH;
|
|
||||||
p = saveP;
|
|
||||||
saveP += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
nlwExtra = nlwidth - nlwMiddle;
|
|
||||||
|
|
||||||
if (startmask && endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p &= ~startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ = 0);
|
|
||||||
*p &= ~endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p |= startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ = ~0);
|
|
||||||
*p |= endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p ^= startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ ^= ~0);
|
|
||||||
*p ^= endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (startmask && !endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p &= ~startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ = 0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p |= startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ = ~0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p ^= startmask;
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ ^= ~0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (!startmask && endmask) {
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ = 0);
|
|
||||||
*p &= ~endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ = ~0);
|
|
||||||
*p |= endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ ^= ~0);
|
|
||||||
*p ^= endmask;
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else { /* no ragged bits at either end */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ = 0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ = ~0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ ^= ~0);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
}
|
|
||||||
} /* for (d = 0 ... ) */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stipple a list of boxes -
|
|
||||||
|
|
||||||
you can use the reduced rasterop for stipples. if rrop is
|
|
||||||
black, AND the destination with (not stipple pattern). if rrop is
|
|
||||||
white OR the destination with the stipple pattern. if rrop is invert,
|
|
||||||
XOR the destination with the stipple pattern.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
void
|
|
||||||
afbStippleAreaPPW (pDraw, nbox, pbox, pstipple, rrops)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
PixmapPtr pstipple;
|
|
||||||
unsigned char *rrops;
|
|
||||||
{
|
|
||||||
register PixelType *psrc;
|
|
||||||
/* pointer to bits in tile, if needed */
|
|
||||||
int tileHeight; /* height of the tile */
|
|
||||||
register PixelType srcpix;
|
|
||||||
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
int w; /* width of current box */
|
|
||||||
register int nlw; /* loop version of nlwMiddle */
|
|
||||||
register PixelType *p; /* pointer to bits we're writing */
|
|
||||||
register int h; /* height of current box */
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlwMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int nlwExtra; /* to get from right of box to left of next span */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int d;
|
|
||||||
int saveIy;
|
|
||||||
register int iy; /* index of current scanline in tile */
|
|
||||||
PixelType *pbits; /* pointer to start of drawable */
|
|
||||||
PixelType *pBase;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pBase);
|
|
||||||
|
|
||||||
tileHeight = pstipple->drawable.height;
|
|
||||||
psrc = (PixelType *)(pstipple->devPrivate.ptr);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
saveIy = pbox->y1 % tileHeight;
|
|
||||||
pbits = pBase;
|
|
||||||
|
|
||||||
if ( ((pbox->x1 & PIM) + w) < PPW) {
|
|
||||||
maskpartialbits(pbox->x1, w, startmask);
|
|
||||||
nlwExtra = nlwidth;
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
p = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
pbits += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
iy = saveIy;
|
|
||||||
h = pbox->y2 - pbox->y1;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
*p &= ~(srcpix & startmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
*p |= (srcpix & startmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
*p ^= (srcpix & startmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
nlwExtra = nlwidth - nlwMiddle;
|
|
||||||
p = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
pbits += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
iy = saveIy;
|
|
||||||
h = pbox->y2 - pbox->y1;
|
|
||||||
|
|
||||||
if (startmask && endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p &= ~(srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff (nlw, *p++ &= ~srcpix);
|
|
||||||
*p &= ~(srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p |= (srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff (nlw, *p++ |= srcpix);
|
|
||||||
*p |= (srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p ^= (srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff (nlw, *p++ ^= srcpix);
|
|
||||||
*p ^= (srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} else if (startmask && !endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p &= ~(srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ &= ~srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p |= (srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ |= srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p ^= (srcpix & startmask);
|
|
||||||
p++;
|
|
||||||
Duff(nlw, *p++ ^= srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} else if (!startmask && endmask) {
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ &= ~srcpix);
|
|
||||||
*p &= ~(srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ |= srcpix);
|
|
||||||
*p |= (srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ ^= srcpix);
|
|
||||||
*p ^= (srcpix & endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} else { /* no ragged bits at either end */
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ &= ~srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ |= srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy = ++iy < tileHeight ? iy : 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
Duff(nlw, *p++ ^= srcpix);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
}
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbStippleArea (pDraw, nbox, pbox, pTile, xOff, yOff, rrops)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
PixmapPtr pTile;
|
|
||||||
int xOff;
|
|
||||||
int yOff;
|
|
||||||
unsigned char *rrops;
|
|
||||||
{
|
|
||||||
register PixelType *psrc; /* pointer to bits in tile, if needed */
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register PixelType *pdst; /* pointer to bits we're writing */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int tileLine;
|
|
||||||
int iline;
|
|
||||||
int w, width, x, xSrc, ySrc, srcStartOver, nend;
|
|
||||||
int tlwidth, rem, tileWidth, tileHeight, endinc;
|
|
||||||
int saveW;
|
|
||||||
register int rop;
|
|
||||||
PixelType *psrcT;
|
|
||||||
int d;
|
|
||||||
int nstart;
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int iy;
|
|
||||||
PixelType *pBase; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
PixelType *pStartDst;
|
|
||||||
PixelType *pStartTile;
|
|
||||||
int saveH;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pBase);
|
|
||||||
|
|
||||||
tileHeight = pTile->drawable.height;
|
|
||||||
tileWidth = pTile->drawable.width;
|
|
||||||
tlwidth = pTile->devKind / sizeof (PixelType);
|
|
||||||
|
|
||||||
xSrc = pDraw->x + ((xOff % tileWidth) - tileWidth);
|
|
||||||
ySrc = pDraw->y + ((yOff % tileHeight) - tileHeight);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
saveW = pbox->x2 - pbox->x1;
|
|
||||||
iline = (pbox->y1 - ySrc) % tileHeight;
|
|
||||||
psrcT = (PixelType *) pTile->devPrivate.ptr;
|
|
||||||
tileLine = iline * tlwidth;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
saveP = afbScanline(pBase, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
h = saveH;
|
|
||||||
pStartDst = saveP;
|
|
||||||
pStartTile = psrcT + tileLine;
|
|
||||||
iy = iline;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
x = pbox->x1;
|
|
||||||
width = saveW;
|
|
||||||
pdst = pStartDst;
|
|
||||||
rop = rrops[d];
|
|
||||||
|
|
||||||
while(width > 0) {
|
|
||||||
psrc = pStartTile;
|
|
||||||
w = min(tileWidth, width);
|
|
||||||
if((rem = (x - xSrc) % tileWidth) != 0) {
|
|
||||||
/* if we're in the middle of the tile, get
|
|
||||||
as many bits as will finish the span, or
|
|
||||||
as many as will get to the left edge of the tile,
|
|
||||||
or a longword worth, starting at the appropriate
|
|
||||||
offset in the tile.
|
|
||||||
*/
|
|
||||||
w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_PAD);
|
|
||||||
endinc = rem / BITMAP_SCANLINE_PAD;
|
|
||||||
getandputrrop((psrc + endinc), (rem & PIM), (x & PIM),
|
|
||||||
w, pdst, rop)
|
|
||||||
if((x & PIM) + w >= PPW)
|
|
||||||
pdst++;
|
|
||||||
} else if(((x & PIM) + w) < PPW) {
|
|
||||||
/* doing < PPW bits is easy, and worth special-casing */
|
|
||||||
putbitsrrop(*psrc, x & PIM, w, pdst, rop);
|
|
||||||
} else {
|
|
||||||
/* start at the left edge of the tile,
|
|
||||||
and put down as much as we can
|
|
||||||
*/
|
|
||||||
maskbits(x, w, startmask, endmask, nlMiddle);
|
|
||||||
|
|
||||||
if (startmask)
|
|
||||||
nstart = PPW - (x & PIM);
|
|
||||||
else
|
|
||||||
nstart = 0;
|
|
||||||
if (endmask)
|
|
||||||
nend = (x + w) & PIM;
|
|
||||||
else
|
|
||||||
nend = 0;
|
|
||||||
|
|
||||||
srcStartOver = nstart > PLST;
|
|
||||||
|
|
||||||
if(startmask) {
|
|
||||||
putbitsrrop(*psrc, (x & PIM), nstart, pdst, rop);
|
|
||||||
pdst++;
|
|
||||||
if(srcStartOver)
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(nlMiddle--) {
|
|
||||||
getandputrrop0(psrc, nstart, PPW, pdst, rop);
|
|
||||||
pdst++;
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(endmask) {
|
|
||||||
getandputrrop0(psrc, nstart, nend, pdst, rop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x += w;
|
|
||||||
width -= w;
|
|
||||||
} /* while (width > 0) */
|
|
||||||
|
|
||||||
pStartDst += nlwidth;
|
|
||||||
if (++iy >= tileHeight) {
|
|
||||||
iy = 0;
|
|
||||||
pStartTile = psrcT;
|
|
||||||
} else
|
|
||||||
pStartTile += tlwidth;
|
|
||||||
|
|
||||||
} /* while (h) */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
pbox++;
|
|
||||||
} /* for each box */
|
|
||||||
}
|
|
146
afb/afbpolypnt.c
146
afb/afbpolypnt.c
|
@ -1,146 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xprotostr.h>
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
afbPolyPoint(pDrawable, pGC, mode, npt, pptInit)
|
|
||||||
register DrawablePtr pDrawable;
|
|
||||||
GCPtr pGC;
|
|
||||||
int mode; /* Origin or Previous */
|
|
||||||
int npt;
|
|
||||||
xPoint *pptInit;
|
|
||||||
{
|
|
||||||
|
|
||||||
register BoxPtr pbox;
|
|
||||||
register int nbox;
|
|
||||||
register int d;
|
|
||||||
|
|
||||||
register PixelType *addrl;
|
|
||||||
PixelType *pBase;
|
|
||||||
PixelType *pBaseSave;
|
|
||||||
int nlwidth;
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
|
|
||||||
int nptTmp;
|
|
||||||
register xPoint *ppt;
|
|
||||||
|
|
||||||
register int x;
|
|
||||||
register int y;
|
|
||||||
register unsigned char *rrops;
|
|
||||||
afbPrivGC *pGCPriv;
|
|
||||||
|
|
||||||
pGCPriv = (afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey);
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, nlwidth, sizeDst, depthDst,
|
|
||||||
pBaseSave);
|
|
||||||
|
|
||||||
rrops = pGCPriv->rrops;
|
|
||||||
if ((mode == CoordModePrevious) && (npt > 1))
|
|
||||||
for (ppt = pptInit + 1, nptTmp = npt - 1; --nptTmp >= 0; ppt++) {
|
|
||||||
ppt->x += (ppt-1)->x;
|
|
||||||
ppt->y += (ppt-1)->y;
|
|
||||||
}
|
|
||||||
|
|
||||||
nbox = REGION_NUM_RECTS(pGC->pCompositeClip);
|
|
||||||
pbox = REGION_RECTS(pGC->pCompositeClip);
|
|
||||||
for (; --nbox >= 0; pbox++)
|
|
||||||
for (d = 0, pBase = pBaseSave; d < depthDst; d++, pBase += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
addrl = pBase;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
for (ppt = pptInit, nptTmp = npt; --nptTmp >= 0; ppt++) {
|
|
||||||
x = ppt->x + pDrawable->x;
|
|
||||||
y = ppt->y + pDrawable->y;
|
|
||||||
if ((x >= pbox->x1) && (x < pbox->x2) &&
|
|
||||||
(y >= pbox->y1) && (y < pbox->y2))
|
|
||||||
*afbScanline(addrl, x, y, nlwidth) &= mfbGetrmask(x & PIM);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_WHITE:
|
|
||||||
for (ppt = pptInit, nptTmp = npt; --nptTmp >= 0; ppt++) {
|
|
||||||
x = ppt->x + pDrawable->x;
|
|
||||||
y = ppt->y + pDrawable->y;
|
|
||||||
if ((x >= pbox->x1) && (x < pbox->x2) &&
|
|
||||||
(y >= pbox->y1) && (y < pbox->y2))
|
|
||||||
*afbScanline(addrl, x, y, nlwidth) |= mfbGetmask(x & PIM);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
for (ppt = pptInit, nptTmp = npt; --nptTmp >= 0; ppt++) {
|
|
||||||
x = ppt->x + pDrawable->x;
|
|
||||||
y = ppt->y + pDrawable->y;
|
|
||||||
if ((x >= pbox->x1) && (x < pbox->x2) &&
|
|
||||||
(y >= pbox->y1) && (y < pbox->y2))
|
|
||||||
*afbScanline(addrl, x, y, nlwidth) ^= mfbGetmask(x & PIM);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
169
afb/afbpushpxl.c
169
afb/afbpushpxl.c
|
@ -1,169 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "afb.h"
|
|
||||||
|
|
||||||
#define NPT 128
|
|
||||||
|
|
||||||
/* afbPushPixels -- squeegees the forground color of pGC through pBitMap
|
|
||||||
* into pDrawable. pBitMap is a stencil (dx by dy of it is used, it may
|
|
||||||
* be bigger) which is placed on the drawable at xOrg, yOrg. Where a 1 bit
|
|
||||||
* is set in the bitmap, the fill style is put onto the drawable using
|
|
||||||
* the GC's logical function. The drawable is not changed where the bitmap
|
|
||||||
* has a zero bit or outside the area covered by the stencil.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDrawable, int dx, int dy, int xOrg, int yOrg)
|
|
||||||
{
|
|
||||||
int h, dxDivPPW, ibEnd;
|
|
||||||
PixelType *pwLineStart;
|
|
||||||
register PixelType *pw, *pwEnd;
|
|
||||||
register PixelType mask;
|
|
||||||
register int ib;
|
|
||||||
register PixelType w;
|
|
||||||
register int ipt; /* index into above arrays */
|
|
||||||
Bool fInBox;
|
|
||||||
DDXPointRec pt[NPT];
|
|
||||||
int width[NPT];
|
|
||||||
|
|
||||||
/* Now scan convert the pixmap and use the result to call fillspans in
|
|
||||||
* in the drawable with the original GC */
|
|
||||||
ipt = 0;
|
|
||||||
dxDivPPW = dx/PPW;
|
|
||||||
for (h = 0; h < dy; h++) {
|
|
||||||
|
|
||||||
pw = (PixelType *)
|
|
||||||
(((char *)(pBitMap->devPrivate.ptr))+(h * pBitMap->devKind));
|
|
||||||
pwLineStart = pw;
|
|
||||||
/* Process all words which are fully in the pixmap */
|
|
||||||
|
|
||||||
fInBox = FALSE;
|
|
||||||
pwEnd = pwLineStart + dxDivPPW;
|
|
||||||
while(pw < pwEnd) {
|
|
||||||
w = *pw;
|
|
||||||
mask = mfbGetendtab(1);
|
|
||||||
for(ib = 0; ib < PPW; ib++) {
|
|
||||||
if(w & mask) {
|
|
||||||
if(!fInBox) {
|
|
||||||
pt[ipt].x = ((pw - pwLineStart) << PWSH) + ib + xOrg;
|
|
||||||
pt[ipt].y = h + yOrg;
|
|
||||||
/* start new box */
|
|
||||||
fInBox = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(fInBox) {
|
|
||||||
width[ipt] = ((pw - pwLineStart) << PWSH) +
|
|
||||||
ib + xOrg - pt[ipt].x;
|
|
||||||
if (++ipt >= NPT) {
|
|
||||||
(*pGC->ops->FillSpans)(pDrawable, pGC, NPT, pt,
|
|
||||||
width, TRUE);
|
|
||||||
ipt = 0;
|
|
||||||
}
|
|
||||||
/* end box */
|
|
||||||
fInBox = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mask = SCRRIGHT(mask, 1);
|
|
||||||
}
|
|
||||||
pw++;
|
|
||||||
}
|
|
||||||
ibEnd = dx & PIM;
|
|
||||||
if(ibEnd) {
|
|
||||||
/* Process final partial word on line */
|
|
||||||
w = *pw;
|
|
||||||
mask = mfbGetendtab(1);
|
|
||||||
for(ib = 0; ib < ibEnd; ib++) {
|
|
||||||
if(w & mask) {
|
|
||||||
if(!fInBox) {
|
|
||||||
/* start new box */
|
|
||||||
pt[ipt].x = ((pw - pwLineStart) << PWSH) + ib + xOrg;
|
|
||||||
pt[ipt].y = h + yOrg;
|
|
||||||
fInBox = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(fInBox) {
|
|
||||||
/* end box */
|
|
||||||
width[ipt] = ((pw - pwLineStart) << PWSH) +
|
|
||||||
ib + xOrg - pt[ipt].x;
|
|
||||||
if (++ipt >= NPT) {
|
|
||||||
(*pGC->ops->FillSpans)(pDrawable, pGC, NPT, pt,
|
|
||||||
width, TRUE);
|
|
||||||
ipt = 0;
|
|
||||||
}
|
|
||||||
fInBox = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mask = SCRRIGHT(mask, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If scanline ended with last bit set, end the box */
|
|
||||||
if(fInBox) {
|
|
||||||
width[ipt] = dx + xOrg - pt[ipt].x;
|
|
||||||
if (++ipt >= NPT) {
|
|
||||||
(*pGC->ops->FillSpans)(pDrawable, pGC, NPT, pt, width, TRUE);
|
|
||||||
ipt = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Flush any remaining spans */
|
|
||||||
if (ipt) {
|
|
||||||
(*pGC->ops->FillSpans)(pDrawable, pGC, ipt, pt, width, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
218
afb/afbscrinit.c
218
afb/afbscrinit.c
|
@ -1,218 +0,0 @@
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xproto.h> /* for xColorItem */
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "resource.h"
|
|
||||||
#include "colormap.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "mistruct.h"
|
|
||||||
#include "dix.h"
|
|
||||||
#include "mi.h"
|
|
||||||
#include "mibstore.h"
|
|
||||||
#include "migc.h"
|
|
||||||
#include "servermd.h"
|
|
||||||
|
|
||||||
#ifdef PIXMAP_PER_WINDOW
|
|
||||||
DevPrivateKey frameWindowPrivateKey = &frameWindowPrivateKey;
|
|
||||||
#endif
|
|
||||||
DevPrivateKey afbGCPrivateKey = &afbGCPrivateKey;
|
|
||||||
DevPrivateKey afbScreenPrivateKey = &afbScreenPrivateKey;
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
afbCloseScreen(int index, ScreenPtr pScreen)
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
DepthPtr depths = pScreen->allowedDepths;
|
|
||||||
|
|
||||||
for (d = 0; d < pScreen->numDepths; d++)
|
|
||||||
xfree(depths[d].vids);
|
|
||||||
xfree(depths);
|
|
||||||
xfree(pScreen->visuals);
|
|
||||||
xfree(dixLookupPrivate(&pScreen->devPrivates, afbScreenPrivateKey));
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
afbCreateScreenResources(ScreenPtr pScreen)
|
|
||||||
{
|
|
||||||
Bool retval;
|
|
||||||
|
|
||||||
pointer oldDevPrivate = pScreen->devPrivate;
|
|
||||||
|
|
||||||
pScreen->devPrivate = dixLookupPrivate(&pScreen->devPrivates,
|
|
||||||
afbScreenPrivateKey);
|
|
||||||
retval = miCreateScreenResources(pScreen);
|
|
||||||
|
|
||||||
/* Modify screen's pixmap devKind value stored off devPrivate to
|
|
||||||
* be the width of a single plane in longs rather than the width
|
|
||||||
* of a chunky screen in longs as incorrectly setup by the mi routine.
|
|
||||||
*/
|
|
||||||
((PixmapPtr)pScreen->devPrivate)->devKind = BitmapBytePad(pScreen->width);
|
|
||||||
dixSetPrivate(&pScreen->devPrivates, afbScreenPrivateKey,
|
|
||||||
pScreen->devPrivate);
|
|
||||||
pScreen->devPrivate = oldDevPrivate;
|
|
||||||
return(retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PixmapPtr
|
|
||||||
afbGetWindowPixmap(WindowPtr pWin)
|
|
||||||
{
|
|
||||||
#ifdef PIXMAP_PER_WINDOW
|
|
||||||
return (PixmapPtr)dixLookupPrivate(&pWin->devPrivates,
|
|
||||||
frameWindowPrivateKey);
|
|
||||||
#else
|
|
||||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
||||||
|
|
||||||
return (* pScreen->GetScreenPixmap)(pScreen);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbSetWindowPixmap(WindowPtr pWin, PixmapPtr pPix)
|
|
||||||
{
|
|
||||||
#ifdef PIXMAP_PER_WINDOW
|
|
||||||
dixSetPrivate(&pWin->devPrivates, frameWindowPrivateKey, pPix);
|
|
||||||
#else
|
|
||||||
(* pWin->drawable.pScreen->SetScreenPixmap)(pPix);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
afbAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCKey)
|
|
||||||
{
|
|
||||||
if (pGCKey)
|
|
||||||
*pGCKey = afbGCPrivateKey;
|
|
||||||
|
|
||||||
pScreen->GetWindowPixmap = afbGetWindowPixmap;
|
|
||||||
pScreen->SetWindowPixmap = afbSetWindowPixmap;
|
|
||||||
return dixRequestPrivate(afbGCPrivateKey, sizeof(afbPrivGC));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dts * (inch/dot) * (25.4 mm / inch) = mm */
|
|
||||||
Bool
|
|
||||||
afbScreenInit(register ScreenPtr pScreen, pointer pbits, int xsize, int ysize, int dpix, int dpiy, int width)
|
|
||||||
|
|
||||||
/* pointer to screen bitmap */
|
|
||||||
/* in pixels */
|
|
||||||
/* dots per inch */
|
|
||||||
/* pixel width of frame buffer */
|
|
||||||
{
|
|
||||||
VisualPtr visuals;
|
|
||||||
DepthPtr depths;
|
|
||||||
int nvisuals;
|
|
||||||
int ndepths;
|
|
||||||
int rootdepth;
|
|
||||||
VisualID defaultVisual;
|
|
||||||
pointer oldDevPrivate;
|
|
||||||
|
|
||||||
rootdepth = 0;
|
|
||||||
if (!afbInitVisuals(&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
|
|
||||||
&defaultVisual, 256, 8)) {
|
|
||||||
ErrorF("afbInitVisuals: FALSE\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (!afbAllocatePrivates(pScreen, NULL)) {
|
|
||||||
ErrorF("afbAllocatePrivates: FALSE\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pScreen->defColormap = (Colormap)FakeClientID(0);
|
|
||||||
/* whitePixel, blackPixel */
|
|
||||||
pScreen->blackPixel = 0;
|
|
||||||
pScreen->whitePixel = 0;
|
|
||||||
pScreen->QueryBestSize = afbQueryBestSize;
|
|
||||||
/* SaveScreen */
|
|
||||||
pScreen->GetImage = afbGetImage;
|
|
||||||
pScreen->GetSpans = afbGetSpans;
|
|
||||||
pScreen->CreateWindow = afbCreateWindow;
|
|
||||||
pScreen->DestroyWindow = afbDestroyWindow;
|
|
||||||
pScreen->PositionWindow = afbPositionWindow;
|
|
||||||
pScreen->ChangeWindowAttributes = afbChangeWindowAttributes;
|
|
||||||
pScreen->RealizeWindow = afbMapWindow;
|
|
||||||
pScreen->UnrealizeWindow = afbUnmapWindow;
|
|
||||||
pScreen->CopyWindow = afbCopyWindow;
|
|
||||||
pScreen->CreatePixmap = afbCreatePixmap;
|
|
||||||
pScreen->DestroyPixmap = afbDestroyPixmap;
|
|
||||||
pScreen->RealizeFont = afbRealizeFont;
|
|
||||||
pScreen->UnrealizeFont = afbUnrealizeFont;
|
|
||||||
pScreen->CreateGC = afbCreateGC;
|
|
||||||
pScreen->CreateColormap = afbInitializeColormap;
|
|
||||||
pScreen->DestroyColormap = (DestroyColormapProcPtr)NoopDDA;
|
|
||||||
pScreen->InstallColormap = afbInstallColormap;
|
|
||||||
pScreen->UninstallColormap = afbUninstallColormap;
|
|
||||||
pScreen->ListInstalledColormaps = afbListInstalledColormaps;
|
|
||||||
pScreen->StoreColors = (StoreColorsProcPtr)NoopDDA;
|
|
||||||
pScreen->ResolveColor = afbResolveColor;
|
|
||||||
pScreen->BitmapToRegion = afbPixmapToRegion;
|
|
||||||
oldDevPrivate = pScreen->devPrivate;
|
|
||||||
if (!miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, rootdepth,
|
|
||||||
ndepths, depths, defaultVisual, nvisuals, visuals)) {
|
|
||||||
ErrorF("miScreenInit: FALSE\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pScreen->CloseScreen = afbCloseScreen;
|
|
||||||
pScreen->CreateScreenResources = afbCreateScreenResources;
|
|
||||||
|
|
||||||
dixSetPrivate(&pScreen->devPrivates, afbScreenPrivateKey,
|
|
||||||
pScreen->devPrivate);
|
|
||||||
pScreen->devPrivate = oldDevPrivate;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
257
afb/afbsetsp.c
257
afb/afbsetsp.c
|
@ -1,257 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
|
|
||||||
#include "misc.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#include "servermd.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* afbSetScanline -- copies the bits from psrc to the drawable starting at
|
|
||||||
* (xStart, y) and continuing to (xEnd, y). xOrigin tells us where psrc
|
|
||||||
* starts on the scanline. (I.e., if this scanline passes through multiple
|
|
||||||
* boxes, we may not want to start grabbing bits at psrc but at some offset
|
|
||||||
* further on.)
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
afbSetScanline(int y, int xOrigin, int xStart, int xEnd, PixelType *psrc,
|
|
||||||
int alu, PixelType *pdstBase, int widthDst, int sizeDst,
|
|
||||||
int depthDst, int sizeSrc)
|
|
||||||
{
|
|
||||||
int w; /* width of scanline in bits */
|
|
||||||
register PixelType *pdst; /* where to put the bits */
|
|
||||||
register PixelType tmpSrc; /* scratch buffer to collect bits in */
|
|
||||||
int dstBit; /* offset in bits from beginning of
|
|
||||||
* word */
|
|
||||||
register int nstart; /* number of bits from first partial */
|
|
||||||
register int nend; /* " " last partial word */
|
|
||||||
int offSrc;
|
|
||||||
PixelType startmask, endmask;
|
|
||||||
PixelType *savePsrc = psrc + ((xStart - xOrigin) >> PWSH);
|
|
||||||
int nlMiddle, nl;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
pdst = afbScanline(pdstBase, xStart, y, widthDst) + sizeDst * d; /* @@@ NEXT PLANE @@@ */
|
|
||||||
psrc = savePsrc + sizeSrc * d; /* @@@ NEXT PLANE @@@ */
|
|
||||||
offSrc = (xStart - xOrigin) & PIM;
|
|
||||||
w = xEnd - xStart;
|
|
||||||
dstBit = xStart & PIM;
|
|
||||||
|
|
||||||
if (dstBit + w <= PPW) {
|
|
||||||
getandputrop(psrc, offSrc, dstBit, w, pdst, alu)
|
|
||||||
} else {
|
|
||||||
maskbits(xStart, w, startmask, endmask, nlMiddle);
|
|
||||||
if (startmask)
|
|
||||||
nstart = PPW - dstBit;
|
|
||||||
else
|
|
||||||
nstart = 0;
|
|
||||||
if (endmask)
|
|
||||||
nend = xEnd & PIM;
|
|
||||||
else
|
|
||||||
nend = 0;
|
|
||||||
if (startmask) {
|
|
||||||
getandputrop(psrc, offSrc, dstBit, nstart, pdst, alu)
|
|
||||||
pdst++;
|
|
||||||
offSrc += nstart;
|
|
||||||
if (offSrc > PLST) {
|
|
||||||
psrc++;
|
|
||||||
offSrc -= PPW;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nl = nlMiddle;
|
|
||||||
while (nl--) {
|
|
||||||
getbits(psrc, offSrc, PPW, tmpSrc);
|
|
||||||
DoRop(*pdst, alu, tmpSrc, *pdst);
|
|
||||||
pdst++;
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
if (endmask) {
|
|
||||||
getandputrop0(psrc, offSrc, nend, pdst, alu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* SetSpans -- for each span copy pwidth[i] bits from psrc to pDrawable at
|
|
||||||
* ppt[i] using the raster op from the GC. If fSorted is TRUE, the scanlines
|
|
||||||
* are in increasing Y order.
|
|
||||||
* Source bit lines are server scanline padded so that they always begin
|
|
||||||
* on a word boundary.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
afbSetSpans(pDrawable, pGC, pcharsrc, ppt, pwidth, nspans, fSorted)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GCPtr pGC;
|
|
||||||
char *pcharsrc;
|
|
||||||
register DDXPointPtr ppt;
|
|
||||||
int *pwidth;
|
|
||||||
int nspans;
|
|
||||||
int fSorted;
|
|
||||||
{
|
|
||||||
PixelType *psrc = (PixelType *)pcharsrc;
|
|
||||||
PixelType *pdstBase; /* start of dst bitmap */
|
|
||||||
int widthDst; /* width of bitmap in words */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int sizeSrc = 0;
|
|
||||||
register BoxPtr pbox, pboxLast, pboxTest;
|
|
||||||
register DDXPointPtr pptLast;
|
|
||||||
int alu;
|
|
||||||
RegionPtr prgnDst;
|
|
||||||
int xStart, xEnd;
|
|
||||||
int yMax;
|
|
||||||
|
|
||||||
alu = pGC->alu;
|
|
||||||
prgnDst = pGC->pCompositeClip;
|
|
||||||
|
|
||||||
pptLast = ppt + nspans;
|
|
||||||
|
|
||||||
yMax = pDrawable->y + (int) pDrawable->height;
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthDst, sizeDst, depthDst,
|
|
||||||
pdstBase);
|
|
||||||
|
|
||||||
pbox = REGION_RECTS(prgnDst);
|
|
||||||
pboxLast = pbox + REGION_NUM_RECTS(prgnDst);
|
|
||||||
|
|
||||||
if(fSorted) {
|
|
||||||
/* scan lines sorted in ascending order. Because they are sorted, we
|
|
||||||
* don't have to check each scanline against each clip box. We can be
|
|
||||||
* sure that this scanline only has to be clipped to boxes at or after the
|
|
||||||
* beginning of this y-band
|
|
||||||
*/
|
|
||||||
pboxTest = pbox;
|
|
||||||
while(ppt < pptLast) {
|
|
||||||
pbox = pboxTest;
|
|
||||||
if(ppt->y >= yMax)
|
|
||||||
break;
|
|
||||||
while(pbox < pboxLast) {
|
|
||||||
if(pbox->y1 > ppt->y) {
|
|
||||||
/* scanline is before clip box */
|
|
||||||
break;
|
|
||||||
} else if(pbox->y2 <= ppt->y) {
|
|
||||||
/* clip box is before scanline */
|
|
||||||
pboxTest = ++pbox;
|
|
||||||
continue;
|
|
||||||
} else if(pbox->x1 > ppt->x + *pwidth) {
|
|
||||||
/* clip box is to right of scanline */
|
|
||||||
break;
|
|
||||||
} else if(pbox->x2 <= ppt->x) {
|
|
||||||
/* scanline is to right of clip box */
|
|
||||||
pbox++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* at least some of the scanline is in the current clip box */
|
|
||||||
xStart = max(pbox->x1, ppt->x);
|
|
||||||
xEnd = min(ppt->x + *pwidth, pbox->x2);
|
|
||||||
sizeSrc = PixmapWidthInPadUnits(*pwidth, 1);
|
|
||||||
afbSetScanline(ppt->y, ppt->x, xStart, xEnd, psrc, alu, pdstBase,
|
|
||||||
widthDst, sizeDst, depthDst, sizeSrc);
|
|
||||||
if(ppt->x + *pwidth <= pbox->x2) {
|
|
||||||
/* End of the line, as it were */
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
/* We've tried this line against every box; it must be outside them
|
|
||||||
* all. move on to the next point */
|
|
||||||
ppt++;
|
|
||||||
psrc += sizeSrc * depthDst;
|
|
||||||
pwidth++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* scan lines not sorted. We must clip each line against all the boxes */
|
|
||||||
while(ppt < pptLast) {
|
|
||||||
if(ppt->y >= 0 && ppt->y < yMax) {
|
|
||||||
for(pbox = REGION_RECTS(prgnDst); pbox< pboxLast; pbox++) {
|
|
||||||
if(pbox->y1 > ppt->y) {
|
|
||||||
/* rest of clip region is above this scanline,
|
|
||||||
* skip it */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(pbox->y2 <= ppt->y) {
|
|
||||||
/* clip box is below scanline */
|
|
||||||
pbox++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(pbox->x1 <= ppt->x + *pwidth &&
|
|
||||||
pbox->x2 > ppt->x) {
|
|
||||||
xStart = max(pbox->x1, ppt->x);
|
|
||||||
xEnd = min(pbox->x2, ppt->x + *pwidth);
|
|
||||||
sizeSrc = PixmapWidthInPadUnits(*pwidth, 1);
|
|
||||||
afbSetScanline(ppt->y, ppt->x, xStart, xEnd, psrc, alu,
|
|
||||||
pdstBase, widthDst, sizeDst, depthDst,
|
|
||||||
sizeSrc);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
psrc += sizeSrc * depthDst;
|
|
||||||
ppt++;
|
|
||||||
pwidth++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
586
afb/afbtegblt.c
586
afb/afbtegblt.c
|
@ -1,586 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xmd.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
#include "afb.h"
|
|
||||||
#include <X11/fonts/fontstruct.h>
|
|
||||||
#include "dixfontstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
this works for fonts with glyphs <= PPW bits wide.
|
|
||||||
|
|
||||||
This should be called only with a terminal-emulator font;
|
|
||||||
this means that the FIXED_METRICS flag is set, and that
|
|
||||||
glyphbounds == charbounds.
|
|
||||||
|
|
||||||
in theory, this goes faster; even if it doesn't, it reduces the
|
|
||||||
flicker caused by writing a string over itself with image text (since
|
|
||||||
the background gets repainted per character instead of per string.)
|
|
||||||
this seems to be important for some converted X10 applications.
|
|
||||||
|
|
||||||
Image text looks at the bits in the glyph and the fg and bg in the
|
|
||||||
GC. it paints a rectangle, as defined in the protocol dcoument,
|
|
||||||
and the paints the characters.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(NO_3_60_CG4) && defined(FASTPUTBITS) && defined(FASTGETBITS)
|
|
||||||
#define FASTCHARS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this macro "knows" that only characters <= 8 bits wide will
|
|
||||||
* fit this case (which is why it is independent of GLYPHPADBYTES)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (BITMAP_BIT_ORDER == MSBFirst) && (GLYPHPADBYTES != 4)
|
|
||||||
#if GLYPHPADBYTES == 1
|
|
||||||
#define ShiftAmnt 24
|
|
||||||
#else
|
|
||||||
#define ShiftAmnt 16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: for BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER, SCRRIGHT() evaluates its
|
|
||||||
* first argument more than once. Thus the imbedded char++ have to be moved.
|
|
||||||
* (DHD)
|
|
||||||
*/
|
|
||||||
#if BITMAP_BIT_ORDER == IMAGE_BYTE_ORDER
|
|
||||||
#if PPW == 32
|
|
||||||
#define GetBits4 c = (*char1++ << ShiftAmnt) | \
|
|
||||||
SCRRIGHT (*char2++ << ShiftAmnt, xoff2) | \
|
|
||||||
SCRRIGHT (*char3++ << ShiftAmnt, xoff3) | \
|
|
||||||
SCRRIGHT (*char4++ << ShiftAmnt, xoff4);
|
|
||||||
#else /* PPW */
|
|
||||||
#define GetBits4 c = ((unsigned long)(*char1++ << ShiftAmnt) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char2++ << ShiftAmnt, xoff2) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char3++ << ShiftAmnt, xoff3) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char4++ << ShiftAmnt, xoff4) << 32 ) | \
|
|
||||||
(*char5++ << ShiftAmnt) | \
|
|
||||||
SCRRIGHT (*char6++ << ShiftAmnt, xoff6) | \
|
|
||||||
SCRRIGHT (*char7++ << ShiftAmnt, xoff7) | \
|
|
||||||
SCRRIGHT (*char8++ << ShiftAmnt, xoff8);
|
|
||||||
#endif /* PPW */
|
|
||||||
#else /* BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER */
|
|
||||||
#if PPW == 32
|
|
||||||
#define GetBits4 c = (*char1++ << ShiftAmnt) | \
|
|
||||||
SCRRIGHT (*char2 << ShiftAmnt, xoff2) | \
|
|
||||||
SCRRIGHT (*char3 << ShiftAmnt, xoff3) | \
|
|
||||||
SCRRIGHT (*char4 << ShiftAmnt, xoff4); \
|
|
||||||
char2++; char3++; char4++;
|
|
||||||
#else /* PPW == 64 */
|
|
||||||
#define GetBits4 c = ((unsigned long)(*char1++ << ShiftAmnt) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char2 << ShiftAmnt, xoff2) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char3 << ShiftAmnt, xoff3) << 32 ) | \
|
|
||||||
(SCRRIGHT (*char4 << ShiftAmnt, xoff4) << 32 ) | \
|
|
||||||
(*char5++ << ShiftAmnt) | \
|
|
||||||
SCRRIGHT (*char6 << ShiftAmnt, xoff6) | \
|
|
||||||
SCRRIGHT (*char7 << ShiftAmnt, xoff7) | \
|
|
||||||
SCRRIGHT (*char8 << ShiftAmnt, xoff8); \
|
|
||||||
char2++; char3++; char4++; char6++; char7++; char8++;
|
|
||||||
#endif /* PPW */
|
|
||||||
#endif /* BITMAP_BIT_ORDER == IMAGE_BYTE_ORDER */
|
|
||||||
|
|
||||||
#else /* (BITMAP_BIT_ORDER != MSBFirst) || (GLYPHPADBYTES == 4) */
|
|
||||||
|
|
||||||
#if BITMAP_BIT_ORDER == IMAGE_BYTE_ORDER
|
|
||||||
#if PPW == 32
|
|
||||||
#define GetBits4 c = *char1++ | \
|
|
||||||
SCRRIGHT (*char2++, xoff2) | \
|
|
||||||
SCRRIGHT (*char3++, xoff3) | \
|
|
||||||
SCRRIGHT (*char4++, xoff4);
|
|
||||||
#else /* PPW == 64 */
|
|
||||||
#define GetBits4 c = (unsigned long)(((*char1++) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char2++, xoff2) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char3++, xoff3) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char4++, xoff4) << 64 ) | \
|
|
||||||
SCRRIGHT (*char5++, xoff5) | \
|
|
||||||
SCRRIGHT (*char6++, xoff6) | \
|
|
||||||
SCRRIGHT (*char7++, xoff7) | \
|
|
||||||
SCRRIGHT (*char8++, xoff8));
|
|
||||||
#endif /* PPW */
|
|
||||||
#else /* BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER */
|
|
||||||
#if PPW == 32
|
|
||||||
#define GetBits4 c = *char1++ | \
|
|
||||||
SCRRIGHT (*char2, xoff2) | \
|
|
||||||
SCRRIGHT (*char3, xoff3) | \
|
|
||||||
SCRRIGHT (*char4, xoff4); \
|
|
||||||
char2++; char3++; char4++;
|
|
||||||
#else /* PPW == 64 */
|
|
||||||
#define GetBits4 c = (unsigned long)(((*char1++) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char2, xoff2) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char3, xoff3) << 64 ) | \
|
|
||||||
(SCRRIGHT (*char4, xoff4) << 64 ) | \
|
|
||||||
SCRRIGHT (*char5, xoff5) | \
|
|
||||||
SCRRIGHT (*char6, xoff6) | \
|
|
||||||
SCRRIGHT (*char7, xoff7) | \
|
|
||||||
SCRRIGHT (*char8, xoff8)); \
|
|
||||||
char2++; char3++; char4++; \
|
|
||||||
char5++; char6++; char7++; char8++;
|
|
||||||
#endif /* PPW */
|
|
||||||
#endif /* BITMAP_BIT_ORDER == IMAGE_BYTE_ORDER */
|
|
||||||
|
|
||||||
#endif /* BITMAP_BIT_ORDER && GLYPHPADBYTES */
|
|
||||||
|
|
||||||
|
|
||||||
#if GLYPHPADBYTES == 1
|
|
||||||
typedef unsigned char *glyphPointer;
|
|
||||||
#define USE_LEFTBITS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GLYPHPADBYTES == 2
|
|
||||||
typedef unsigned short *glyphPointer;
|
|
||||||
#define USE_LEFTBITS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GLYPHPADBYTES == 4
|
|
||||||
typedef unsigned int *glyphPointer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_LEFTBITS
|
|
||||||
#define GetBits1 getleftbits (char1, widthGlyph, c); \
|
|
||||||
c &= glyphMask; \
|
|
||||||
char1 = (glyphPointer) (((char *) char1) + glyphBytes);
|
|
||||||
#else
|
|
||||||
#define GetBits1 c = *char1++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
afbTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
|
|
||||||
DrawablePtr pDrawable;
|
|
||||||
GC *pGC;
|
|
||||||
int x, y;
|
|
||||||
unsigned int nglyph;
|
|
||||||
CharInfoPtr *ppci; /* array of character info */
|
|
||||||
pointer pglyphBase; /* start of array of glyphs */
|
|
||||||
{
|
|
||||||
FontPtr pfont = pGC->font;
|
|
||||||
int widthDst;
|
|
||||||
PixelType *pdstBase; /* pointer to longword with top row
|
|
||||||
of current glyph */
|
|
||||||
|
|
||||||
int h; /* height of glyph and char */
|
|
||||||
register int xpos; /* current x */
|
|
||||||
int ypos; /* current y */
|
|
||||||
int widthGlyph;
|
|
||||||
|
|
||||||
int hTmp; /* counter for height */
|
|
||||||
register PixelType startmask, endmask;
|
|
||||||
int nfirst; /* used if glyphs spans a longword boundary */
|
|
||||||
BoxRec bbox; /* for clipping */
|
|
||||||
int widthGlyphs;
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
PixelType *saveDst;
|
|
||||||
register PixelType *dst;
|
|
||||||
register PixelType c;
|
|
||||||
register int d;
|
|
||||||
register int xoff1, xoff2, xoff3, xoff4;
|
|
||||||
register glyphPointer char1, char2, char3, char4;
|
|
||||||
glyphPointer schar1, schar2, schar3, schar4;
|
|
||||||
#if PPW == 64
|
|
||||||
register int xoff5, xoff6, xoff7, xoff8;
|
|
||||||
register glyphPointer char5, char6, char7, char8;
|
|
||||||
glyphPointer schar5, schar6, schar7, schar8;
|
|
||||||
#endif /* PPW */
|
|
||||||
|
|
||||||
unsigned char *rrops;
|
|
||||||
#ifdef USE_LEFTBITS
|
|
||||||
register PixelType glyphMask;
|
|
||||||
register PixelType tmpSrc;
|
|
||||||
register int glyphBytes;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDrawable, widthDst, sizeDst, depthDst,
|
|
||||||
pdstBase);
|
|
||||||
|
|
||||||
xpos = x + pDrawable->x;
|
|
||||||
ypos = y + pDrawable->y;
|
|
||||||
|
|
||||||
widthGlyph = FONTMAXBOUNDS(pfont,characterWidth);
|
|
||||||
h = FONTASCENT(pfont) + FONTDESCENT(pfont);
|
|
||||||
|
|
||||||
xpos += FONTMAXBOUNDS(pfont,leftSideBearing);
|
|
||||||
ypos -= FONTASCENT(pfont);
|
|
||||||
|
|
||||||
rrops = ((afbPrivGCPtr)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey))->rropOS;
|
|
||||||
bbox.x1 = xpos;
|
|
||||||
bbox.x2 = xpos + (widthGlyph * nglyph);
|
|
||||||
bbox.y1 = ypos;
|
|
||||||
bbox.y2 = ypos + h;
|
|
||||||
|
|
||||||
switch (RECT_IN_REGION(pGC->pScreen, pGC->pCompositeClip, &bbox)) {
|
|
||||||
case rgnPART:
|
|
||||||
/* this is the WRONG thing to do, but it works.
|
|
||||||
calling the non-terminal text is easy, but slow, given
|
|
||||||
what we know about the font.
|
|
||||||
|
|
||||||
the right thing to do is something like:
|
|
||||||
for each clip rectangle
|
|
||||||
compute at which row the glyph starts to be in it,
|
|
||||||
and at which row the glyph ceases to be in it
|
|
||||||
compute which is the first glyph inside the left
|
|
||||||
edge, and the last one inside the right edge
|
|
||||||
draw a fractional first glyph, using only
|
|
||||||
the rows we know are in
|
|
||||||
draw all the whole glyphs, using the appropriate rows
|
|
||||||
draw any pieces of the last glyph, using the right rows
|
|
||||||
|
|
||||||
this way, the code would take advantage of knowing that
|
|
||||||
all glyphs are the same height and don't overlap.
|
|
||||||
|
|
||||||
one day...
|
|
||||||
*/
|
|
||||||
afbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
|
||||||
case rgnOUT:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pdstBase = afbScanlineDeltaNoBankSwitch(pdstBase, ypos, widthDst);
|
|
||||||
widthGlyphs = widthGlyph * PGSZB;
|
|
||||||
|
|
||||||
#ifdef USE_LEFTBITS
|
|
||||||
glyphMask = mfbGetendtab(widthGlyph);
|
|
||||||
glyphBytes = GLYPHWIDTHBYTESPADDED(*ppci);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (nglyph >= PGSZB && widthGlyphs <= PPW) {
|
|
||||||
while (nglyph >= PGSZB) {
|
|
||||||
nglyph -= PGSZB;
|
|
||||||
xoff1 = xpos & PIM;
|
|
||||||
xoff2 = widthGlyph;
|
|
||||||
xoff3 = xoff2 + widthGlyph;
|
|
||||||
xoff4 = xoff3 + widthGlyph;
|
|
||||||
#if PPW == 64
|
|
||||||
xoff5 = xoff4 + widthGlyph;
|
|
||||||
xoff6 = xoff5 + widthGlyph;
|
|
||||||
xoff7 = xoff6 + widthGlyph;
|
|
||||||
xoff8 = xoff7 + widthGlyph;
|
|
||||||
#endif /* PPW */
|
|
||||||
schar1 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar2 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar3 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar4 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
#if PPW == 64
|
|
||||||
schar5 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar6 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar7 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
schar8 = (glyphPointer)FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
#endif /* PPW */
|
|
||||||
|
|
||||||
hTmp = h;
|
|
||||||
saveDst = afbScanlineOffset(pdstBase, (xpos >> PWSH)); /* switch now */
|
|
||||||
|
|
||||||
#ifndef FASTCHARS
|
|
||||||
if (xoff1 + widthGlyphs <= PPW) {
|
|
||||||
maskpartialbits (xoff1, widthGlyphs, startmask);
|
|
||||||
#endif
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
hTmp = h;
|
|
||||||
dst = saveDst;
|
|
||||||
saveDst += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (hTmp--) {
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
FASTPUTBITS(0, xoff1, widthGlyphs, dst);
|
|
||||||
#else
|
|
||||||
*(dst) &= ~startmask;
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (hTmp--) {
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
FASTPUTBITS(~0, xoff1, widthGlyphs, dst);
|
|
||||||
#else
|
|
||||||
*(dst) |= startmask;
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
char1 = schar1;
|
|
||||||
char2 = schar2;
|
|
||||||
char3 = schar3;
|
|
||||||
char4 = schar4;
|
|
||||||
/* XXX */
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits4
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
# if BITMAP_BIT_ORDER == MSBFirst
|
|
||||||
c >>= PPW - widthGlyphs;
|
|
||||||
# endif
|
|
||||||
FASTPUTBITS(~c, xoff1, widthGlyphs, dst);
|
|
||||||
#else
|
|
||||||
*(dst) = ((*dst) & ~startmask) | (~SCRRIGHT(c, xoff1) & startmask);
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
char1 = schar1;
|
|
||||||
char2 = schar2;
|
|
||||||
char3 = schar3;
|
|
||||||
char4 = schar4;
|
|
||||||
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits4
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
# if BITMAP_BIT_ORDER == MSBFirst
|
|
||||||
c >>= PPW - widthGlyphs;
|
|
||||||
#endif
|
|
||||||
FASTPUTBITS(c, xoff1, widthGlyphs, dst);
|
|
||||||
#else
|
|
||||||
*(dst) = ((*dst) & ~startmask) | (SCRRIGHT(c, xoff1) & startmask);
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch (rrops[d]) */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
#ifndef FASTCHARS
|
|
||||||
} else {
|
|
||||||
maskPPWbits (xoff1, widthGlyphs, startmask, endmask);
|
|
||||||
nfirst = PPW - xoff1;
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
hTmp = h;
|
|
||||||
dst = saveDst;
|
|
||||||
saveDst += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (hTmp--) {
|
|
||||||
dst[0] &= ~startmask;
|
|
||||||
dst[1] &= ~endmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (hTmp--) {
|
|
||||||
dst[0] |= startmask;
|
|
||||||
dst[1] |= endmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
char1 = schar1;
|
|
||||||
char2 = schar2;
|
|
||||||
char3 = schar3;
|
|
||||||
char4 = schar4;
|
|
||||||
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits4
|
|
||||||
dst[0] = (dst[0] & ~startmask) | (~SCRRIGHT(c,xoff1) & startmask);
|
|
||||||
dst[1] = (dst[1] & ~endmask) | (~SCRLEFT(c,nfirst) & endmask);
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
char1 = schar1;
|
|
||||||
char2 = schar2;
|
|
||||||
char3 = schar3;
|
|
||||||
char4 = schar4;
|
|
||||||
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits4
|
|
||||||
dst[0] = (dst[0] & ~startmask) | (SCRRIGHT(c,xoff1) & startmask);
|
|
||||||
dst[1] = (dst[1] & ~endmask) | (SCRLEFT(c,nfirst) & endmask);
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
xpos += widthGlyphs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while(nglyph--) {
|
|
||||||
xoff1 = xpos & PIM;
|
|
||||||
schar1 = (glyphPointer) FONTGLYPHBITS(pglyphBase,(*ppci++));
|
|
||||||
hTmp = h;
|
|
||||||
saveDst = afbScanlineOffset(pdstBase, (xpos >> PWSH));
|
|
||||||
|
|
||||||
if (xoff1 + widthGlyph <= PPW) {
|
|
||||||
maskpartialbits (xoff1, widthGlyph, startmask);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
hTmp = h;
|
|
||||||
dst = saveDst;
|
|
||||||
saveDst += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
char1 = schar1;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (hTmp--) {
|
|
||||||
(*dst) &= ~startmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (hTmp--) {
|
|
||||||
(*dst) |= startmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (hTmp--) {
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
#ifdef USE_LEFTBITS
|
|
||||||
FASTGETBITS (char1,0,widthGlyph,c);
|
|
||||||
char1 = (glyphPointer) (((char *) char1) + glyphBytes);
|
|
||||||
#else
|
|
||||||
c = *char1++;
|
|
||||||
#if BITMAP_BIT_ORDER == MSBFirst
|
|
||||||
c >>= PPW - widthGlyph;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
FASTPUTBITS (~c,xoff1,widthGlyph,dst);
|
|
||||||
#else
|
|
||||||
GetBits1
|
|
||||||
(*dst) = ((*dst) & ~startmask) | (~SCRRIGHT(c, xoff1) & startmask);
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
while (hTmp--) {
|
|
||||||
#ifdef FASTCHARS
|
|
||||||
#ifdef USE_LEFTBITS
|
|
||||||
FASTGETBITS (char1,0,widthGlyph,c);
|
|
||||||
char1 = (glyphPointer) (((char *) char1) + glyphBytes);
|
|
||||||
#else
|
|
||||||
c = *char1++;
|
|
||||||
#if BITMAP_BIT_ORDER == MSBFirst
|
|
||||||
c >>= PPW - widthGlyph;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
FASTPUTBITS (c,xoff1,widthGlyph,dst);
|
|
||||||
#else
|
|
||||||
GetBits1
|
|
||||||
(*dst) = ((*dst) & ~startmask) | (SCRRIGHT(c, xoff1) & startmask);
|
|
||||||
#endif
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
} else {
|
|
||||||
maskPPWbits (xoff1, widthGlyph, startmask, endmask);
|
|
||||||
nfirst = PPW - xoff1;
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++) {
|
|
||||||
hTmp = h;
|
|
||||||
dst = saveDst;
|
|
||||||
saveDst += sizeDst; /* @@@ NEXT PLANE @@@ */
|
|
||||||
char1 = schar1;
|
|
||||||
|
|
||||||
switch (rrops[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
while (hTmp--) {
|
|
||||||
dst[0] &= ~startmask;
|
|
||||||
dst[1] &= ~endmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
while (hTmp--) {
|
|
||||||
dst[0] |= startmask;
|
|
||||||
dst[1] |= endmask;
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits1
|
|
||||||
dst[0] = (dst[0] & ~startmask) | (~SCRRIGHT(c,xoff1) & startmask);
|
|
||||||
dst[1] = (dst[1] & ~endmask) | (~SCRLEFT(c,nfirst) & endmask);
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
while (hTmp--) {
|
|
||||||
GetBits1
|
|
||||||
dst[0] = (dst[0] & ~startmask) | (SCRRIGHT(c,xoff1) & startmask);
|
|
||||||
dst[1] = (dst[1] & ~endmask) | (SCRLEFT(c,nfirst) & endmask);
|
|
||||||
afbScanlineInc(dst, widthDst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RROP_NOP:
|
|
||||||
break;
|
|
||||||
} /* switch */
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
||||||
|
|
||||||
xpos += widthGlyph;
|
|
||||||
}
|
|
||||||
}
|
|
857
afb/afbtile.c
857
afb/afbtile.c
|
@ -1,857 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
|
|
||||||
#include "afb.h"
|
|
||||||
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
#include "mergerop.h"
|
|
||||||
/*
|
|
||||||
|
|
||||||
the boxes are already translated.
|
|
||||||
|
|
||||||
NOTE:
|
|
||||||
iy = ++iy < tileHeight ? iy : 0
|
|
||||||
is equivalent to iy%= tileheight, and saves a division.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
tile area with a PPW bit wide pixmap
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
MROP_NAME(afbTileAreaPPW)(pDraw, nbox, pbox, alu, ptile, planemask)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
int alu;
|
|
||||||
PixmapPtr ptile;
|
|
||||||
unsigned long planemask;
|
|
||||||
{
|
|
||||||
register PixelType *psrc;
|
|
||||||
/* pointer to bits in tile, if needed */
|
|
||||||
int tileHeight; /* height of the tile */
|
|
||||||
register PixelType srcpix;
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
int w; /* width of current box */
|
|
||||||
MROP_DECLARE_REG ()
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register int nlw; /* loop version of nlwMiddle */
|
|
||||||
register PixelType *p; /* pointer to bits we're writing */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
register int d;
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlwMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int nlwExtra; /* to get from right of box to left of next span */
|
|
||||||
register int iy; /* index of current scanline in tile */
|
|
||||||
PixelType *pbits; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
PixelType *pSaveSrc;
|
|
||||||
int saveH;
|
|
||||||
int saveIY;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pbits);
|
|
||||||
|
|
||||||
MROP_INITIALIZE(alu,~0)
|
|
||||||
|
|
||||||
tileHeight = ptile->drawable.height;
|
|
||||||
pSaveSrc = (PixelType *)(ptile->devPrivate.ptr);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
saveIY = pbox->y1 % tileHeight;
|
|
||||||
saveP = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
psrc = pSaveSrc;
|
|
||||||
|
|
||||||
if (((pbox->x1 & PIM) + w) < PPW) {
|
|
||||||
maskpartialbits(pbox->x1, w, startmask);
|
|
||||||
nlwExtra = nlwidth;
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst, psrc += tileHeight) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
p = saveP;
|
|
||||||
h = saveH;
|
|
||||||
iy = saveIY;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
*p = MROP_MASK(srcpix,*p,startmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst, psrc += tileHeight) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
p = saveP;
|
|
||||||
h = saveH;
|
|
||||||
iy = saveIY;
|
|
||||||
nlwExtra = nlwidth - nlwMiddle;
|
|
||||||
|
|
||||||
if (startmask && endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p = MROP_MASK (srcpix,*p,startmask);
|
|
||||||
p++;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = MROP_MASK(srcpix,*p,endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else if (startmask && !endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p = MROP_MASK(srcpix,*p,startmask);
|
|
||||||
p++;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else if (!startmask && endmask) {
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = MROP_MASK(srcpix,*p,endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else { /* no ragged bits at either end */
|
|
||||||
while (h--) {
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID (srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MROP_NAME(afbTileArea)(pDraw, nbox, pbox, alu, pTile, xOff, yOff, planemask)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
int alu;
|
|
||||||
PixmapPtr pTile;
|
|
||||||
int xOff;
|
|
||||||
int yOff;
|
|
||||||
unsigned long planemask;
|
|
||||||
{
|
|
||||||
register PixelType *psrc;
|
|
||||||
/* pointer to bits in tile, if needed */
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
MROP_DECLARE_REG ()
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register PixelType *pdst; /* pointer to bits we're writing */
|
|
||||||
register PixelType tmpsrc;
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
register PixelType tmpdst;
|
|
||||||
#endif
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int sizeTile;
|
|
||||||
int tileLine;
|
|
||||||
int iline;
|
|
||||||
int w, width, x, xSrc, ySrc, srcStartOver, nend;
|
|
||||||
int tlwidth, rem, tileWidth, tileHeight, endinc;
|
|
||||||
int saveW;
|
|
||||||
PixelType *psrcT;
|
|
||||||
int d;
|
|
||||||
int nstart;
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int iy;
|
|
||||||
PixelType *pBase; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
PixelType *pStartDst;
|
|
||||||
PixelType *pStartTile;
|
|
||||||
int saveH;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pBase);
|
|
||||||
|
|
||||||
MROP_INITIALIZE(alu,~0)
|
|
||||||
|
|
||||||
tileHeight = pTile->drawable.height;
|
|
||||||
tileWidth = pTile->drawable.width;
|
|
||||||
tlwidth = pTile->devKind / sizeof (PixelType);
|
|
||||||
sizeTile = tlwidth * tileHeight;
|
|
||||||
|
|
||||||
xSrc = pDraw->x + ((xOff % tileWidth) - tileWidth);
|
|
||||||
ySrc = pDraw->y + ((yOff % tileHeight) - tileHeight);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
saveW = pbox->x2 - pbox->x1;
|
|
||||||
iline = (pbox->y1 - ySrc) % tileHeight;
|
|
||||||
psrcT = (PixelType *) pTile->devPrivate.ptr;
|
|
||||||
tileLine = iline * tlwidth;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
saveP = afbScanline(pBase, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, psrcT += sizeTile, saveP += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
h = saveH;
|
|
||||||
pStartDst = saveP;
|
|
||||||
pStartTile = psrcT + tileLine;
|
|
||||||
iy = iline;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
x = pbox->x1;
|
|
||||||
width = saveW;
|
|
||||||
pdst = pStartDst;
|
|
||||||
while(width > 0) {
|
|
||||||
psrc = pStartTile;
|
|
||||||
w = min(tileWidth, width);
|
|
||||||
if((rem = (x - xSrc) % tileWidth) != 0) {
|
|
||||||
/* if we're in the middle of the tile, get
|
|
||||||
as many bits as will finish the span, or
|
|
||||||
as many as will get to the left edge of the tile,
|
|
||||||
or a longword worth, starting at the appropriate
|
|
||||||
offset in the tile.
|
|
||||||
*/
|
|
||||||
w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_PAD);
|
|
||||||
endinc = rem / BITMAP_SCANLINE_PAD;
|
|
||||||
|
|
||||||
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), w, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), w, pdst);
|
|
||||||
|
|
||||||
if((x & PIM) + w >= PPW)
|
|
||||||
pdst++;
|
|
||||||
} else if(((x & PIM) + w) < PPW) {
|
|
||||||
/* doing < PPW bits is easy, and worth special-casing */
|
|
||||||
tmpsrc = *psrc;
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), w, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), w, pdst);
|
|
||||||
} else {
|
|
||||||
/* start at the left edge of the tile,
|
|
||||||
and put down as much as we can
|
|
||||||
*/
|
|
||||||
maskbits(x, w, startmask, endmask, nlMiddle);
|
|
||||||
|
|
||||||
if (startmask)
|
|
||||||
nstart = PPW - (x & PIM);
|
|
||||||
else
|
|
||||||
nstart = 0;
|
|
||||||
if (endmask)
|
|
||||||
nend = (x + w) & PIM;
|
|
||||||
else
|
|
||||||
nend = 0;
|
|
||||||
|
|
||||||
srcStartOver = nstart > PLST;
|
|
||||||
|
|
||||||
if(startmask) {
|
|
||||||
tmpsrc = *psrc;
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), nstart, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), nstart, pdst);
|
|
||||||
pdst++;
|
|
||||||
if(srcStartOver)
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(nlMiddle--) {
|
|
||||||
getbits (psrc, nstart, PPW, tmpsrc);
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
tmpdst = *pdst;
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
*pdst++ = tmpsrc;
|
|
||||||
/*putbits (tmpsrc, 0, PPW, pdst);
|
|
||||||
pdst++;*/
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(endmask) {
|
|
||||||
getbits (psrc, nstart, nend, tmpsrc);
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
tmpdst = *pdst;
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, 0, nend, pdst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x += w;
|
|
||||||
width -= w;
|
|
||||||
} /* while (width > 0) */
|
|
||||||
|
|
||||||
pStartDst += nlwidth;
|
|
||||||
if (++iy >= tileHeight) {
|
|
||||||
iy = 0;
|
|
||||||
pStartTile = psrcT;
|
|
||||||
} else
|
|
||||||
pStartTile += tlwidth;
|
|
||||||
|
|
||||||
} /* while (h) */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
pbox++;
|
|
||||||
} /* for each box */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MROP_NAME(afbOpaqueStippleAreaPPW)(pDraw, nbox, pbox, alu, ptile,
|
|
||||||
rropsOS, planemask)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
int alu;
|
|
||||||
PixmapPtr ptile;
|
|
||||||
register unsigned char *rropsOS;
|
|
||||||
unsigned long planemask;
|
|
||||||
{
|
|
||||||
register PixelType *psrc;
|
|
||||||
/* pointer to bits in tile, if needed */
|
|
||||||
int tileHeight; /* height of the tile */
|
|
||||||
register PixelType srcpix = 0;
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
int w; /* width of current box */
|
|
||||||
MROP_DECLARE_REG ()
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register int nlw; /* loop version of nlwMiddle */
|
|
||||||
register PixelType *p; /* pointer to bits we're writing */
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
register int d;
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlwMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int nlwExtra; /* to get from right of box to left of next span */
|
|
||||||
register int iy; /* index of current scanline in tile */
|
|
||||||
PixelType *pbits; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
int saveH;
|
|
||||||
int saveIY;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pbits);
|
|
||||||
|
|
||||||
MROP_INITIALIZE(alu,~0)
|
|
||||||
|
|
||||||
tileHeight = ptile->drawable.height;
|
|
||||||
psrc = (PixelType *)(ptile->devPrivate.ptr);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
saveIY = pbox->y1 % tileHeight;
|
|
||||||
saveP = afbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
|
|
||||||
if ( ((pbox->x1 & PIM) + w) < PPW) {
|
|
||||||
maskpartialbits(pbox->x1, w, startmask);
|
|
||||||
nlwExtra = nlwidth;
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
p = saveP;
|
|
||||||
h = saveH;
|
|
||||||
iy = saveIY;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
srcpix = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
srcpix = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
srcpix = ~psrc[iy];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
*p = MROP_MASK(srcpix,*p,startmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
p = saveP;
|
|
||||||
h = saveH;
|
|
||||||
iy = saveIY;
|
|
||||||
nlwExtra = nlwidth - nlwMiddle;
|
|
||||||
|
|
||||||
if (startmask && endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
while (h--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
srcpix = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
srcpix = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
srcpix = ~psrc[iy];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p = MROP_MASK (srcpix,*p,startmask);
|
|
||||||
p++;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = MROP_MASK(srcpix,*p,endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else if (startmask && !endmask) {
|
|
||||||
nlwExtra -= 1;
|
|
||||||
while (h--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
srcpix = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
srcpix = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
srcpix = ~psrc[iy];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
*p = MROP_MASK(srcpix,*p,startmask);
|
|
||||||
p++;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else if (!startmask && endmask) {
|
|
||||||
while (h--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
srcpix = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
srcpix = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
srcpix = ~psrc[iy];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID(srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = MROP_MASK(srcpix,*p,endmask);
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
} else { /* no ragged bits at either end */
|
|
||||||
while (h--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
srcpix = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
srcpix = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
srcpix = psrc[iy];
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
srcpix = ~psrc[iy];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iy++;
|
|
||||||
if (iy == tileHeight)
|
|
||||||
iy = 0;
|
|
||||||
nlw = nlwMiddle;
|
|
||||||
while (nlw--) {
|
|
||||||
*p = MROP_SOLID (srcpix,*p);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
afbScanlineInc(p, nlwExtra);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* for (d = ...) */
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MROP_NAME(afbOpaqueStippleArea)(pDraw, nbox, pbox, alu, pTile, xOff, yOff,
|
|
||||||
rropsOS, planemask)
|
|
||||||
DrawablePtr pDraw;
|
|
||||||
int nbox;
|
|
||||||
BoxPtr pbox;
|
|
||||||
int alu;
|
|
||||||
PixmapPtr pTile;
|
|
||||||
int xOff;
|
|
||||||
int yOff;
|
|
||||||
register unsigned char *rropsOS;
|
|
||||||
unsigned long planemask;
|
|
||||||
{
|
|
||||||
register PixelType *psrc;
|
|
||||||
/* pointer to bits in tile, if needed */
|
|
||||||
int nlwidth; /* width in longwords of the drawable */
|
|
||||||
MROP_DECLARE_REG ()
|
|
||||||
register int h; /* height of current box */
|
|
||||||
register PixelType *pdst; /* pointer to bits we're writing */
|
|
||||||
register PixelType tmpsrc = 0;
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
register PixelType tmpdst;
|
|
||||||
#endif
|
|
||||||
int sizeDst;
|
|
||||||
int depthDst;
|
|
||||||
int tileLine;
|
|
||||||
int iline;
|
|
||||||
int w, width, x, xSrc, ySrc, srcStartOver, nend;
|
|
||||||
int tlwidth, rem, tileWidth, tileHeight, endinc;
|
|
||||||
int saveW;
|
|
||||||
PixelType *psrcT;
|
|
||||||
int d;
|
|
||||||
int nstart;
|
|
||||||
PixelType startmask;
|
|
||||||
PixelType endmask; /* masks for reggedy bits at either end of line */
|
|
||||||
int nlMiddle; /* number of longwords between sides of boxes */
|
|
||||||
int iy;
|
|
||||||
PixelType *pBase; /* pointer to start of drawable */
|
|
||||||
PixelType *saveP;
|
|
||||||
PixelType *pStartDst;
|
|
||||||
PixelType *pStartTile;
|
|
||||||
int saveH;
|
|
||||||
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
pBase);
|
|
||||||
|
|
||||||
MROP_INITIALIZE(alu,~0)
|
|
||||||
|
|
||||||
tileHeight = pTile->drawable.height;
|
|
||||||
tileWidth = pTile->drawable.width;
|
|
||||||
tlwidth = pTile->devKind / sizeof (PixelType);
|
|
||||||
|
|
||||||
xSrc = pDraw->x + ((xOff % tileWidth) - tileWidth);
|
|
||||||
ySrc = pDraw->y + ((yOff % tileHeight) - tileHeight);
|
|
||||||
|
|
||||||
while (nbox--) {
|
|
||||||
saveW = pbox->x2 - pbox->x1;
|
|
||||||
iline = (pbox->y1 - ySrc) % tileHeight;
|
|
||||||
psrcT = (PixelType *) pTile->devPrivate.ptr;
|
|
||||||
tileLine = iline * tlwidth;
|
|
||||||
saveH = pbox->y2 - pbox->y1;
|
|
||||||
saveP = afbScanline(pBase, pbox->x1, pbox->y1, nlwidth);
|
|
||||||
|
|
||||||
for (d = 0; d < depthDst; d++, saveP += sizeDst) { /* @@@ NEXT PLANE @@@ */
|
|
||||||
if (!(planemask & (1 << d)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
h = saveH;
|
|
||||||
pStartDst = saveP;
|
|
||||||
pStartTile = psrcT + tileLine;
|
|
||||||
iy = iline;
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
x = pbox->x1;
|
|
||||||
width = saveW;
|
|
||||||
pdst = pStartDst;
|
|
||||||
while(width > 0) {
|
|
||||||
psrc = pStartTile;
|
|
||||||
w = min(tileWidth, width);
|
|
||||||
if((rem = (x - xSrc) % tileWidth) != 0) {
|
|
||||||
/* if we're in the middle of the tile, get
|
|
||||||
as many bits as will finish the span, or
|
|
||||||
as many as will get to the left edge of the tile,
|
|
||||||
or a longword worth, starting at the appropriate
|
|
||||||
offset in the tile.
|
|
||||||
*/
|
|
||||||
w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_PAD);
|
|
||||||
endinc = rem / BITMAP_SCANLINE_PAD;
|
|
||||||
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
tmpsrc = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
tmpsrc = ~0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_COPY:
|
|
||||||
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
getbits ((psrc+endinc), (rem&PIM), w, tmpsrc);
|
|
||||||
tmpsrc = ~tmpsrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), w, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), w, pdst);
|
|
||||||
|
|
||||||
if((x & PIM) + w >= PPW)
|
|
||||||
pdst++;
|
|
||||||
} else if(((x & PIM) + w) < PPW) {
|
|
||||||
/* doing < PPW bits is easy, and worth special-casing */
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
tmpsrc = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
tmpsrc = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
tmpsrc = *psrc;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
tmpsrc = ~*psrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), w, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), w, pdst);
|
|
||||||
} else {
|
|
||||||
/* start at the left edge of the tile,
|
|
||||||
and put down as much as we can
|
|
||||||
*/
|
|
||||||
maskbits(x, w, startmask, endmask, nlMiddle);
|
|
||||||
|
|
||||||
if (startmask)
|
|
||||||
nstart = PPW - (x & PIM);
|
|
||||||
else
|
|
||||||
nstart = 0;
|
|
||||||
if (endmask)
|
|
||||||
nend = (x + w) & PIM;
|
|
||||||
else
|
|
||||||
nend = 0;
|
|
||||||
|
|
||||||
srcStartOver = nstart > PLST;
|
|
||||||
|
|
||||||
if(startmask) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
tmpsrc = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
tmpsrc = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
tmpsrc = *psrc;
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
tmpsrc = ~*psrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
getbits (pdst, (x & PIM), nstart, tmpdst);
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, (x & PIM), nstart, pdst);
|
|
||||||
pdst++;
|
|
||||||
if(srcStartOver)
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(nlMiddle--) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
tmpsrc = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
tmpsrc = ~0;
|
|
||||||
break;
|
|
||||||
case RROP_COPY:
|
|
||||||
getbits (psrc, nstart, PPW, tmpsrc);
|
|
||||||
break;
|
|
||||||
case RROP_INVERT:
|
|
||||||
getbits (psrc, nstart, PPW, tmpsrc);
|
|
||||||
tmpsrc = ~tmpsrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
tmpdst = *pdst;
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
*pdst++ = tmpsrc;
|
|
||||||
/*putbits (tmpsrc, 0, PPW, pdst);
|
|
||||||
pdst++; */
|
|
||||||
psrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(endmask) {
|
|
||||||
switch (rropsOS[d]) {
|
|
||||||
case RROP_BLACK:
|
|
||||||
tmpsrc = 0;
|
|
||||||
break;
|
|
||||||
case RROP_WHITE:
|
|
||||||
tmpsrc = ~0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_COPY:
|
|
||||||
getbits (psrc, nstart, nend, tmpsrc);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RROP_INVERT:
|
|
||||||
getbits (psrc, nstart, nend, tmpsrc);
|
|
||||||
tmpsrc = ~tmpsrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#if (MROP) != Mcopy
|
|
||||||
tmpdst = *pdst;
|
|
||||||
tmpsrc = DoMergeRop (tmpsrc, tmpdst);
|
|
||||||
#endif
|
|
||||||
putbits (tmpsrc, 0, nend, pdst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x += w;
|
|
||||||
width -= w;
|
|
||||||
} /* while (width > 0) */
|
|
||||||
|
|
||||||
pStartDst += nlwidth;
|
|
||||||
if (++iy >= tileHeight) {
|
|
||||||
iy = 0;
|
|
||||||
pStartTile = psrcT;
|
|
||||||
} else
|
|
||||||
pStartTile += tlwidth;
|
|
||||||
|
|
||||||
} /* while (h) */
|
|
||||||
} /* for (d = ... ) */
|
|
||||||
pbox++;
|
|
||||||
} /* for each box */
|
|
||||||
}
|
|
164
afb/afbwindow.c
164
afb/afbwindow.c
|
@ -1,164 +0,0 @@
|
||||||
/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1987 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "windowstr.h"
|
|
||||||
#include "privates.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "mistruct.h"
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbCreateWindow(WindowPtr pWin)
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This always returns true, because Xfree can't fail. It might be possible
|
|
||||||
* on some devices for Destroy to fail */
|
|
||||||
Bool
|
|
||||||
afbDestroyWindow(WindowPtr pWin)
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
Bool
|
|
||||||
afbMapWindow(pWindow)
|
|
||||||
WindowPtr pWindow;
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
Bool
|
|
||||||
afbPositionWindow(WindowPtr pWin, int x, int y)
|
|
||||||
{
|
|
||||||
/* This is the "wrong" fix to the right problem, but it doesn't really
|
|
||||||
* cost very much. When the window is moved, we need to invalidate any
|
|
||||||
* RotatedPixmap that exists in any GC currently validated against this
|
|
||||||
* window.
|
|
||||||
*/
|
|
||||||
pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
|
||||||
|
|
||||||
/* Again, we have no failure modes indicated by any of the routines
|
|
||||||
* we've called, so we have to assume it worked */
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
Bool
|
|
||||||
afbUnmapWindow(pWindow)
|
|
||||||
WindowPtr pWindow;
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UNCLEAN!
|
|
||||||
this code calls the bitblt helper code directly.
|
|
||||||
|
|
||||||
afbCopyWindow copies only the parts of the destination that are
|
|
||||||
visible in the source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
afbCopyWindow(pWin, ptOldOrg, prgnSrc)
|
|
||||||
WindowPtr pWin;
|
|
||||||
DDXPointRec ptOldOrg;
|
|
||||||
RegionPtr prgnSrc;
|
|
||||||
{
|
|
||||||
DDXPointPtr pptSrc;
|
|
||||||
register DDXPointPtr ppt;
|
|
||||||
RegionPtr prgnDst;
|
|
||||||
register BoxPtr pbox;
|
|
||||||
register int dx, dy;
|
|
||||||
register int i, nbox;
|
|
||||||
WindowPtr pwinRoot;
|
|
||||||
|
|
||||||
pwinRoot = WindowTable[pWin->drawable.pScreen->myNum];
|
|
||||||
|
|
||||||
prgnDst = REGION_CREATE(pWin->drawable.pScreen, NULL, 1);
|
|
||||||
|
|
||||||
dx = ptOldOrg.x - pWin->drawable.x;
|
|
||||||
dy = ptOldOrg.y - pWin->drawable.y;
|
|
||||||
REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
|
|
||||||
REGION_INTERSECT(pWin->drawable.pScreen, prgnDst, &pWin->borderClip,
|
|
||||||
prgnSrc);
|
|
||||||
|
|
||||||
pbox = REGION_RECTS(prgnDst);
|
|
||||||
nbox = REGION_NUM_RECTS(prgnDst);
|
|
||||||
if(!(pptSrc = (DDXPointPtr )xalloc(nbox * sizeof(DDXPointRec))))
|
|
||||||
return;
|
|
||||||
ppt = pptSrc;
|
|
||||||
|
|
||||||
for (i=nbox; --i >= 0; ppt++, pbox++) {
|
|
||||||
ppt->x = pbox->x1 + dx;
|
|
||||||
ppt->y = pbox->y1 + dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
afbDoBitblt((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot, GXcopy, prgnDst,
|
|
||||||
pptSrc, ~0);
|
|
||||||
xfree(pptSrc);
|
|
||||||
REGION_DESTROY(pWin->drawable.pScreen, prgnDst);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool
|
|
||||||
afbChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
|
|
||||||
{
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
201
afb/afbzerarc.c
201
afb/afbzerarc.c
|
@ -1,201 +0,0 @@
|
||||||
/************************************************************
|
|
||||||
|
|
||||||
Copyright (c) 1989 X Consortium
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of the X Consortium shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from the X Consortium.
|
|
||||||
|
|
||||||
********************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/* Derived from:
|
|
||||||
* "Algorithm for drawing ellipses or hyperbolae with a digital plotter"
|
|
||||||
* by M. L. V. Pitteway
|
|
||||||
* The Computer Journal, November 1967, Volume 10, Number 3, pp. 282-289
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/Xprotostr.h>
|
|
||||||
#include "regionstr.h"
|
|
||||||
#include "gcstruct.h"
|
|
||||||
#include "pixmapstr.h"
|
|
||||||
#include "scrnintstr.h"
|
|
||||||
#include "afb.h"
|
|
||||||
#include "maskbits.h"
|
|
||||||
#include "mizerarc.h"
|
|
||||||
#include "mi.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: LEFTMOST must be the bit leftmost in the actual screen
|
|
||||||
* representation. This depends also on the IMAGE_BYTE_ORDER.
|
|
||||||
* LONG2CHARS() takes care of the re-ordering as required. (DHD)
|
|
||||||
*/
|
|
||||||
#if (BITMAP_BIT_ORDER == MSBFirst)
|
|
||||||
#define LEFTMOST ((PixelType) LONG2CHARS((1 << PLST)))
|
|
||||||
#else
|
|
||||||
#define LEFTMOST ((PixelType) LONG2CHARS(1))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define Pixelate(base,yoff,xoff) \
|
|
||||||
{ \
|
|
||||||
paddr = afbScanlineOffset(base, (yoff) + ((xoff)>>PWSH)); \
|
|
||||||
pmask = SCRRIGHT(LEFTMOST, (xoff) & PIM); \
|
|
||||||
for (de = 0; de < depthDst; de++, paddr += sizeDst) /* @@@ NEXT PLANE @@@ */ \
|
|
||||||
switch (rrops[de]) { \
|
|
||||||
case RROP_BLACK: \
|
|
||||||
*paddr &= ~pmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_WHITE: \
|
|
||||||
*paddr |= pmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_INVERT: \
|
|
||||||
*paddr ^= pmask; \
|
|
||||||
break; \
|
|
||||||
case RROP_NOP: \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DoPix(bit,base,yoff,xoff) if (mask & bit) Pixelate(base,yoff,xoff);
|
|
||||||
|
|
||||||
static void
|
|
||||||
afbZeroArcSS(DrawablePtr pDraw, GCPtr pGC, xArc *arc)
|
|
||||||
{
|
|
||||||
miZeroArcRec info;
|
|
||||||
Bool do360;
|
|
||||||
register int de;
|
|
||||||
register int x, y, a, b, d, mask;
|
|
||||||
register int k1, k3, dx, dy;
|
|
||||||
PixelType *addrl;
|
|
||||||
PixelType *yorgl, *yorgol;
|
|
||||||
int nlwidth, yoffset, dyoffset;
|
|
||||||
int sizeDst, depthDst;
|
|
||||||
PixelType pmask;
|
|
||||||
register PixelType *paddr;
|
|
||||||
register unsigned char *rrops;
|
|
||||||
|
|
||||||
rrops = ((afbPrivGC *)dixLookupPrivate(&pGC->devPrivates,
|
|
||||||
afbGCPrivateKey))->rrops;
|
|
||||||
afbGetPixelWidthSizeDepthAndPointer(pDraw, nlwidth, sizeDst, depthDst,
|
|
||||||
addrl);
|
|
||||||
do360 = miZeroArcSetup(arc, &info, TRUE);
|
|
||||||
yorgl = addrl + ((info.yorg + pDraw->y) * nlwidth);
|
|
||||||
yorgol = addrl + ((info.yorgo + pDraw->y) * nlwidth);
|
|
||||||
info.xorg += pDraw->x;
|
|
||||||
info.xorgo += pDraw->x;
|
|
||||||
MIARCSETUP();
|
|
||||||
yoffset = y ? nlwidth : 0;
|
|
||||||
dyoffset = 0;
|
|
||||||
mask = info.initialMask;
|
|
||||||
if (!(arc->width & 1)) {
|
|
||||||
DoPix(2, yorgl, 0, info.xorgo);
|
|
||||||
DoPix(8, yorgol, 0, info.xorgo);
|
|
||||||
}
|
|
||||||
if (!info.end.x || !info.end.y) {
|
|
||||||
mask = info.end.mask;
|
|
||||||
info.end = info.altend;
|
|
||||||
}
|
|
||||||
if (do360 && (arc->width == arc->height) && !(arc->width & 1)) {
|
|
||||||
int xoffset = nlwidth;
|
|
||||||
PixelType *yorghl = afbScanlineDeltaNoBankSwitch(yorgl, info.h, nlwidth);
|
|
||||||
int xorghp = info.xorg + info.h;
|
|
||||||
int xorghn = info.xorg - info.h;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
Pixelate(yorgl, yoffset, info.xorg + x);
|
|
||||||
Pixelate(yorgl, yoffset, info.xorg - x);
|
|
||||||
Pixelate(yorgol, -yoffset, info.xorg - x);
|
|
||||||
Pixelate(yorgol, -yoffset, info.xorg + x);
|
|
||||||
if (a < 0)
|
|
||||||
break;
|
|
||||||
Pixelate(yorghl, -xoffset, xorghp - y);
|
|
||||||
Pixelate(yorghl, -xoffset, xorghn + y);
|
|
||||||
Pixelate(yorghl, xoffset, xorghn + y);
|
|
||||||
Pixelate(yorghl, xoffset, xorghp - y);
|
|
||||||
xoffset += nlwidth;
|
|
||||||
MIARCCIRCLESTEP(yoffset += nlwidth;);
|
|
||||||
}
|
|
||||||
x = info.w;
|
|
||||||
yoffset = info.h * nlwidth;
|
|
||||||
} else if (do360) {
|
|
||||||
while (y < info.h || x < info.w) {
|
|
||||||
MIARCOCTANTSHIFT(dyoffset = nlwidth;);
|
|
||||||
Pixelate(yorgl, yoffset, info.xorg + x);
|
|
||||||
Pixelate(yorgl, yoffset, info.xorgo - x);
|
|
||||||
Pixelate(yorgol, -yoffset, info.xorgo - x);
|
|
||||||
Pixelate(yorgol, -yoffset, info.xorg + x);
|
|
||||||
MIARCSTEP(yoffset += dyoffset;, yoffset += nlwidth;);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (y < info.h || x < info.w) {
|
|
||||||
MIARCOCTANTSHIFT(dyoffset = nlwidth;);
|
|
||||||
if ((x == info.start.x) || (y == info.start.y)) {
|
|
||||||
mask = info.start.mask;
|
|
||||||
info.start = info.altstart;
|
|
||||||
}
|
|
||||||
DoPix(1, yorgl, yoffset, info.xorg + x);
|
|
||||||
DoPix(2, yorgl, yoffset, info.xorgo - x);
|
|
||||||
DoPix(4, yorgol, -yoffset, info.xorgo - x);
|
|
||||||
DoPix(8, yorgol, -yoffset, info.xorg + x);
|
|
||||||
if ((x == info.end.x) || (y == info.end.y)) {
|
|
||||||
mask = info.end.mask;
|
|
||||||
info.end = info.altend;
|
|
||||||
}
|
|
||||||
MIARCSTEP(yoffset += dyoffset;, yoffset += nlwidth;);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((x == info.start.x) || (y == info.start.y))
|
|
||||||
mask = info.start.mask;
|
|
||||||
DoPix(1, yorgl, yoffset, info.xorg + x);
|
|
||||||
DoPix(4, yorgol, -yoffset, info.xorgo - x);
|
|
||||||
if (arc->height & 1) {
|
|
||||||
DoPix(2, yorgl, yoffset, info.xorgo - x);
|
|
||||||
DoPix(8, yorgol, -yoffset, info.xorg + x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
afbZeroPolyArcSS(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs)
|
|
||||||
{
|
|
||||||
register xArc *arc;
|
|
||||||
register int i;
|
|
||||||
BoxRec box;
|
|
||||||
RegionPtr cclip;
|
|
||||||
|
|
||||||
cclip = pGC->pCompositeClip;
|
|
||||||
for (arc = parcs, i = narcs; --i >= 0; arc++) {
|
|
||||||
if (miCanZeroArc(arc)) {
|
|
||||||
box.x1 = arc->x + pDraw->x;
|
|
||||||
box.y1 = arc->y + pDraw->y;
|
|
||||||
box.x2 = box.x1 + (int)arc->width + 1;
|
|
||||||
box.y2 = box.y1 + (int)arc->height + 1;
|
|
||||||
if (RECT_IN_REGION(pDraw->pScreen, cclip, &box) == rgnIN)
|
|
||||||
afbZeroArcSS(pDraw, pGC, arc);
|
|
||||||
else
|
|
||||||
miZeroPolyArc(pDraw, pGC, 1, arc);
|
|
||||||
} else
|
|
||||||
miPolyArc(pDraw, pGC, 1, arc);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -573,7 +573,6 @@ AC_ARG_ENABLE(xglx, AS_HELP_STRING([--enable-xglx], [Build Xglx xgl mo
|
||||||
AC_ARG_ENABLE(xegl, AS_HELP_STRING([--enable-xegl], [Build Xegl xgl module (default: no)]), [XEGL=$enableval], [XEGL=no])
|
AC_ARG_ENABLE(xegl, AS_HELP_STRING([--enable-xegl], [Build Xegl xgl module (default: no)]), [XEGL=$enableval], [XEGL=no])
|
||||||
dnl legacy fb support
|
dnl legacy fb support
|
||||||
AC_ARG_ENABLE(mfb, AS_HELP_STRING([--enable-mfb], [Build legacy mono framebuffer support (default: disable)]), [MFB=$enableval], [MFB=no])
|
AC_ARG_ENABLE(mfb, AS_HELP_STRING([--enable-mfb], [Build legacy mono framebuffer support (default: disable)]), [MFB=$enableval], [MFB=no])
|
||||||
AC_ARG_ENABLE(afb, AS_HELP_STRING([--enable-afb], [Build legacy advanced framebuffer support (default: disable)]), [AFB=$enableval], [AFB=no])
|
|
||||||
dnl kdrive and its subsystems
|
dnl kdrive and its subsystems
|
||||||
AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
|
AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
|
||||||
AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
|
AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
|
||||||
|
@ -1581,10 +1580,8 @@ AM_CONDITIONAL([XF86VIDMODE], [test "x$XF86VIDMODE" = xyes])
|
||||||
|
|
||||||
dnl legacy fb support
|
dnl legacy fb support
|
||||||
test "x$MFB" = xauto && MFB="$XORG"
|
test "x$MFB" = xauto && MFB="$XORG"
|
||||||
test "x$AFB" = xauto && AFB="$XORG"
|
|
||||||
AM_CONDITIONAL(MFB, [test "x$MFB" = xyes])
|
AM_CONDITIONAL(MFB, [test "x$MFB" = xyes])
|
||||||
AM_CONDITIONAL(AFB, [test "x$AFB" = xyes])
|
if test "x$MFB" = xyes; then
|
||||||
if test "x$MFB" = xyes -o "x$AFB" = xyes; then
|
|
||||||
if test "x$XORG" != xyes; then
|
if test "x$XORG" != xyes; then
|
||||||
AC_MSG_ERROR([legacy fb support requires the Xorg server])
|
AC_MSG_ERROR([legacy fb support requires the Xorg server])
|
||||||
fi
|
fi
|
||||||
|
@ -1992,7 +1989,6 @@ AC_OUTPUT([
|
||||||
Makefile
|
Makefile
|
||||||
glx/Makefile
|
glx/Makefile
|
||||||
include/Makefile
|
include/Makefile
|
||||||
afb/Makefile
|
|
||||||
composite/Makefile
|
composite/Makefile
|
||||||
damageext/Makefile
|
damageext/Makefile
|
||||||
dbe/Makefile
|
dbe/Makefile
|
||||||
|
|
|
@ -14,10 +14,6 @@ if DBE
|
||||||
DBEMOD = libdbe.la
|
DBEMOD = libdbe.la
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if AFB
|
|
||||||
AFBMOD = libafb.la
|
|
||||||
endif
|
|
||||||
|
|
||||||
if MFB
|
if MFB
|
||||||
MFBMOD = libmfb.la
|
MFBMOD = libmfb.la
|
||||||
endif
|
endif
|
||||||
|
@ -26,8 +22,7 @@ if RECORD
|
||||||
RECORDMOD = librecord.la
|
RECORDMOD = librecord.la
|
||||||
endif
|
endif
|
||||||
|
|
||||||
module_LTLIBRARIES = $(AFBMOD) \
|
module_LTLIBRARIES = libfb.la \
|
||||||
libfb.la \
|
|
||||||
libwfb.la \
|
libwfb.la \
|
||||||
$(MFBMOD) \
|
$(MFBMOD) \
|
||||||
libshadow.la
|
libshadow.la
|
||||||
|
@ -48,10 +43,6 @@ INCLUDES = @XORG_INCS@ \
|
||||||
-I$(top_srcdir)/miext/shadow \
|
-I$(top_srcdir)/miext/shadow \
|
||||||
-I$(top_srcdir)/glx
|
-I$(top_srcdir)/glx
|
||||||
|
|
||||||
libafb_la_LDFLAGS = -avoid-version
|
|
||||||
libafb_la_LIBADD = $(top_builddir)/afb/libafb.la
|
|
||||||
libafb_la_SOURCES = afbmodule.c
|
|
||||||
|
|
||||||
libdbe_la_LDFLAGS = -avoid-version
|
libdbe_la_LDFLAGS = -avoid-version
|
||||||
libdbe_la_LIBADD = $(top_builddir)/dbe/libdbe.la
|
libdbe_la_LIBADD = $(top_builddir)/dbe/libdbe.la
|
||||||
libdbe_la_SOURCES = dbemodule.c
|
libdbe_la_SOURCES = dbemodule.c
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 1998 The XFree86 Project, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* Except as contained in this notice, the name of the XFree86 Project shall
|
|
||||||
* not be used in advertising or otherwise to promote the sale, use or other
|
|
||||||
* dealings in this Software without prior written authorization from the
|
|
||||||
* XFree86 Project.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_XORG_CONFIG_H
|
|
||||||
#include <xorg-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "xf86Module.h"
|
|
||||||
|
|
||||||
static MODULESETUPPROTO(afbSetup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo VersRec =
|
|
||||||
{
|
|
||||||
"afb",
|
|
||||||
MODULEVENDORSTRING,
|
|
||||||
MODINFOSTRING1,
|
|
||||||
MODINFOSTRING2,
|
|
||||||
XORG_VERSION_CURRENT,
|
|
||||||
1, 0, 0,
|
|
||||||
ABI_CLASS_ANSIC, /* Only need the ansic layer */
|
|
||||||
ABI_ANSIC_VERSION,
|
|
||||||
MOD_CLASS_NONE,
|
|
||||||
{0,0,0,0} /* signature, to be patched into the file by a tool */
|
|
||||||
};
|
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData afbModuleData = { &VersRec, afbSetup, NULL };
|
|
||||||
|
|
||||||
static pointer
|
|
||||||
afbSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
|
||||||
{
|
|
||||||
/* This modules requires mfb, so load it */
|
|
||||||
return LoadSubModule(module, "mfb", NULL, NULL, NULL, NULL,
|
|
||||||
errmaj, errmin);
|
|
||||||
}
|
|
Loading…
Reference in New Issue