mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-20 21:41:02 +03:00
Removed PIL 1.0 era readme that concerns Windows 95/NT
This commit is contained in:
parent
296fb5fe1d
commit
c13676e975
285
Tk/README.rst
285
Tk/README.rst
|
@ -1,285 +0,0 @@
|
||||||
Using PIL With Tkinter
|
|
||||||
====================================================================
|
|
||||||
|
|
||||||
Starting with 1.0 final (release candidate 2 and later, to be
|
|
||||||
precise), PIL can attach itself to Tkinter in flight. As a result,
|
|
||||||
you no longer need to rebuild the Tkinter extension to be able to
|
|
||||||
use PIL.
|
|
||||||
|
|
||||||
However, if you cannot get the this to work on your platform, you
|
|
||||||
can do it in the old way:
|
|
||||||
|
|
||||||
Adding Tkinter support
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
1. Compile Python's _tkinter.c with the WITH_APPINIT and WITH_PIL
|
|
||||||
flags set, and link it with tkImaging.c and tkappinit.c. To
|
|
||||||
do this, copy the former to the Modules directory, and edit
|
|
||||||
the _tkinter line in Setup (or Setup.in) according to the
|
|
||||||
instructions in that file.
|
|
||||||
|
|
||||||
NOTE: if you have an old Python version, the tkappinit.c
|
|
||||||
file is not included by default. If this is the case, you
|
|
||||||
will have to add the following lines to tkappinit.c, after
|
|
||||||
the MOREBUTTONS stuff::
|
|
||||||
|
|
||||||
{
|
|
||||||
extern void TkImaging_Init(Tcl_Interp* interp);
|
|
||||||
TkImaging_Init(interp);
|
|
||||||
}
|
|
||||||
|
|
||||||
This registers a Tcl command called "PyImagingPhoto", which is
|
|
||||||
use to communicate between PIL and Tk's PhotoImage handler.
|
|
||||||
|
|
||||||
You must also change the _tkinter line in Setup (or Setup.in)
|
|
||||||
to something like::
|
|
||||||
|
|
||||||
_tkinter _tkinter.c tkImaging.c tkappinit.c -DWITH_APPINIT
|
|
||||||
-I/usr/local/include -L/usr/local/lib -ltk8.0 -ltcl8.0 -lX11
|
|
||||||
|
|
||||||
The Photoimage Booster Patch (for Windows 95/NT)
|
|
||||||
====================================================================
|
|
||||||
|
|
||||||
This patch kit boosts performance for 16/24-bit displays. The
|
|
||||||
first patch is required on Tk 4.2 (where it fixes the problems for
|
|
||||||
16-bit displays) and later versions. By installing both patches,
|
|
||||||
Tk's PhotoImage handling becomes much faster on both 16-bit and
|
|
||||||
24-bit displays. The patch has been tested with Tk 4.2 and 8.0.
|
|
||||||
|
|
||||||
Here's a benchmark, made with a sample program which loads two
|
|
||||||
512x512 greyscale PGM's, and two 512x512 colour PPM's, and displays
|
|
||||||
each of them in a separate toplevel windows. Tcl/Tk was compiled
|
|
||||||
with Visual C 4.0, and run on a P100 under Win95. Image load times
|
|
||||||
are not included in the timings:
|
|
||||||
|
|
||||||
+----------------------+------------+-------------+----------------+
|
|
||||||
| | **8-bit** | **16-bit** | **24-bit** |
|
|
||||||
+----------------------+------------+-------------+----------------+
|
|
||||||
| 1. original 4.2 code | 5.52 s | 8.57 s | 3.79 s |
|
|
||||||
+----------------------+------------+-------------+----------------+
|
|
||||||
| 2. booster patch | 5.49 s | 1.87 s | 1.82 s |
|
|
||||||
+----------------------+------------+-------------+----------------+
|
|
||||||
| speedup | None | 4.6x | 2.1x |
|
|
||||||
+----------------------+------------+-------------+----------------+
|
|
||||||
|
|
||||||
Here's the patches:
|
|
||||||
|
|
||||||
1. For portability and speed, the best thing under Windows is to
|
|
||||||
treat 16-bit displays as if they were 24-bit. The Windows device
|
|
||||||
drivers take care of the rest.
|
|
||||||
|
|
||||||
.. Note::
|
|
||||||
|
|
||||||
If you have Tk 4.1 or Tk 8.0b1, you don't have to apply this
|
|
||||||
patch! It only applies to Tk 4.2, Tk 8.0a[12] and Tk 8.0b2.
|
|
||||||
|
|
||||||
In ``win/tkWinImage.c``, change the following line in ``XCreateImage``::
|
|
||||||
|
|
||||||
imagePtr->bits_per_pixel = depth;
|
|
||||||
|
|
||||||
to::
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
/* The tk photo image booster patch -- patch section 1 */
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
if (visual->class == TrueColor)
|
|
||||||
/* true colour is stored as 3 bytes: (blue, green, red) */
|
|
||||||
imagePtr->bits_per_pixel = 24;
|
|
||||||
else
|
|
||||||
imagePtr->bits_per_pixel = depth;
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
2. The DitherInstance implementation is not good. It's especially
|
|
||||||
bad on highend truecolour displays. IMO, it should be rewritten from
|
|
||||||
scratch (some other day...).
|
|
||||||
|
|
||||||
Anyway, the following band-aid makes the situation a little bit
|
|
||||||
better under Windows. This hack trades some marginal quality (no
|
|
||||||
dithering on 16-bit displays) for a dramatic performance boost.
|
|
||||||
Requires patch 1, unless you're using Tk 4.1 or Tk 8.0b1.
|
|
||||||
|
|
||||||
In generic/tkImgPhoto.c, add the #ifdef section to the DitherInstance
|
|
||||||
function::
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
for (; height > 0; height -= nLines) {
|
|
||||||
if (nLines > height) {
|
|
||||||
nLines = height;
|
|
||||||
}
|
|
||||||
dstLinePtr = (unsigned char *) imagePtr->data;
|
|
||||||
yEnd = yStart + nLines;
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
/* The tk photo image booster patch -- patch section 2 */
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
|
||||||
if (colorPtr->visualInfo.class == TrueColor
|
|
||||||
&& instancePtr->gamma == 1.0) {
|
|
||||||
/* Windows hicolor/truecolor booster */
|
|
||||||
for (y = yStart; y < yEnd; ++y) {
|
|
||||||
destBytePtr = dstLinePtr;
|
|
||||||
srcPtr = srcLinePtr;
|
|
||||||
for (x = xStart; x < xEnd; ++x) {
|
|
||||||
destBytePtr[0] = srcPtr[2];
|
|
||||||
destBytePtr[1] = srcPtr[1];
|
|
||||||
destBytePtr[2] = srcPtr[0];
|
|
||||||
destBytePtr += 3; srcPtr += 3;
|
|
||||||
}
|
|
||||||
srcLinePtr += lineLength;
|
|
||||||
dstLinePtr += bytesPerLine;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
for (y = yStart; y < yEnd; ++y) {
|
|
||||||
srcPtr = srcLinePtr;
|
|
||||||
errPtr = errLinePtr;
|
|
||||||
destBytePtr = dstLinePtr;
|
|
||||||
|
|
||||||
The PIL Bitmap Booster Patch
|
|
||||||
====================================================================
|
|
||||||
|
|
||||||
The pilbitmap booster patch greatly improves performance of the
|
|
||||||
ImageTk.BitmapImage constructor. Unfortunately, the design of Tk
|
|
||||||
doesn't allow us to do this from the tkImaging interface module, so
|
|
||||||
you have to patch the Tk sources.
|
|
||||||
|
|
||||||
Once installed, the ImageTk module will automatically detect this
|
|
||||||
patch.
|
|
||||||
|
|
||||||
(Note: this patch has been tested with Tk 8.0 on Win32 only, but it
|
|
||||||
should work just fine on other platforms as well).
|
|
||||||
|
|
||||||
1. To the beginning of TkGetBitmapData (in generic/tkImgBmap.c), add
|
|
||||||
the following stuff::
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
int width, height, numBytes, hotX, hotY;
|
|
||||||
char *p, *end, *expandedFileName;
|
|
||||||
ParseInfo pi;
|
|
||||||
char *data = NULL;
|
|
||||||
Tcl_DString buffer;
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
/* The pilbitmap booster patch -- patch section */
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
char *PILGetBitmapData();
|
|
||||||
|
|
||||||
if (string) {
|
|
||||||
/* Is this a PIL bitmap reference? */
|
|
||||||
data = PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr);
|
|
||||||
if (data)
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
pi.string = string;
|
|
||||||
if (string == NULL) {
|
|
||||||
if (Tcl_IsSafe(interp)) {
|
|
||||||
|
|
||||||
2. Append the following to the same file (you may wish to include
|
|
||||||
Imaging.h instead of copying the struct declaration...)::
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
/* The pilbitmap booster patch -- code section */
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
/* Imaging declaration boldly copied from Imaging.h (!) */
|
|
||||||
|
|
||||||
typedef struct ImagingInstance *Imaging; /* a.k.a. ImagingImage :-) */
|
|
||||||
|
|
||||||
typedef unsigned char UINT8;
|
|
||||||
typedef int INT32;
|
|
||||||
|
|
||||||
struct ImagingInstance {
|
|
||||||
|
|
||||||
/* Format */
|
|
||||||
char mode[4+1]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK") */
|
|
||||||
int type; /* Always 0 in this version */
|
|
||||||
int depth; /* Always 8 in this version */
|
|
||||||
int bands; /* Number of bands (1, 3, or 4) */
|
|
||||||
int xsize; /* Image dimension. */
|
|
||||||
int ysize;
|
|
||||||
|
|
||||||
/* Colour palette (for "P" images only) */
|
|
||||||
void* palette;
|
|
||||||
|
|
||||||
/* Data pointers */
|
|
||||||
UINT8 **image8; /* Set for 8-bit image (pixelsize=1). */
|
|
||||||
INT32 **image32; /* Set for 32-bit image (pixelsize=4). */
|
|
||||||
|
|
||||||
/* Internals */
|
|
||||||
char **image; /* Actual raster data. */
|
|
||||||
char *block; /* Set if data is allocated in a single block. */
|
|
||||||
|
|
||||||
int pixelsize; /* Size of a pixel, in bytes (1 or 4) */
|
|
||||||
int linesize; /* Size of a line, in bytes (xsize * pixelsize) */
|
|
||||||
|
|
||||||
/* Virtual methods */
|
|
||||||
void (*im_delete)(Imaging *);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The pilbitmap booster patch allows you to pass PIL images to the
|
|
||||||
Tk bitmap decoder. Passing images this way is much more efficient
|
|
||||||
than using the "tobitmap" method. */
|
|
||||||
|
|
||||||
char *
|
|
||||||
PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr)
|
|
||||||
char *string;
|
|
||||||
int *widthPtr, *heightPtr;
|
|
||||||
int *hotXPtr, *hotYPtr;
|
|
||||||
{
|
|
||||||
char* data;
|
|
||||||
char* p;
|
|
||||||
int y;
|
|
||||||
Imaging im;
|
|
||||||
|
|
||||||
if (strncmp(string, "PIL:", 4) != 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
im = (Imaging) atol(string + 4);
|
|
||||||
|
|
||||||
if (strcmp(im->mode, "1") != 0 && strcmp(im->mode, "L") != 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
data = p = (char *) ckalloc((unsigned) ((im->xsize+7)/8) * im->ysize);
|
|
||||||
|
|
||||||
for (y = 0; y < im->ysize; y++) {
|
|
||||||
char* in = im->image8[y];
|
|
||||||
int i, m, b;
|
|
||||||
b = 0; m = 1;
|
|
||||||
for (i = 0; i < im->xsize; i++) {
|
|
||||||
if (in[i] != 0)
|
|
||||||
b |= m;
|
|
||||||
m <<= 1;
|
|
||||||
if (m == 256){
|
|
||||||
*p++ = b;
|
|
||||||
b = 0; m = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m != 1)
|
|
||||||
*p++ = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
*widthPtr = im->xsize;
|
|
||||||
*heightPtr = im->ysize;
|
|
||||||
*hotXPtr = -1;
|
|
||||||
*hotYPtr = -1;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
|
||||||
|
|
||||||
3. Recompile Tk and relink the _tkinter module (where necessary).
|
|
Loading…
Reference in New Issue
Block a user