From 103cf49c910b62660b9c9f03b19484462aea4c7d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 31 Jan 2013 14:52:15 +0900 Subject: [PATCH 001/102] Fix rendered characters have been chipped for some TrueType fonts ImageFont ignores descender value of TrueType fonts (uses ascender only), then some fonts which use descender is chipped on rendering. --- _imagingft.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index f54e38553..5dcd20e37 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -282,7 +282,7 @@ font_render(FontObject* self, PyObject* args) { int i, x, y; Imaging im; - int index, error, ascender; + int index, error, ascender, descender; int load_flags; unsigned char *source; FT_ULong ch; @@ -332,6 +332,7 @@ font_render(FontObject* self, PyObject* args) int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; ascender = PIXEL(self->face->size->metrics.ascender); + descender = PIXEL(self->face->size->metrics.descender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -340,7 +341,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender - glyph->bitmap_top; + int yy = y + ascender + descender - glyph->bitmap_top; if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; @@ -361,6 +362,7 @@ font_render(FontObject* self, PyObject* args) int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; ascender = PIXEL(self->face->size->metrics.ascender); + descender = PIXEL(self->face->size->metrics.descender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -369,7 +371,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender - glyph->bitmap_top; + int yy = y + ascender + descender - glyph->bitmap_top; if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; From e55a94567a6017ae104cae5773f275da2fb78823 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 18 Mar 2013 22:39:30 -0700 Subject: [PATCH 002/102] Starting to integrate README --- README.rst | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/README.rst b/README.rst index a61e4cb1d..1f7269764 100644 --- a/README.rst +++ b/README.rst @@ -79,6 +79,70 @@ Current platform support for Pillow. Binary distributions are contributed for ea .. [1] x86 only .. [2] In some cases, x86 support may indicate 32-bit compilation on 64-bit architecture (vs. compilation on 32-bit hardware). +Installation +============ + +If there is a binary package for your system, that is the preferred way of obtaining Pillow. + +Building from Source +-------------------- + +Some of Pillow's features require external libraries. + +* libjpeg provides JPEG functionality. Pillow has been tested with libjpev versions 6b and 8 +* zlib provides access to compressed PNGs +* libtiff provides group4 tiff functionality. Pillow has been tested with versions 3.x and 4.0 +* libfreetype provides type related services +* littlecms provides color management +* libwebp provides the Webp format. + +If the prerequisites are installed in the standard library locations for your machine, no configuration shoule be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations. See [[url here]] for more information. + +Once you have assembed the prerequisites, run: + +

+    $ pip install pillow
+
+ +Platform Specific Instructions +------------------------------ + +** Ubuntu ** + +If you didn't build Python from sources, make sure you have Python's build support files on your machine. + +

+sudo apt-get install python-dev python-setuptools
+# or for python 3
+sudo apt-get install python3-dev python3-setuptools
+
+ +The library prerequisites are installed with: + +

+# Ubuntu 10.04 LTS
+sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev
+# Ubuntu 12.04 LTS
+sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev
+
+ + +Porting +======= + +Pillow is a functional dropin for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging modules from the PIL namespace instead of the global namespace. + +Change: +

+import Image
+
+to +

+from PIL import Image
+
+ + + Python Imaging Library ====================== From eb4db1c951fa4d81da44e322de1e31069e2599ec Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 18 Mar 2013 22:51:37 -0700 Subject: [PATCH 003/102] Rst, not gfm. --- README.rst | 59 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/README.rst b/README.rst index 1f7269764..b817e2220 100644 --- a/README.rst +++ b/README.rst @@ -89,42 +89,53 @@ Building from Source Some of Pillow's features require external libraries. -* libjpeg provides JPEG functionality. Pillow has been tested with libjpev versions 6b and 8 +* libjpeg provides JPEG functionality. + + * Pillow has been tested with libjpev versions 6b and 8 + * zlib provides access to compressed PNGs -* libtiff provides group4 tiff functionality. Pillow has been tested with versions 3.x and 4.0 + +* libtiff provides group4 tiff functionality. + + * Pillow has been tested with versions 3.x and 4.0 + * libfreetype provides type related services + * littlecms provides color management + * libwebp provides the Webp format. If the prerequisites are installed in the standard library locations for your machine, no configuration shoule be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations. See [[url here]] for more information. Once you have assembed the prerequisites, run: -

+::
     $ pip install pillow
-
Platform Specific Instructions ------------------------------ -** Ubuntu ** +Mac OSX +******* +Ubuntu or Debian +****** If you didn't build Python from sources, make sure you have Python's build support files on your machine. -

-sudo apt-get install python-dev python-setuptools
-# or for python 3
-sudo apt-get install python3-dev python3-setuptools
-
+:: + sudo apt-get install python-dev python-setuptools + # or for python 3 + sudo apt-get install python3-dev python3-setuptools -The library prerequisites are installed with: -

-# Ubuntu 10.04 LTS
-sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev
-# Ubuntu 12.04 LTS
-sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev
-
+The library prerequisites are installed with:: + # Ubuntu 10.04 LTS + sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev + # Ubuntu 12.04 LTS + sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev + +##Undone## Debian library versions. + Porting @@ -132,14 +143,12 @@ Porting Pillow is a functional dropin for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging modules from the PIL namespace instead of the global namespace. -Change: -

-import Image
-
-to -

-from PIL import Image
-
+Change:: + import Image + +to:: + from PIL import Image + From 6471b5899917d95c9a31204616ab7dbef3d37c39 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 18 Mar 2013 22:53:41 -0700 Subject: [PATCH 004/102] ::block formatting --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index b817e2220..73b97f983 100644 --- a/README.rst +++ b/README.rst @@ -110,6 +110,7 @@ If the prerequisites are installed in the standard library locations for your ma Once you have assembed the prerequisites, run: :: + $ pip install pillow Platform Specific Instructions @@ -123,12 +124,14 @@ Ubuntu or Debian If you didn't build Python from sources, make sure you have Python's build support files on your machine. :: + sudo apt-get install python-dev python-setuptools # or for python 3 sudo apt-get install python3-dev python3-setuptools The library prerequisites are installed with:: + # Ubuntu 10.04 LTS sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev # Ubuntu 12.04 LTS @@ -144,9 +147,11 @@ Porting Pillow is a functional dropin for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging modules from the PIL namespace instead of the global namespace. Change:: + import Image to:: + from PIL import Image From 2a2a1ea144554cc17d141374e2d9223bfd2f5e07 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Sun, 7 Apr 2013 19:02:11 +0200 Subject: [PATCH 005/102] Fix tests which are hardcoded for little-endian CPUs --- Tests/test_image_array.py | 4 ++-- Tests/test_lib_pack.py | 6 ++++-- Tests/test_mode_i16.py | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index c2e85903a..351621d3a 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -10,8 +10,8 @@ def test_toarray(): return ai["shape"], ai["typestr"], len(ai["data"]) # assert_equal(test("1"), ((100, 128), '|b1', 1600)) assert_equal(test("L"), ((100, 128), '|u1', 12800)) - assert_equal(test("I"), ((100, 128), ' Date: Mon, 8 Apr 2013 00:52:15 +0200 Subject: [PATCH 006/102] Make quantization code more portable --- _imaging.c | 1 - libImaging/Quant.c | 395 ++++++++++++++++++-------------------- libImaging/Quant.h | 40 ---- libImaging/QuantDefines.h | 25 --- libImaging/QuantHash.c | 250 +++++++++++------------- libImaging/QuantHash.h | 55 ++++-- libImaging/QuantHeap.c | 49 ++--- libImaging/QuantHeap.h | 18 +- libImaging/QuantOctree.c | 28 +-- libImaging/QuantOctree.h | 12 +- libImaging/QuantTypes.h | 25 +-- 11 files changed, 405 insertions(+), 493 deletions(-) delete mode 100644 libImaging/Quant.h delete mode 100644 libImaging/QuantDefines.h diff --git a/_imaging.c b/_imaging.c index c9d3c8247..2ee7eef42 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1369,7 +1369,6 @@ _putdata(ImagingObject* self, PyObject* args) #ifdef WITH_QUANTIZE -#include "Quant.h" static PyObject* _quantize(ImagingObject* self, PyObject* args) { diff --git a/libImaging/Quant.c b/libImaging/Quant.c index ff15ac01f..7f328bda9 100644 --- a/libImaging/Quant.c +++ b/libImaging/Quant.c @@ -25,17 +25,15 @@ #include #include -#include "Quant.h" +#include "QuantTypes.h" #include "QuantOctree.h" - -#include "QuantDefines.h" #include "QuantHash.h" #include "QuantHeap.h" #define NO_OUTPUT typedef struct { - unsigned long scale; + uint32_t scale; } PixelHashData; typedef struct _PixelList { @@ -50,7 +48,7 @@ typedef struct _BoxNode { PixelList *head[3],*tail[3]; int axis; int volume; - unsigned long pixelCount; + uint32_t pixelCount; } BoxNode; #define _SQR(x) ((x)*(x)) @@ -76,104 +74,92 @@ typedef struct _BoxNode { ((q)->c.g=(p)->c.g>>(s)), \ ((q)->c.b=(p)->c.b>>(s)) -static unsigned long -unshifted_pixel_hash(const HashTable h, const void *p) +static uint32_t +unshifted_pixel_hash(const HashTable *h, const Pixel pixel) { - Pixel *pixel=(Pixel *)&p; - unsigned long hash=PIXEL_HASH(pixel->c.r, - pixel->c.g, - pixel->c.b); - return hash; + return PIXEL_HASH(pixel.c.r, pixel.c.g, pixel.c.b); } static int -unshifted_pixel_cmp(const HashTable h, const void *a, const void *b) +unshifted_pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) { - Pixel *pixel1=(Pixel *)&a; - Pixel *pixel2=(Pixel *)&b; - if (pixel1->c.r==pixel2->c.r) { - if (pixel1->c.g==pixel2->c.g) { - if (pixel1->c.b==pixel2->c.b) { + if (pixel1.c.r==pixel2.c.r) { + if (pixel1.c.g==pixel2.c.g) { + if (pixel1.c.b==pixel2.c.b) { return 0; } else { - return (int)(pixel1->c.b)-(int)(pixel2->c.b); + return (int)(pixel1.c.b)-(int)(pixel2.c.b); } } else { - return (int)(pixel1->c.g)-(int)(pixel2->c.g); + return (int)(pixel1.c.g)-(int)(pixel2.c.g); } } else { - return (int)(pixel1->c.r)-(int)(pixel2->c.r); + return (int)(pixel1.c.r)-(int)(pixel2.c.r); } } -static unsigned long -pixel_hash(const HashTable h,const void *p) +static uint32_t +pixel_hash(const HashTable *h,const Pixel pixel) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - Pixel *pixel=(Pixel *)&p; - unsigned long hash=PIXEL_HASH(pixel->c.r>>d->scale, - pixel->c.g>>d->scale, - pixel->c.b>>d->scale); - return hash; + return PIXEL_HASH(pixel.c.r>>d->scale, pixel.c.g>>d->scale, pixel.c.b>>d->scale); } static int -pixel_cmp(const HashTable h,const void *a,const void *b) +pixel_cmp(const HashTable *h,const Pixel pixel1, const Pixel pixel2) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - Pixel *pixel1=(Pixel *)&a; - Pixel *pixel2=(Pixel *)&b; - unsigned long A,B; - A=PIXEL_HASH(pixel1->c.r>>d->scale, - pixel1->c.g>>d->scale, - pixel1->c.b>>d->scale); - B=PIXEL_HASH(pixel2->c.r>>d->scale, - pixel2->c.g>>d->scale, - pixel2->c.b>>d->scale); + uint32_t A,B; + A=PIXEL_HASH(pixel1.c.r>>d->scale, pixel1.c.g>>d->scale, pixel1.c.b>>d->scale); + B=PIXEL_HASH(pixel2.c.r>>d->scale, pixel2.c.g>>d->scale, pixel2.c.b>>d->scale); return (A==B)?0:((Ascale=0; +#ifndef NO_OUTPUT timer=timer3=clock(); +#endif for (i=0;iscale++; #ifndef NO_OUTPUT printf ("rehashing - new scale: %d\n",(int)d->scale); -#endif timer2=clock(); - hashtable_rehash_compute(hash,rehash_collide); - timer2=clock()-timer2; -#ifndef NO_OUTPUT - printf ("rehash took %f sec\n",timer2/(double)CLOCKS_PER_SEC); #endif + hashtable_rehash_compute(hash,rehash_collide); +#ifndef NO_OUTPUT + timer2=clock()-timer2; + printf ("rehash took %f sec\n",timer2/(double)CLOCKS_PER_SEC); timer+=timer2; +#endif } } #ifndef NO_OUTPUT @@ -201,7 +187,7 @@ create_pixel_hash(Pixel *pixelData,unsigned long nPixels) } static void -destroy_pixel_hash(HashTable hash) +destroy_pixel_hash(HashTable *hash) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash); if (d) free(d); @@ -237,17 +223,15 @@ compute_box_volume(BoxNode *b) } static void -hash_to_list(HashTable h, const void *key, const void *val, void *u) +hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); PixelList **pl=(PixelList **)u; PixelList *p; - Pixel *pixel=(Pixel *)&key; int i; Pixel q; - int count=(unsigned long) val; - PIXEL_SCALE(pixel,&q,d->scale); + PIXEL_SCALE(&pixel,&q,d->scale); p=malloc(sizeof(PixelList)); if (!p) return; @@ -327,7 +311,7 @@ test_sorted(PixelList *pl[3]) #endif static int -box_heap_cmp(const Heap h, const void *A, const void *B) +box_heap_cmp(const Heap *h, const void *A, const void *B) { BoxNode *a=(BoxNode *)A; BoxNode *b=(BoxNode *)B; @@ -341,11 +325,11 @@ splitlists(PixelList *h[3], PixelList *t[3], PixelList *nh[2][3], PixelList *nt[2][3], - unsigned long nCount[2], + uint32_t nCount[2], int axis, - unsigned long pixelCount) + uint32_t pixelCount) { - unsigned long left; + uint32_t left; PixelList *l,*r,*c,*n; int i; @@ -476,7 +460,7 @@ split(BoxNode *node) int i; PixelList *heads[2][3]; PixelList *tails[2][3]; - unsigned long newCounts[2]; + uint32_t newCounts[2]; BoxNode *left,*right; rh=node->head[0]->p.c.r; @@ -618,13 +602,13 @@ split(BoxNode *node) static BoxNode * median_cut(PixelList *hl[3], - unsigned long imPixelCount, + uint32_t imPixelCount, int nPixels) { PixelList *tl[3]; int i; BoxNode *root; - Heap h; + Heap* h; BoxNode *thisNode; h=ImagingQuantHeapNew(box_heap_cmp); @@ -701,7 +685,7 @@ checkContained(BoxNode *n,Pixel *pp) #endif static int -annotate_hash_table(BoxNode *n,HashTable h,unsigned long *box) +annotate_hash_table(BoxNode *n,HashTable *h,uint32_t *box) { PixelList *p; PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); @@ -717,7 +701,7 @@ annotate_hash_table(BoxNode *n,HashTable h,unsigned long *box) } for (p=n->head[0];p;p=p->next[0]) { PIXEL_UNSCALE(&(p->p),&q,d->scale); - if (!hashtable_insert(h,(void *)q.v,(void *)*box)) { + if (!hashtable_insert(h,q,*box)) { #ifndef NO_OUTPUT printf ("hashtable insert failed\n"); #endif @@ -731,20 +715,20 @@ annotate_hash_table(BoxNode *n,HashTable h,unsigned long *box) static int _sort_ulong_ptr_keys(const void *a, const void *b) { - unsigned long A=**(unsigned long **)a; - unsigned long B=**(unsigned long **)b; + uint32_t A=**(uint32_t **)a; + uint32_t B=**(uint32_t **)b; return (A==B)?0:((A=nPaletteEntries) { @@ -1091,35 +1075,35 @@ compute_palette_from_quantized_pixels( static int k_means(Pixel *pixelData, - unsigned long nPixels, + uint32_t nPixels, Pixel *paletteData, - unsigned long nPaletteEntries, - unsigned long *qp, + uint32_t nPaletteEntries, + uint32_t *qp, int threshold) { - unsigned long *avg[3]; - unsigned long *count; - unsigned long i; - unsigned long *avgDist; - unsigned long **avgDistSortKey; + uint32_t *avg[3]; + uint32_t *count; + uint32_t i; + uint32_t *avgDist; + uint32_t **avgDistSortKey; int changes; int built=0; - if (!(count=malloc(sizeof(unsigned long)*nPaletteEntries))) { + if (!(count=malloc(sizeof(uint32_t)*nPaletteEntries))) { return 0; } for(i=0;i<3;i++) { avg[i]=NULL; } for(i=0;i<3;i++) { - if (!(avg[i]=malloc(sizeof(unsigned long)*nPaletteEntries))) { + if (!(avg[i]=malloc(sizeof(uint32_t)*nPaletteEntries))) { goto error_1; } } - avgDist=malloc(sizeof(unsigned long)*nPaletteEntries*nPaletteEntries); + avgDist=malloc(sizeof(uint32_t)*nPaletteEntries*nPaletteEntries); if (!avgDist) { goto error_1; } - avgDistSortKey=malloc(sizeof(unsigned long *)*nPaletteEntries*nPaletteEntries); + avgDistSortKey=malloc(sizeof(uint32_t *)*nPaletteEntries*nPaletteEntries); if (!avgDistSortKey) { goto error_2; } #ifndef NO_OUTPUT @@ -1172,26 +1156,26 @@ error_1: int quantize(Pixel *pixelData, - unsigned long nPixels, - unsigned long nQuantPixels, + uint32_t nPixels, + uint32_t nQuantPixels, Pixel **palette, - unsigned long *paletteLength, - unsigned long **quantizedPixels, + uint32_t *paletteLength, + uint32_t **quantizedPixels, int kmeans) { PixelList *hl[3]; - HashTable h; + HashTable *h; BoxNode *root; - unsigned long i; - unsigned long *qp; - unsigned long nPaletteEntries; + uint32_t i; + uint32_t *qp; + uint32_t nPaletteEntries; - unsigned long *avgDist; - unsigned long **avgDistSortKey; + uint32_t *avgDist; + uint32_t **avgDistSortKey; Pixel *p; #ifndef NO_OUTPUT - unsigned long timer,timer2; + uint32_t timer,timer2; #endif #ifndef NO_OUTPUT @@ -1266,13 +1250,13 @@ quantize(Pixel *pixelData, free_box_tree(root); root=NULL; - qp=malloc(sizeof(unsigned long)*nPixels); + qp=malloc(sizeof(uint32_t)*nPixels); if (!qp) { goto error_4; } - avgDist=malloc(sizeof(unsigned long)*nPaletteEntries*nPaletteEntries); + avgDist=malloc(sizeof(uint32_t)*nPaletteEntries*nPaletteEntries); if (!avgDist) { goto error_5; } - avgDistSortKey=malloc(sizeof(unsigned long *)*nPaletteEntries*nPaletteEntries); + avgDistSortKey=malloc(sizeof(uint32_t *)*nPaletteEntries*nPaletteEntries); if (!avgDistSortKey) { goto error_6; } if (!build_distance_tables(avgDist,avgDistSortKey,p,nPaletteEntries)) { @@ -1286,12 +1270,12 @@ quantize(Pixel *pixelData, #ifdef TEST_NEAREST_NEIGHBOUR #include { - unsigned long bestmatch,bestdist,dist; - HashTable h2; + uint32_t bestmatch,bestdist,dist; + HashTable *h2; printf ("nearest neighbour search (full search)..."); fflush(stdout); timer=clock(); h2=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); for (i=0;inew),pixel); + uint32_t oldDist=*dist; + uint32_t newDist; + newDist=_DISTSQR(&(data->new),&pixel); if (data->secondPixel || newDistdata->furthestDistance) { data->furthestDistance=oldDist; - data->furthest.v=pixel->v; + data->furthest.v=pixel.v; } } int quantize2(Pixel *pixelData, - unsigned long nPixels, - unsigned long nQuantPixels, + uint32_t nPixels, + uint32_t nQuantPixels, Pixel **palette, - unsigned long *paletteLength, - unsigned long **quantizedPixels, + uint32_t *paletteLength, + uint32_t **quantizedPixels, int kmeans) { - HashTable h; - unsigned long i; - unsigned long mean[3]; + HashTable *h; + uint32_t i; + uint32_t mean[3]; Pixel *p; DistanceData data; - unsigned long *qp; - unsigned long *avgDist; - unsigned long **avgDistSortKey; + uint32_t *qp; + uint32_t *avgDist; + uint32_t **avgDistSortKey; p=malloc(sizeof(Pixel)*nQuantPixels); if (!p) return 0; mean[0]=mean[1]=mean[2]=0; h=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); for (i=0;i. - * - * See the README file for information on usage and redistribution. - */ - -#ifndef __QUANT_H__ -#define __QUANT_H__ - -typedef union { - struct { - unsigned char r,g,b,a; - } c; - struct { - unsigned char v[4]; - } a; - unsigned long v; -} Pixel; - -int quantize(Pixel *, - unsigned long, - unsigned long, - Pixel **, - unsigned long *, - unsigned long **, - int); - -int quantize2(Pixel *, - unsigned long, - unsigned long, - Pixel **, - unsigned long *, - unsigned long **, - int); -#endif diff --git a/libImaging/QuantDefines.h b/libImaging/QuantDefines.h deleted file mode 100644 index 5b080104e..000000000 --- a/libImaging/QuantDefines.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * The Python Imaging Library - * $Id$ - * - * image quantizer - * - * Written by Toby J Sargeant . - * - * See the README file for information on usage and redistribution. - */ - -#ifndef __DEFINES_H__ -#define __DEFINES_H__ - -#if 0 - -void *newMalloc(size_t,const char *,const char *,int); -void newFree(void *,const char *,const char *,int); -void print_malloc_stats(); -#define malloc(x) newMalloc(x,__FILE__,__FUNCTION__,__LINE__) -#define free(x) newFree(x,__FILE__,__FUNCTION__,__LINE__) - -#endif - -#endif diff --git a/libImaging/QuantHash.c b/libImaging/QuantHash.c index e6438402d..58d881349 100644 --- a/libImaging/QuantHash.c +++ b/libImaging/QuantHash.c @@ -22,35 +22,35 @@ #include #include "QuantHash.h" -#include "QuantDefines.h" -typedef struct _IntHashNode { - struct _IntHashNode *next; - void *key,*value; -} IntHashNode; +typedef struct _HashNode { + struct _HashNode *next; + HashKey_t key; + HashVal_t value; +} HashNode; -typedef struct _IntHashTable { - IntHashNode **table; - unsigned long length; - unsigned long count; +typedef struct _HashTable { + HashNode **table; + uint32_t length; + uint32_t count; HashFunc hashFunc; HashCmpFunc cmpFunc; - DestroyFunc keyDestroyFunc; - DestroyFunc valDestroyFunc; + KeyDestroyFunc keyDestroyFunc; + ValDestroyFunc valDestroyFunc; void *userData; -} IntHashTable; +} HashTable; #define MIN_LENGTH 11 #define RESIZE_FACTOR 3 -static int _hashtable_insert_node(IntHashTable *,IntHashNode *,int,int,CollisionFunc); +static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); #if 0 -static int _hashtable_test(IntHashTable *); +static int _hashtable_test(HashTable *); #endif -HashTable hashtable_new(HashFunc hf,HashCmpFunc cf) { - IntHashTable *h; - h=malloc(sizeof(IntHashTable)); +HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { + HashTable *h; + h=malloc(sizeof(HashTable)); if (!h) { return NULL; } h->hashFunc=hf; h->cmpFunc=cf; @@ -59,25 +59,24 @@ HashTable hashtable_new(HashFunc hf,HashCmpFunc cf) { h->length=MIN_LENGTH; h->count=0; h->userData=NULL; - h->table=malloc(sizeof(IntHashNode *)*h->length); + h->table=malloc(sizeof(HashNode *)*h->length); if (!h->table) { free(h); return NULL; } - memset (h->table,0,sizeof(IntHashNode *)*h->length); - return (HashTable)h; + memset (h->table,0,sizeof(HashNode *)*h->length); + return h; } -static void _hashtable_destroy(HashTable H,const void *key,const void *val,void *u) { - IntHashTable *h=(IntHashTable *)H; - if (h->keyDestroyFunc&&key) { - h->keyDestroyFunc((HashTable)h,(void *)key); +static void _hashtable_destroy(const HashTable *h,const HashKey_t key,const HashVal_t val,void *u) { + if (h->keyDestroyFunc) { + h->keyDestroyFunc(h,key); } - if (h->valDestroyFunc&&val) { - h->valDestroyFunc((HashTable)h,(void *)val); + if (h->valDestroyFunc) { + h->valDestroyFunc(h,val); } } -static unsigned long _findPrime(unsigned long start,int dir) { +static uint32_t _findPrime(uint32_t start,int dir) { static int unit[]={0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0}; - unsigned long t; + uint32_t t; while (start>1) { if (!unit[start&0x0f]) { start+=dir; @@ -94,22 +93,20 @@ static unsigned long _findPrime(unsigned long start,int dir) { return start; } -static void _hashtable_rehash(IntHashTable *h, - CollisionFunc cf, - unsigned long newSize) { - IntHashNode **oldTable=h->table; - unsigned long i; - IntHashNode *n,*nn; - unsigned long oldSize; +static void _hashtable_rehash(HashTable *h,CollisionFunc cf,uint32_t newSize) { + HashNode **oldTable=h->table; + uint32_t i; + HashNode *n,*nn; + uint32_t oldSize; oldSize=h->length; - h->table=malloc(sizeof(IntHashNode *)*newSize); + h->table=malloc(sizeof(HashNode *)*newSize); if (!h->table) { h->table=oldTable; return; } h->length=newSize; h->count=0; - memset (h->table,0,sizeof(IntHashNode *)*h->length); + memset (h->table,0,sizeof(HashNode *)*h->length); for (i=0;inext; @@ -119,9 +116,9 @@ static void _hashtable_rehash(IntHashTable *h, free(oldTable); } -static void _hashtable_resize(IntHashTable *h) { - unsigned long newSize; - unsigned long oldSize; +static void _hashtable_resize(HashTable *h) { + uint32_t newSize; + uint32_t oldSize; oldSize=h->length; newSize=oldSize; if (h->count*RESIZE_FACTORlength) { @@ -136,13 +133,13 @@ static void _hashtable_resize(IntHashTable *h) { } #if 0 -static int _hashtable_test(IntHashTable *h) { - unsigned long i; +static int _hashtable_test(HashTable *h) { + uint32_t i; int j; - IntHashNode *n; + HashNode *n; for (i=0;ilength;i++) { for (n=h->table[i];n&&n->next;n=n->next) { - j=h->cmpFunc((HashTable)h,n->key,n->next->key); + j=h->cmpFunc(h,n->key,n->next->key); printf ("%c",j?(j<0?'-':'+'):'='); } printf ("\n"); @@ -151,26 +148,26 @@ static int _hashtable_test(IntHashTable *h) { } #endif -static int _hashtable_insert_node(IntHashTable *h,IntHashNode *node,int resize,int update,CollisionFunc cf) { - unsigned long hash=h->hashFunc((HashTable)h,node->key)%h->length; - IntHashNode **n,*nv; +static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) { + uint32_t hash=h->hashFunc(h,node->key)%h->length; + HashNode **n,*nv; int i; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; - i=h->cmpFunc((HashTable)h,nv->key,node->key); + i=h->cmpFunc(h,nv->key,node->key); if (!i) { if (cf) { nv->key=node->key; - cf((HashTable)h,&(nv->key),&(nv->value),node->key,node->value); + cf(h,&(nv->key),&(nv->value),node->key,node->value); free(node); return 1; } else { if (h->valDestroyFunc) { - h->valDestroyFunc((HashTable)h,nv->value); + h->valDestroyFunc(h,nv->value); } if (h->keyDestroyFunc) { - h->keyDestroyFunc((HashTable)h,nv->key); + h->keyDestroyFunc(h,nv->key); } nv->key=node->key; nv->value=node->value; @@ -192,17 +189,17 @@ static int _hashtable_insert_node(IntHashTable *h,IntHashNode *node,int resize,i } } -static int _hashtable_insert(IntHashTable *h,void *key,void *val,int resize,int update) { - IntHashNode **n,*nv; - IntHashNode *t; +static int _hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val,int resize,int update) { + HashNode **n,*nv; + HashNode *t; int i; - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; + uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; - i=h->cmpFunc((HashTable)h,nv->key,key); + i=h->cmpFunc(h,nv->key,key); if (!i) { - if (h->valDestroyFunc) { h->valDestroyFunc((HashTable)h,nv->value); } + if (h->valDestroyFunc) { h->valDestroyFunc(h,nv->value); } nv->value=val; return 1; } else if (i>0) { @@ -210,7 +207,7 @@ static int _hashtable_insert(IntHashTable *h,void *key,void *val,int resize,int } } if (!update) { - t=malloc(sizeof(IntHashNode)); + t=malloc(sizeof(HashNode)); if (!t) return 0; t->next=*n; *n=t; @@ -224,15 +221,15 @@ static int _hashtable_insert(IntHashTable *h,void *key,void *val,int resize,int } } -static int _hashtable_lookup_or_insert(IntHashTable *h,void *key,void **retVal,void *newVal,int resize) { - IntHashNode **n,*nv; - IntHashNode *t; +static int _hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *retVal,HashVal_t newVal,int resize) { + HashNode **n,*nv; + HashNode *t; int i; - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; + uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; - i=h->cmpFunc((HashTable)h,nv->key,key); + i=h->cmpFunc(h,nv->key,key); if (!i) { *retVal=nv->value; return 1; @@ -240,7 +237,7 @@ static int _hashtable_lookup_or_insert(IntHashTable *h,void *key,void **retVal,v break; } } - t=malloc(sizeof(IntHashNode)); + t=malloc(sizeof(HashNode)); if (!t) return 0; t->next=*n; *n=t; @@ -252,26 +249,25 @@ static int _hashtable_lookup_or_insert(IntHashTable *h,void *key,void **retVal,v return 1; } -int hashtable_insert_or_update_computed(HashTable H, - void *key, +int hashtable_insert_or_update_computed(HashTable *h, + HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc) { - IntHashTable *h=(IntHashTable *)H; - IntHashNode **n,*nv; - IntHashNode *t; + HashNode **n,*nv; + HashNode *t; int i; - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; + uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; - i=h->cmpFunc((HashTable)h,nv->key,key); + i=h->cmpFunc(h,nv->key,key); if (!i) { - void *old=nv->value; + HashVal_t old=nv->value; if (existsFunc) { - existsFunc(H,nv->key,&(nv->value)); + existsFunc(h,nv->key,&(nv->value)); if (nv->value!=old) { if (h->valDestroyFunc) { - h->valDestroyFunc((HashTable)h,old); + h->valDestroyFunc(h,old); } } } else { @@ -282,13 +278,13 @@ int hashtable_insert_or_update_computed(HashTable H, break; } } - t=malloc(sizeof(IntHashNode)); + t=malloc(sizeof(HashNode)); if (!t) return 0; t->key=key; t->next=*n; *n=t; if (newFunc) { - newFunc(H,t->key,&(t->value)); + newFunc(h,t->key,&(t->value)); } else { free(t); return 0; @@ -298,52 +294,47 @@ int hashtable_insert_or_update_computed(HashTable H, return 1; } -int hashtable_update(HashTable H,void *key,void *val) { - IntHashTable *h=(IntHashTable *)H; +int hashtable_update(HashTable *h,HashKey_t key,HashVal_t val) { return _hashtable_insert(h,key,val,1,0); } -int hashtable_insert(HashTable H,void *key,void *val) { - IntHashTable *h=(IntHashTable *)H; +int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val) { return _hashtable_insert(h,key,val,1,0); } -void hashtable_foreach_update(HashTable H,IteratorUpdateFunc i,void *u) { - IntHashTable *h=(IntHashTable *)H; - IntHashNode *n; - unsigned long x; +void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u) { + HashNode *n; + uint32_t x; if (h->table) { for (x=0;xlength;x++) { for (n=h->table[x];n;n=n->next) { - i((HashTable)h,n->key,(void **)&(n->value),u); + i(h,n->key,&(n->value),u); } } } } -void hashtable_foreach(HashTable H,IteratorFunc i,void *u) { - IntHashTable *h=(IntHashTable *)H; - IntHashNode *n; - unsigned long x; +void hashtable_foreach(HashTable *h,IteratorFunc i,void *u) { + HashNode *n; + uint32_t x; if (h->table) { for (x=0;xlength;x++) { for (n=h->table[x];n;n=n->next) { - i((HashTable)h,n->key,n->value,u); + i(h,n->key,n->value,u); } } } } -void hashtable_free(HashTable H) { - IntHashTable *h=(IntHashTable *)H; - IntHashNode *n,*nn; - unsigned long i; +void hashtable_free(HashTable *h) { + HashNode *n,*nn; + uint32_t i; if (h->table) { if (h->keyDestroyFunc || h->keyDestroyFunc) { - hashtable_foreach(H,_hashtable_destroy,NULL); + hashtable_foreach(h,_hashtable_destroy,NULL); } for (i=0;ilength;i++) { for (n=h->table[i];n;n=nn) { @@ -356,31 +347,29 @@ void hashtable_free(HashTable H) { free(h); } -DestroyFunc hashtable_set_value_destroy_func(HashTable H,DestroyFunc d) { - IntHashTable *h=(IntHashTable *)H; - DestroyFunc r=h->valDestroyFunc; +ValDestroyFunc hashtable_set_value_destroy_func(HashTable *h,ValDestroyFunc d) { + ValDestroyFunc r=h->valDestroyFunc; h->valDestroyFunc=d; return r; } -DestroyFunc hashtable_set_key_destroy_func(HashTable H,DestroyFunc d) { - IntHashTable *h=(IntHashTable *)H; - DestroyFunc r=h->keyDestroyFunc; +KeyDestroyFunc hashtable_set_key_destroy_func(HashTable *h,KeyDestroyFunc d) { + KeyDestroyFunc r=h->keyDestroyFunc; h->keyDestroyFunc=d; return r; } -static int _hashtable_remove(IntHashTable *h, - const void *key, - void **keyRet, - void **valRet, +static int _hashtable_remove(HashTable *h, + const HashKey_t key, + HashKey_t *keyRet, + HashVal_t *valRet, int resize) { - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; - IntHashNode *n,*p; + uint32_t hash=h->hashFunc(h,key)%h->length; + HashNode *n,*p; int i; for (p=NULL,n=h->table[hash];n;p=n,n=n->next) { - i=h->cmpFunc((HashTable)h,n->key,key); + i=h->cmpFunc(h,n->key,key); if (!i) { if (p) p=n->next; else h->table[hash]=n->next; *keyRet=n->key; @@ -395,17 +384,17 @@ static int _hashtable_remove(IntHashTable *h, return 0; } -static int _hashtable_delete(IntHashTable *h,const void *key,int resize) { - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; - IntHashNode *n,*p; +static int _hashtable_delete(HashTable *h,const HashKey_t key,int resize) { + uint32_t hash=h->hashFunc(h,key)%h->length; + HashNode *n,*p; int i; for (p=NULL,n=h->table[hash];n;p=n,n=n->next) { - i=h->cmpFunc((HashTable)h,n->key,key); + i=h->cmpFunc(h,n->key,key); if (!i) { if (p) p=n->next; else h->table[hash]=n->next; - if (h->valDestroyFunc) { h->valDestroyFunc((HashTable)h,n->value); } - if (h->keyDestroyFunc) { h->keyDestroyFunc((HashTable)h,n->key); } + if (h->valDestroyFunc) { h->valDestroyFunc(h,n->value); } + if (h->keyDestroyFunc) { h->keyDestroyFunc(h,n->key); } free(n); h->count++; return 1; @@ -416,39 +405,33 @@ static int _hashtable_delete(IntHashTable *h,const void *key,int resize) { return 0; } -int hashtable_remove(HashTable H,const void *key,void **keyRet,void **valRet) { - IntHashTable *h=(IntHashTable *)H; +int hashtable_remove(HashTable *h,const HashKey_t key,HashKey_t *keyRet,HashVal_t *valRet) { return _hashtable_remove(h,key,keyRet,valRet,1); } -int hashtable_delete(HashTable H,const void *key) { - IntHashTable *h=(IntHashTable *)H; +int hashtable_delete(HashTable *h,const HashKey_t key) { return _hashtable_delete(h,key,1); } -void hashtable_rehash_compute(HashTable H,CollisionFunc cf) { - IntHashTable *h=(IntHashTable *)H; +void hashtable_rehash_compute(HashTable *h,CollisionFunc cf) { _hashtable_rehash(h,cf,h->length); } -void hashtable_rehash(HashTable H) { - IntHashTable *h=(IntHashTable *)H; +void hashtable_rehash(HashTable *h) { _hashtable_rehash(h,NULL,h->length); } -int hashtable_lookup_or_insert(HashTable H,void *key,void **valp,void *val) { - IntHashTable *h=(IntHashTable *)H; +int hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *valp,HashVal_t val) { return _hashtable_lookup_or_insert(h,key,valp,val,1); } -int hashtable_lookup(const HashTable H,const void *key,void **valp) { - IntHashTable *h=(IntHashTable *)H; - unsigned long hash=h->hashFunc((HashTable)h,key)%h->length; - IntHashNode *n; +int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp) { + uint32_t hash=h->hashFunc(h,key)%h->length; + HashNode *n; int i; for (n=h->table[hash];n;n=n->next) { - i=h->cmpFunc((HashTable)h,n->key,key); + i=h->cmpFunc(h,n->key,key); if (!i) { *valp=n->value; return 1; @@ -459,18 +442,15 @@ int hashtable_lookup(const HashTable H,const void *key,void **valp) { return 0; } -unsigned long hashtable_get_count(const HashTable H) { - IntHashTable *h=(IntHashTable *)H; +uint32_t hashtable_get_count(const HashTable *h) { return h->count; } -void *hashtable_get_user_data(const HashTable H) { - IntHashTable *h=(IntHashTable *)H; +void *hashtable_get_user_data(const HashTable *h) { return h->userData; } -void *hashtable_set_user_data(HashTable H,void *data) { - IntHashTable *h=(IntHashTable *)H; +void *hashtable_set_user_data(HashTable *h,void *data) { void *r=h->userData; h->userData=data; return r; diff --git a/libImaging/QuantHash.h b/libImaging/QuantHash.h index b98b56eaa..028b4af89 100644 --- a/libImaging/QuantHash.h +++ b/libImaging/QuantHash.h @@ -9,28 +9,41 @@ * See the README file for information on usage and redistribution. */ -#ifndef __HASH_H__ -#define __HASH_H__ +#ifndef __QUANTHASH_H__ +#define __QUANTHASH_H__ #include "QuantTypes.h" -HashTable hashtable_new(HashFunc,HashCmpFunc); -void hashtable_free(HashTable); -void hashtable_foreach(HashTable,IteratorFunc,void *); -void hashtable_foreach_update(HashTable,IteratorUpdateFunc,void *); -int hashtable_insert(HashTable,void *,void *); -int hashtable_update(HashTable,void *,void *); -int hashtable_lookup(const HashTable,const void *,void **); -int hashtable_lookup_or_insert(HashTable,void *,void **,void *); -int hashtable_insert_or_update_computed(HashTable,void *,ComputeFunc,ComputeFunc); -int hashtable_delete(HashTable,const void *); -int hashtable_remove(HashTable,const void *,void **,void **); -void *hashtable_set_user_data(HashTable,void *); -void *hashtable_get_user_data(const HashTable); -DestroyFunc hashtable_set_key_destroy_func(HashTable,DestroyFunc); -DestroyFunc hashtable_set_value_destroy_func(HashTable,DestroyFunc); -unsigned long hashtable_get_count(const HashTable); -void hashtable_rehash(HashTable); -void hashtable_rehash_compute(HashTable,CollisionFunc); +typedef struct _HashTable HashTable; +typedef Pixel HashKey_t; +typedef uint32_t HashVal_t; -#endif +typedef uint32_t (*HashFunc)(const HashTable *,const HashKey_t); +typedef int (*HashCmpFunc)(const HashTable *,const HashKey_t,const HashKey_t); +typedef void (*IteratorFunc)(const HashTable *,const HashKey_t,const HashVal_t,void *); +typedef void (*IteratorUpdateFunc)(const HashTable *,const HashKey_t,HashVal_t *,void *); +typedef void (*KeyDestroyFunc)(const HashTable *,HashKey_t); +typedef void (*ValDestroyFunc)(const HashTable *,HashVal_t); +typedef void (*ComputeFunc)(const HashTable *,const HashKey_t,HashVal_t *); +typedef void (*CollisionFunc)(const HashTable *,HashKey_t *,HashVal_t *,HashKey_t,HashVal_t); + +HashTable * hashtable_new(HashFunc hf,HashCmpFunc cf); +void hashtable_free(HashTable *h); +void hashtable_foreach(HashTable *h,IteratorFunc i,void *u); +void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u); +int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val); +int hashtable_update(HashTable *h,HashKey_t key,HashVal_t val); +int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp); +int hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *valp,HashVal_t val); +int hashtable_insert_or_update_computed(HashTable *h,HashKey_t key,ComputeFunc newFunc,ComputeFunc existsFunc); +int hashtable_delete(HashTable *h,const HashKey_t key); +int hashtable_remove(HashTable *h,const HashKey_t key,HashKey_t *keyRet,HashVal_t *valRet); +void *hashtable_set_user_data(HashTable *h,void *data); +void *hashtable_get_user_data(const HashTable *h); +KeyDestroyFunc hashtable_set_key_destroy_func(HashTable *,KeyDestroyFunc d); +ValDestroyFunc hashtable_set_value_destroy_func(HashTable *,ValDestroyFunc d); +uint32_t hashtable_get_count(const HashTable *h); +void hashtable_rehash(HashTable *h); +void hashtable_rehash_compute(HashTable *h,CollisionFunc cf); + +#endif // __QUANTHASH_H__ diff --git a/libImaging/QuantHeap.c b/libImaging/QuantHeap.c index 9332a5cd7..bddcf142c 100644 --- a/libImaging/QuantHeap.c +++ b/libImaging/QuantHeap.c @@ -21,31 +21,29 @@ #include #include -#include "QuantHash.h" -#include "QuantDefines.h" +#include "QuantHeap.h" -typedef struct { +typedef struct _Heap { void **heap; int heapsize; int heapcount; HeapCmpFunc cf; -} IntHeap; +} Heap; #define INITIAL_SIZE 256 -#define DEBUG +// #define DEBUG #ifdef DEBUG -static int _heap_test(Heap); +static int _heap_test(Heap *); #endif -void ImagingQuantHeapFree(Heap H) { - IntHeap *h=(IntHeap *)H; +void ImagingQuantHeapFree(Heap *h) { free(h->heap); free(h); } -static int _heap_grow(IntHeap *h,int newsize) { +static int _heap_grow(Heap *h,int newsize) { void *newheap; if (!newsize) newsize=h->heapsize<<1; if (newsizeheapsize) return 0; @@ -59,15 +57,14 @@ static int _heap_grow(IntHeap *h,int newsize) { } #ifdef DEBUG -static int _heap_test(Heap H) { - IntHeap *h=(IntHeap *)H; +static int _heap_test(Heap *h) { int k; for (k=1;k*2<=h->heapcount;k++) { - if (h->cf(H,h->heap[k],h->heap[k*2])<0) { + if (h->cf(h,h->heap[k],h->heap[k*2])<0) { printf ("heap is bad\n"); return 0; } - if (k*2+1<=h->heapcount && h->cf(H,h->heap[k],h->heap[k*2+1])<0) { + if (k*2+1<=h->heapcount && h->cf(h,h->heap[k],h->heap[k*2+1])<0) { printf ("heap is bad\n"); return 0; } @@ -76,8 +73,7 @@ static int _heap_test(Heap H) { } #endif -int ImagingQuantHeapRemove(Heap H,void **r) { - IntHeap *h=(IntHeap *)H; +int ImagingQuantHeapRemove(Heap* h,void **r) { int k,l; void *v; @@ -89,31 +85,30 @@ int ImagingQuantHeapRemove(Heap H,void **r) { for (k=1;k*2<=h->heapcount;k=l) { l=k*2; if (lheapcount) { - if (h->cf(H,h->heap[l],h->heap[l+1])<0) { + if (h->cf(h,h->heap[l],h->heap[l+1])<0) { l++; } } - if (h->cf(H,v,h->heap[l])>0) { + if (h->cf(h,v,h->heap[l])>0) { break; } h->heap[k]=h->heap[l]; } h->heap[k]=v; #ifdef DEBUG - if (!_heap_test(H)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } + if (!_heap_test(h)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } #endif return 1; } -int ImagingQuantHeapAdd(Heap H,void *val) { - IntHeap *h=(IntHeap *)H; +int ImagingQuantHeapAdd(Heap *h,void *val) { int k; if (h->heapcount==h->heapsize-1) { _heap_grow(h,0); } k=++h->heapcount; while (k!=1) { - if (h->cf(H,val,h->heap[k/2])<=0) { + if (h->cf(h,val,h->heap[k/2])<=0) { break; } h->heap[k]=h->heap[k/2]; @@ -121,13 +116,12 @@ int ImagingQuantHeapAdd(Heap H,void *val) { } h->heap[k]=val; #ifdef DEBUG - if (!_heap_test(H)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } + if (!_heap_test(h)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } #endif return 1; } -int ImagingQuantHeapTop(Heap H,void **r) { - IntHeap *h=(IntHeap *)H; +int ImagingQuantHeapTop(Heap *h,void **r) { if (!h->heapcount) { return 0; } @@ -136,15 +130,14 @@ int ImagingQuantHeapTop(Heap H,void **r) { } Heap *ImagingQuantHeapNew(HeapCmpFunc cf) { - IntHeap *h; + Heap *h; - h=malloc(sizeof(IntHeap)); + h=malloc(sizeof(Heap)); if (!h) return NULL; h->heapsize=INITIAL_SIZE; h->heap=malloc(sizeof(void *)*h->heapsize); if (!h->heap) { free(h); return NULL; } h->heapcount=0; h->cf=cf; - return (Heap)h; + return h; } - diff --git a/libImaging/QuantHeap.h b/libImaging/QuantHeap.h index 5a213c42a..77bf0d9d5 100644 --- a/libImaging/QuantHeap.h +++ b/libImaging/QuantHeap.h @@ -9,15 +9,19 @@ * See the README file for information on usage and redistribution. */ -#ifndef __HEAP_H__ -#define __HEAP_H__ +#ifndef __QUANTHEAP_H__ +#define __QUANTHEAP_H__ #include "QuantTypes.h" -void ImagingQuantHeapFree(Heap); -int ImagingQuantHeapRemove(Heap,void **); -int ImagingQuantHeapAdd(Heap,void *); -int ImagingQuantHeapTop(Heap,void **); +typedef struct _Heap Heap; + +typedef int (*HeapCmpFunc)(const Heap *,const void *,const void *); + +void ImagingQuantHeapFree(Heap *); +int ImagingQuantHeapRemove(Heap *,void **); +int ImagingQuantHeapAdd(Heap *,void *); +int ImagingQuantHeapTop(Heap *,void **); Heap *ImagingQuantHeapNew(HeapCmpFunc); -#endif +#endif // __QUANTHEAP_H__ diff --git a/libImaging/QuantOctree.c b/libImaging/QuantOctree.c index fcdf9e0b0..e841d6fbb 100644 --- a/libImaging/QuantOctree.c +++ b/libImaging/QuantOctree.c @@ -27,15 +27,15 @@ #include #include -#include "Quant.h" +#include "QuantOctree.h" typedef struct _ColorBucket{ /* contains palette index when used for look up cube */ - unsigned long count; - unsigned long r; - unsigned long g; - unsigned long b; - unsigned long a; + uint32_t count; + uint32_t r; + uint32_t g; + uint32_t b; + uint32_t a; } *ColorBucket; typedef struct _ColorCube{ @@ -262,7 +262,7 @@ set_lookup_value(const ColorCube cube, const Pixel *p, long value) { bucket->count = value; } -unsigned long +uint32_t lookup_color(const ColorCube cube, const Pixel *p) { ColorBucket bucket = color_bucket_from_cube(cube, p); return bucket->count; @@ -302,9 +302,9 @@ create_palette_array(const ColorBucket palette, unsigned int paletteLength) { static void map_image_pixels(const Pixel *pixelData, - unsigned long nPixels, + uint32_t nPixels, const ColorCube lookupCube, - unsigned long *pixelArray) + uint32_t *pixelArray) { long i; for (i=0; i +#endif -typedef unsigned long (*HashFunc)(const HashTable,const void *); -typedef int (*HashCmpFunc)(const HashTable,const void *,const void *); -typedef void (*IteratorFunc)(const HashTable,const void *,const void *,void *); -typedef void (*IteratorUpdateFunc)(const HashTable,const void *,void **,void *); -typedef void (*DestroyFunc)(const HashTable,void *); -typedef void (*ComputeFunc)(const HashTable,const void *,void **); -typedef void (*CollisionFunc)(const HashTable,void **,void **,void *,void *); - -typedef int (*HeapCmpFunc)(const Heap,const void *,const void *); +typedef union { + struct { + unsigned char r,g,b,a; + } c; + struct { + unsigned char v[4]; + } a; + uint32_t v; +} Pixel; #endif From 836e3e05d8644d4f65c44a1aa02d953762900615 Mon Sep 17 00:00:00 2001 From: David Schmidt Date: Tue, 9 Apr 2013 13:21:38 +0200 Subject: [PATCH 007/102] create a palette before converting transparent L-Mode to RGBA fixes #154 --- PIL/Image.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PIL/Image.py b/PIL/Image.py index 1e29db198..cafc5a22f 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -713,6 +713,16 @@ class Image: if dither is None: dither = FLOYDSTEINBERG + # fake a P-mode image, otherwise the transparency will get lost as there is + # currently no other way to convert transparency into an RGBA image + if self.mode == "L" and mode == "RGBA" and "transparency" in self.info: + from PIL import ImagePalette + self.mode = "P" + bytePalette = bytes([i//3 for i in range(768)]) + self.palette = ImagePalette.raw("RGB", bytePalette) + self.palette.dirty = 1 + self.load() + try: im = self.im.convert(mode, dither) except ValueError: From 2838015c8492c428ca48df347c2235330b5992c1 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 9 Apr 2013 12:25:55 -0700 Subject: [PATCH 008/102] header formating --- README.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index f7e559f76..e3b0e161b 100644 --- a/README.rst +++ b/README.rst @@ -24,7 +24,7 @@ Why a fork? PIL is not setuptools compatible. Please see http://mail.python.org/pipermail/image-sig/2010-August/006480.html for a more detailed explanation. Also, PIL's current bi-yearly (or greater) release schedule is too infrequent to accomodate the large number and frequency of issues reported. Porting -======= +------- Pillow is a functional dropin for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging @@ -101,12 +101,12 @@ Current platform support for Pillow. Binary distributions are contributed for ea .. [2] In some cases, x86 support may indicate 32-bit compilation on 64-bit architecture (vs. compilation on 32-bit hardware). Installation -============ +------------ If there is a binary package for your system, that is the preferred way of obtaining Pillow. Building from Source --------------------- ++++++++++ Some of Pillow's features require external libraries. @@ -135,7 +135,7 @@ Once you have assembed the prerequisites, run: $ pip install pillow Platform Specific Instructions ------------------------------- ++++++++++ Mac OSX ******* @@ -158,6 +158,8 @@ The library prerequisites are installed with:: # Ubuntu 12.04 LTS sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev +Windows +******* Donations --------- From 88d38e80b486b5871d80ce63d9c6251e12d59dfb Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 9 Apr 2013 12:43:23 -0700 Subject: [PATCH 009/102] OSX instructions --- README.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.rst b/README.rst index e3b0e161b..59300a650 100644 --- a/README.rst +++ b/README.rst @@ -139,6 +139,19 @@ Platform Specific Instructions Mac OSX ******* +We don't currently have official binary builds for OSX. You'll need Xcode to build the package. Xcode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever Xcode compiled your python. + +The easiest way to install the prerequisites is to use homebrew: http://mxcl.github.com/homebrew/ . Then run: + +:: + +$ brew install libtiff lbjpeg webp littlecms + +If you've built your own python, then you should be able to install Pillow using + +:: + +$ pip install pillow Ubuntu or Debian ****** From ce3b7231b45e3dcaddb3a0020dc5d09f00dd838a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 9 Apr 2013 13:08:45 -0700 Subject: [PATCH 010/102] wording, undone --- README.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 59300a650..6d7a52fcb 100644 --- a/README.rst +++ b/README.rst @@ -38,7 +38,9 @@ to:: from PIL import Image -Note that if your code imports _imaging, that will also be hosted in the PIL namespace. The preferred method of importing _imaging is:: +Note that if your code imports _imaging, that will also be hosted in +the PIL namespace. The preferred, future proof method of importing the +private _imaging module is:: from PIL import Image _imaging = Image.core @@ -103,7 +105,7 @@ Current platform support for Pillow. Binary distributions are contributed for ea Installation ------------ -If there is a binary package for your system, that is the preferred way of obtaining Pillow. +If there is a binary package for your system, that is the preferred way of obtaining Pillow. [[UNDONE: Binary links]] Building from Source +++++++++ From f0f405ac92a4ec93b936c158052fe038c91af2ec Mon Sep 17 00:00:00 2001 From: "Fabio M. Costa" Date: Wed, 10 Apr 2013 18:39:44 -0400 Subject: [PATCH 011/102] makes sure this script is executed with systems python Also removed some unused imports --- Scripts/pilfont.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/pilfont.py b/Scripts/pilfont.py index 21cfa864d..ec25e7a71 100644 --- a/Scripts/pilfont.py +++ b/Scripts/pilfont.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ @@ -13,8 +14,7 @@ from __future__ import print_function VERSION = "0.4" -import site -import glob, os, sys +import glob, sys # drivers from PIL import BdfFontFile From e44f35eec2448a15185b651a6a2df00e5d7c716d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 11 Apr 2013 18:57:27 +0900 Subject: [PATCH 012/102] Revert pull request #45 --- _imagingft.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index e19125e04..7028293ec 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -282,7 +282,7 @@ font_render(FontObject* self, PyObject* args) { int i, x, y; Imaging im; - int index, error, ascender, descender; + int index, error, ascender; int load_flags; unsigned char *source; FT_ULong ch; @@ -332,7 +332,6 @@ font_render(FontObject* self, PyObject* args) int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; ascender = PIXEL(self->face->size->metrics.ascender); - descender = PIXEL(self->face->size->metrics.descender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -341,7 +340,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender + descender - glyph->bitmap_top; + int yy = y + ascender - glyph->bitmap_top; if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; @@ -362,7 +361,6 @@ font_render(FontObject* self, PyObject* args) int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; ascender = PIXEL(self->face->size->metrics.ascender); - descender = PIXEL(self->face->size->metrics.descender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -371,7 +369,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender + descender - glyph->bitmap_top; + int yy = y + ascender - glyph->bitmap_top; if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; From efd70fb295c94936abb099256411f52a46a5c483 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 11 Apr 2013 19:16:26 +0900 Subject: [PATCH 013/102] Fix rendered characters have been chipped for some TrueType fonts This patch is from http://pastebin.com/jP2iLkDN --- _imagingft.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index 7028293ec..fad450722 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -35,6 +35,8 @@ #include #endif +#include FT_GLYPH_H + #define KEEP_PY_UNICODE #include "py3.h" @@ -141,7 +143,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) return (PyObject*) self; } - + static int font_getchar(PyObject* string, int index, FT_ULong* char_out) { @@ -171,7 +173,7 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) static PyObject* font_getsize(FontObject* self, PyObject* args) { - int i, x; + int i, x, y_max, y_min; FT_ULong ch; FT_Face face; int xoffset; @@ -195,6 +197,7 @@ font_getsize(FontObject* self, PyObject* args) face = NULL; xoffset = 0; + y_max = y_min = 0; for (x = i = 0; font_getchar(string, i, &ch); i++) { int index, error; @@ -212,6 +215,16 @@ font_getsize(FontObject* self, PyObject* args) if (i == 0) xoffset = face->glyph->metrics.horiBearingX; x += face->glyph->metrics.horiAdvance; + + FT_BBox bbox; + FT_Glyph glyph; + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); + if (bbox.yMax > y_max) + y_max = bbox.yMax; + if (bbox.yMin < y_min) + y_min = bbox.yMin; + last_index = index; } @@ -232,7 +245,7 @@ font_getsize(FontObject* self, PyObject* args) return Py_BuildValue( "(ii)(ii)", - PIXEL(x), PIXEL(self->face->size->metrics.height), + PIXEL(x), PIXEL(y_max - y_min), PIXEL(xoffset), 0 ); } @@ -313,6 +326,19 @@ font_render(FontObject* self, PyObject* args) if (mask) load_flags |= FT_LOAD_TARGET_MONO; + int temp; + ascender = 0; + for (i = 0; font_getchar(string, i, &ch); i++) { + index = FT_Get_Char_Index(self->face, ch); + error = FT_Load_Glyph(self->face, index, load_flags); + if (error) + return geterror(error); + glyph = self->face->glyph; + temp = (glyph->bitmap.rows - glyph->bitmap_top); + if (temp > ascender) + ascender = temp; + } + for (x = i = 0; font_getchar(string, i, &ch); i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -PIXEL(self->face->glyph->metrics.horiBearingX); @@ -331,7 +357,6 @@ font_render(FontObject* self, PyObject* args) /* use monochrome mask (on palette images, etc) */ int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; - ascender = PIXEL(self->face->size->metrics.ascender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -340,7 +365,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender - glyph->bitmap_top; + int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; @@ -360,7 +385,6 @@ font_render(FontObject* self, PyObject* args) /* use antialiased rendering */ int xx, x0, x1; source = (unsigned char*) glyph->bitmap.buffer; - ascender = PIXEL(self->face->size->metrics.ascender); xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; @@ -369,7 +393,7 @@ font_render(FontObject* self, PyObject* args) if (xx + x1 > im->xsize) x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { - int yy = y + ascender - glyph->bitmap_top; + int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; From 0b9e4047611bb13f9163acfe73ab72e073a6e183 Mon Sep 17 00:00:00 2001 From: "Fabio M. Costa" Date: Fri, 12 Apr 2013 01:25:16 -0400 Subject: [PATCH 014/102] DRYing out the code --- _imagingft.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index fad450722..e29e3a244 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -349,21 +349,25 @@ font_render(FontObject* self, PyObject* args) &delta); x += delta.x >> 6; } + error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); + glyph = self->face->glyph; + + int xx, x0, x1; + source = (unsigned char*) glyph->bitmap.buffer; + xx = x + glyph->bitmap_left; + x0 = 0; + x1 = glyph->bitmap.width; + if (xx < 0) + x0 = -xx; + if (xx + x1 > im->xsize) + x1 = im->xsize - xx; + if (mask) { /* use monochrome mask (on palette images, etc) */ - int xx, x0, x1; - source = (unsigned char*) glyph->bitmap.buffer; - xx = x + glyph->bitmap_left; - x0 = 0; - x1 = glyph->bitmap.width; - if (xx < 0) - x0 = -xx; - if (xx + x1 > im->xsize) - x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { @@ -383,15 +387,6 @@ font_render(FontObject* self, PyObject* args) } } else { /* use antialiased rendering */ - int xx, x0, x1; - source = (unsigned char*) glyph->bitmap.buffer; - xx = x + glyph->bitmap_left; - x0 = 0; - x1 = glyph->bitmap.width; - if (xx < 0) - x0 = -xx; - if (xx + x1 > im->xsize) - x1 = im->xsize - xx; for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { From e2c62ff1d2cd3f99d8f88840c2931d341178aaf7 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 16:52:00 +0200 Subject: [PATCH 015/102] Fix warning: pointer targets differ in signedness --- libImaging/JpegEncode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libImaging/JpegEncode.c b/libImaging/JpegEncode.c index 1caa50de5..221f8ccfa 100644 --- a/libImaging/JpegEncode.c +++ b/libImaging/JpegEncode.c @@ -221,7 +221,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->extra_offset = context->extra_size; //add exif header if (context->rawExifLen > 0) - jpeg_write_marker(&context->cinfo, JPEG_APP0+1, context->rawExif, context->rawExifLen); + jpeg_write_marker(&context->cinfo, JPEG_APP0+1, (unsigned char*)context->rawExif, context->rawExifLen); break; default: @@ -229,7 +229,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) jpeg_start_compress(&context->cinfo, TRUE); //add exif header if (context->rawExifLen > 0) - jpeg_write_marker(&context->cinfo, JPEG_APP0+1, context->rawExif, context->rawExifLen); + jpeg_write_marker(&context->cinfo, JPEG_APP0+1, (unsigned char*)context->rawExif, context->rawExifLen); break; } From 6c013c2d972e6a48f683acbf3d048840c0f1b334 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 17:01:53 +0200 Subject: [PATCH 016/102] Fix warnings: passing argument from incompatible pointer type, pointer targets differ in signedness, unused variable --- _webp.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/_webp.c b/_webp.c index 84418980c..cf53ff252 100644 --- a/_webp.c +++ b/_webp.c @@ -20,7 +20,7 @@ PyObject* WebPEncodeRGB_wrapper(PyObject* self, PyObject* args) return Py_None; } - PyBytes_AsStringAndSize((PyObject *) rgb_string, &rgb, &size); + PyBytes_AsStringAndSize((PyObject *) rgb_string, (char**)&rgb, &size); if (stride * height > size) { Py_INCREF(Py_None); @@ -29,7 +29,7 @@ PyObject* WebPEncodeRGB_wrapper(PyObject* self, PyObject* args) ret_size = WebPEncodeRGB(rgb, width, height, stride, quality_factor, &output); if (ret_size > 0) { - PyObject *ret = PyBytes_FromStringAndSize(output, ret_size); + PyObject *ret = PyBytes_FromStringAndSize((char*)output, ret_size); free(output); return ret; } @@ -41,7 +41,6 @@ PyObject* WebPEncodeRGB_wrapper(PyObject* self, PyObject* args) PyObject* WebPDecodeRGB_wrapper(PyObject* self, PyObject* args) { PyBytesObject *webp_string; - float quality_factor; int width; int height; uint8_t *webp; @@ -54,11 +53,11 @@ PyObject* WebPDecodeRGB_wrapper(PyObject* self, PyObject* args) return Py_None; } - PyBytes_AsStringAndSize((PyObject *) webp_string, &webp, &size); + PyBytes_AsStringAndSize((PyObject *) webp_string, (char**)&webp, &size); output = WebPDecodeRGB(webp, size, &width, &height); - ret = PyBytes_FromStringAndSize(output, width * height * 3); + ret = PyBytes_FromStringAndSize((char*)output, width * height * 3); free(output); return Py_BuildValue("Sii", ret, width, height); } @@ -90,7 +89,6 @@ PyInit__webp(void) { PyMODINIT_FUNC init_webp() { - PyObject* m; - m = Py_InitModule("_webp", webpMethods); + Py_InitModule("_webp", webpMethods); } #endif From 3b6392bbda12b744a07c2cbb59efb6c89c87a5da Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 17:08:46 +0200 Subject: [PATCH 017/102] Fix warnings: _POSIX_C_SOURCE, _XOPEN_SOURCE redefined (caused by indirectly including system headers before Python.h) --- Tk/tkImaging.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tk/tkImaging.c b/Tk/tkImaging.c index 4234a7d2b..319645d56 100644 --- a/Tk/tkImaging.c +++ b/Tk/tkImaging.c @@ -48,9 +48,8 @@ for the Tcl_CreateCommand command. */ #define USE_COMPAT_CONST -#include "tk.h" - #include "Imaging.h" +#include "tk.h" #include From 0a8291e1a4000d1065179a08e7f0430a61f30936 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 17:11:36 +0200 Subject: [PATCH 018/102] Fix warnings: variable set but not used --- Sane/_sane.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sane/_sane.c b/Sane/_sane.c index b424015a8..2001be421 100644 --- a/Sane/_sane.c +++ b/Sane/_sane.c @@ -408,7 +408,6 @@ static PyObject * SaneDev_set_auto_option(SaneDevObject *self, PyObject *args) { SANE_Status st; - const SANE_Option_Descriptor *d; SANE_Int i; int n; @@ -419,7 +418,6 @@ SaneDev_set_auto_option(SaneDevObject *self, PyObject *args) PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } - d=sane_get_option_descriptor(self->h, n); st=sane_control_option(self->h, n, SANE_ACTION_SET_AUTO, NULL, &i); if (st) {return PySane_Error(st);} From f2630f6c37bdf77f2d7c08adf5dc7a465e073e16 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 19:43:09 +0200 Subject: [PATCH 019/102] Remove old files --- docs/Makefile | 153 ------ docs/conf.py | 235 --------- docs/effbot.css | 118 ----- docs/index.rst | 180 ------- docs/make.bat | 190 ------- docs/pythondoc-PIL.ArgImagePlugin.rst | 17 - docs/pythondoc-PIL.BdfFontFile.rst | 17 - docs/pythondoc-PIL.BmpImagePlugin.rst | 17 - docs/pythondoc-PIL.BufrStubImagePlugin.rst | 12 - docs/pythondoc-PIL.ContainerIO.rst | 51 -- docs/pythondoc-PIL.CurImagePlugin.rst | 17 - docs/pythondoc-PIL.DcxImagePlugin.rst | 17 - docs/pythondoc-PIL.EpsImagePlugin.rst | 17 - docs/pythondoc-PIL.ExifTags.rst | 12 - docs/pythondoc-PIL.FitsStubImagePlugin.rst | 12 - docs/pythondoc-PIL.FliImagePlugin.rst | 20 - docs/pythondoc-PIL.FontFile.rst | 17 - docs/pythondoc-PIL.FpxImagePlugin.rst | 17 - docs/pythondoc-PIL.GbrImagePlugin.rst | 17 - docs/pythondoc-PIL.GdImageFile.rst | 29 -- docs/pythondoc-PIL.GifImagePlugin.rst | 17 - docs/pythondoc-PIL.GimpGradientFile.rst | 19 - docs/pythondoc-PIL.GimpPaletteFile.rst | 19 - docs/pythondoc-PIL.GribStubImagePlugin.rst | 12 - docs/pythondoc-PIL.Hdf5StubImagePlugin.rst | 12 - docs/pythondoc-PIL.IcnsImagePlugin.rst | 19 - docs/pythondoc-PIL.IcoImagePlugin.rst | 17 - docs/pythondoc-PIL.ImImagePlugin.rst | 17 - docs/pythondoc-PIL.Image.rst | 557 --------------------- docs/pythondoc-PIL.ImageChops.rst | 163 ------ docs/pythondoc-PIL.ImageColor.rst | 13 - docs/pythondoc-PIL.ImageDraw.rst | 69 --- docs/pythondoc-PIL.ImageEnhance.rst | 74 --- docs/pythondoc-PIL.ImageFile.rst | 84 ---- docs/pythondoc-PIL.ImageFileIO.rst | 32 -- docs/pythondoc-PIL.ImageFilter.rst | 226 --------- docs/pythondoc-PIL.ImageFont.rst | 98 ---- docs/pythondoc-PIL.ImageGL.rst | 20 - docs/pythondoc-PIL.ImageGrab.rst | 24 - docs/pythondoc-PIL.ImageOps.rst | 113 ----- docs/pythondoc-PIL.ImagePalette.rst | 19 - docs/pythondoc-PIL.ImagePath.rst | 30 -- docs/pythondoc-PIL.ImageSequence.rst | 23 - docs/pythondoc-PIL.ImageStat.rst | 29 -- docs/pythondoc-PIL.ImageTk.rst | 92 ---- docs/pythondoc-PIL.ImageTransform.rst | 114 ----- docs/pythondoc-PIL.ImageWin.rst | 107 ---- docs/pythondoc-PIL.ImtImagePlugin.rst | 17 - docs/pythondoc-PIL.IptcImagePlugin.rst | 27 - docs/pythondoc-PIL.JpegImagePlugin.rst | 19 - docs/pythondoc-PIL.McIdasImagePlugin.rst | 19 - docs/pythondoc-PIL.MicImagePlugin.rst | 17 - docs/pythondoc-PIL.MpegImagePlugin.rst | 19 - docs/pythondoc-PIL.MspImagePlugin.rst | 17 - docs/pythondoc-PIL.OleFileIO.rst | 31 -- docs/pythondoc-PIL.PSDraw.rst | 17 - docs/pythondoc-PIL.PaletteFile.rst | 17 - docs/pythondoc-PIL.PalmImagePlugin.rst | 12 - docs/pythondoc-PIL.PcdImagePlugin.rst | 17 - docs/pythondoc-PIL.PcfFontFile.rst | 17 - docs/pythondoc-PIL.PcxImagePlugin.rst | 17 - docs/pythondoc-PIL.PdfImagePlugin.rst | 11 - docs/pythondoc-PIL.PixarImagePlugin.rst | 19 - docs/pythondoc-PIL.PngImagePlugin.rst | 17 - docs/pythondoc-PIL.PpmImagePlugin.rst | 17 - docs/pythondoc-PIL.PsdImagePlugin.rst | 17 - docs/pythondoc-PIL.SgiImagePlugin.rst | 17 - docs/pythondoc-PIL.SpiderImagePlugin.rst | 28 -- docs/pythondoc-PIL.SunImagePlugin.rst | 17 - docs/pythondoc-PIL.TarIO.rst | 24 - docs/pythondoc-PIL.TgaImagePlugin.rst | 17 - docs/pythondoc-PIL.TiffImagePlugin.rst | 32 -- docs/pythondoc-PIL.TiffTags.rst | 12 - docs/pythondoc-PIL.WalImageFile.rst | 16 - docs/pythondoc-PIL.WmfImagePlugin.rst | 24 - docs/pythondoc-PIL.XVThumbImagePlugin.rst | 19 - docs/pythondoc-PIL.XbmImagePlugin.rst | 17 - docs/pythondoc-PIL.XpmImagePlugin.rst | 17 - 78 files changed, 3768 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py delete mode 100644 docs/effbot.css delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/pythondoc-PIL.ArgImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.BdfFontFile.rst delete mode 100644 docs/pythondoc-PIL.BmpImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.BufrStubImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.ContainerIO.rst delete mode 100644 docs/pythondoc-PIL.CurImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.DcxImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.EpsImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.ExifTags.rst delete mode 100644 docs/pythondoc-PIL.FitsStubImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.FliImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.FontFile.rst delete mode 100644 docs/pythondoc-PIL.FpxImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.GbrImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.GdImageFile.rst delete mode 100644 docs/pythondoc-PIL.GifImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.GimpGradientFile.rst delete mode 100644 docs/pythondoc-PIL.GimpPaletteFile.rst delete mode 100644 docs/pythondoc-PIL.GribStubImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.Hdf5StubImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.IcnsImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.IcoImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.ImImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.Image.rst delete mode 100644 docs/pythondoc-PIL.ImageChops.rst delete mode 100644 docs/pythondoc-PIL.ImageColor.rst delete mode 100644 docs/pythondoc-PIL.ImageDraw.rst delete mode 100644 docs/pythondoc-PIL.ImageEnhance.rst delete mode 100644 docs/pythondoc-PIL.ImageFile.rst delete mode 100644 docs/pythondoc-PIL.ImageFileIO.rst delete mode 100644 docs/pythondoc-PIL.ImageFilter.rst delete mode 100644 docs/pythondoc-PIL.ImageFont.rst delete mode 100644 docs/pythondoc-PIL.ImageGL.rst delete mode 100644 docs/pythondoc-PIL.ImageGrab.rst delete mode 100644 docs/pythondoc-PIL.ImageOps.rst delete mode 100644 docs/pythondoc-PIL.ImagePalette.rst delete mode 100644 docs/pythondoc-PIL.ImagePath.rst delete mode 100644 docs/pythondoc-PIL.ImageSequence.rst delete mode 100644 docs/pythondoc-PIL.ImageStat.rst delete mode 100644 docs/pythondoc-PIL.ImageTk.rst delete mode 100644 docs/pythondoc-PIL.ImageTransform.rst delete mode 100644 docs/pythondoc-PIL.ImageWin.rst delete mode 100644 docs/pythondoc-PIL.ImtImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.IptcImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.JpegImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.McIdasImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.MicImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.MpegImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.MspImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.OleFileIO.rst delete mode 100644 docs/pythondoc-PIL.PSDraw.rst delete mode 100644 docs/pythondoc-PIL.PaletteFile.rst delete mode 100644 docs/pythondoc-PIL.PalmImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PcdImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PcfFontFile.rst delete mode 100644 docs/pythondoc-PIL.PcxImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PdfImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PixarImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PngImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PpmImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.PsdImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.SgiImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.SpiderImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.SunImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.TarIO.rst delete mode 100644 docs/pythondoc-PIL.TgaImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.TiffImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.TiffTags.rst delete mode 100644 docs/pythondoc-PIL.WalImageFile.rst delete mode 100644 docs/pythondoc-PIL.WmfImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.XVThumbImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.XbmImagePlugin.rst delete mode 100644 docs/pythondoc-PIL.XpmImagePlugin.rst diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 7f5429b08..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Pillowdocumentation.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Pillowdocumentation.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Pillowdocumentation" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Pillowdocumentation" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 9847e3ca9..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,235 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Pillow documentation documentation build configuration file, created by -# sphinx-quickstart on Thu Feb 16 20:04:11 2012. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Pillow (PIL fork)' -copyright = u'Copyright © 1997-2011 by Secret Labs AB Copyright © 1995-2011 by Fredrik Lundh' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '2.0.0' -# The full version, including alpha/beta/rc tags. -release = '2.0.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -#htmlhelp_basename = None - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' diff --git a/docs/effbot.css b/docs/effbot.css deleted file mode 100644 index d137735c7..000000000 --- a/docs/effbot.css +++ /dev/null @@ -1,118 +0,0 @@ -/* effbot.css */ - -BODY { - font: 100% Georgia, Times, serif; - color: black; - margin: 0px 20px 0px 20px; -} - -#effbot-body { - background: white; - padding: 10px 40px 10px 40px; - max-width: 50em; -} - -#effbot-menu { - display: none; -} - -.adsense { - background: #f8fff8; - border: 1px solid #084; - padding: 10px 4px 4px 4px; -} - -.sidebar { - border: 1px solid #000; - float: right; clear: right; - width: 200px; - background: white; - padding: 10px; - margin: 0px -25px 10px 0px; -} - -/* visual style */ - -P { - line-height: 1.3em; -} - -CODE, PRE { - font: 100% "Courier New", Courier, Monaco, monospace; - color: #042; margin-left: 20px; -} - -H1, H2, H3 { - font-family: Georgia, Times, serif; - color: #084; margin-top: 30px; -} - -H1, H2, { border-top: 1px solid #084; } - -H4, H5, H6 { - font-family: Georgia, Times, serif; - color: #084; margin-top: 15px; -} - -A:link, A:hover { color: #084; } -A:visited { color: #404040; } - -UL LI { list-style-type: square; } - -.title { margin-bottom: 2px; color: #084; } -.info { font-size: 80%; color: #084; margin-top: 0px; } - -.bluebox { color: #084; margin-top: 10px; } - -.highlight { background: #cfc; } -.mark { color: #084; } -.small { font-size: 80%; } -.display { background: #eee; padding: 20px; } - -.note { - background: #efe; - border-top: 1px solid #084; - border-bottom: 1px solid #084; - padding: 2px 20px; -} - -.example { - border-top: medium solid #084; - border-bottom: medium solid #084; - padding: 5px; -} - -.figure { - border-top: medium solid #084; - border-bottom: medium solid #084; - padding: 5px; -} - -.fixme { - background: #eee; - border: 1px solid #084; - padding: 2x 20px; -} - -.simpletable { - border: 1px solid #084; - border-collapse: collapse; -} - -.simpletable TH { - text-align: left; - background: #cfc; - border: 1px solid #084; - margin: 0px; - padding: 1px 5px; -} - -.simpletable TD { - border: 1px solid #084; - margin: 0px; - padding: 5px; -} - -/* xmldiff markup */ -.new { text-decoration: underline; color: red; background: #fff0f0; } -.old { text-decoration: line-through; color: blue; background: #f0f0ff; } diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 985e656b4..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,180 +0,0 @@ -========================== -The Python Imaging Library -========================== - -The Python Imaging Library -========================== - -Online Resources -~~~~~~~~~~~~~~~~ - -`*Python Imaging Library* `_ -(official product page at `pythonware.com `_) - -`*Python Imaging Library* `_ -(development page at `effbot.org `_) - -Package Contents -~~~~~~~~~~~~~~~~ - -The following pages are generated from -`**pythondoc** `_ markup in the -source files. - -`The PIL.Image Module `_ - -`The PIL.ImageChops Module `_ - -`The PIL.ImageColor Module `_ - -`The PIL.ImageDraw Module `_ - -`The PIL.ImageEnhance Module `_ - -`The PIL.ImageFile Module `_ - -`The PIL.ImageFileIO Module `_ - -`The PIL.ImageFilter Module `_ - -`The PIL.ImageFont Module `_ - -`The PIL.ImageGL Module `_ - -`The PIL.ImageGrab Module `_ - -`The PIL.ImageMath Module `_ - -`The PIL.ImageMode Module `_ - -`The PIL.ImageOps Module `_ - -`The PIL.ImagePalette Module `_ - -`The PIL.ImagePath Module `_ - -`The PIL.ImageQt Module `_ - -`The PIL.ImageSequence Module `_ - -`The PIL.ImageStat Module `_ - -`The PIL.ImageTk Module `_ - -`The PIL.ImageTransform Module `_ - -`The PIL.ImageWin Module `_ - -`The PIL.ArgImagePlugin Module `_ - -`The PIL.BdfFontFile Module `_ - -`The PIL.BmpImagePlugin Module `_ - -`The PIL.BufrStubImagePlugin -Module `_ - -`The PIL.ContainerIO Module `_ - -`The PIL.CurImagePlugin Module `_ - -`The PIL.DcxImagePlugin Module `_ - -`The PIL.EpsImagePlugin Module `_ - -`The PIL.ExifTags Module `_ - -`The PIL.FitsStubImagePlugin -Module `_ - -`The PIL.FliImagePlugin Module `_ - -`The PIL.FontFile Module `_ - -`The PIL.FpxImagePlugin Module `_ - -`The PIL.GbrImagePlugin Module `_ - -`The PIL.GdImageFile Module `_ - -`The PIL.GifImagePlugin Module `_ - -`The PIL.GimpGradientFile Module `_ - -`The PIL.GimpPaletteFile Module `_ - -`The PIL.GribStubImagePlugin -Module `_ - -`The PIL.Hdf5StubImagePlugin -Module `_ - -`The PIL.IcnsImagePlugin Module `_ - -`The PIL.IcoImagePlugin Module `_ - -`The PIL.ImImagePlugin Module `_ - -`The PIL.ImtImagePlugin Module `_ - -`The PIL.IptcImagePlugin Module `_ - -`The PIL.JpegImagePlugin Module `_ - -`The PIL.McIdasImagePlugin -Module `_ - -`The PIL.MicImagePlugin Module `_ - -`The PIL.MpegImagePlugin Module `_ - -`The PIL.MspImagePlugin Module `_ - -`The PIL.OleFileIO Module `_ - -`The PIL.PSDraw Module `_ - -`The PIL.PaletteFile Module `_ - -`The PIL.PalmImagePlugin Module `_ - -`The PIL.PcdImagePlugin Module `_ - -`The PIL.PcfFontFile Module `_ - -`The PIL.PcxImagePlugin Module `_ - -`The PIL.PdfImagePlugin Module `_ - -`The PIL.PixarImagePlugin Module `_ - -`The PIL.PngImagePlugin Module `_ - -`The PIL.PpmImagePlugin Module `_ - -`The PIL.PsdImagePlugin Module `_ - -`The PIL.SgiImagePlugin Module `_ - -`The PIL.SunImagePlugin Module `_ - -`The PIL.TarIO Module `_ - -`The PIL.TgaImagePlugin Module `_ - -`The PIL.TiffImagePlugin Module `_ - -`The PIL.TiffTags Module `_ - -`The PIL.WalImageFile Module `_ - -`The PIL.WbmpImagePlugin Module `_ - -`The PIL.WmfImagePlugin Module `_ - -`The PIL.XVThumbImagePlugin -Module `_ - -`The PIL.XbmImagePlugin Module `_ - -`The PIL.XpmImagePlugin Module `_ diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 42103d031..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,190 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Pillowdocumentation.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Pillowdocumentation.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -:end diff --git a/docs/pythondoc-PIL.ArgImagePlugin.rst b/docs/pythondoc-PIL.ArgImagePlugin.rst deleted file mode 100644 index 1d35c535f..000000000 --- a/docs/pythondoc-PIL.ArgImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.ArgImagePlugin Module -============================= - -The PIL.ArgImagePlugin Module -============================= - -**ArgImageFile** (class) [`# <#PIL.ArgImagePlugin.ArgImageFile-class>`_] - Image plugin for the experimental Animated Raster Graphics format. - - For more information about this class, see `*The ArgImageFile - Class* <#PIL.ArgImagePlugin.ArgImageFile-class>`_. - -The ArgImageFile Class ----------------------- - -**ArgImageFile** (class) [`# <#PIL.ArgImagePlugin.ArgImageFile-class>`_] diff --git a/docs/pythondoc-PIL.BdfFontFile.rst b/docs/pythondoc-PIL.BdfFontFile.rst deleted file mode 100644 index 350cbfa28..000000000 --- a/docs/pythondoc-PIL.BdfFontFile.rst +++ /dev/null @@ -1,17 +0,0 @@ -========================== -The PIL.BdfFontFile Module -========================== - -The PIL.BdfFontFile Module -========================== - -**BdfFontFile(fp)** (class) [`# <#PIL.BdfFontFile.BdfFontFile-class>`_] - Font file plugin for the X11 BDF format. - - For more information about this class, see `*The BdfFontFile - Class* <#PIL.BdfFontFile.BdfFontFile-class>`_. - -The BdfFontFile Class ---------------------- - -**BdfFontFile(fp)** (class) [`# <#PIL.BdfFontFile.BdfFontFile-class>`_] diff --git a/docs/pythondoc-PIL.BmpImagePlugin.rst b/docs/pythondoc-PIL.BmpImagePlugin.rst deleted file mode 100644 index 3f552a8e6..000000000 --- a/docs/pythondoc-PIL.BmpImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.BmpImagePlugin Module -============================= - -The PIL.BmpImagePlugin Module -============================= - -**BmpImageFile** (class) [`# <#PIL.BmpImagePlugin.BmpImageFile-class>`_] - Image plugin for the Windows BMP format. - - For more information about this class, see `*The BmpImageFile - Class* <#PIL.BmpImagePlugin.BmpImageFile-class>`_. - -The BmpImageFile Class ----------------------- - -**BmpImageFile** (class) [`# <#PIL.BmpImagePlugin.BmpImageFile-class>`_] diff --git a/docs/pythondoc-PIL.BufrStubImagePlugin.rst b/docs/pythondoc-PIL.BufrStubImagePlugin.rst deleted file mode 100644 index afc2ccf33..000000000 --- a/docs/pythondoc-PIL.BufrStubImagePlugin.rst +++ /dev/null @@ -1,12 +0,0 @@ -================================== -The PIL.BufrStubImagePlugin Module -================================== - -The PIL.BufrStubImagePlugin Module -================================== - -**register\_handler(handler)** -[`# <#PIL.BufrStubImagePlugin.register_handler-function>`_] - - *handler* - diff --git a/docs/pythondoc-PIL.ContainerIO.rst b/docs/pythondoc-PIL.ContainerIO.rst deleted file mode 100644 index 52f351151..000000000 --- a/docs/pythondoc-PIL.ContainerIO.rst +++ /dev/null @@ -1,51 +0,0 @@ -========================== -The PIL.ContainerIO Module -========================== - -The PIL.ContainerIO Module -========================== - -**ContainerIO(file, offset, length)** (class) -[`# <#PIL.ContainerIO.ContainerIO-class>`_] - A file object that provides read access to a part of an existing - file (for example a TAR file). - - For more information about this class, see `*The ContainerIO - Class* <#PIL.ContainerIO.ContainerIO-class>`_. - -The ContainerIO Class ---------------------- - -**ContainerIO(file, offset, length)** (class) -[`# <#PIL.ContainerIO.ContainerIO-class>`_] -**\_\_init\_\_(file, offset, length)** -[`# <#PIL.ContainerIO.ContainerIO.__init__-method>`_] - - *file* - *offset* - *length* - -**isatty()** [`# <#PIL.ContainerIO.ContainerIO.isatty-method>`_] -**read(bytes=0)** [`# <#PIL.ContainerIO.ContainerIO.read-method>`_] - - *bytes* - Returns: - -**readline()** [`# <#PIL.ContainerIO.ContainerIO.readline-method>`_] - - Returns: - -**readlines()** [`# <#PIL.ContainerIO.ContainerIO.readlines-method>`_] - - Returns: - -**seek(offset, mode=0)** -[`# <#PIL.ContainerIO.ContainerIO.seek-method>`_] - - *offset* - *mode* - -**tell()** [`# <#PIL.ContainerIO.ContainerIO.tell-method>`_] - - Returns: - diff --git a/docs/pythondoc-PIL.CurImagePlugin.rst b/docs/pythondoc-PIL.CurImagePlugin.rst deleted file mode 100644 index 10d70f355..000000000 --- a/docs/pythondoc-PIL.CurImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.CurImagePlugin Module -============================= - -The PIL.CurImagePlugin Module -============================= - -**CurImageFile** (class) [`# <#PIL.CurImagePlugin.CurImageFile-class>`_] - Image plugin for Windows Cursor files. - - For more information about this class, see `*The CurImageFile - Class* <#PIL.CurImagePlugin.CurImageFile-class>`_. - -The CurImageFile Class ----------------------- - -**CurImageFile** (class) [`# <#PIL.CurImagePlugin.CurImageFile-class>`_] diff --git a/docs/pythondoc-PIL.DcxImagePlugin.rst b/docs/pythondoc-PIL.DcxImagePlugin.rst deleted file mode 100644 index 139d25036..000000000 --- a/docs/pythondoc-PIL.DcxImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.DcxImagePlugin Module -============================= - -The PIL.DcxImagePlugin Module -============================= - -**DcxImageFile** (class) [`# <#PIL.DcxImagePlugin.DcxImageFile-class>`_] - Image plugin for the Intel DCX format. - - For more information about this class, see `*The DcxImageFile - Class* <#PIL.DcxImagePlugin.DcxImageFile-class>`_. - -The DcxImageFile Class ----------------------- - -**DcxImageFile** (class) [`# <#PIL.DcxImagePlugin.DcxImageFile-class>`_] diff --git a/docs/pythondoc-PIL.EpsImagePlugin.rst b/docs/pythondoc-PIL.EpsImagePlugin.rst deleted file mode 100644 index d6293fb86..000000000 --- a/docs/pythondoc-PIL.EpsImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.EpsImagePlugin Module -============================= - -The PIL.EpsImagePlugin Module -============================= - -**EpsImageFile** (class) [`# <#PIL.EpsImagePlugin.EpsImageFile-class>`_] - Image plugin for Encapsulated Postscript. - - For more information about this class, see `*The EpsImageFile - Class* <#PIL.EpsImagePlugin.EpsImageFile-class>`_. - -The EpsImageFile Class ----------------------- - -**EpsImageFile** (class) [`# <#PIL.EpsImagePlugin.EpsImageFile-class>`_] diff --git a/docs/pythondoc-PIL.ExifTags.rst b/docs/pythondoc-PIL.ExifTags.rst deleted file mode 100644 index 4efe17c69..000000000 --- a/docs/pythondoc-PIL.ExifTags.rst +++ /dev/null @@ -1,12 +0,0 @@ -======================= -The PIL.ExifTags Module -======================= - -The PIL.ExifTags Module -======================= - -Module Contents ---------------- - -**GPSTAGS** (variable) [`# <#PIL.ExifTags.GPSTAGS-variable>`_] -**TAGS** (variable) [`# <#PIL.ExifTags.TAGS-variable>`_] diff --git a/docs/pythondoc-PIL.FitsStubImagePlugin.rst b/docs/pythondoc-PIL.FitsStubImagePlugin.rst deleted file mode 100644 index 4606a27c7..000000000 --- a/docs/pythondoc-PIL.FitsStubImagePlugin.rst +++ /dev/null @@ -1,12 +0,0 @@ -================================== -The PIL.FitsStubImagePlugin Module -================================== - -The PIL.FitsStubImagePlugin Module -================================== - -**register\_handler(handler)** -[`# <#PIL.FitsStubImagePlugin.register_handler-function>`_] - - *handler* - diff --git a/docs/pythondoc-PIL.FliImagePlugin.rst b/docs/pythondoc-PIL.FliImagePlugin.rst deleted file mode 100644 index 11db3fb5f..000000000 --- a/docs/pythondoc-PIL.FliImagePlugin.rst +++ /dev/null @@ -1,20 +0,0 @@ -============================= -The PIL.FliImagePlugin Module -============================= - -The PIL.FliImagePlugin Module -============================= - -**FliImageFile** (class) [`# <#PIL.FliImagePlugin.FliImageFile-class>`_] - Image plugin for the FLI/FLC animation format. - - For more information about this class, see `*The FliImageFile - Class* <#PIL.FliImagePlugin.FliImageFile-class>`_. - -The FliImageFile Class ----------------------- - -**FliImageFile** (class) [`# <#PIL.FliImagePlugin.FliImageFile-class>`_] - Image plugin for the FLI/FLC animation format. Use the **seek** - method to load individual frames. - diff --git a/docs/pythondoc-PIL.FontFile.rst b/docs/pythondoc-PIL.FontFile.rst deleted file mode 100644 index 06b9e9825..000000000 --- a/docs/pythondoc-PIL.FontFile.rst +++ /dev/null @@ -1,17 +0,0 @@ -======================= -The PIL.FontFile Module -======================= - -The PIL.FontFile Module -======================= - -**FontFile()** (class) [`# <#PIL.FontFile.FontFile-class>`_] - Base class for raster font file handlers. - - For more information about this class, see `*The FontFile - Class* <#PIL.FontFile.FontFile-class>`_. - -The FontFile Class ------------------- - -**FontFile()** (class) [`# <#PIL.FontFile.FontFile-class>`_] diff --git a/docs/pythondoc-PIL.FpxImagePlugin.rst b/docs/pythondoc-PIL.FpxImagePlugin.rst deleted file mode 100644 index 332b894ef..000000000 --- a/docs/pythondoc-PIL.FpxImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.FpxImagePlugin Module -============================= - -The PIL.FpxImagePlugin Module -============================= - -**FpxImageFile** (class) [`# <#PIL.FpxImagePlugin.FpxImageFile-class>`_] - Image plugin for the FlashPix images. - - For more information about this class, see `*The FpxImageFile - Class* <#PIL.FpxImagePlugin.FpxImageFile-class>`_. - -The FpxImageFile Class ----------------------- - -**FpxImageFile** (class) [`# <#PIL.FpxImagePlugin.FpxImageFile-class>`_] diff --git a/docs/pythondoc-PIL.GbrImagePlugin.rst b/docs/pythondoc-PIL.GbrImagePlugin.rst deleted file mode 100644 index 4fd99a591..000000000 --- a/docs/pythondoc-PIL.GbrImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.GbrImagePlugin Module -============================= - -The PIL.GbrImagePlugin Module -============================= - -**GbrImageFile** (class) [`# <#PIL.GbrImagePlugin.GbrImageFile-class>`_] - Image plugin for the GIMP brush format. - - For more information about this class, see `*The GbrImageFile - Class* <#PIL.GbrImagePlugin.GbrImageFile-class>`_. - -The GbrImageFile Class ----------------------- - -**GbrImageFile** (class) [`# <#PIL.GbrImagePlugin.GbrImageFile-class>`_] diff --git a/docs/pythondoc-PIL.GdImageFile.rst b/docs/pythondoc-PIL.GdImageFile.rst deleted file mode 100644 index 2409efb8f..000000000 --- a/docs/pythondoc-PIL.GdImageFile.rst +++ /dev/null @@ -1,29 +0,0 @@ -========================== -The PIL.GdImageFile Module -========================== - -The PIL.GdImageFile Module -========================== - -**GdImageFile** (class) [`# <#PIL.GdImageFile.GdImageFile-class>`_] - Image plugin for the GD uncompressed format. - - For more information about this class, see `*The GdImageFile - Class* <#PIL.GdImageFile.GdImageFile-class>`_. - -**open(fp, mode="r")** [`# <#PIL.GdImageFile.open-function>`_] - - *filename* - *mode* - Returns: - Raises **IOError**: - -The GdImageFile Class ---------------------- - -**GdImageFile** (class) [`# <#PIL.GdImageFile.GdImageFile-class>`_] - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard **Image.open** function. To use - this plugin, you have to import the **GdImageFile** module and use - the **GdImageFile.open** function. - diff --git a/docs/pythondoc-PIL.GifImagePlugin.rst b/docs/pythondoc-PIL.GifImagePlugin.rst deleted file mode 100644 index 23c2df7a3..000000000 --- a/docs/pythondoc-PIL.GifImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.GifImagePlugin Module -============================= - -The PIL.GifImagePlugin Module -============================= - -**GifImageFile** (class) [`# <#PIL.GifImagePlugin.GifImageFile-class>`_] - Image plugin for GIF images. - - For more information about this class, see `*The GifImageFile - Class* <#PIL.GifImagePlugin.GifImageFile-class>`_. - -The GifImageFile Class ----------------------- - -**GifImageFile** (class) [`# <#PIL.GifImagePlugin.GifImageFile-class>`_] diff --git a/docs/pythondoc-PIL.GimpGradientFile.rst b/docs/pythondoc-PIL.GimpGradientFile.rst deleted file mode 100644 index ae2db5e7b..000000000 --- a/docs/pythondoc-PIL.GimpGradientFile.rst +++ /dev/null @@ -1,19 +0,0 @@ -=============================== -The PIL.GimpGradientFile Module -=============================== - -The PIL.GimpGradientFile Module -=============================== - -**GimpGradientFile(fp)** (class) -[`# <#PIL.GimpGradientFile.GimpGradientFile-class>`_] - File handler for GIMP's gradient format. - - For more information about this class, see `*The GimpGradientFile - Class* <#PIL.GimpGradientFile.GimpGradientFile-class>`_. - -The GimpGradientFile Class --------------------------- - -**GimpGradientFile(fp)** (class) -[`# <#PIL.GimpGradientFile.GimpGradientFile-class>`_] diff --git a/docs/pythondoc-PIL.GimpPaletteFile.rst b/docs/pythondoc-PIL.GimpPaletteFile.rst deleted file mode 100644 index e54aa812d..000000000 --- a/docs/pythondoc-PIL.GimpPaletteFile.rst +++ /dev/null @@ -1,19 +0,0 @@ -============================== -The PIL.GimpPaletteFile Module -============================== - -The PIL.GimpPaletteFile Module -============================== - -**GimpPaletteFile(fp)** (class) -[`# <#PIL.GimpPaletteFile.GimpPaletteFile-class>`_] - File handler for GIMP's palette format. - - For more information about this class, see `*The GimpPaletteFile - Class* <#PIL.GimpPaletteFile.GimpPaletteFile-class>`_. - -The GimpPaletteFile Class -------------------------- - -**GimpPaletteFile(fp)** (class) -[`# <#PIL.GimpPaletteFile.GimpPaletteFile-class>`_] diff --git a/docs/pythondoc-PIL.GribStubImagePlugin.rst b/docs/pythondoc-PIL.GribStubImagePlugin.rst deleted file mode 100644 index 145793bd0..000000000 --- a/docs/pythondoc-PIL.GribStubImagePlugin.rst +++ /dev/null @@ -1,12 +0,0 @@ -================================== -The PIL.GribStubImagePlugin Module -================================== - -The PIL.GribStubImagePlugin Module -================================== - -**register\_handler(handler)** -[`# <#PIL.GribStubImagePlugin.register_handler-function>`_] - - *handler* - diff --git a/docs/pythondoc-PIL.Hdf5StubImagePlugin.rst b/docs/pythondoc-PIL.Hdf5StubImagePlugin.rst deleted file mode 100644 index c71d61e65..000000000 --- a/docs/pythondoc-PIL.Hdf5StubImagePlugin.rst +++ /dev/null @@ -1,12 +0,0 @@ -================================== -The PIL.Hdf5StubImagePlugin Module -================================== - -The PIL.Hdf5StubImagePlugin Module -================================== - -**register\_handler(handler)** -[`# <#PIL.Hdf5StubImagePlugin.register_handler-function>`_] - - *handler* - diff --git a/docs/pythondoc-PIL.IcnsImagePlugin.rst b/docs/pythondoc-PIL.IcnsImagePlugin.rst deleted file mode 100644 index 78faeaec2..000000000 --- a/docs/pythondoc-PIL.IcnsImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -============================== -The PIL.IcnsImagePlugin Module -============================== - -The PIL.IcnsImagePlugin Module -============================== - -**IcnsImageFile** (class) -[`# <#PIL.IcnsImagePlugin.IcnsImageFile-class>`_] - Image plugin for Mac OS icons. - - For more information about this class, see `*The IcnsImageFile - Class* <#PIL.IcnsImagePlugin.IcnsImageFile-class>`_. - -The IcnsImageFile Class ------------------------ - -**IcnsImageFile** (class) -[`# <#PIL.IcnsImagePlugin.IcnsImageFile-class>`_] diff --git a/docs/pythondoc-PIL.IcoImagePlugin.rst b/docs/pythondoc-PIL.IcoImagePlugin.rst deleted file mode 100644 index cab89b17a..000000000 --- a/docs/pythondoc-PIL.IcoImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.IcoImagePlugin Module -============================= - -The PIL.IcoImagePlugin Module -============================= - -**IcoImageFile** (class) [`# <#PIL.IcoImagePlugin.IcoImageFile-class>`_] - Image plugin for Windows Icon files. - - For more information about this class, see `*The IcoImageFile - Class* <#PIL.IcoImagePlugin.IcoImageFile-class>`_. - -The IcoImageFile Class ----------------------- - -**IcoImageFile** (class) [`# <#PIL.IcoImagePlugin.IcoImageFile-class>`_] diff --git a/docs/pythondoc-PIL.ImImagePlugin.rst b/docs/pythondoc-PIL.ImImagePlugin.rst deleted file mode 100644 index 7fd4b036d..000000000 --- a/docs/pythondoc-PIL.ImImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================ -The PIL.ImImagePlugin Module -============================ - -The PIL.ImImagePlugin Module -============================ - -**ImImageFile** (class) [`# <#PIL.ImImagePlugin.ImImageFile-class>`_] - Image plugin for the IFUNC IM file format. - - For more information about this class, see `*The ImImageFile - Class* <#PIL.ImImagePlugin.ImImageFile-class>`_. - -The ImImageFile Class ---------------------- - -**ImImageFile** (class) [`# <#PIL.ImImagePlugin.ImImageFile-class>`_] diff --git a/docs/pythondoc-PIL.Image.rst b/docs/pythondoc-PIL.Image.rst deleted file mode 100644 index 1c2882374..000000000 --- a/docs/pythondoc-PIL.Image.rst +++ /dev/null @@ -1,557 +0,0 @@ -==================== -The PIL.Image Module -==================== - -The PIL.Image Module -==================== - -**blend(im1, im2, alpha)** [`# <#PIL.Image.blend-function>`_] - Creates a new image by interpolating between two input images, using - a constant alpha. - - :: - - out = image1 * (1.0 - alpha) + image2 * alpha - - *im1* - *im2* - *alpha* - Returns: - -**composite(image1, image2, mask)** -[`# <#PIL.Image.composite-function>`_] - - *image1* - *image2* - *mask* - -**eval(image, function)** [`# <#PIL.Image.eval-function>`_] - - *image* - *function* - Returns: - -**frombuffer(mode, size, data, decoder\_name="raw", \*args)** -[`# <#PIL.Image.frombuffer-function>`_] - (New in 1.1.4) Creates an image memory referencing pixel data in a - byte buffer. - - This function is similar to - `**frombytes** <#PIL.Image.frombytes-function>`_, but uses data in - the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes - can share memory; support modes include "L", "RGBX", "RGBA", and - "CMYK". For other modes, this function behaves like a corresponding - call to the **fromstring** function. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - **StringIO** object, and use `**open** <#PIL.Image.open-function>`_ - to load it. - - *mode* - *size* - *data* - *decoder\_name* - *\*args* - Returns: - -**frombytes(mode, size, data, decoder\_name="raw", \*args)** -[`# <#PIL.Image.frombytes-function>`_] - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments (mode, - size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section `*Writing Your - Own File Decoder* `_. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a **StringIO** - object, and use `**open** <#PIL.Image.open-function>`_ to load it. - - *mode* - *size* - *data* - *decoder\_name* - *\*args* - Returns: - -**getmodebandnames(mode)** [`# <#PIL.Image.getmodebandnames-function>`_] - Gets a list of individual band names. Given a mode, this function - returns a tuple containing the names of individual bands (use - `**getmodetype** <#PIL.Image.getmodetype-function>`_ to get the mode - used to store each individual band. - - *mode* - Returns: - Raises **KeyError**: - -**getmodebands(mode)** [`# <#PIL.Image.getmodebands-function>`_] - - *mode* - Returns: - Raises **KeyError**: - -**getmodebase(mode)** [`# <#PIL.Image.getmodebase-function>`_] - - *mode* - Returns: - Raises **KeyError**: - -**getmodetype(mode)** [`# <#PIL.Image.getmodetype-function>`_] - - *mode* - Returns: - Raises **KeyError**: - -**Image()** (class) [`# <#PIL.Image.Image-class>`_] - This class represents an image object. - - For more information about this class, see `*The Image - Class* <#PIL.Image.Image-class>`_. - -**init()** [`# <#PIL.Image.init-function>`_] -**isDirectory(f)** [`# <#PIL.Image.isDirectory-function>`_] -**isImageType(t)** [`# <#PIL.Image.isImageType-function>`_] -**isStringType(t)** [`# <#PIL.Image.isStringType-function>`_] -**merge(mode, bands)** [`# <#PIL.Image.merge-function>`_] - - *mode* - *bands* - Returns: - -**new(mode, size, color=0)** [`# <#PIL.Image.new-function>`_] - - *mode* - *size* - *color* - Returns: - -**open(file, mode="r")** [`# <#PIL.Image.open-function>`_] - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but the - actual image data is not read from the file until you try to process - the data (or call the `**load** <#PIL.Image.Image.load-method>`_ - method). - - *file* - A filename (string) or a file object. The file object must - implement **read**, **seek**, and **tell** methods, and be - opened in binary mode. - *mode* - Returns: - Raises **IOError**: - -**preinit()** [`# <#PIL.Image.preinit-function>`_] -**register\_extension(id, extension)** -[`# <#PIL.Image.register_extension-function>`_] - - *id* - *extension* - -**register\_mime(id, mimetype)** -[`# <#PIL.Image.register_mime-function>`_] - - *id* - *mimetype* - -**register\_open(id, factory, accept=None)** -[`# <#PIL.Image.register_open-function>`_] - - *id* - *factory* - *accept* - -**register\_save(id, driver)** -[`# <#PIL.Image.register_save-function>`_] - - *id* - *driver* - -The Image Class ---------------- - -**Image()** (class) [`# <#PIL.Image.Image-class>`_] -**convert(mode, matrix=None)** [`# <#PIL.Image.Image.convert-method>`_] - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is omitted, a - mode is chosen so that all information in the image and the palette - can be represented without a palette. - - The current version supports all possible conversions between "L", - "RGB" and "CMYK." - - When translating a colour image to black and white (mode "L"), the - library uses the ITU-R 601-2 luma transform: - - **L = R \* 299/1000 + G \* 587/1000 + B \* 114/1000** - - When translating a greyscale image into a bilevel image (mode "1"), - all non-zero values are set to 255 (white). To use other thresholds, - use the `**point** <#PIL.Image.Image.point-method>`_ method. - - *mode* - *matrix* - Returns: - -**copy()** [`# <#PIL.Image.Image.copy-method>`_] - - Returns: - -**crop(box=None)** [`# <#PIL.Image.Image.crop-method>`_] - Returns a rectangular region from this image. The box is a 4-tuple - defining the left, upper, right, and lower pixel coordinate. - - This is a lazy operation. Changes to the source image may or may not - be reflected in the cropped image. To break the connection, call the - `**load** <#PIL.Image.Image.load-method>`_ method on the cropped - copy. - - *The* - Returns: - -**draft(mode, size)** [`# <#PIL.Image.Image.draft-method>`_] - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and size. - For example, you can use this method to convert a colour JPEG to - greyscale while loading it, or to extract a 128x192 version from a - PCD file. - - Note that this method modifies the Image object in place. If the - image has already been loaded, this method has no effect. - - *mode* - *size* - -**filter(filter)** [`# <#PIL.Image.Image.filter-method>`_] - Filters this image using the given filter. For a list of available - filters, see the **ImageFilter** module. - - *filter* - Returns: - -**frombytes(data, decoder\_name="raw", \*args)** -[`# <#PIL.Image.Image.frombytes-method>`_] - Loads this image with pixel data from a byte uffer. - - This method is similar to the - `**frombytes** <#PIL.Image.frombytes-function>`_ function, but - loads data into this image instead of creating a new image object. - - (In Python 2.6 and 2.7, this is also available as fromstring().) - -**getbands()** [`# <#PIL.Image.Image.getbands-method>`_] - Returns a tuple containing the name of each band in this image. For - example, **getbands** on an RGB image returns ("R", "G", "B"). - - Returns: - -**getbbox()** [`# <#PIL.Image.Image.getbbox-method>`_] - - Returns: - -**getcolors(maxcolors=256)** [`# <#PIL.Image.Image.getcolors-method>`_] - - *maxcolors* - Returns: - -**getdata(band=None)** [`# <#PIL.Image.Image.getdata-method>`_] - Returns the contents of this image as a sequence object containing - pixel values. The sequence object is flattened, so that values for - line one follow directly after the values of line zero, and so on. - - Note that the sequence object returned by this method is an internal - PIL data type, which only supports certain sequence operations. To - convert it to an ordinary sequence (e.g. for printing), use - **list(im.getdata())**. - - *band* - Returns: - -**getextrema()** [`# <#PIL.Image.Image.getextrema-method>`_] - - Returns: - -**getim()** [`# <#PIL.Image.Image.getim-method>`_] - - Returns: - -**getpalette()** [`# <#PIL.Image.Image.getpalette-method>`_] - - Returns: - -**getpixel(xy)** [`# <#PIL.Image.Image.getpixel-method>`_] - - *xy* - Returns: - -**getprojection()** [`# <#PIL.Image.Image.getprojection-method>`_] - - Returns: - -**histogram(mask=None)** [`# <#PIL.Image.Image.histogram-method>`_] - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source image. - If the image has more than one band, the histograms for all bands - are concatenated (for example, the histogram for an "RGB" image - contains 768 values). - - A bilevel image (mode "1") is treated as a greyscale ("L") image by - this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask image - must have the same size as the image, and be either a bi-level image - (mode "1") or a greyscale image ("L"). - - *mask* - Returns: - -**load()** [`# <#PIL.Image.Image.load-method>`_] - - Returns: - -**offset(xoffset, yoffset=None)** -[`# <#PIL.Image.Image.offset-method>`_] - (Deprecated) Returns a copy of the image where the data has been - offset by the given distances. Data wraps around the edges. If - yoffset is omitted, it is assumed to be equal to xoffset. - - This method is deprecated. New code should use the **offset** - function in the **ImageChops** module. - - *xoffset* - *yoffset* - Returns: - -**paste(im, box=None, mask=None)** -[`# <#PIL.Image.Image.paste-method>`_] - Pastes another image into this image. The box argument is either a - 2-tuple giving the upper left corner, a 4-tuple defining the left, - upper, right, and lower pixel coordinate, or None (same as (0, 0)). - If a 4-tuple is given, the size of the pasted image must match the - size of the region. - - If the modes don't match, the pasted image is converted to the mode - of this image (see the - `**convert** <#PIL.Image.Image.convert-method>`_ method for - details). - - Instead of an image, the source can be a integer or tuple containing - pixel values. The method then fills the region with the given - colour. When creating RGB images, you can also use colour strings as - supported by the ImageColor module. - - If a mask is given, this method updates only the regions indicated - by the mask. You can use either "1", "L" or "RGBA" images (in the - latter case, the alpha band is used as mask). Where the mask is 255, - the given image is copied as is. Where the mask is 0, the current - value is preserved. Intermediate values can be used for transparency - effects. - - Note that if you paste an "RGBA" image, the alpha band is ignored. - You can work around this by using the same image as both source - image and mask. - - *im* - *box* - An optional 4-tuple giving the region to paste into. If a - 2-tuple is used instead, it's treated as the upper left corner. - If omitted or None, the source is pasted into the upper left - corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument is - interpreted as a mask image. - - *mask* - Returns: - -**point(lut, mode=None)** [`# <#PIL.Image.Image.point-method>`_] - - *lut* - *mode* - Returns: - -**putalpha(alpha)** [`# <#PIL.Image.Image.putalpha-method>`_] - - *im* - -**putdata(data, scale=1.0, offset=0.0)** -[`# <#PIL.Image.Image.putdata-method>`_] - Copies pixel data to this image. This method copies data from a - sequence object into the image, starting at the upper left corner - (0, 0), and continuing until either the image or the sequence ends. - The scale and offset values are used to adjust the sequence values: - **pixel = value\*scale + offset**. - - *data* - *scale* - *offset* - -**putpalette(data)** [`# <#PIL.Image.Image.putpalette-method>`_] - - *data* - -**putpixel(xy, value)** [`# <#PIL.Image.Image.putpixel-method>`_] - Modifies the pixel at the given position. The colour is given as a - single numerical value for single-band images, and a tuple for - multi-band images. - - Note that this method is relatively slow. For more extensive - changes, use `**paste** <#PIL.Image.Image.paste-method>`_ or the - **ImageDraw** module instead. - - *xy* - *value* - -**resize(size, filter=NEAREST)** [`# <#PIL.Image.Image.resize-method>`_] - - *size* - *filter* - An optional resampling filter. This can be one of **NEAREST** - (use nearest neighbour), **BILINEAR** (linear interpolation in a - 2x2 environment), **BICUBIC** (cubic spline interpolation in a - 4x4 environment), or **ANTIALIAS** (a high-quality downsampling - filter). If omitted, or if the image has mode "1" or "P", it is - set **NEAREST**. - Returns: - -**rotate(angle, filter=NEAREST)** -[`# <#PIL.Image.Image.rotate-method>`_] - - *angle* - *filter* - An optional resampling filter. This can be one of **NEAREST** - (use nearest neighbour), **BILINEAR** (linear interpolation in a - 2x2 environment), or **BICUBIC** (cubic spline interpolation in - a 4x4 environment). If omitted, or if the image has mode "1" or - "P", it is set **NEAREST**. - Returns: - -**save(file, format=None, \*\*options)** -[`# <#PIL.Image.Image.save-method>`_] - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions to - the writer. If a writer doesn't recognise an option, it is silently - ignored. The available options are described later in this handbook. - - You can use a file object instead of a filename. In this case, you - must always specify the format. The file object must implement the - **seek**, **tell**, and **write** methods, and be opened in binary - mode. - - *file* - *format* - *\*\*options* - Returns: - Raises **KeyError**: - Raises **IOError**: - -**seek(frame)** [`# <#PIL.Image.Image.seek-method>`_] - Seeks to the given frame in this sequence file. If you seek beyond - the end of the sequence, the method raises an **EOFError** - exception. When a sequence file is opened, the library automatically - seeks to frame 0. - - Note that in the current version of the library, most sequence - formats only allows you to seek to the next frame. - - *frame* - Raises **EOFError**: - -**show(title=None)** [`# <#PIL.Image.Image.show-method>`_] - Displays this image. This method is mainly intended for debugging - purposes. - - On Unix platforms, this method saves the image to a temporary PPM - file, and calls the **xv** utility. - - On Windows, it saves the image to a temporary BMP file, and uses the - standard BMP display utility to show it (usually Paint). - - *title* - -**split()** [`# <#PIL.Image.Image.split-method>`_] - - Returns: - -**tell()** [`# <#PIL.Image.Image.tell-method>`_] - - Returns: - -**thumbnail(size, resample=NEAREST)** -[`# <#PIL.Image.Image.thumbnail-method>`_] - Make this image into a thumbnail. This method modifies the image to - contain a thumbnail version of itself, no larger than the given - size. This method calculates an appropriate thumbnail size to - preserve the aspect of the image, calls the - `**draft** <#PIL.Image.Image.draft-method>`_ method to configure the - file reader (where applicable), and finally resizes the image. - - Note that the bilinear and bicubic filters in the current version of - PIL are not well-suited for thumbnail generation. You should use - **ANTIALIAS** unless speed is much more important than quality. - - Also note that this function modifies the Image object in place. If - you need to use the full resolution image as well, apply this method - to a `**copy** <#PIL.Image.Image.copy-method>`_ of the original - image. - - *size* - *resample* - Optional resampling filter. This can be one of **NEAREST**, - **BILINEAR**, **BICUBIC**, or **ANTIALIAS** (best quality). If - omitted, it defaults to **NEAREST** (this will be changed to - ANTIALIAS in a future version). - Returns: - -**tobitmap(name="image")** [`# <#PIL.Image.Image.tobitmap-method>`_] - - *name* - Returns: - Raises **ValueError**: - -**tobytes(encoder\_name="raw", \*args)** -[`# <#PIL.Image.Image.tobytes-method>`_] - (In Python 2.6 and 2.7, this is also available as tostring().) - - *encoder\_name* - *\*args* - Returns: - -**transform(size, method, data, resample=NEAREST)** -[`# <#PIL.Image.Image.transform-method>`_] - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data to - the new image using the given transform. - - *size* - *method* - The transformation method. This is one of **EXTENT** (cut out a - rectangular subregion), **AFFINE** (affine transform), - **PERSPECTIVE** (perspective transform), **QUAD** (map a - quadrilateral to a rectangle), or **MESH** (map a number of - source quadrilaterals in one operation). - *data* - *resample* - Optional resampling filter. It can be one of **NEAREST** (use - nearest neighbour), **BILINEAR** (linear interpolation in a 2x2 - environment), or **BICUBIC** (cubic spline interpolation in a - 4x4 environment). If omitted, or if the image has mode "1" or - "P", it is set to **NEAREST**. - Returns: - -**transpose(method)** [`# <#PIL.Image.Image.transpose-method>`_] - - *method* - One of **FLIP\_LEFT\_RIGHT**, **FLIP\_TOP\_BOTTOM**, - **ROTATE\_90**, **ROTATE\_180**, or **ROTATE\_270**. - -**verify()** [`# <#PIL.Image.Image.verify-method>`_] diff --git a/docs/pythondoc-PIL.ImageChops.rst b/docs/pythondoc-PIL.ImageChops.rst deleted file mode 100644 index 3faad8293..000000000 --- a/docs/pythondoc-PIL.ImageChops.rst +++ /dev/null @@ -1,163 +0,0 @@ -========================= -The PIL.ImageChops Module -========================= - -The PIL.ImageChops Module -========================= - -The **ImageChops** module contains a number of arithmetical image -operations, called *channel operations* ("chops"). These can be used for -various purposes, including special effects, image compositions, -algorithmic painting, and more. - -At this time, channel operations are only implemented for 8-bit images -(e.g. "L" and "RGB"). - -Most channel operations take one or two image arguments and returns a -new image. Unless otherwise noted, the result of a channel operation is -always clipped to the range 0 to MAX (which is 255 for all modes -supported by the operations in this module). - -Module Contents ---------------- - -**add(image1, image2, scale=1.0, offset=0)** -[`# <#PIL.ImageChops.add-function>`_] - Add images ((image1 + image2) / scale + offset). - - Adds two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. - - *image1* - *image1* - Returns: - -**add\_modulo(image1, image2)** -[`# <#PIL.ImageChops.add_modulo-function>`_] - Add images without clipping ((image1 + image2) % MAX). - - Adds two images, without clipping the result. - - *image1* - *image1* - Returns: - -**blend(image1, image2, alpha)** [`# <#PIL.ImageChops.blend-function>`_] - Blend images using constant transparency weight. - - Same as the **blend** function in the **Image** module. - -**composite(image1, image2, mask)** -[`# <#PIL.ImageChops.composite-function>`_] - Create composite using transparency mask. - - Same as the **composite** function in the **Image** module. - -**constant(image, value)** [`# <#PIL.ImageChops.constant-function>`_] - - *image* - *value* - Returns: - -**darker(image1, image2)** [`# <#PIL.ImageChops.darker-function>`_] - Compare images, and return darker pixel value (min(image1, image2)). - - Compares the two images, pixel by pixel, and returns a new image - containing the darker values. - - *image1* - *image1* - Returns: - -**difference(image1, image2)** -[`# <#PIL.ImageChops.difference-function>`_] - Calculate absolute difference (abs(image1 - image2)). - - Returns the absolute value of the difference between the two images. - - *image1* - *image1* - Returns: - -**duplicate(image)** [`# <#PIL.ImageChops.duplicate-function>`_] - - *image* - Returns: - -**invert(image)** [`# <#PIL.ImageChops.invert-function>`_] - - *image* - Returns: - -**lighter(image1, image2)** [`# <#PIL.ImageChops.lighter-function>`_] - Compare images, and return lighter pixel value (max(image1, - image2)). - - Compares the two images, pixel by pixel, and returns a new image - containing the lighter values. - - *image1* - *image1* - Returns: - -**logical\_and(image1, image2)** -[`# <#PIL.ImageChops.logical_and-function>`_] -**logical\_or(image1, image2)** -[`# <#PIL.ImageChops.logical_or-function>`_] -**logical\_xor(image1, image2)** -[`# <#PIL.ImageChops.logical_xor-function>`_] -**multiply(image1, image2)** [`# <#PIL.ImageChops.multiply-function>`_] - Superimpose positive images (image1 \* image2 / MAX). - - Superimposes two images on top of each other. If you multiply an - image with a solid black image, the result is black. If you multiply - with a solid white image, the image is unaffected. - - *image1* - *image1* - Returns: - -**offset(image, xoffset, yoffset=None)** -[`# <#PIL.ImageChops.offset-function>`_] - Offset image data. - - Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If yoffset is omitted, it is - assumed to be equal to xoffset. - - *image* - *xoffset* - *yoffset* - Returns: - -**screen(image1, image2)** [`# <#PIL.ImageChops.screen-function>`_] - Superimpose negative images (MAX - ((MAX - image1) \* (MAX - image2) - / MAX)). - - Superimposes two inverted images on top of each other. - - *image1* - *image1* - Returns: - -**subtract(image1, image2, scale=1.0, offset=0)** -[`# <#PIL.ImageChops.subtract-function>`_] - Subtract images ((image1 - image2) / scale + offset). - - Subtracts two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. - - *image1* - *image1* - Returns: - -**subtract\_modulo(image1, image2)** -[`# <#PIL.ImageChops.subtract_modulo-function>`_] - Subtract images without clipping ((image1 - image2) % MAX). - - Subtracts two images, without clipping the result. - - *image1* - *image1* - Returns: - diff --git a/docs/pythondoc-PIL.ImageColor.rst b/docs/pythondoc-PIL.ImageColor.rst deleted file mode 100644 index 9f4c22558..000000000 --- a/docs/pythondoc-PIL.ImageColor.rst +++ /dev/null @@ -1,13 +0,0 @@ -========================= -The PIL.ImageColor Module -========================= - -The PIL.ImageColor Module -========================= - -**getrgb(color)** [`# <#PIL.ImageColor.getrgb-function>`_] - - *color* - Returns: - Raises **ValueError**: - diff --git a/docs/pythondoc-PIL.ImageDraw.rst b/docs/pythondoc-PIL.ImageDraw.rst deleted file mode 100644 index 2e1d10184..000000000 --- a/docs/pythondoc-PIL.ImageDraw.rst +++ /dev/null @@ -1,69 +0,0 @@ -======================== -The PIL.ImageDraw Module -======================== - -The PIL.ImageDraw Module -======================== - -**Draw(im, mode=None)** [`# <#PIL.ImageDraw.Draw-function>`_] - - *im* - *mode* - -**getdraw(im=None, hints=None)** -[`# <#PIL.ImageDraw.getdraw-function>`_] - - *im* - *hints* - Returns: - -**ImageDraw(im, mode=None)** (class) -[`# <#PIL.ImageDraw.ImageDraw-class>`_] - A simple 2D drawing interface for PIL images. - - For more information about this class, see `*The ImageDraw - Class* <#PIL.ImageDraw.ImageDraw-class>`_. - -The ImageDraw Class -------------------- - -**ImageDraw(im, mode=None)** (class) -[`# <#PIL.ImageDraw.ImageDraw-class>`_] - A simple 2D drawing interface for PIL images. - - Application code should use the **Draw** factory, instead of - directly. - -**\_\_init\_\_(im, mode=None)** -[`# <#PIL.ImageDraw.ImageDraw.__init__-method>`_] - - *im* - *mode* - -**arc(xy, start, end, fill=None)** -[`# <#PIL.ImageDraw.ImageDraw.arc-method>`_] -**bitmap(xy, bitmap, fill=None)** -[`# <#PIL.ImageDraw.ImageDraw.bitmap-method>`_] -**chord(xy, start, end, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.chord-method>`_] -**ellipse(xy, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.ellipse-method>`_] -**getfont()** [`# <#PIL.ImageDraw.ImageDraw.getfont-method>`_] -**line(xy, fill=None, width=0)** -[`# <#PIL.ImageDraw.ImageDraw.line-method>`_] -**pieslice(xy, start, end, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.pieslice-method>`_] -**point(xy, fill=None)** [`# <#PIL.ImageDraw.ImageDraw.point-method>`_] -**polygon(xy, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.polygon-method>`_] -**rectangle(xy, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.rectangle-method>`_] -**setfill(onoff)** [`# <#PIL.ImageDraw.ImageDraw.setfill-method>`_] -**setfont(font)** [`# <#PIL.ImageDraw.ImageDraw.setfont-method>`_] -**setink(ink)** [`# <#PIL.ImageDraw.ImageDraw.setink-method>`_] -**shape(shape, fill=None, outline=None)** -[`# <#PIL.ImageDraw.ImageDraw.shape-method>`_] -**text(xy, text, fill=None, font=None, anchor=None)** -[`# <#PIL.ImageDraw.ImageDraw.text-method>`_] -**textsize(text, font=None)** -[`# <#PIL.ImageDraw.ImageDraw.textsize-method>`_] diff --git a/docs/pythondoc-PIL.ImageEnhance.rst b/docs/pythondoc-PIL.ImageEnhance.rst deleted file mode 100644 index 65a1b0f54..000000000 --- a/docs/pythondoc-PIL.ImageEnhance.rst +++ /dev/null @@ -1,74 +0,0 @@ -=========================== -The PIL.ImageEnhance Module -=========================== - -The PIL.ImageEnhance Module -=========================== - -**Brightness(image)** (class) -[`# <#PIL.ImageEnhance.Brightness-class>`_] - Brightness enhancement object. - - For more information about this class, see `*The Brightness - Class* <#PIL.ImageEnhance.Brightness-class>`_. - -**Color(image)** (class) [`# <#PIL.ImageEnhance.Color-class>`_] - Color enhancement object. - - For more information about this class, see `*The Color - Class* <#PIL.ImageEnhance.Color-class>`_. - -**Contrast(image)** (class) [`# <#PIL.ImageEnhance.Contrast-class>`_] - Contrast enhancement object. - - For more information about this class, see `*The Contrast - Class* <#PIL.ImageEnhance.Contrast-class>`_. - -**Sharpness(image)** (class) [`# <#PIL.ImageEnhance.Sharpness-class>`_] - Sharpness enhancement object. - - For more information about this class, see `*The Sharpness - Class* <#PIL.ImageEnhance.Sharpness-class>`_. - -The Brightness Class --------------------- - -**Brightness(image)** (class) -[`# <#PIL.ImageEnhance.Brightness-class>`_] - Brightness enhancement object. - - This class can be used to control the brighntess of an image. An - enhancement factor of 0.0 gives a black image, factor 1.0 gives the - original image. - -The Color Class ---------------- - -**Color(image)** (class) [`# <#PIL.ImageEnhance.Color-class>`_] - Color enhancement object. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image, a factor of 1.0 gives - the original image. - -The Contrast Class ------------------- - -**Contrast(image)** (class) [`# <#PIL.ImageEnhance.Contrast-class>`_] - Contrast enhancement object. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives an solid grey image, factor 1.0 gives the original image. - -The Sharpness Class -------------------- - -**Sharpness(image)** (class) [`# <#PIL.ImageEnhance.Sharpness-class>`_] - Sharpness enhancement object. - - This class can be used to adjust the sharpness of an image. The - enhancement factor 0.0 gives a blurred image, 1.0 gives the original - image, and a factor of 2.0 gives a sharpened image. - diff --git a/docs/pythondoc-PIL.ImageFile.rst b/docs/pythondoc-PIL.ImageFile.rst deleted file mode 100644 index 09c339766..000000000 --- a/docs/pythondoc-PIL.ImageFile.rst +++ /dev/null @@ -1,84 +0,0 @@ -======================== -The PIL.ImageFile Module -======================== - -The PIL.ImageFile Module -======================== - -**\_ParserFile(data)** (class) [`# <#PIL.ImageFile._ParserFile-class>`_] - (Internal) Support class for the Parser file. - - For more information about this class, see `*The \_ParserFile - Class* <#PIL.ImageFile._ParserFile-class>`_. - -**\_safe\_read(fp, size)** [`# <#PIL.ImageFile._safe_read-function>`_] - - *fp* - File handle. Must implement a **read** method. - *size* - Returns: - A string containing up to *size* bytes of data. - -**\_save(im, fp, tile)** [`# <#PIL.ImageFile._save-function>`_] - - *im* - *fp* - *tile* - -**ImageFile(fp=None, filename=None)** (class) -[`# <#PIL.ImageFile.ImageFile-class>`_] - Base class for image file handlers. - - For more information about this class, see `*The ImageFile - Class* <#PIL.ImageFile.ImageFile-class>`_. - -**Parser** (class) [`# <#PIL.ImageFile.Parser-class>`_] - Incremental image parser. - - For more information about this class, see `*The Parser - Class* <#PIL.ImageFile.Parser-class>`_. - -**StubImageFile** (class) [`# <#PIL.ImageFile.StubImageFile-class>`_] - Base class for stub image loaders. - - For more information about this class, see `*The StubImageFile - Class* <#PIL.ImageFile.StubImageFile-class>`_. - -The \_ParserFile Class ----------------------- - -**\_ParserFile(data)** (class) [`# <#PIL.ImageFile._ParserFile-class>`_] - (Internal) Support class for the **Parser** file. - -The ImageFile Class -------------------- - -**ImageFile(fp=None, filename=None)** (class) -[`# <#PIL.ImageFile.ImageFile-class>`_] - -The Parser Class ----------------- - -**Parser** (class) [`# <#PIL.ImageFile.Parser-class>`_] -**close()** [`# <#PIL.ImageFile.Parser.close-method>`_] - - Returns: - Raises **IOError**: - -**feed(data)** [`# <#PIL.ImageFile.Parser.feed-method>`_] - - *data* - Raises **IOError**: - -**reset()** [`# <#PIL.ImageFile.Parser.reset-method>`_] - -The StubImageFile Class ------------------------ - -**StubImageFile** (class) [`# <#PIL.ImageFile.StubImageFile-class>`_] - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - -**\_load()** [`# <#PIL.ImageFile.StubImageFile._load-method>`_] diff --git a/docs/pythondoc-PIL.ImageFileIO.rst b/docs/pythondoc-PIL.ImageFileIO.rst deleted file mode 100644 index 03f22c33c..000000000 --- a/docs/pythondoc-PIL.ImageFileIO.rst +++ /dev/null @@ -1,32 +0,0 @@ -========================== -The PIL.ImageFileIO Module -========================== - -The PIL.ImageFileIO Module -========================== - -**ImageFileIO(fp)** (class) [`# <#PIL.ImageFileIO.ImageFileIO-class>`_] - The ImageFileIO module can be used to read an image from a socket, - or any other stream device. - - For more information about this class, see `*The ImageFileIO - Class* <#PIL.ImageFileIO.ImageFileIO-class>`_. - -The ImageFileIO Class ---------------------- - -**ImageFileIO(fp)** (class) [`# <#PIL.ImageFileIO.ImageFileIO-class>`_] - The **ImageFileIO** module can be used to read an image from a - socket, or any other stream device. - - This module is deprecated. New code should use the **Parser** class - in the `ImageFile `_ module instead. - -**\_\_init\_\_(fp)** -[`# <#PIL.ImageFileIO.ImageFileIO.__init__-method>`_] - Adds buffering to a stream file object, in order to provide **seek** - and **tell** methods required by the **Image.open** method. The - stream object must implement **read** and **close** methods. - - *fp* - diff --git a/docs/pythondoc-PIL.ImageFilter.rst b/docs/pythondoc-PIL.ImageFilter.rst deleted file mode 100644 index 0b3a1b356..000000000 --- a/docs/pythondoc-PIL.ImageFilter.rst +++ /dev/null @@ -1,226 +0,0 @@ -========================== -The PIL.ImageFilter Module -========================== - -The PIL.ImageFilter Module -========================== - -**BLUR** (class) [`# <#PIL.ImageFilter.BLUR-class>`_] - Blur filter. - - For more information about this class, see `*The BLUR - Class* <#PIL.ImageFilter.BLUR-class>`_. - -**CONTOUR** (class) [`# <#PIL.ImageFilter.CONTOUR-class>`_] - Contour filter. - - For more information about this class, see `*The CONTOUR - Class* <#PIL.ImageFilter.CONTOUR-class>`_. - -**DETAIL** (class) [`# <#PIL.ImageFilter.DETAIL-class>`_] - Detail filter. - - For more information about this class, see `*The DETAIL - Class* <#PIL.ImageFilter.DETAIL-class>`_. - -**EDGE\_ENHANCE** (class) [`# <#PIL.ImageFilter.EDGE_ENHANCE-class>`_] - Edge enhancement filter. - - For more information about this class, see `*The EDGE\_ENHANCE - Class* <#PIL.ImageFilter.EDGE_ENHANCE-class>`_. - -**EDGE\_ENHANCE\_MORE** (class) -[`# <#PIL.ImageFilter.EDGE_ENHANCE_MORE-class>`_] - Stronger edge enhancement filter. - - For more information about this class, see `*The EDGE\_ENHANCE\_MORE - Class* <#PIL.ImageFilter.EDGE_ENHANCE_MORE-class>`_. - -**EMBOSS** (class) [`# <#PIL.ImageFilter.EMBOSS-class>`_] - Embossing filter. - - For more information about this class, see `*The EMBOSS - Class* <#PIL.ImageFilter.EMBOSS-class>`_. - -**FIND\_EDGES** (class) [`# <#PIL.ImageFilter.FIND_EDGES-class>`_] - Edge-finding filter. - - For more information about this class, see `*The FIND\_EDGES - Class* <#PIL.ImageFilter.FIND_EDGES-class>`_. - -**Kernel(size, kernel, \*\*options)** (class) -[`# <#PIL.ImageFilter.Kernel-class>`_] - Convolution filter kernel. - - For more information about this class, see `*The Kernel - Class* <#PIL.ImageFilter.Kernel-class>`_. - -**MaxFilter(size=3)** (class) [`# <#PIL.ImageFilter.MaxFilter-class>`_] - Max filter. - - For more information about this class, see `*The MaxFilter - Class* <#PIL.ImageFilter.MaxFilter-class>`_. - -**MedianFilter(size=3)** (class) -[`# <#PIL.ImageFilter.MedianFilter-class>`_] - Median filter. - - For more information about this class, see `*The MedianFilter - Class* <#PIL.ImageFilter.MedianFilter-class>`_. - -**MinFilter(size=3)** (class) [`# <#PIL.ImageFilter.MinFilter-class>`_] - Min filter. - - For more information about this class, see `*The MinFilter - Class* <#PIL.ImageFilter.MinFilter-class>`_. - -**ModeFilter(size=3)** (class) -[`# <#PIL.ImageFilter.ModeFilter-class>`_] - Mode filter. - - For more information about this class, see `*The ModeFilter - Class* <#PIL.ImageFilter.ModeFilter-class>`_. - -**RankFilter(size, rank)** (class) -[`# <#PIL.ImageFilter.RankFilter-class>`_] - Rank filter. - - For more information about this class, see `*The RankFilter - Class* <#PIL.ImageFilter.RankFilter-class>`_. - -**SHARPEN** (class) [`# <#PIL.ImageFilter.SHARPEN-class>`_] - Sharpening filter. - - For more information about this class, see `*The SHARPEN - Class* <#PIL.ImageFilter.SHARPEN-class>`_. - -**SMOOTH** (class) [`# <#PIL.ImageFilter.SMOOTH-class>`_] - Smoothing filter. - - For more information about this class, see `*The SMOOTH - Class* <#PIL.ImageFilter.SMOOTH-class>`_. - -**SMOOTH\_MORE** (class) [`# <#PIL.ImageFilter.SMOOTH_MORE-class>`_] - Stronger smoothing filter. - - For more information about this class, see `*The SMOOTH\_MORE - Class* <#PIL.ImageFilter.SMOOTH_MORE-class>`_. - -The BLUR Class --------------- - -**BLUR** (class) [`# <#PIL.ImageFilter.BLUR-class>`_] - -The CONTOUR Class ------------------ - -**CONTOUR** (class) [`# <#PIL.ImageFilter.CONTOUR-class>`_] - -The DETAIL Class ----------------- - -**DETAIL** (class) [`# <#PIL.ImageFilter.DETAIL-class>`_] - -The EDGE\_ENHANCE Class ------------------------ - -**EDGE\_ENHANCE** (class) [`# <#PIL.ImageFilter.EDGE_ENHANCE-class>`_] - -The EDGE\_ENHANCE\_MORE Class ------------------------------ - -**EDGE\_ENHANCE\_MORE** (class) -[`# <#PIL.ImageFilter.EDGE_ENHANCE_MORE-class>`_] - -The EMBOSS Class ----------------- - -**EMBOSS** (class) [`# <#PIL.ImageFilter.EMBOSS-class>`_] - -The FIND\_EDGES Class ---------------------- - -**FIND\_EDGES** (class) [`# <#PIL.ImageFilter.FIND_EDGES-class>`_] - -The Kernel Class ----------------- - -**Kernel(size, kernel, \*\*options)** (class) -[`# <#PIL.ImageFilter.Kernel-class>`_] -**\_\_init\_\_(size, kernel, \*\*options)** -[`# <#PIL.ImageFilter.Kernel.__init__-method>`_] - Create a convolution kernel. The current version only supports 3x3 - and 5x5 integer and floating point kernels. - - In the current version, kernels can only be applied to "L" and "RGB" - images. - - *size* - *kernel* - *\*\*options* - *scale=* - *offset=* - -The MaxFilter Class -------------------- - -**MaxFilter(size=3)** (class) [`# <#PIL.ImageFilter.MaxFilter-class>`_] -**\_\_init\_\_(size=3)** -[`# <#PIL.ImageFilter.MaxFilter.__init__-method>`_] - - *size* - -The MedianFilter Class ----------------------- - -**MedianFilter(size=3)** (class) -[`# <#PIL.ImageFilter.MedianFilter-class>`_] -**\_\_init\_\_(size=3)** -[`# <#PIL.ImageFilter.MedianFilter.__init__-method>`_] - - *size* - -The MinFilter Class -------------------- - -**MinFilter(size=3)** (class) [`# <#PIL.ImageFilter.MinFilter-class>`_] -**\_\_init\_\_(size=3)** -[`# <#PIL.ImageFilter.MinFilter.__init__-method>`_] - - *size* - -The ModeFilter Class --------------------- - -**ModeFilter(size=3)** (class) -[`# <#PIL.ImageFilter.ModeFilter-class>`_] -**\_\_init\_\_(size=3)** -[`# <#PIL.ImageFilter.ModeFilter.__init__-method>`_] - - *size* - -The RankFilter Class --------------------- - -**RankFilter(size, rank)** (class) -[`# <#PIL.ImageFilter.RankFilter-class>`_] -**\_\_init\_\_(size, rank)** -[`# <#PIL.ImageFilter.RankFilter.__init__-method>`_] - - *size* - *rank* - -The SHARPEN Class ------------------ - -**SHARPEN** (class) [`# <#PIL.ImageFilter.SHARPEN-class>`_] - -The SMOOTH Class ----------------- - -**SMOOTH** (class) [`# <#PIL.ImageFilter.SMOOTH-class>`_] - -The SMOOTH\_MORE Class ----------------------- - -**SMOOTH\_MORE** (class) [`# <#PIL.ImageFilter.SMOOTH_MORE-class>`_] diff --git a/docs/pythondoc-PIL.ImageFont.rst b/docs/pythondoc-PIL.ImageFont.rst deleted file mode 100644 index 4491ba644..000000000 --- a/docs/pythondoc-PIL.ImageFont.rst +++ /dev/null @@ -1,98 +0,0 @@ -======================== -The PIL.ImageFont Module -======================== - -The PIL.ImageFont Module -======================== - -**FreeTypeFont(file, size, index=0, encoding="")** (class) -[`# <#PIL.ImageFont.FreeTypeFont-class>`_] - Wrapper for FreeType fonts. - - For more information about this class, see `*The FreeTypeFont - Class* <#PIL.ImageFont.FreeTypeFont-class>`_. - -**ImageFont** (class) [`# <#PIL.ImageFont.ImageFont-class>`_] - The ImageFont module defines a class with the same name. - - For more information about this class, see `*The ImageFont - Class* <#PIL.ImageFont.ImageFont-class>`_. - -**load(filename)** [`# <#PIL.ImageFont.load-function>`_] - - *filename* - Returns: - Raises **IOError**: - -**load\_default()** [`# <#PIL.ImageFont.load_default-function>`_] - - Returns: - -**load\_path(filename)** [`# <#PIL.ImageFont.load_path-function>`_] - - *filename* - Returns: - Raises **IOError**: - -**TransposedFont(font, orientation=None)** (class) -[`# <#PIL.ImageFont.TransposedFont-class>`_] - Wrapper that creates a transposed font from any existing font - object. - - *font* - *orientation* - - For more information about this class, see `*The TransposedFont - Class* <#PIL.ImageFont.TransposedFont-class>`_. - -**truetype(filename, size, index=0, encoding="")** -[`# <#PIL.ImageFont.truetype-function>`_] - Load a TrueType or OpenType font file, and create a font object. - This function loads a font object from the given file, and creates a - font object for a font of the given size. - - This function requires the \_imagingft service. - - *filename* - A truetype font file. Under Windows, if the file is not found in - this filename, the loader also looks in Windows **fonts** - directory - *size* - *index* - *encoding* - Returns: - Raises **IOError**: - -The FreeTypeFont Class ----------------------- - -**FreeTypeFont(file, size, index=0, encoding="")** (class) -[`# <#PIL.ImageFont.FreeTypeFont-class>`_] - Wrapper for FreeType fonts. Application code should use the - **truetype** factory function to create font objects. - -The ImageFont Class -------------------- - -**ImageFont** (class) [`# <#PIL.ImageFont.ImageFont-class>`_] - The **ImageFont** module defines a class with the same name. - Instances of this class store bitmap fonts, and are used with the - **text** method of the **ImageDraw** class. - - PIL uses it's own font file format to store bitmap fonts. You can - use the **pilfont** utility to convert BDF and PCF font descriptors - (X window font formats) to this format. - - Starting with version 1.1.4, PIL can be configured to support - TrueType and OpenType fonts. For earlier version, TrueType support - is only available as part of the imToolkit package - -The TransposedFont Class ------------------------- - -**TransposedFont(font, orientation=None)** (class) -[`# <#PIL.ImageFont.TransposedFont-class>`_] - - *font* - *orientation* - diff --git a/docs/pythondoc-PIL.ImageGL.rst b/docs/pythondoc-PIL.ImageGL.rst deleted file mode 100644 index c8cce6397..000000000 --- a/docs/pythondoc-PIL.ImageGL.rst +++ /dev/null @@ -1,20 +0,0 @@ -====================== -The PIL.ImageGL Module -====================== - -The PIL.ImageGL Module -====================== - -Module Contents ---------------- - -**TextureFactory** (class) [`# <#PIL.ImageGL.TextureFactory-class>`_] - Texture factory. - - For more information about this class, see `*The TextureFactory - Class* <#PIL.ImageGL.TextureFactory-class>`_. - -The TextureFactory Class ------------------------- - -**TextureFactory** (class) [`# <#PIL.ImageGL.TextureFactory-class>`_] diff --git a/docs/pythondoc-PIL.ImageGrab.rst b/docs/pythondoc-PIL.ImageGrab.rst deleted file mode 100644 index 793b54f15..000000000 --- a/docs/pythondoc-PIL.ImageGrab.rst +++ /dev/null @@ -1,24 +0,0 @@ -======================== -The PIL.ImageGrab Module -======================== - -The PIL.ImageGrab Module -======================== - -(New in 1.1.3) The **ImageGrab** module can be used to copy the contents -of the screen to a PIL image memory. - -The current version works on Windows only. - -Module Contents ---------------- - -**grab(bbox=None)** [`# <#PIL.ImageGrab.grab-function>`_] - - *bbox* - Returns: - -**grabclipboard()** [`# <#PIL.ImageGrab.grabclipboard-function>`_] - - Returns: - diff --git a/docs/pythondoc-PIL.ImageOps.rst b/docs/pythondoc-PIL.ImageOps.rst deleted file mode 100644 index 38a299a82..000000000 --- a/docs/pythondoc-PIL.ImageOps.rst +++ /dev/null @@ -1,113 +0,0 @@ -======================= -The PIL.ImageOps Module -======================= - -The PIL.ImageOps Module -======================= - -(New in 1.1.3) The **ImageOps** module contains a number of 'ready-made' -image processing operations. This module is somewhat experimental, and -most operators only work on L and RGB images. - -Module Contents ---------------- - -**autocontrast(image, cutoff=0, ignore=None)** -[`# <#PIL.ImageOps.autocontrast-function>`_] - Maximize (normalize) image contrast. This function calculates a - histogram of the input image, removes *cutoff* percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - *image* - *cutoff* - *ignore* - Returns: - -**colorize(image, black, white)** -[`# <#PIL.ImageOps.colorize-function>`_] - Colorize grayscale image. The *black* and *white* arguments should - be RGB tuples; this function calculates a colour wedge mapping all - black pixels in the source image to the first colour, and all white - pixels to the second colour. - - *image* - *black* - *white* - Returns: - -**crop(image, border=0)** [`# <#PIL.ImageOps.crop-function>`_] - - *image* - *border* - Returns: - -**deform(image, deformer, resample=Image.BILINEAR)** -[`# <#PIL.ImageOps.deform-function>`_] - - *image* - *deformer* - *resample* - Returns: - -**equalize(image, mask=None)** [`# <#PIL.ImageOps.equalize-function>`_] - - *image* - *mask* - Returns: - -**expand(image, border=0, fill=0)** -[`# <#PIL.ImageOps.expand-function>`_] - - *image* - *border* - *fill* - Returns: - -**fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, -0.5))** [`# <#PIL.ImageOps.fit-function>`_] - Returns a sized and cropped version of the image, cropped to the - requested aspect ratio and size. - - The **fit** function was contributed by Kevin Cazabon. - - *size* - *method* - *bleed* - *centering* - Returns: - -**flip(image)** [`# <#PIL.ImageOps.flip-function>`_] - - *image* - Returns: - -**grayscale(image)** [`# <#PIL.ImageOps.grayscale-function>`_] - - *image* - Returns: - -**invert(image)** [`# <#PIL.ImageOps.invert-function>`_] - - *image* - Returns: - -**mirror(image)** [`# <#PIL.ImageOps.mirror-function>`_] - - *image* - Returns: - -**posterize(image, bits)** [`# <#PIL.ImageOps.posterize-function>`_] - - *image* - *bits* - Returns: - -**solarize(image, threshold=128)** -[`# <#PIL.ImageOps.solarize-function>`_] - - *image* - *threshold* - Returns: - diff --git a/docs/pythondoc-PIL.ImagePalette.rst b/docs/pythondoc-PIL.ImagePalette.rst deleted file mode 100644 index 296ba18a5..000000000 --- a/docs/pythondoc-PIL.ImagePalette.rst +++ /dev/null @@ -1,19 +0,0 @@ -=========================== -The PIL.ImagePalette Module -=========================== - -The PIL.ImagePalette Module -=========================== - -**ImagePalette(mode="RGB", palette=None)** (class) -[`# <#PIL.ImagePalette.ImagePalette-class>`_] - Colour palette wrapper for palette mapped images. - - For more information about this class, see `*The ImagePalette - Class* <#PIL.ImagePalette.ImagePalette-class>`_. - -The ImagePalette Class ----------------------- - -**ImagePalette(mode="RGB", palette=None)** (class) -[`# <#PIL.ImagePalette.ImagePalette-class>`_] diff --git a/docs/pythondoc-PIL.ImagePath.rst b/docs/pythondoc-PIL.ImagePath.rst deleted file mode 100644 index 738138266..000000000 --- a/docs/pythondoc-PIL.ImagePath.rst +++ /dev/null @@ -1,30 +0,0 @@ -======================== -The PIL.ImagePath Module -======================== - -The PIL.ImagePath Module -======================== - -**Path(xy)** (class) [`# <#PIL.ImagePath.Path-class>`_] - Path wrapper. - - For more information about this class, see `*The Path - Class* <#PIL.ImagePath.Path-class>`_. - -The Path Class --------------- - -**Path(xy)** (class) [`# <#PIL.ImagePath.Path-class>`_] -**\_\_init\_\_(xy)** [`# <#PIL.ImagePath.Path.__init__-method>`_] - - *xy* - -**compact(distance=2)** [`# <#PIL.ImagePath.Path.compact-method>`_] -**getbbox()** [`# <#PIL.ImagePath.Path.getbbox-method>`_] -**map(function)** [`# <#PIL.ImagePath.Path.map-method>`_] -**tolist(flat=0)** [`# <#PIL.ImagePath.Path.tolist-method>`_] - - *flat* - Returns: - -**transform(matrix)** [`# <#PIL.ImagePath.Path.transform-method>`_] diff --git a/docs/pythondoc-PIL.ImageSequence.rst b/docs/pythondoc-PIL.ImageSequence.rst deleted file mode 100644 index 279ae0022..000000000 --- a/docs/pythondoc-PIL.ImageSequence.rst +++ /dev/null @@ -1,23 +0,0 @@ -============================ -The PIL.ImageSequence Module -============================ - -The PIL.ImageSequence Module -============================ - -**Iterator(im)** (class) [`# <#PIL.ImageSequence.Iterator-class>`_] - This class implements an iterator object that can be used to loop - over an image sequence. - - For more information about this class, see `*The Iterator - Class* <#PIL.ImageSequence.Iterator-class>`_. - -The Iterator Class ------------------- - -**Iterator(im)** (class) [`# <#PIL.ImageSequence.Iterator-class>`_] -**\_\_init\_\_(im)** -[`# <#PIL.ImageSequence.Iterator.__init__-method>`_] - - *im* - diff --git a/docs/pythondoc-PIL.ImageStat.rst b/docs/pythondoc-PIL.ImageStat.rst deleted file mode 100644 index 09ac5c87a..000000000 --- a/docs/pythondoc-PIL.ImageStat.rst +++ /dev/null @@ -1,29 +0,0 @@ -======================== -The PIL.ImageStat Module -======================== - -The PIL.ImageStat Module -======================== - -The **ImageStat** module calculates global statistics for an image, or a -region of an image. - -Module Contents ---------------- - -**Stat(image, mask=None)** (class) [`# <#PIL.ImageStat.Stat-class>`_] - Calculate statistics for the given image. - - For more information about this class, see `*The Stat - Class* <#PIL.ImageStat.Stat-class>`_. - -The Stat Class --------------- - -**Stat(image, mask=None)** (class) [`# <#PIL.ImageStat.Stat-class>`_] -**\_\_init\_\_(image, mask=None)** -[`# <#PIL.ImageStat.Stat.__init__-method>`_] - - *image* - *mask* - diff --git a/docs/pythondoc-PIL.ImageTk.rst b/docs/pythondoc-PIL.ImageTk.rst deleted file mode 100644 index e60292aee..000000000 --- a/docs/pythondoc-PIL.ImageTk.rst +++ /dev/null @@ -1,92 +0,0 @@ -====================== -The PIL.ImageTk Module -====================== - -The PIL.ImageTk Module -====================== - -The **ImageTk** module contains support to create and modify Tkinter -**BitmapImage** and **PhotoImage** objects. - -For examples, see the demo programs in the *Scripts* directory. - -Module Contents ---------------- - -**BitmapImage(image=None, \*\*options)** (class) -[`# <#PIL.ImageTk.BitmapImage-class>`_] - Create a Tkinter-compatible bitmap image. - - For more information about this class, see `*The BitmapImage - Class* <#PIL.ImageTk.BitmapImage-class>`_. - -**getimage(photo)** [`# <#PIL.ImageTk.getimage-function>`_] -**PhotoImage(image=None, size=None, \*\*options)** (class) -[`# <#PIL.ImageTk.PhotoImage-class>`_] - Creates a Tkinter-compatible photo image. - - For more information about this class, see `*The PhotoImage - Class* <#PIL.ImageTk.PhotoImage-class>`_. - -The BitmapImage Class ---------------------- - -**BitmapImage(image=None, \*\*options)** (class) -[`# <#PIL.ImageTk.BitmapImage-class>`_] -**\_\_init\_\_(image=None, \*\*options)** -[`# <#PIL.ImageTk.BitmapImage.__init__-method>`_] - Create a Tkinter-compatible bitmap image. - - The given image must have mode "1". Pixels having value 0 are - treated as transparent. Options, if any, are passed on to Tkinter. - The most commonly used option is **foreground**, which is used to - specify the colour for the non-transparent parts. See the Tkinter - documentation for information on how to specify colours. - - *image* - -**\_\_str\_\_()** [`# <#PIL.ImageTk.BitmapImage.__str__-method>`_] - - Returns: - -**height()** [`# <#PIL.ImageTk.BitmapImage.height-method>`_] - - Returns: - -**width()** [`# <#PIL.ImageTk.BitmapImage.width-method>`_] - - Returns: - -The PhotoImage Class --------------------- - -**PhotoImage(image=None, size=None, \*\*options)** (class) -[`# <#PIL.ImageTk.PhotoImage-class>`_] -**\_\_init\_\_(image=None, size=None, \*\*options)** -[`# <#PIL.ImageTk.PhotoImage.__init__-method>`_] - Create a photo image object. The constructor takes either a PIL - image, or a mode and a size. Alternatively, you can use the **file** - or **data** options to initialize the photo image object. - - *image* - *size* - *file=* - *data=* - -**\_\_str\_\_()** [`# <#PIL.ImageTk.PhotoImage.__str__-method>`_] - - Returns: - -**height()** [`# <#PIL.ImageTk.PhotoImage.height-method>`_] - - Returns: - -**paste(im, box=None)** [`# <#PIL.ImageTk.PhotoImage.paste-method>`_] - - *im* - *box* - -**width()** [`# <#PIL.ImageTk.PhotoImage.width-method>`_] - - Returns: - diff --git a/docs/pythondoc-PIL.ImageTransform.rst b/docs/pythondoc-PIL.ImageTransform.rst deleted file mode 100644 index 51408750d..000000000 --- a/docs/pythondoc-PIL.ImageTransform.rst +++ /dev/null @@ -1,114 +0,0 @@ -============================= -The PIL.ImageTransform Module -============================= - -The PIL.ImageTransform Module -============================= - -**AffineTransform** (class) -[`# <#PIL.ImageTransform.AffineTransform-class>`_] - Define an affine image transform. - - *matrix* - A 6-tuple (*a, b, c, d, e, f*) containing the first two rows - from an affine transform matrix. - - For more information about this class, see `*The AffineTransform - Class* <#PIL.ImageTransform.AffineTransform-class>`_. - -**ExtentTransform** (class) -[`# <#PIL.ImageTransform.ExtentTransform-class>`_] - Define a transform to extract a subregion from an image. - - *bbox* - A 4-tuple (*x0, y0, x1, y1*) which specifies two points in the - input image's coordinate system. - - For more information about this class, see `*The ExtentTransform - Class* <#PIL.ImageTransform.ExtentTransform-class>`_. - -**MeshTransform** (class) -[`# <#PIL.ImageTransform.MeshTransform-class>`_] - Define an mesh image transform. - - *data* - - For more information about this class, see `*The MeshTransform - Class* <#PIL.ImageTransform.MeshTransform-class>`_. - -**QuadTransform** (class) -[`# <#PIL.ImageTransform.QuadTransform-class>`_] - Define an quad image transform. - - *xy* - An 8-tuple (*x0, y0, x1, y1, x2, y2, y3, y3*) which contain the - upper left, lower left, lower right, and upper right corner of - the source quadrilateral. - - For more information about this class, see `*The QuadTransform - Class* <#PIL.ImageTransform.QuadTransform-class>`_. - -The AffineTransform Class -------------------------- - -**AffineTransform** (class) -[`# <#PIL.ImageTransform.AffineTransform-class>`_] - Define an affine image transform. - - This function takes a 6-tuple (*a, b, c, d, e, f*) which contain the - first two rows from an affine transform matrix. For each pixel (*x, - y*) in the output image, the new value is taken from a position (a - *x* + b *y* + c, d *x* + e *y* + f) in the input image, rounded to - nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - *matrix* - A 6-tuple (*a, b, c, d, e, f*) containing the first two rows - from an affine transform matrix. - -The ExtentTransform Class -------------------------- - -**ExtentTransform** (class) -[`# <#PIL.ImageTransform.ExtentTransform-class>`_] - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a - rectangle of the given size. The resulting image will contain data - sampled from between the corners, such that (*x0, y0*) in the input - image will end up at (0,0) in the output image, and (*x1, y1*) at - *size*. - - This method can be used to crop, stretch, shrink, or mirror an - arbitrary rectangle in the current image. It is slightly slower than - **crop**, but about as fast as a corresponding **resize** operation. - - *bbox* - A 4-tuple (*x0, y0, x1, y1*) which specifies two points in the - input image's coordinate system. - -The MeshTransform Class ------------------------ - -**MeshTransform** (class) -[`# <#PIL.ImageTransform.MeshTransform-class>`_] - - *data* - -The QuadTransform Class ------------------------ - -**QuadTransform** (class) -[`# <#PIL.ImageTransform.QuadTransform-class>`_] - Define an quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the - image to a rectangle of the given size. - - *xy* - An 8-tuple (*x0, y0, x1, y1, x2, y2, y3, y3*) which contain the - upper left, lower left, lower right, and upper right corner of - the source quadrilateral. - diff --git a/docs/pythondoc-PIL.ImageWin.rst b/docs/pythondoc-PIL.ImageWin.rst deleted file mode 100644 index 2bcb8fbb2..000000000 --- a/docs/pythondoc-PIL.ImageWin.rst +++ /dev/null @@ -1,107 +0,0 @@ -======================= -The PIL.ImageWin Module -======================= - -The PIL.ImageWin Module -======================= - -**Dib(image, size=None)** (class) [`# <#PIL.ImageWin.Dib-class>`_] - Create a Windows bitmap with the given mode and size. - - For more information about this class, see `*The Dib - Class* <#PIL.ImageWin.Dib-class>`_. - -**HDC(dc)** (class) [`# <#PIL.ImageWin.HDC-class>`_] - The ImageWin module contains support to create and display images - under Windows 95/98, NT, 2000 and later. - - For more information about this class, see `*The HDC - Class* <#PIL.ImageWin.HDC-class>`_. - -**ImageWindow(image, title="PIL")** (class) -[`# <#PIL.ImageWin.ImageWindow-class>`_] - Create an image window which displays the given image. - - For more information about this class, see `*The ImageWindow - Class* <#PIL.ImageWin.ImageWindow-class>`_. - -**Window(title="PIL", width=None, height=None)** (class) -[`# <#PIL.ImageWin.Window-class>`_] - Create a Window with the given title size. - - For more information about this class, see `*The Window - Class* <#PIL.ImageWin.Window-class>`_. - -The Dib Class -------------- - -**Dib(image, size=None)** (class) [`# <#PIL.ImageWin.Dib-class>`_] - Create a Windows bitmap with the given mode and size. The mode can - be one of "1", "L", "P", or "RGB". If the display requires a - palette, this constructor creates a suitable palette and associates - it with the image. For an "L" image, 128 greylevels are allocated. - For an "RGB" image, a 6x6x6 colour cube is used, together with 20 - greylevels. To make sure that palettes work properly under Windows, - you must call the **palette** method upon certain events from - Windows. - -**\_\_init\_\_(image, size=None)** -[`# <#PIL.ImageWin.Dib.__init__-method>`_] - - *image* - *size* - -**expose(handle)** [`# <#PIL.ImageWin.Dib.expose-method>`_] - - *handle* - Device context (HDC), cast to a Python integer, or a HDC or HWND - instance. In PythonWin, you can use the **GetHandleAttrib** - method of the **CDC** class to get a suitable handle. - -**frombytes(buffer)** [`# <#PIL.ImageWin.Dib.frombytes-method>`_] - (For Python 2.6/2.7, this is also available as fromstring(buffer).) - - *buffer* - A byte buffer containing display data (usually data returned - from **tobytes**) - -**paste(im, box=None)** [`# <#PIL.ImageWin.Dib.paste-method>`_] - - *im* - *box* - -**query\_palette(handle)** -[`# <#PIL.ImageWin.Dib.query_palette-method>`_] - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, - and the image should be redrawn. - - *handle* - Returns: - -**tobytes()** [`# <#PIL.ImageWin.Dib.tobytes-method>`_] - - Returns: - -The HDC Class -------------- - -**HDC(dc)** (class) [`# <#PIL.ImageWin.HDC-class>`_] - The **ImageWin** module contains support to create and display - images under Windows 95/98, NT, 2000 and later. - -The ImageWindow Class ---------------------- - -**ImageWindow(image, title="PIL")** (class) -[`# <#PIL.ImageWin.ImageWindow-class>`_] - -The Window Class ----------------- - -**Window(title="PIL", width=None, height=None)** (class) -[`# <#PIL.ImageWin.Window-class>`_] diff --git a/docs/pythondoc-PIL.ImtImagePlugin.rst b/docs/pythondoc-PIL.ImtImagePlugin.rst deleted file mode 100644 index 1c8737b22..000000000 --- a/docs/pythondoc-PIL.ImtImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.ImtImagePlugin Module -============================= - -The PIL.ImtImagePlugin Module -============================= - -**ImtImageFile** (class) [`# <#PIL.ImtImagePlugin.ImtImageFile-class>`_] - Image plugin for IM Tools images. - - For more information about this class, see `*The ImtImageFile - Class* <#PIL.ImtImagePlugin.ImtImageFile-class>`_. - -The ImtImageFile Class ----------------------- - -**ImtImageFile** (class) [`# <#PIL.ImtImagePlugin.ImtImageFile-class>`_] diff --git a/docs/pythondoc-PIL.IptcImagePlugin.rst b/docs/pythondoc-PIL.IptcImagePlugin.rst deleted file mode 100644 index d8b29633f..000000000 --- a/docs/pythondoc-PIL.IptcImagePlugin.rst +++ /dev/null @@ -1,27 +0,0 @@ -============================== -The PIL.IptcImagePlugin Module -============================== - -The PIL.IptcImagePlugin Module -============================== - -**getiptcinfo(im)** [`# <#PIL.IptcImagePlugin.getiptcinfo-function>`_] - - *im* - Returns: - -**IptcImageFile** (class) -[`# <#PIL.IptcImagePlugin.IptcImageFile-class>`_] - Image plugin for IPTC/NAA datastreams. - - For more information about this class, see `*The IptcImageFile - Class* <#PIL.IptcImagePlugin.IptcImageFile-class>`_. - -The IptcImageFile Class ------------------------ - -**IptcImageFile** (class) -[`# <#PIL.IptcImagePlugin.IptcImageFile-class>`_] - Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields from - TIFF and JPEG files, use the **getiptcinfo** function. - diff --git a/docs/pythondoc-PIL.JpegImagePlugin.rst b/docs/pythondoc-PIL.JpegImagePlugin.rst deleted file mode 100644 index a752b3b4f..000000000 --- a/docs/pythondoc-PIL.JpegImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -============================== -The PIL.JpegImagePlugin Module -============================== - -The PIL.JpegImagePlugin Module -============================== - -**JpegImageFile** (class) -[`# <#PIL.JpegImagePlugin.JpegImageFile-class>`_] - Image plugin for JPEG and JFIF images. - - For more information about this class, see `*The JpegImageFile - Class* <#PIL.JpegImagePlugin.JpegImageFile-class>`_. - -The JpegImageFile Class ------------------------ - -**JpegImageFile** (class) -[`# <#PIL.JpegImagePlugin.JpegImageFile-class>`_] diff --git a/docs/pythondoc-PIL.McIdasImagePlugin.rst b/docs/pythondoc-PIL.McIdasImagePlugin.rst deleted file mode 100644 index a2f8951c2..000000000 --- a/docs/pythondoc-PIL.McIdasImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -================================ -The PIL.McIdasImagePlugin Module -================================ - -The PIL.McIdasImagePlugin Module -================================ - -**McIdasImageFile** (class) -[`# <#PIL.McIdasImagePlugin.McIdasImageFile-class>`_] - Image plugin for McIdas area images. - - For more information about this class, see `*The McIdasImageFile - Class* <#PIL.McIdasImagePlugin.McIdasImageFile-class>`_. - -The McIdasImageFile Class -------------------------- - -**McIdasImageFile** (class) -[`# <#PIL.McIdasImagePlugin.McIdasImageFile-class>`_] diff --git a/docs/pythondoc-PIL.MicImagePlugin.rst b/docs/pythondoc-PIL.MicImagePlugin.rst deleted file mode 100644 index e87e2faf1..000000000 --- a/docs/pythondoc-PIL.MicImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.MicImagePlugin Module -============================= - -The PIL.MicImagePlugin Module -============================= - -**MicImageFile** (class) [`# <#PIL.MicImagePlugin.MicImageFile-class>`_] - Image plugin for Microsoft's Image Composer file format. - - For more information about this class, see `*The MicImageFile - Class* <#PIL.MicImagePlugin.MicImageFile-class>`_. - -The MicImageFile Class ----------------------- - -**MicImageFile** (class) [`# <#PIL.MicImagePlugin.MicImageFile-class>`_] diff --git a/docs/pythondoc-PIL.MpegImagePlugin.rst b/docs/pythondoc-PIL.MpegImagePlugin.rst deleted file mode 100644 index 6a0c7a227..000000000 --- a/docs/pythondoc-PIL.MpegImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -============================== -The PIL.MpegImagePlugin Module -============================== - -The PIL.MpegImagePlugin Module -============================== - -**MpegImageFile** (class) -[`# <#PIL.MpegImagePlugin.MpegImageFile-class>`_] - Image plugin for MPEG streams. - - For more information about this class, see `*The MpegImageFile - Class* <#PIL.MpegImagePlugin.MpegImageFile-class>`_. - -The MpegImageFile Class ------------------------ - -**MpegImageFile** (class) -[`# <#PIL.MpegImagePlugin.MpegImageFile-class>`_] diff --git a/docs/pythondoc-PIL.MspImagePlugin.rst b/docs/pythondoc-PIL.MspImagePlugin.rst deleted file mode 100644 index a9cb5ba04..000000000 --- a/docs/pythondoc-PIL.MspImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.MspImagePlugin Module -============================= - -The PIL.MspImagePlugin Module -============================= - -**MspImageFile** (class) [`# <#PIL.MspImagePlugin.MspImageFile-class>`_] - Image plugin for Windows MSP images. - - For more information about this class, see `*The MspImageFile - Class* <#PIL.MspImagePlugin.MspImageFile-class>`_. - -The MspImageFile Class ----------------------- - -**MspImageFile** (class) [`# <#PIL.MspImagePlugin.MspImageFile-class>`_] diff --git a/docs/pythondoc-PIL.OleFileIO.rst b/docs/pythondoc-PIL.OleFileIO.rst deleted file mode 100644 index 12ff5f654..000000000 --- a/docs/pythondoc-PIL.OleFileIO.rst +++ /dev/null @@ -1,31 +0,0 @@ -======================== -The PIL.OleFileIO Module -======================== - -The PIL.OleFileIO Module -======================== - -**OleFileIO(filename=None)** (class) -[`# <#PIL.OleFileIO.OleFileIO-class>`_] - This class encapsulates the interface to an OLE 2 structured storage - file. - - For more information about this class, see `*The OleFileIO - Class* <#PIL.OleFileIO.OleFileIO-class>`_. - -The OleFileIO Class -------------------- - -**OleFileIO(filename=None)** (class) -[`# <#PIL.OleFileIO.OleFileIO-class>`_] - This class encapsulates the interface to an OLE 2 structured storage - file. Use the `**listdir** `_ and - `**openstream** `_ methods to access the contents - of this file. - -**getproperties(filename)** -[`# <#PIL.OleFileIO.OleFileIO.getproperties-method>`_] -**listdir()** [`# <#PIL.OleFileIO.OleFileIO.listdir-method>`_] -**open(filename)** [`# <#PIL.OleFileIO.OleFileIO.open-method>`_] -**openstream(filename)** -[`# <#PIL.OleFileIO.OleFileIO.openstream-method>`_] diff --git a/docs/pythondoc-PIL.PSDraw.rst b/docs/pythondoc-PIL.PSDraw.rst deleted file mode 100644 index f2f73b9e2..000000000 --- a/docs/pythondoc-PIL.PSDraw.rst +++ /dev/null @@ -1,17 +0,0 @@ -===================== -The PIL.PSDraw Module -===================== - -The PIL.PSDraw Module -===================== - -**PSDraw(fp=None)** (class) [`# <#PIL.PSDraw.PSDraw-class>`_] - Simple Postscript graphics interface. - - For more information about this class, see `*The PSDraw - Class* <#PIL.PSDraw.PSDraw-class>`_. - -The PSDraw Class ----------------- - -**PSDraw(fp=None)** (class) [`# <#PIL.PSDraw.PSDraw-class>`_] diff --git a/docs/pythondoc-PIL.PaletteFile.rst b/docs/pythondoc-PIL.PaletteFile.rst deleted file mode 100644 index 324fd2fe2..000000000 --- a/docs/pythondoc-PIL.PaletteFile.rst +++ /dev/null @@ -1,17 +0,0 @@ -========================== -The PIL.PaletteFile Module -========================== - -The PIL.PaletteFile Module -========================== - -**PaletteFile(fp)** (class) [`# <#PIL.PaletteFile.PaletteFile-class>`_] - File handler for Teragon-style palette files. - - For more information about this class, see `*The PaletteFile - Class* <#PIL.PaletteFile.PaletteFile-class>`_. - -The PaletteFile Class ---------------------- - -**PaletteFile(fp)** (class) [`# <#PIL.PaletteFile.PaletteFile-class>`_] diff --git a/docs/pythondoc-PIL.PalmImagePlugin.rst b/docs/pythondoc-PIL.PalmImagePlugin.rst deleted file mode 100644 index f3a7cb5e5..000000000 --- a/docs/pythondoc-PIL.PalmImagePlugin.rst +++ /dev/null @@ -1,12 +0,0 @@ -============================== -The PIL.PalmImagePlugin Module -============================== - -The PIL.PalmImagePlugin Module -============================== - -Module Contents ---------------- - -**\_save(im, fp, filename, check=0)** -[`# <#PIL.PalmImagePlugin._save-function>`_] diff --git a/docs/pythondoc-PIL.PcdImagePlugin.rst b/docs/pythondoc-PIL.PcdImagePlugin.rst deleted file mode 100644 index e1bc43aaf..000000000 --- a/docs/pythondoc-PIL.PcdImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.PcdImagePlugin Module -============================= - -The PIL.PcdImagePlugin Module -============================= - -**PcdImageFile** (class) [`# <#PIL.PcdImagePlugin.PcdImageFile-class>`_] - Image plugin for PhotoCD images. - - For more information about this class, see `*The PcdImageFile - Class* <#PIL.PcdImagePlugin.PcdImageFile-class>`_. - -The PcdImageFile Class ----------------------- - -**PcdImageFile** (class) [`# <#PIL.PcdImagePlugin.PcdImageFile-class>`_] diff --git a/docs/pythondoc-PIL.PcfFontFile.rst b/docs/pythondoc-PIL.PcfFontFile.rst deleted file mode 100644 index 51ac27d1c..000000000 --- a/docs/pythondoc-PIL.PcfFontFile.rst +++ /dev/null @@ -1,17 +0,0 @@ -========================== -The PIL.PcfFontFile Module -========================== - -The PIL.PcfFontFile Module -========================== - -**PcfFontFile(fp)** (class) [`# <#PIL.PcfFontFile.PcfFontFile-class>`_] - Font file plugin for the X11 PCF format. - - For more information about this class, see `*The PcfFontFile - Class* <#PIL.PcfFontFile.PcfFontFile-class>`_. - -The PcfFontFile Class ---------------------- - -**PcfFontFile(fp)** (class) [`# <#PIL.PcfFontFile.PcfFontFile-class>`_] diff --git a/docs/pythondoc-PIL.PcxImagePlugin.rst b/docs/pythondoc-PIL.PcxImagePlugin.rst deleted file mode 100644 index 0255c990b..000000000 --- a/docs/pythondoc-PIL.PcxImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.PcxImagePlugin Module -============================= - -The PIL.PcxImagePlugin Module -============================= - -**PcxImageFile** (class) [`# <#PIL.PcxImagePlugin.PcxImageFile-class>`_] - Image plugin for Paintbrush images. - - For more information about this class, see `*The PcxImageFile - Class* <#PIL.PcxImagePlugin.PcxImageFile-class>`_. - -The PcxImageFile Class ----------------------- - -**PcxImageFile** (class) [`# <#PIL.PcxImagePlugin.PcxImageFile-class>`_] diff --git a/docs/pythondoc-PIL.PdfImagePlugin.rst b/docs/pythondoc-PIL.PdfImagePlugin.rst deleted file mode 100644 index de63382c5..000000000 --- a/docs/pythondoc-PIL.PdfImagePlugin.rst +++ /dev/null @@ -1,11 +0,0 @@ -============================= -The PIL.PdfImagePlugin Module -============================= - -The PIL.PdfImagePlugin Module -============================= - -Module Contents ---------------- - -**\_save(im, fp, filename)** [`# <#PIL.PdfImagePlugin._save-function>`_] diff --git a/docs/pythondoc-PIL.PixarImagePlugin.rst b/docs/pythondoc-PIL.PixarImagePlugin.rst deleted file mode 100644 index e4cecf7a1..000000000 --- a/docs/pythondoc-PIL.PixarImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -=============================== -The PIL.PixarImagePlugin Module -=============================== - -The PIL.PixarImagePlugin Module -=============================== - -**PixarImageFile** (class) -[`# <#PIL.PixarImagePlugin.PixarImageFile-class>`_] - Image plugin for PIXAR raster images. - - For more information about this class, see `*The PixarImageFile - Class* <#PIL.PixarImagePlugin.PixarImageFile-class>`_. - -The PixarImageFile Class ------------------------- - -**PixarImageFile** (class) -[`# <#PIL.PixarImagePlugin.PixarImageFile-class>`_] diff --git a/docs/pythondoc-PIL.PngImagePlugin.rst b/docs/pythondoc-PIL.PngImagePlugin.rst deleted file mode 100644 index 5d7b4991c..000000000 --- a/docs/pythondoc-PIL.PngImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.PngImagePlugin Module -============================= - -The PIL.PngImagePlugin Module -============================= - -**PngImageFile** (class) [`# <#PIL.PngImagePlugin.PngImageFile-class>`_] - Image plugin for PNG images. - - For more information about this class, see `*The PngImageFile - Class* <#PIL.PngImagePlugin.PngImageFile-class>`_. - -The PngImageFile Class ----------------------- - -**PngImageFile** (class) [`# <#PIL.PngImagePlugin.PngImageFile-class>`_] diff --git a/docs/pythondoc-PIL.PpmImagePlugin.rst b/docs/pythondoc-PIL.PpmImagePlugin.rst deleted file mode 100644 index 72ce7cae9..000000000 --- a/docs/pythondoc-PIL.PpmImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.PpmImagePlugin Module -============================= - -The PIL.PpmImagePlugin Module -============================= - -**PpmImageFile** (class) [`# <#PIL.PpmImagePlugin.PpmImageFile-class>`_] - Image plugin for PBM, PGM, and PPM images. - - For more information about this class, see `*The PpmImageFile - Class* <#PIL.PpmImagePlugin.PpmImageFile-class>`_. - -The PpmImageFile Class ----------------------- - -**PpmImageFile** (class) [`# <#PIL.PpmImagePlugin.PpmImageFile-class>`_] diff --git a/docs/pythondoc-PIL.PsdImagePlugin.rst b/docs/pythondoc-PIL.PsdImagePlugin.rst deleted file mode 100644 index 17ffc69b5..000000000 --- a/docs/pythondoc-PIL.PsdImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.PsdImagePlugin Module -============================= - -The PIL.PsdImagePlugin Module -============================= - -**PsdImageFile** (class) [`# <#PIL.PsdImagePlugin.PsdImageFile-class>`_] - Image plugin for Photoshop images. - - For more information about this class, see `*The PsdImageFile - Class* <#PIL.PsdImagePlugin.PsdImageFile-class>`_. - -The PsdImageFile Class ----------------------- - -**PsdImageFile** (class) [`# <#PIL.PsdImagePlugin.PsdImageFile-class>`_] diff --git a/docs/pythondoc-PIL.SgiImagePlugin.rst b/docs/pythondoc-PIL.SgiImagePlugin.rst deleted file mode 100644 index 10b404b0a..000000000 --- a/docs/pythondoc-PIL.SgiImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.SgiImagePlugin Module -============================= - -The PIL.SgiImagePlugin Module -============================= - -**SgiImageFile** (class) [`# <#PIL.SgiImagePlugin.SgiImageFile-class>`_] - Image plugin for SGI images. - - For more information about this class, see `*The SgiImageFile - Class* <#PIL.SgiImagePlugin.SgiImageFile-class>`_. - -The SgiImageFile Class ----------------------- - -**SgiImageFile** (class) [`# <#PIL.SgiImagePlugin.SgiImageFile-class>`_] diff --git a/docs/pythondoc-PIL.SpiderImagePlugin.rst b/docs/pythondoc-PIL.SpiderImagePlugin.rst deleted file mode 100644 index a2b287300..000000000 --- a/docs/pythondoc-PIL.SpiderImagePlugin.rst +++ /dev/null @@ -1,28 +0,0 @@ -================================ -The PIL.SpiderImagePlugin Module -================================ - -The PIL.SpiderImagePlugin Module -================================ - -Image plugin for the Spider image format. This format is is used by the -SPIDER software, in processing image data from electron microscopy and -tomography. - -Module Contents ---------------- - -**SpiderImageFile** (class) -[`# <#PIL.SpiderImagePlugin.SpiderImageFile-class>`_] - Image plugin for the SPIDER format. - - For more information about this class, see `*The SpiderImageFile - Class* <#PIL.SpiderImagePlugin.SpiderImageFile-class>`_. - -The SpiderImageFile Class -------------------------- - -**SpiderImageFile** (class) -[`# <#PIL.SpiderImagePlugin.SpiderImageFile-class>`_] - Image plugin for the SPIDER format. - diff --git a/docs/pythondoc-PIL.SunImagePlugin.rst b/docs/pythondoc-PIL.SunImagePlugin.rst deleted file mode 100644 index b41326616..000000000 --- a/docs/pythondoc-PIL.SunImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.SunImagePlugin Module -============================= - -The PIL.SunImagePlugin Module -============================= - -**SunImageFile** (class) [`# <#PIL.SunImagePlugin.SunImageFile-class>`_] - Image plugin for Sun raster files. - - For more information about this class, see `*The SunImageFile - Class* <#PIL.SunImagePlugin.SunImageFile-class>`_. - -The SunImageFile Class ----------------------- - -**SunImageFile** (class) [`# <#PIL.SunImagePlugin.SunImageFile-class>`_] diff --git a/docs/pythondoc-PIL.TarIO.rst b/docs/pythondoc-PIL.TarIO.rst deleted file mode 100644 index 1f10fab4a..000000000 --- a/docs/pythondoc-PIL.TarIO.rst +++ /dev/null @@ -1,24 +0,0 @@ -==================== -The PIL.TarIO Module -==================== - -The PIL.TarIO Module -==================== - -**TarIO(tarfile, file)** (class) [`# <#PIL.TarIO.TarIO-class>`_] - A file object that provides read access to a given member of a TAR - file. - - For more information about this class, see `*The TarIO - Class* <#PIL.TarIO.TarIO-class>`_. - -The TarIO Class ---------------- - -**TarIO(tarfile, file)** (class) [`# <#PIL.TarIO.TarIO-class>`_] -**\_\_init\_\_(tarfile, file)** -[`# <#PIL.TarIO.TarIO.__init__-method>`_] - - *tarfile* - *file* - diff --git a/docs/pythondoc-PIL.TgaImagePlugin.rst b/docs/pythondoc-PIL.TgaImagePlugin.rst deleted file mode 100644 index 0ec930893..000000000 --- a/docs/pythondoc-PIL.TgaImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.TgaImagePlugin Module -============================= - -The PIL.TgaImagePlugin Module -============================= - -**TgaImageFile** (class) [`# <#PIL.TgaImagePlugin.TgaImageFile-class>`_] - Image plugin for Targa files. - - For more information about this class, see `*The TgaImageFile - Class* <#PIL.TgaImagePlugin.TgaImageFile-class>`_. - -The TgaImageFile Class ----------------------- - -**TgaImageFile** (class) [`# <#PIL.TgaImagePlugin.TgaImageFile-class>`_] diff --git a/docs/pythondoc-PIL.TiffImagePlugin.rst b/docs/pythondoc-PIL.TiffImagePlugin.rst deleted file mode 100644 index 483743983..000000000 --- a/docs/pythondoc-PIL.TiffImagePlugin.rst +++ /dev/null @@ -1,32 +0,0 @@ -============================== -The PIL.TiffImagePlugin Module -============================== - -The PIL.TiffImagePlugin Module -============================== - -**ImageFileDirectory(prefix="II")** (class) -[`# <#PIL.TiffImagePlugin.ImageFileDirectory-class>`_] - Wrapper for TIFF IFDs. - - For more information about this class, see `*The ImageFileDirectory - Class* <#PIL.TiffImagePlugin.ImageFileDirectory-class>`_. - -**TiffImageFile** (class) -[`# <#PIL.TiffImagePlugin.TiffImageFile-class>`_] - Image plugin for TIFF files. - - For more information about this class, see `*The TiffImageFile - Class* <#PIL.TiffImagePlugin.TiffImageFile-class>`_. - -The ImageFileDirectory Class ----------------------------- - -**ImageFileDirectory(prefix="II")** (class) -[`# <#PIL.TiffImagePlugin.ImageFileDirectory-class>`_] - -The TiffImageFile Class ------------------------ - -**TiffImageFile** (class) -[`# <#PIL.TiffImagePlugin.TiffImageFile-class>`_] diff --git a/docs/pythondoc-PIL.TiffTags.rst b/docs/pythondoc-PIL.TiffTags.rst deleted file mode 100644 index 73d51d75b..000000000 --- a/docs/pythondoc-PIL.TiffTags.rst +++ /dev/null @@ -1,12 +0,0 @@ -======================= -The PIL.TiffTags Module -======================= - -The PIL.TiffTags Module -======================= - -Module Contents ---------------- - -**TAGS** (variable) [`# <#PIL.TiffTags.TAGS-variable>`_] -**TYPES** (variable) [`# <#PIL.TiffTags.TYPES-variable>`_] diff --git a/docs/pythondoc-PIL.WalImageFile.rst b/docs/pythondoc-PIL.WalImageFile.rst deleted file mode 100644 index bda6255d4..000000000 --- a/docs/pythondoc-PIL.WalImageFile.rst +++ /dev/null @@ -1,16 +0,0 @@ -=========================== -The PIL.WalImageFile Module -=========================== - -The PIL.WalImageFile Module -=========================== - -**open(filename)** [`# <#PIL.WalImageFile.open-function>`_] - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. To - override the palette, use the **putpalette** method. - - *filename* - Returns: - diff --git a/docs/pythondoc-PIL.WmfImagePlugin.rst b/docs/pythondoc-PIL.WmfImagePlugin.rst deleted file mode 100644 index e4e1bd83f..000000000 --- a/docs/pythondoc-PIL.WmfImagePlugin.rst +++ /dev/null @@ -1,24 +0,0 @@ -============================= -The PIL.WmfImagePlugin Module -============================= - -The PIL.WmfImagePlugin Module -============================= - -**register\_handler(handler)** -[`# <#PIL.WmfImagePlugin.register_handler-function>`_] - - *handler* - -**WmfStubImageFile** (class) -[`# <#PIL.WmfImagePlugin.WmfStubImageFile-class>`_] - Image plugin for Windows metafiles. - - For more information about this class, see `*The WmfStubImageFile - Class* <#PIL.WmfImagePlugin.WmfStubImageFile-class>`_. - -The WmfStubImageFile Class --------------------------- - -**WmfStubImageFile** (class) -[`# <#PIL.WmfImagePlugin.WmfStubImageFile-class>`_] diff --git a/docs/pythondoc-PIL.XVThumbImagePlugin.rst b/docs/pythondoc-PIL.XVThumbImagePlugin.rst deleted file mode 100644 index 0218c7767..000000000 --- a/docs/pythondoc-PIL.XVThumbImagePlugin.rst +++ /dev/null @@ -1,19 +0,0 @@ -================================= -The PIL.XVThumbImagePlugin Module -================================= - -The PIL.XVThumbImagePlugin Module -================================= - -**XVThumbImageFile** (class) -[`# <#PIL.XVThumbImagePlugin.XVThumbImageFile-class>`_] - Image plugin for XV thumbnail images. - - For more information about this class, see `*The XVThumbImageFile - Class* <#PIL.XVThumbImagePlugin.XVThumbImageFile-class>`_. - -The XVThumbImageFile Class --------------------------- - -**XVThumbImageFile** (class) -[`# <#PIL.XVThumbImagePlugin.XVThumbImageFile-class>`_] diff --git a/docs/pythondoc-PIL.XbmImagePlugin.rst b/docs/pythondoc-PIL.XbmImagePlugin.rst deleted file mode 100644 index 2b982d2ca..000000000 --- a/docs/pythondoc-PIL.XbmImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.XbmImagePlugin Module -============================= - -The PIL.XbmImagePlugin Module -============================= - -**XbmImageFile** (class) [`# <#PIL.XbmImagePlugin.XbmImageFile-class>`_] - Image plugin for X11 bitmaps. - - For more information about this class, see `*The XbmImageFile - Class* <#PIL.XbmImagePlugin.XbmImageFile-class>`_. - -The XbmImageFile Class ----------------------- - -**XbmImageFile** (class) [`# <#PIL.XbmImagePlugin.XbmImageFile-class>`_] diff --git a/docs/pythondoc-PIL.XpmImagePlugin.rst b/docs/pythondoc-PIL.XpmImagePlugin.rst deleted file mode 100644 index d4ea38398..000000000 --- a/docs/pythondoc-PIL.XpmImagePlugin.rst +++ /dev/null @@ -1,17 +0,0 @@ -============================= -The PIL.XpmImagePlugin Module -============================= - -The PIL.XpmImagePlugin Module -============================= - -**XpmImageFile** (class) [`# <#PIL.XpmImagePlugin.XpmImageFile-class>`_] - Image plugin for X11 pixel maps. - - For more information about this class, see `*The XpmImageFile - Class* <#PIL.XpmImagePlugin.XpmImageFile-class>`_. - -The XpmImageFile Class ----------------------- - -**XpmImageFile** (class) [`# <#PIL.XpmImagePlugin.XpmImageFile-class>`_] From c191ad3f3e4f05ff10215ae57d7cbdf08967a9d9 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 19:52:50 +0200 Subject: [PATCH 020/102] Fresh start for docs, generated by sphinx-apidoc --- docs/Makefile | 153 ++++++++++++ docs/PIL.rst | 667 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/conf.py | 285 +++++++++++++++++++++ docs/index.rst | 23 ++ docs/make.bat | 190 ++++++++++++++ 5 files changed, 1318 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/PIL.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/make.bat diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..6fd3002d5 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PillowPILfork.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PillowPILfork.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/PillowPILfork" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PillowPILfork" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/PIL.rst b/docs/PIL.rst new file mode 100644 index 000000000..69321e8e0 --- /dev/null +++ b/docs/PIL.rst @@ -0,0 +1,667 @@ +PIL Package +=========== + +:mod:`PIL` Package +------------------ + +.. automodule:: PIL.__init__ + :members: + :undoc-members: + :show-inheritance: + +:mod:`ArgImagePlugin` Module +---------------------------- + +.. automodule:: PIL.ArgImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`BdfFontFile` Module +------------------------- + +.. automodule:: PIL.BdfFontFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`BmpImagePlugin` Module +---------------------------- + +.. automodule:: PIL.BmpImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`BufrStubImagePlugin` Module +--------------------------------- + +.. automodule:: PIL.BufrStubImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`ContainerIO` Module +------------------------- + +.. automodule:: PIL.ContainerIO + :members: + :undoc-members: + :show-inheritance: + +:mod:`CurImagePlugin` Module +---------------------------- + +.. automodule:: PIL.CurImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`DcxImagePlugin` Module +---------------------------- + +.. automodule:: PIL.DcxImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`EpsImagePlugin` Module +---------------------------- + +.. automodule:: PIL.EpsImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`ExifTags` Module +---------------------- + +.. automodule:: PIL.ExifTags + :members: + :undoc-members: + :show-inheritance: + +:mod:`FitsStubImagePlugin` Module +--------------------------------- + +.. automodule:: PIL.FitsStubImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`FliImagePlugin` Module +---------------------------- + +.. automodule:: PIL.FliImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`FontFile` Module +---------------------- + +.. automodule:: PIL.FontFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`FpxImagePlugin` Module +---------------------------- + +.. automodule:: PIL.FpxImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`GbrImagePlugin` Module +---------------------------- + +.. automodule:: PIL.GbrImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`GdImageFile` Module +------------------------- + +.. automodule:: PIL.GdImageFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`GifImagePlugin` Module +---------------------------- + +.. automodule:: PIL.GifImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`GimpGradientFile` Module +------------------------------ + +.. automodule:: PIL.GimpGradientFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`GimpPaletteFile` Module +----------------------------- + +.. automodule:: PIL.GimpPaletteFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`GribStubImagePlugin` Module +--------------------------------- + +.. automodule:: PIL.GribStubImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`Hdf5StubImagePlugin` Module +--------------------------------- + +.. automodule:: PIL.Hdf5StubImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`IcnsImagePlugin` Module +----------------------------- + +.. automodule:: PIL.IcnsImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`IcoImagePlugin` Module +---------------------------- + +.. automodule:: PIL.IcoImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImImagePlugin` Module +--------------------------- + +.. automodule:: PIL.ImImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`Image` Module +------------------- + +.. automodule:: PIL.Image + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageChops` Module +------------------------ + +.. automodule:: PIL.ImageChops + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageCms` Module +---------------------- + +.. automodule:: PIL.ImageCms + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageColor` Module +------------------------ + +.. automodule:: PIL.ImageColor + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageDraw` Module +----------------------- + +.. automodule:: PIL.ImageDraw + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageDraw2` Module +------------------------ + +.. automodule:: PIL.ImageDraw2 + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageEnhance` Module +-------------------------- + +.. automodule:: PIL.ImageEnhance + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageFile` Module +----------------------- + +.. automodule:: PIL.ImageFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageFileIO` Module +------------------------- + +.. automodule:: PIL.ImageFileIO + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageFilter` Module +------------------------- + +.. automodule:: PIL.ImageFilter + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageFont` Module +----------------------- + +.. automodule:: PIL.ImageFont + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageGL` Module +--------------------- + +.. automodule:: PIL.ImageGL + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageGrab` Module +----------------------- + +.. automodule:: PIL.ImageGrab + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageMath` Module +----------------------- + +.. automodule:: PIL.ImageMath + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageMode` Module +----------------------- + +.. automodule:: PIL.ImageMode + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageOps` Module +---------------------- + +.. automodule:: PIL.ImageOps + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImagePalette` Module +-------------------------- + +.. automodule:: PIL.ImagePalette + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImagePath` Module +----------------------- + +.. automodule:: PIL.ImagePath + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageQt` Module +--------------------- + +.. automodule:: PIL.ImageQt + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageSequence` Module +--------------------------- + +.. automodule:: PIL.ImageSequence + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageShow` Module +----------------------- + +.. automodule:: PIL.ImageShow + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageStat` Module +----------------------- + +.. automodule:: PIL.ImageStat + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageTk` Module +--------------------- + +.. automodule:: PIL.ImageTk + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageTransform` Module +---------------------------- + +.. automodule:: PIL.ImageTransform + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImageWin` Module +---------------------- + +.. automodule:: PIL.ImageWin + :members: + :undoc-members: + :show-inheritance: + +:mod:`ImtImagePlugin` Module +---------------------------- + +.. automodule:: PIL.ImtImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`IptcImagePlugin` Module +----------------------------- + +.. automodule:: PIL.IptcImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`JpegImagePlugin` Module +----------------------------- + +.. automodule:: PIL.JpegImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`JpegPresets` Module +------------------------- + +.. automodule:: PIL.JpegPresets + :members: + :undoc-members: + :show-inheritance: + +:mod:`McIdasImagePlugin` Module +------------------------------- + +.. automodule:: PIL.McIdasImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`MicImagePlugin` Module +---------------------------- + +.. automodule:: PIL.MicImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`MpegImagePlugin` Module +----------------------------- + +.. automodule:: PIL.MpegImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`MspImagePlugin` Module +---------------------------- + +.. automodule:: PIL.MspImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`OleFileIO` Module +----------------------- + +.. automodule:: PIL.OleFileIO + :members: + :undoc-members: + :show-inheritance: + +:mod:`PSDraw` Module +-------------------- + +.. automodule:: PIL.PSDraw + :members: + :undoc-members: + :show-inheritance: + +:mod:`PaletteFile` Module +------------------------- + +.. automodule:: PIL.PaletteFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`PalmImagePlugin` Module +----------------------------- + +.. automodule:: PIL.PalmImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PcdImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PcdImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PcfFontFile` Module +------------------------- + +.. automodule:: PIL.PcfFontFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`PcxImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PcxImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PdfImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PdfImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PixarImagePlugin` Module +------------------------------ + +.. automodule:: PIL.PixarImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PngImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PngImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PpmImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PpmImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`PsdImagePlugin` Module +---------------------------- + +.. automodule:: PIL.PsdImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`SgiImagePlugin` Module +---------------------------- + +.. automodule:: PIL.SgiImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`SpiderImagePlugin` Module +------------------------------- + +.. automodule:: PIL.SpiderImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`SunImagePlugin` Module +---------------------------- + +.. automodule:: PIL.SunImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`TarIO` Module +------------------- + +.. automodule:: PIL.TarIO + :members: + :undoc-members: + :show-inheritance: + +:mod:`TgaImagePlugin` Module +---------------------------- + +.. automodule:: PIL.TgaImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`TiffImagePlugin` Module +----------------------------- + +.. automodule:: PIL.TiffImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`TiffTags` Module +---------------------- + +.. automodule:: PIL.TiffTags + :members: + :undoc-members: + :show-inheritance: + +:mod:`WalImageFile` Module +-------------------------- + +.. automodule:: PIL.WalImageFile + :members: + :undoc-members: + :show-inheritance: + +:mod:`WebPImagePlugin` Module +----------------------------- + +.. automodule:: PIL.WebPImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`WmfImagePlugin` Module +---------------------------- + +.. automodule:: PIL.WmfImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`XVThumbImagePlugin` Module +-------------------------------- + +.. automodule:: PIL.XVThumbImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`XbmImagePlugin` Module +---------------------------- + +.. automodule:: PIL.XbmImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`XpmImagePlugin` Module +---------------------------- + +.. automodule:: PIL.XpmImagePlugin + :members: + :undoc-members: + :show-inheritance: + +:mod:`_binary` Module +--------------------- + +.. automodule:: PIL._binary + :members: + :undoc-members: + :show-inheritance: + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..58814cdb3 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- +# +# Pillow (PIL fork) documentation build configuration file, created by +# sphinx-quickstart on Fri Apr 12 19:51:26 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Pillow (PIL fork)' +copyright = u'2013, Author' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '2.0.0' +# The full version, including alpha/beta/rc tags. +release = '2.0.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'PillowPILforkdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'PillowPILfork.tex', u'Pillow (PIL fork) Documentation', + u'Author', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'pillowpilfork', u'Pillow (PIL fork) Documentation', + [u'Author'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'PillowPILfork', u'Pillow (PIL fork) Documentation', + u'Author', 'PillowPILfork', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# -- Options for Epub output --------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'Pillow (PIL fork)' +epub_author = u'Author' +epub_publisher = u'Author' +epub_copyright = u'2013, Author' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +#epub_exclude_files = [] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..89e89d4d5 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,23 @@ +.. Pillow (PIL fork) documentation master file, created by + sphinx-quickstart on Fri Apr 12 19:51:26 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pillow (PIL fork)'s documentation! +============================================= + +Contents: + +.. toctree:: + :maxdepth: 4 + + PIL + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 000000000..c943319ad --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PillowPILfork.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PillowPILfork.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end From 05ff4122a98699c7d5161fa9c8f9c71b53a481b0 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 20:00:17 +0200 Subject: [PATCH 021/102] Remove docs for dead modules --- docs/PIL.rst | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/docs/PIL.rst b/docs/PIL.rst index 69321e8e0..870b896fa 100644 --- a/docs/PIL.rst +++ b/docs/PIL.rst @@ -281,22 +281,6 @@ PIL Package :undoc-members: :show-inheritance: -:mod:`ImageGL` Module ---------------------- - -.. automodule:: PIL.ImageGL - :members: - :undoc-members: - :show-inheritance: - -:mod:`ImageGrab` Module ------------------------ - -.. automodule:: PIL.ImageGrab - :members: - :undoc-members: - :show-inheritance: - :mod:`ImageMath` Module ----------------------- From 3d636b66ff8ba143dd3b8a8ff09b072428fee94b Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 20:05:45 +0200 Subject: [PATCH 022/102] Setup sphinx config --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 58814cdb3..222c71d44 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.abspath('../')) # -- General configuration ----------------------------------------------------- @@ -41,7 +41,7 @@ master_doc = 'index' # General information about the project. project = u'Pillow (PIL fork)' -copyright = u'2013, Author' +copyright = u'1997-2011 by Secret Labs AB, 1995-2011 by Fredrik Lundh, 2010-2013 Alex Clark' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From 194370d89b611e624eaa8db8bc40ef964667667a Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 12 Apr 2013 21:53:17 +0200 Subject: [PATCH 023/102] Fix some docstrings --- PIL/ImageCms.py | 664 +++++++++++++++++++++------------------------ PIL/JpegPresets.py | 51 ++-- PIL/OleFileIO.py | 2 +- 3 files changed, 331 insertions(+), 386 deletions(-) diff --git a/PIL/ImageCms.py b/PIL/ImageCms.py index c41139b2b..f966bb676 100644 --- a/PIL/ImageCms.py +++ b/PIL/ImageCms.py @@ -202,7 +202,7 @@ class ImageCmsTransform(Image.ImagePointHandler): ## # (experimental) Fetches the profile for the current display device. -# Returns None if the profile is not known. +# @return None if the profile is not known. def get_display_profile(handle=None): import sys @@ -234,59 +234,50 @@ class PyCMSError(Exception): ## # (pyCMS) Applies an ICC transformation to a given image, mapping from # inputProfile to outputProfile. +# +# If the input or output profiles specified are not valid filenames, a +# PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, +# a PyCMSError will be raised. If an error occurs during application of +# the profiles, a PyCMSError will be raised. If outputMode is not a mode +# supported by the outputProfile (or by pyCMS), a PyCMSError will be +# raised. +# +# This function applies an ICC transformation to im from inputProfile's +# color space to outputProfile's color space using the specified rendering +# intent to decide how to handle out-of-gamut colors. +# +# OutputMode can be used to specify that a color mode conversion is to +# be done using these profiles, but the specified profiles must be able +# to handle that mode. I.e., if converting im from RGB to CMYK using +# profiles, the input profile must handle RGB data, and the output +# profile must handle CMYK data. +# +# @param im An open PIL image object (i.e. Image.new(...) or Image.open(...), etc.) +# @param inputProfile String, as a valid filename path to the ICC input profile +# you wish to use for this image, or a profile object +# @param outputProfile String, as a valid filename path to the ICC output +# profile you wish to use for this image, or a profile object +# @param renderingIntent Integer (0-3) specifying the rendering intent you wish +# to use for the transform +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @param outputMode A valid PIL mode for the output image (i.e. "RGB", "CMYK", +# etc.). Note: if rendering the image "inPlace", outputMode MUST be the +# same mode as the input, or omitted completely. If omitted, the outputMode +# will be the same as the mode of the input image (im.mode) +# @param inPlace Boolean (1 = True, None or 0 = False). If True, the original +# image is modified in-place, and None is returned. If False (default), a +# new Image object is returned with the transform applied. +# @param flags Integer (0-...) specifying additional flags +# @return Either None or a new PIL image object, depending on value of inPlace +# @exception PyCMSError def profileToProfile(im, inputProfile, outputProfile, renderingIntent=INTENT_PERCEPTUAL, outputMode=None, inPlace=0, flags=0): - """ - ImageCms.profileToProfile(im, inputProfile, outputProfile, - [renderingIntent], [outputMode], [inPlace]) - - Returns either None or a new PIL image object, depending on value of - inPlace (see below). - - im = an open PIL image object (i.e. Image.new(...) or - Image.open(...), etc.) - inputProfile = string, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - outputProfile = string, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - renderingIntent = integer (0-3) specifying the rendering intent you - wish to use for the transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - see the pyCMS documentation for details on rendering intents and - what they do. - outputMode = a valid PIL mode for the output image (i.e. "RGB", "CMYK", - etc.). Note: if rendering the image "inPlace", outputMode MUST be - the same mode as the input, or omitted completely. If omitted, the - outputMode will be the same as the mode of the input image (im.mode) - inPlace = BOOL (1 = TRUE, None or 0 = FALSE). If TRUE, the original - image is modified in-place, and None is returned. If FALSE - (default), a new Image object is returned with the transform - applied. - flags = integer (0-...) specifying additional flags - - If the input or output profiles specified are not valid filenames, a - PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, - a PyCMSError will be raised. If an error occurs during application of - the profiles, a PyCMSError will be raised. If outputMode is not a mode - supported by the outputProfile (or by pyCMS), a PyCMSError will be - raised. - - This function applies an ICC transformation to im from inputProfile's - color space to outputProfile's color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - OutputMode can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - """ - if outputMode is None: outputMode = im.mode @@ -316,24 +307,19 @@ def profileToProfile(im, inputProfile, outputProfile, renderingIntent=INTENT_PER ## # (pyCMS) Opens an ICC profile file. +# +# The PyCMSProfile object can be passed back into pyCMS for use in creating +# transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). +# +# If profileFilename is not a vaild filename for an ICC profile, a PyCMSError +# will be raised. +# +# @param profileFilename String, as a valid filename path to the ICC profile you +# wish to open, or a file-like object. +# @return A CmsProfile class object. +# @exception PyCMSError def getOpenProfile(profileFilename): - """ - ImageCms.getOpenProfile(profileFilename) - - Returns a CmsProfile class object. - - profileFilename = string, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If profileFilename is not a vaild filename for an ICC profile, a - PyCMSError will be raised. - - """ - try: return ImageCmsProfile(profileFilename) except (IOError, TypeError, ValueError) as v: @@ -343,61 +329,56 @@ def getOpenProfile(profileFilename): # (pyCMS) Builds an ICC transform mapping from the inputProfile to the # outputProfile. Use applyTransform to apply the transform to a given # image. +# +# If the input or output profiles specified are not valid filenames, a +# PyCMSError will be raised. If an error occurs during creation of the +# transform, a PyCMSError will be raised. +# +# If inMode or outMode are not a mode supported by the outputProfile (or +# by pyCMS), a PyCMSError will be raised. +# +# This function builds and returns an ICC transform from the inputProfile +# to the outputProfile using the renderingIntent to determine what to do +# with out-of-gamut colors. It will ONLY work for converting images that +# are in inMode to images that are in outMode color format (PIL mode, +# i.e. "RGB", "RGBA", "CMYK", etc.). +# +# Building the transform is a fair part of the overhead in +# ImageCms.profileToProfile(), so if you're planning on converting multiple +# images using the same input/output settings, this can save you time. +# Once you have a transform object, it can be used with +# ImageCms.applyProfile() to convert images without the need to re-compute +# the lookup table for the transform. +# +# The reason pyCMS returns a class object rather than a handle directly +# to the transform is that it needs to keep track of the PIL input/output +# modes that the transform is meant for. These attributes are stored in +# the "inMode" and "outMode" attributes of the object (which can be +# manually overridden if you really want to, but I don't know of any +# time that would be of use, or would even work). +# +# @param inputProfile String, as a valid filename path to the ICC input profile +# you wish to use for this transform, or a profile object +# @param outputProfile String, as a valid filename path to the ICC output +# profile you wish to use for this transform, or a profile object +# @param inMode String, as a valid PIL mode that the appropriate profile also +# supports (i.e. "RGB", "RGBA", "CMYK", etc.) +# @param outMode String, as a valid PIL mode that the appropriate profile also +# supports (i.e. "RGB", "RGBA", "CMYK", etc.) +# @param renderingIntent Integer (0-3) specifying the rendering intent you +# wish to use for the transform +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @param flags Integer (0-...) specifying additional flags +# @return A CmsTransform class object. +# @exception PyCMSError def buildTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent=INTENT_PERCEPTUAL, flags=0): - """ - ImageCms.buildTransform(inputProfile, outputProfile, inMode, outMode, - [renderingIntent]) - - Returns a CmsTransform class object. - - inputProfile = string, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - outputProfile = string, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - inMode = string, as a valid PIL mode that the appropriate profile also - supports (i.e. "RGB", "RGBA", "CMYK", etc.) - outMode = string, as a valid PIL mode that the appropriate profile also - supports (i.e. "RGB", "RGBA", "CMYK", etc.) - renderingIntent = integer (0-3) specifying the rendering intent you - wish to use for the transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - see the pyCMS documentation for details on rendering intents and - what they do. - flags = integer (0-...) specifying additional flags - - If the input or output profiles specified are not valid filenames, a - PyCMSError will be raised. If an error occurs during creation of the - transform, a PyCMSError will be raised. - - If inMode or outMode are not a mode supported by the outputProfile (or - by pyCMS), a PyCMSError will be raised. - - This function builds and returns an ICC transform from the inputProfile - to the outputProfile using the renderingIntent to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in inMode to images that are in outMode color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the "inMode" and "outMode" attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - """ - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <=3): raise PyCMSError("renderingIntent must be an integer between 0 and 3") @@ -417,78 +398,74 @@ def buildTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent # (pyCMS) Builds an ICC transform mapping from the inputProfile to the # outputProfile, but tries to simulate the result that would be # obtained on the proofProfile device. +# +# If the input, output, or proof profiles specified are not valid +# filenames, a PyCMSError will be raised. +# +# If an error occurs during creation of the transform, a PyCMSError will +# be raised. +# +# If inMode or outMode are not a mode supported by the outputProfile +# (or by pyCMS), a PyCMSError will be raised. +# +# This function builds and returns an ICC transform from the inputProfile +# to the outputProfile, but tries to simulate the result that would be +# obtained on the proofProfile device using renderingIntent and +# proofRenderingIntent to determine what to do with out-of-gamut +# colors. This is known as "soft-proofing". It will ONLY work for +# converting images that are in inMode to images that are in outMode +# color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). +# +# Usage of the resulting transform object is exactly the same as with +# ImageCms.buildTransform(). +# +# Proof profiling is generally used when using an output device to get a +# good idea of what the final printed/displayed image would look like on +# the proofProfile device when it's quicker and easier to use the +# output device for judging color. Generally, this means that the +# output device is a monitor, or a dye-sub printer (etc.), and the simulated +# device is something more expensive, complicated, or time consuming +# (making it difficult to make a real print for color judgement purposes). +# +# Soft-proofing basically functions by adjusting the colors on the +# output device to match the colors of the device being simulated. However, +# when the simulated device has a much wider gamut than the output +# device, you may obtain marginal results. +# +# @param inputProfile String, as a valid filename path to the ICC input profile +# you wish to use for this transform, or a profile object +# @param outputProfile String, as a valid filename path to the ICC output +# (monitor, usually) profile you wish to use for this transform, or a +# profile object +# @param proofProfile String, as a valid filename path to the ICC proof profile +# you wish to use for this transform, or a profile object +# @param inMode String, as a valid PIL mode that the appropriate profile also +# supports (i.e. "RGB", "RGBA", "CMYK", etc.) +# @param outMode String, as a valid PIL mode that the appropriate profile also +# supports (i.e. "RGB", "RGBA", "CMYK", etc.) +# @param renderingIntent Integer (0-3) specifying the rendering intent you +# wish to use for the input->proof (simulated) transform +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @param proofRenderingIntent Integer (0-3) specifying the rendering intent you +# wish to use for proof->output transform +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @param flags Integer (0-...) specifying additional flags +# @return A CmsTransform class object. +# @exception PyCMSError def buildProofTransform(inputProfile, outputProfile, proofProfile, inMode, outMode, renderingIntent=INTENT_PERCEPTUAL, proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC, flags=FLAGS["SOFTPROOFING"]): - """ - ImageCms.buildProofTransform(inputProfile, outputProfile, proofProfile, - inMode, outMode, [renderingIntent], [proofRenderingIntent]) - - Returns a CmsTransform class object. - - inputProfile = string, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - outputProfile = string, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, - or a profile object - proofProfile = string, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - inMode = string, as a valid PIL mode that the appropriate profile also - supports (i.e. "RGB", "RGBA", "CMYK", etc.) - outMode = string, as a valid PIL mode that the appropriate profile also - supports (i.e. "RGB", "RGBA", "CMYK", etc.) - renderingIntent = integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - see the pyCMS documentation for details on rendering intents and - what they do. - proofRenderingIntent = integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - see the pyCMS documentation for details on rendering intents and - what they do. - flags = integer (0-...) specifying additional flags - - If the input, output, or proof profiles specified are not valid - filenames, a PyCMSError will be raised. - - If an error occurs during creation of the transform, a PyCMSError will - be raised. - - If inMode or outMode are not a mode supported by the outputProfile - (or by pyCMS), a PyCMSError will be raised. - - This function builds and returns an ICC transform from the inputProfile - to the outputProfile, but tries to simulate the result that would be - obtained on the proofProfile device using renderingIntent and - proofRenderingIntent to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in inMode to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the proofProfile device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - """ - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <=3): raise PyCMSError("renderingIntent must be an integer between 0 and 3") @@ -511,48 +488,41 @@ buildProofTransformFromOpenProfiles = buildProofTransform ## # (pyCMS) Applies a transform to a given image. +# +# If im.mode != transform.inMode, a PyCMSError is raised. +# +# If inPlace == TRUE and transform.inMode != transform.outMode, a +# PyCMSError is raised. +# +# If im.mode, transfer.inMode, or transfer.outMode is not supported by +# pyCMSdll or the profiles you used for the transform, a PyCMSError is +# raised. +# +# If an error occurs while the transform is being applied, a PyCMSError +# is raised. +# +# This function applies a pre-calculated transform (from +# ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) to an +# image. The transform can be used for multiple images, saving +# considerable calcuation time if doing the same conversion multiple times. +# +# If you want to modify im in-place instead of receiving a new image as +# the return value, set inPlace to TRUE. This can only be done if +# transform.inMode and transform.outMode are the same, because we can't +# change the mode in-place (the buffer sizes for some modes are +# different). The default behavior is to return a new Image object of +# the same dimensions in mode transform.outMode. +# +# @param im A PIL Image object, and im.mode must be the same as the inMode +# supported by the transform. +# @param transform A valid CmsTransform class object +# @param inPlace Bool (1 == True, 0 or None == False). If True, im is modified +# in place and None is returned, if False, a new Image object with the +# transform applied is returned (and im is not changed). The default is False. +# @return Either None, or a new PIL Image object, depending on the value of inPlace +# @exception PyCMSError def applyTransform(im, transform, inPlace=0): - """ - ImageCms.applyTransform(im, transform, [inPlace]) - - Returns either None, or a new PIL Image object, depending on the value - of inPlace (see below) - - im = a PIL Image object, and im.mode must be the same as the inMode - supported by the transform. - transform = a valid CmsTransform class object - inPlace = BOOL (1 == TRUE, 0 or None == FALSE). If TRUE, im is - modified in place and None is returned, if FALSE, a new Image - object with the transform applied is returned (and im is not - changed). The default is FALSE. - - If im.mode != transform.inMode, a PyCMSError is raised. - - If inPlace == TRUE and transform.inMode != transform.outMode, a - PyCMSError is raised. - - If im.mode, transfer.inMode, or transfer.outMode is not supported by - pyCMSdll or the profiles you used for the transform, a PyCMSError is - raised. - - If an error occurs while the transform is being applied, a PyCMSError - is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) to an - image. The transform can be used for multiple images, saving - considerable calcuation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set inPlace to TRUE. This can only be done if - transform.inMode and transform.outMode are the same, because we can't - change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new Image object of - the same dimensions in mode transform.outMode. - - """ - try: if inPlace: transform.apply_in_place(im) @@ -566,33 +536,29 @@ def applyTransform(im, transform, inPlace=0): ## # (pyCMS) Creates a profile. +# +# If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised +# +# If using LAB and colorTemp != a positive integer, a PyCMSError is raised. +# +# If an error occurs while creating the profile, a PyCMSError is raised. +# +# Use this function to create common profiles on-the-fly instead of +# having to supply a profile on disk and knowing the path to it. It +# returns a normal CmsProfile object that can be passed to +# ImageCms.buildTransformFromOpenProfiles() to create a transform to apply +# to images. +# +# @param colorSpace String, the color space of the profile you wish to create. +# Currently only "LAB", "XYZ", and "sRGB" are supported. +# @param colorTemp Positive integer for the white point for the profile, in +# degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 +# illuminant if omitted (5000k). colorTemp is ONLY applied to LAB profiles, +# and is ignored for XYZ and sRGB. +# @return A CmsProfile class object +# @exception PyCMSError def createProfile(colorSpace, colorTemp=-1): - """ - ImageCms.createProfile(colorSpace, [colorTemp]) - - Returns a CmsProfile class object - - colorSpace = string, the color space of the profile you wish to create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - colorTemp = positive integer for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for - D50 illuminant if omitted (5000k). colorTemp is ONLY applied to - LAB profiles, and is ignored for XYZ and sRGB. - - If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised - - If using LAB and colorTemp != a positive integer, a PyCMSError is raised. - - If an error occurs while creating the profile, a PyCMSError is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - """ if colorSpace not in ["LAB", "XYZ", "sRGB"]: raise PyCMSError("Color space not supported for on-the-fly profile creation (%s)" % colorSpace) @@ -609,27 +575,23 @@ def createProfile(colorSpace, colorTemp=-1): ## # (pyCMS) Gets the internal product name for the given profile. +# +# If profile isn't a valid CmsProfile object or filename to a profile, +# a PyCMSError is raised If an error occurs while trying to obtain the +# name tag, a PyCMSError is raised. +# +# Use this function to obtain the INTERNAL name of the profile (stored +# in an ICC tag in the profile itself), usually the one used when the +# profile was originally created. Sometimes this tag also contains +# additional information supplied by the creator. +# +# @param profile EITHER a valid CmsProfile object, OR a string of the filename +# of an ICC profile. +# @return A string containing the internal name of the profile as stored in an +# ICC tag. +# @exception PyCMSError def getProfileName(profile): - """ - ImageCms.getProfileName(profile) - - Returns a string containing the internal name of the profile as stored - in an ICC tag. - - profile = EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - - If profile isn't a valid CmsProfile object or filename to a profile, - a PyCMSError is raised If an error occurs while trying to obtain the - name tag, a PyCMSError is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - """ try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): @@ -640,28 +602,24 @@ def getProfileName(profile): ## # (pyCMS) Gets the internal product information for the given profile. +# +# If profile isn't a valid CmsProfile object or filename to a profile, +# a PyCMSError is raised. +# +# If an error occurs while trying to obtain the info tag, a PyCMSError +# is raised +# +# Use this function to obtain the information stored in the profile's +# info tag. This often contains details about the profile, and how it +# was created, as supplied by the creator. +# +# @param profile EITHER a valid CmsProfile object, OR a string of the filename +# of an ICC profile. +# @return A string containing the internal profile information stored in an ICC +# tag. +# @exception PyCMSError def getProfileInfo(profile): - """ - ImageCms.getProfileInfo(profile) - - Returns a string containing the internal profile information stored in - an ICC tag. - - profile = EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - - If profile isn't a valid CmsProfile object or filename to a profile, - a PyCMSError is raised. - - If an error occurs while trying to obtain the info tag, a PyCMSError - is raised - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - """ try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) @@ -672,35 +630,32 @@ def getProfileInfo(profile): ## # (pyCMS) Gets the default intent name for the given profile. +# +# If profile isn't a valid CmsProfile object or filename to a profile, +# a PyCMSError is raised. +# +# If an error occurs while trying to obtain the default intent, a +# PyCMSError is raised. +# +# Use this function to determine the default (and usually best optomized) +# rendering intent for this profile. Most profiles support multiple +# rendering intents, but are intended mostly for one type of conversion. +# If you wish to use a different intent than returned, use +# ImageCms.isIntentSupported() to verify it will work first. +# +# @param profile EITHER a valid CmsProfile object, OR a string of the filename +# of an ICC profile. +# @return Integer 0-3 specifying the default rendering intent for this profile. +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @exception PyCMSError def getDefaultIntent(profile): - """ - ImageCms.getDefaultIntent(profile) - - Returns integer 0-3 specifying the default rendering intent for this - profile. - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - see the pyCMS documentation for details on rendering intents and - what they do. - - profile = EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - - If profile isn't a valid CmsProfile object or filename to a profile, - a PyCMSError is raised. - - If an error occurs while trying to obtain the default intent, a - PyCMSError is raised. - - Use this function to determine the default (and usually best optomized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - """ try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) @@ -710,41 +665,40 @@ def getDefaultIntent(profile): ## # (pyCMS) Checks if a given intent is supported. +# +# Use this function to verify that you can use your desired +# renderingIntent with profile, and that profile can be used for the +# input/output/proof profile as you desire. +# +# Some profiles are created specifically for one "direction", can cannot +# be used for others. Some profiles can only be used for certain +# rendering intents... so it's best to either verify this before trying +# to create a transform with them (using this function), or catch the +# potential PyCMSError that will occur if they don't support the modes +# you select. +# +# @param profile EITHER a valid CmsProfile object, OR a string of the filename +# of an ICC profile. +# @param intent Integer (0-3) specifying the rendering intent you wish to use +# with this profile +# +# INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) +# INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) +# INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) +# INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) +# +# see the pyCMS documentation for details on rendering intents and what they do. +# @param direction Integer specifing if the profile is to be used for input, +# output, or proof +# +# INPUT = 0 (or use ImageCms.DIRECTION_INPUT) +# OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) +# PROOF = 2 (or use ImageCms.DIRECTION_PROOF) +# +# @return 1 if the intent/direction are supported, -1 if they are not. +# @exception PyCMSError def isIntentSupported(profile, intent, direction): - """ - ImageCms.isIntentSupported(profile, intent, direction) - - Returns 1 if the intent/direction are supported, -1 if they are not. - - profile = EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - intent = integer (0-3) specifying the rendering intent you wish to use - with this profile - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC =1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC =3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - see the pyCMS documentation for details on rendering intents and - what they do. - direction = integer specifing if the profile is to be used for input, - output, or proof - INPUT = 0 (or use ImageCms.DIRECTION_INPUT) - OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) - PROOF = 2 (or use ImageCms.DIRECTION_PROOF) - - Use this function to verify that you can use your desired - renderingIntent with profile, and that profile can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents... so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential PyCMSError that will occur if they don't support the modes - you select. - - """ try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) diff --git a/PIL/JpegPresets.py b/PIL/JpegPresets.py index 1df6f0ba3..b664755e8 100644 --- a/PIL/JpegPresets.py +++ b/PIL/JpegPresets.py @@ -5,21 +5,21 @@ More presets can be added to the presets dict if needed. Can be use when saving JPEG file. -To apply the preset, specify: +To apply the preset, specify:: - - quality=preset name - -To apply only the quantization table: + quality="preset_name" -- qtables=preset name +To apply only the quantization table:: -To apply only the subsampling setting: + qtables="preset_name" -- subsampling=preset name +To apply only the subsampling setting:: -Example: + subsampling="preset_name" - im.save("image_name.jpg", quality="web_high") +Example:: + + im.save("image_name.jpg", quality="web_high") Subsampling @@ -28,7 +28,7 @@ Subsampling Subsampling is the practice of encoding images by implementing less resolution for chroma information than for luma information. (ref.: http://en.wikipedia.org/wiki/Chroma_subsampling) - + Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and 4:1:1 (or 4:2:0?). @@ -42,25 +42,23 @@ Quantization tables They are values use by the DCT (Discrete cosine transform) to remove *unnecessary* information from the image (the lossy part of the compression). (ref.: http://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, - http://en.wikipedia.org/wiki/JPEG#Quantization) +http://en.wikipedia.org/wiki/JPEG#Quantization) -You can get the quantization tables of a JPEG with: +You can get the quantization tables of a JPEG with:: + + im.quantization - im.quantization - This will return a dict with a number of arrays. You can pass this dict directly as the qtables argument when saving a JPEG. The tables format between im.quantization and quantization in presets differ in 3 ways: - 1. The base container of the preset is a list with sublists instead of dict. - dict[0] -> list[0], dict[1] -> list[1], ... - - 2. Each table in a preset is a list instead of an array. - - 3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). - +1. The base container of the preset is a list with sublists instead of dict. + dict[0] -> list[0], dict[1] -> list[1], ... +2. Each table in a preset is a list instead of an array. +3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). + You can convert the dict format to the preset format with the `JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. @@ -68,7 +66,7 @@ Libjpeg ref.: http://www.jpegcameras.com/libjpeg/libjpeg-3.html """ -presets = { +presets = { 'web_low': {'subsampling': 2, # "4:1:1" 'quantization': [ [20, 16, 25, 39, 50, 46, 62, 68, @@ -88,7 +86,6 @@ presets = { 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68] ]}, - 'web_medium': {'subsampling': 2, # "4:1:1" 'quantization': [ [16, 11, 11, 16, 23, 27, 31, 30, @@ -108,7 +105,6 @@ presets = { 38, 35, 46, 53, 64, 64, 64, 64, 48, 43, 53, 64, 64, 64, 64, 64] ]}, - 'web_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, @@ -128,7 +124,6 @@ presets = { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31] ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, @@ -148,7 +143,6 @@ presets = { 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12] ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 1, 1, 1, 1, 1, 1, 1, 1, @@ -168,7 +162,6 @@ presets = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] ]}, - 'low': {'subsampling': 2, # "4:1:1" 'quantization': [ [18, 14, 14, 21, 30, 35, 34, 17, @@ -207,7 +200,6 @@ presets = { 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, - 'high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, @@ -227,7 +219,6 @@ presets = { 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, - 'maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, @@ -247,4 +238,4 @@ presets = { 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12] ]}, - } \ No newline at end of file +} \ No newline at end of file diff --git a/PIL/OleFileIO.py b/PIL/OleFileIO.py index 1976df6c2..4d26ceb87 100644 --- a/PIL/OleFileIO.py +++ b/PIL/OleFileIO.py @@ -239,7 +239,7 @@ class OleFileIO: Object names are given as a list of strings, one for each subentry level. The root entry should be omitted. For example, the following - code extracts all image streams from a Microsoft Image Composer file: + code extracts all image streams from a Microsoft Image Composer file:: ole = OleFileIO("fan.mic") From c42e41a7dd3e3cfc62a2711b402d6932703dddbc Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Sat, 13 Apr 2013 00:28:26 +0200 Subject: [PATCH 024/102] Fix warning: function declaration isn't a prototype --- _webp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_webp.c b/_webp.c index cf53ff252..0fd5be2f4 100644 --- a/_webp.c +++ b/_webp.c @@ -87,7 +87,7 @@ PyInit__webp(void) { } #else PyMODINIT_FUNC -init_webp() +init_webp(void) { Py_InitModule("_webp", webpMethods); } From 3662e34ff1a0a3db5899a64594d740c8bbf8ebb5 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 12 Apr 2013 15:34:15 -0700 Subject: [PATCH 025/102] changed PY_VERSION_HEX, fixes https://github.com/python-imaging/Pillow/issues/166 --- path.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path.c b/path.c index 53139c5df..871da937b 100644 --- a/path.c +++ b/path.c @@ -560,7 +560,7 @@ path_subscript(PyPathObject* self, PyObject* item) { int len = 4; Py_ssize_t start, stop, step, slicelength; -#if PY_VERSION_HEX >= 0x03000000 +#if PY_VERSION_HEX >= 0x03020000 if (PySlice_GetIndicesEx(item, len, &start, &stop, &step, &slicelength) < 0) return NULL; #else From 8e74b50e0f6e4b507efec97c8cc0f6fb7a91a304 Mon Sep 17 00:00:00 2001 From: Evert Rol Date: Wed, 17 Apr 2013 14:27:07 +0200 Subject: [PATCH 026/102] Fix issue #193: remove double typedef declaration. --- libImaging/QuantHash.c | 4 ++-- libImaging/QuantHeap.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libImaging/QuantHash.c b/libImaging/QuantHash.c index 58d881349..b2bdb0618 100644 --- a/libImaging/QuantHash.c +++ b/libImaging/QuantHash.c @@ -29,7 +29,7 @@ typedef struct _HashNode { HashVal_t value; } HashNode; -typedef struct _HashTable { +struct _HashTable { HashNode **table; uint32_t length; uint32_t count; @@ -38,7 +38,7 @@ typedef struct _HashTable { KeyDestroyFunc keyDestroyFunc; ValDestroyFunc valDestroyFunc; void *userData; -} HashTable; +}; #define MIN_LENGTH 11 #define RESIZE_FACTOR 3 diff --git a/libImaging/QuantHeap.c b/libImaging/QuantHeap.c index bddcf142c..20379ac59 100644 --- a/libImaging/QuantHeap.c +++ b/libImaging/QuantHeap.c @@ -23,12 +23,12 @@ #include "QuantHeap.h" -typedef struct _Heap { +struct _Heap { void **heap; int heapsize; int heapcount; HeapCmpFunc cf; -} Heap; +}; #define INITIAL_SIZE 256 From 05e2de1cb3a4b5236342a15f5600c41b56ed0dfe Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 19 Apr 2013 00:16:58 +0200 Subject: [PATCH 027/102] Add directories for documentation build --- docs/_build/.gitignore | 1 + docs/_static/.gitignore | 1 + docs/_templates/.gitignore | 1 + 3 files changed, 3 insertions(+) create mode 100644 docs/_build/.gitignore create mode 100644 docs/_static/.gitignore create mode 100644 docs/_templates/.gitignore diff --git a/docs/_build/.gitignore b/docs/_build/.gitignore new file mode 100644 index 000000000..b1f9a2ade --- /dev/null +++ b/docs/_build/.gitignore @@ -0,0 +1 @@ +# Empty file, to make the directory available in the repository diff --git a/docs/_static/.gitignore b/docs/_static/.gitignore new file mode 100644 index 000000000..b1f9a2ade --- /dev/null +++ b/docs/_static/.gitignore @@ -0,0 +1 @@ +# Empty file, to make the directory available in the repository diff --git a/docs/_templates/.gitignore b/docs/_templates/.gitignore new file mode 100644 index 000000000..b1f9a2ade --- /dev/null +++ b/docs/_templates/.gitignore @@ -0,0 +1 @@ +# Empty file, to make the directory available in the repository From 1a977c859a9677a37fad3dcfa08a7621e920c185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 08:38:36 +0200 Subject: [PATCH 028/102] Add proper shebangs to all Python scripts. --- Scripts/enhancer.py | 1 + Scripts/explode.py | 1 + Scripts/gifmaker.py | 1 + Scripts/painter.py | 1 + Scripts/pilconvert.py | 2 +- Scripts/pilfile.py | 2 +- Scripts/pilprint.py | 2 +- Scripts/player.py | 1 + Scripts/thresholder.py | 1 + Scripts/viewer.py | 1 + 10 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py index 546172f81..fe250c9f8 100644 --- a/Scripts/enhancer.py +++ b/Scripts/enhancer.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/explode.py b/Scripts/explode.py index 950ef7b50..90084a464 100644 --- a/Scripts/explode.py +++ b/Scripts/explode.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index 3180c13b4..9964f77b1 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/painter.py b/Scripts/painter.py index d6821e476..80c4db6a0 100644 --- a/Scripts/painter.py +++ b/Scripts/painter.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py index 588c0dfab..934167351 100644 --- a/Scripts/pilconvert.py +++ b/Scripts/pilconvert.py @@ -1,4 +1,4 @@ -#! /usr/local/bin/python +#!/usr/bin/env python # # The Python Imaging Library. # $Id$ diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py index 33c7dc7e7..48514e88b 100644 --- a/Scripts/pilfile.py +++ b/Scripts/pilfile.py @@ -1,4 +1,4 @@ -#! /usr/local/bin/python +#!/usr/bin/env python # # The Python Imaging Library. # $Id$ diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py index 9c30e6343..be42e0a75 100644 --- a/Scripts/pilprint.py +++ b/Scripts/pilprint.py @@ -1,4 +1,4 @@ -#! /usr/local/bin/python +#!/usr/bin/env python # # The Python Imaging Library. # $Id$ diff --git a/Scripts/player.py b/Scripts/player.py index b1435ba4c..84b636668 100644 --- a/Scripts/player.py +++ b/Scripts/player.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py index 9a8610892..29d4592d9 100644 --- a/Scripts/thresholder.py +++ b/Scripts/thresholder.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ diff --git a/Scripts/viewer.py b/Scripts/viewer.py index 8c26e9c5a..86b2526cd 100644 --- a/Scripts/viewer.py +++ b/Scripts/viewer.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # The Python Imaging Library # $Id$ From 6afa11ec02df3d5e9e6b8da3c1eee91b7e6146aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:04:58 +0200 Subject: [PATCH 029/102] test_file_tar: skip if codecs are not available. The .tar test requires both jpeg & zlib support. If one of the two is unavailable, run the test for the second one. If both are unavailable, skip the test. --- Tests/test_file_tar.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index 0f87ea2c0..fa33d3802 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -2,21 +2,27 @@ from tester import * from PIL import Image, TarIO +codecs = dir(Image.core) +if "zip_decoder" not in codecs and "jpeg_decoder" not in codecs: + skip("neither jpeg nor zip support not available") + # sample ppm stream tarfile = "Images/lena.tar" def test_sanity(): - tar = TarIO.TarIO(tarfile, 'lena.png') - im = Image.open(tar) - im.load() - assert_equal(im.mode, "RGB") - assert_equal(im.size, (128, 128)) - assert_equal(im.format, "PNG") + if "zip_decoder" in codecs: + tar = TarIO.TarIO(tarfile, 'lena.png') + im = Image.open(tar) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "PNG") - tar = TarIO.TarIO(tarfile, 'lena.jpg') - im = Image.open(tar) - im.load() - assert_equal(im.mode, "RGB") - assert_equal(im.size, (128, 128)) - assert_equal(im.format, "JPEG") + if "jpeg_decoder" in codecs: + tar = TarIO.TarIO(tarfile, 'lena.jpg') + im = Image.open(tar) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "JPEG") From 6cdc8b08dbbbbeb76002ad7842534bc513be6219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:13:33 +0200 Subject: [PATCH 030/102] test_imagefile: handle missing PNG & JPEG encoders gracefully. --- Tests/test_imagefile.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 7493e0846..382ae27f2 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -3,6 +3,8 @@ from tester import * from PIL import Image from PIL import ImageFile +codecs = dir(Image.core) + # save original block sizes MAXBLOCK = ImageFile.MAXBLOCK SAFEBLOCK = ImageFile.SAFEBLOCK @@ -31,12 +33,13 @@ def test_parser(): assert_image_equal(*roundtrip("GIF")) assert_image_equal(*roundtrip("IM")) assert_image_equal(*roundtrip("MSP")) - try: - # force multiple blocks in PNG driver - ImageFile.MAXBLOCK = 8192 - assert_image_equal(*roundtrip("PNG")) - finally: - ImageFile.MAXBLOCK = MAXBLOCK + if "zip_encoder" in codecs: + try: + # force multiple blocks in PNG driver + ImageFile.MAXBLOCK = 8192 + assert_image_equal(*roundtrip("PNG")) + finally: + ImageFile.MAXBLOCK = MAXBLOCK assert_image_equal(*roundtrip("PPM")) assert_image_equal(*roundtrip("TIFF")) assert_image_equal(*roundtrip("XBM")) @@ -44,8 +47,9 @@ def test_parser(): assert_image_equal(*roundtrip("TGA")) assert_image_equal(*roundtrip("PCX")) - im1, im2 = roundtrip("JPEG") # lossy compression - assert_image(im1, im2.mode, im2.size) + if "jpeg_encoder" in codecs: + im1, im2 = roundtrip("JPEG") # lossy compression + assert_image(im1, im2.mode, im2.size) # XXX Why assert exception and why does it fail? # https://github.com/python-imaging/Pillow/issues/78 @@ -55,6 +59,9 @@ def test_safeblock(): im1 = lena() + if "zip_encoder" not in codecs: + skip("PNG (zlib) encoder not available") + try: ImageFile.SAFEBLOCK = 1 im2 = fromstring(tostring(im1, "PNG")) From e2221de8f568b05d37dcea80effbcd0f5cd2a008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:18:32 +0200 Subject: [PATCH 031/102] Support (most of) test_image_split without PNG. If PNG (zlib) support is disabled, use .pcx for test_image_split which is unconditional. Since it does not support RGBA, skip the RGBA test. Otherwise, just use PNG and do the full test. --- Tests/test_image_split.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_split.py b/Tests/test_image_split.py index 7fc70182b..07a779664 100644 --- a/Tests/test_image_split.py +++ b/Tests/test_image_split.py @@ -30,7 +30,13 @@ def test_split_merge(): assert_image_equal(lena("YCbCr"), split_merge("YCbCr")) def test_split_open(): - file = tempfile("temp.png") + codecs = dir(Image.core) + + if 'zip_encoder' in codecs: + file = tempfile("temp.png") + else: + file = tempfile("temp.pcx") + def split_open(mode): lena(mode).save(file) im = Image.open(file) @@ -39,4 +45,5 @@ def test_split_open(): assert_equal(split_open("L"), 1) assert_equal(split_open("P"), 1) assert_equal(split_open("RGB"), 3) - assert_equal(split_open("RGBA"), 4) + if 'zip_encoder' in codecs: + assert_equal(split_open("RGBA"), 4) From a5a5c854b896026ceac46ed3baa2f29d42f7aed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:27:27 +0200 Subject: [PATCH 032/102] test_image_draft: skip if no JPEG support. --- Tests/test_image_draft.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_image_draft.py b/Tests/test_image_draft.py index 41df761a6..e512aa033 100644 --- a/Tests/test_image_draft.py +++ b/Tests/test_image_draft.py @@ -2,6 +2,11 @@ from tester import * from PIL import Image +codecs = dir(Image.core) + +if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: + skip("jpeg support not available") + filename = "Images/lena.jpg" data = tostring(Image.open(filename).resize((512, 512)), "JPEG") From a83530f47544baf7da2b71d3d274ee7875b68157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:30:59 +0200 Subject: [PATCH 033/102] test_font_pcf: skip if zlib is not available. --- Tests/test_font_pcf.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 958657eaa..60e6e0e26 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -3,6 +3,11 @@ from tester import * from PIL import Image, FontFile, PcfFontFile from PIL import ImageFont, ImageDraw +codecs = dir(Image.core) + +if "zip_encoder" not in codecs or "zip_decoder" not in codecs: + skip("zlib support not available") + fontname = "Tests/fonts/helvO18.pcf" tempname = tempfile("temp.pil", "temp.pbm") From 995fe2b041290739ba976ceef2f68409517a4751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 10:32:42 +0200 Subject: [PATCH 034/102] test_file_tiff: skip if TIFF is not available. --- Tests/test_file_tiff.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 6db12c4ff..cd3f2915b 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -4,6 +4,11 @@ from PIL import Image import random +codecs = dir(Image.core) + +if "group4_encoder" not in codecs or "group4_decoder" not in codecs: + skip("tiff support not available") + def test_sanity(): file = tempfile("temp.tif") From c01696bf2d5f3eee1d671f273f6656c21f9b064c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Apr 2013 11:05:31 +0200 Subject: [PATCH 035/102] Use proper tempdir for temporary test files. Writing temporary files in source tree is just wrong. Instead, use a directory inside system tempdir. --- Tests/run.py | 5 +++-- Tests/tester.py | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Tests/run.py b/Tests/run.py index 7b4f1ac48..e9fb319f0 100644 --- a/Tests/run.py +++ b/Tests/run.py @@ -2,7 +2,7 @@ from __future__ import print_function # minimal test runner -import glob, os, sys +import glob, os, os.path, sys, tempfile try: root = os.path.dirname(__file__) @@ -73,7 +73,8 @@ for file in files: print("-"*68) -tempfiles = glob.glob(os.path.join(root, "temp_*")) +temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests') +tempfiles = glob.glob(os.path.join(temp_root, "temp_*")) if tempfiles: print("===", "remaining temporary files") for file in tempfiles: diff --git a/Tests/tester.py b/Tests/tester.py index e534623d1..3c5f720d2 100644 --- a/Tests/tester.py +++ b/Tests/tester.py @@ -171,11 +171,16 @@ def assert_image_similar(a, b, epsilon, msg=None): success() def tempfile(template, *extra): - import os, sys + import os, os.path, sys, tempfile files = [] + root = os.path.join(tempfile.gettempdir(), 'pillow-tests') + try: + os.mkdir(root) + except OSError: + pass for temp in (template,) + extra: assert temp[:5] in ("temp.", "temp_") - root, name = os.path.split(sys.argv[0]) + name = os.path.basename(sys.argv[0]) name = temp[:4] + os.path.splitext(name)[0][4:] name = name + "_%d" % len(_tempfiles) + temp[4:] name = os.path.join(root, name) @@ -229,12 +234,18 @@ def _setup(): if success.count and not failure.count: print("ok") # only clean out tempfiles if test passed - import os + import os, os.path, tempfile for file in _tempfiles: try: os.remove(file) except OSError: pass # report? + temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests') + try: + os.rmdir(temp_root) + except OSError: + pass + if "--coverage" in sys.argv: import coverage coverage.stop() From 7a3f72ded76a29bda221a0dc7eef77fcd70bb0d9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 11:54:22 -0700 Subject: [PATCH 036/102] Update compatibility for Gentoo on python 3.2.x --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index 6d7a52fcb..ed7446222 100644 --- a/README.rst +++ b/README.rst @@ -93,6 +93,8 @@ Current platform support for Pillow. Binary distributions are contributed for ea | Ubuntu Linux 10.04 LTS |Yes | 2.6 |x86,x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3 |x86,x86-64 | ++-------------------------------------------------------------------------------------------------------+ +| Gentoo Linux | | 2.7,3.2.4 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ | Windows Server 2008 R2 Enterprise|Yes | 3.3 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ From fc7816f8722aee86ba638340fe3bc91a1e297f2a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 11:55:58 -0700 Subject: [PATCH 037/102] Formatting on Readme --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ed7446222..974d5ccf8 100644 --- a/README.rst +++ b/README.rst @@ -93,8 +93,8 @@ Current platform support for Pillow. Binary distributions are contributed for ea | Ubuntu Linux 10.04 LTS |Yes | 2.6 |x86,x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3 |x86,x86-64 | -+-------------------------------------------------------------------------------------------------------+ -| Gentoo Linux | | 2.7,3.2.4 |x86-64 | ++----------------------------------+-------------+------------------------------+-----------------------+ +| Gentoo Linux |Soon | 2.7,3.2.4 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ | Windows Server 2008 R2 Enterprise|Yes | 3.3 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ From 945b6bf53c38c0c3cde866142ca22a357bc3bf52 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 13:51:16 -0700 Subject: [PATCH 038/102] Split tiff tests so that test_file_tiff tests the builtins, and test_file_libtiff tests only things that depend on libtiff --- Tests/test_file_libtiff.py | 89 +++++++++++++++++++++++++++++++++++ Tests/test_file_tiff.py | 86 --------------------------------- Tests/test_file_tiff_small.py | 2 +- 3 files changed, 90 insertions(+), 87 deletions(-) create mode 100644 Tests/test_file_libtiff.py diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py new file mode 100644 index 000000000..b838bf9d6 --- /dev/null +++ b/Tests/test_file_libtiff.py @@ -0,0 +1,89 @@ +from tester import * + +from PIL import Image + +codecs = dir(Image.core) + +if "group4_encoder" not in codecs or "group4_decoder" not in codecs: + skip("tiff support not available") + +def _assert_noerr(im): + """Helper tests that assert basic sanity about the g4 tiff reading""" + #1 bit + assert_equal(im.mode, "1") + + # Does the data actually load + assert_no_exception(lambda: im.load()) + assert_no_exception(lambda: im.getdata()) + + try: + assert_equal(im._compression, 'group4') + except: + print("No _compression") + print (dir(im)) + + # can we write it back out, in a different form. + out = tempfile("temp.png") + assert_no_exception(lambda: im.save(out)) + +def test_g4_tiff(): + """Test the ordinary file path load path""" + + file = "Tests/images/lena_g4_500.tif" + im = Image.open(file) + + assert_equal(im.size, (500,500)) + _assert_noerr(im) + +def test_g4_large(): + file = "Tests/images/pport_g4.tif" + im = Image.open(file) + _assert_noerr(im) + +def test_g4_tiff_file(): + """Testing the string load path""" + + file = "Tests/images/lena_g4_500.tif" + with open(file,'rb') as f: + im = Image.open(f) + + assert_equal(im.size, (500,500)) + _assert_noerr(im) + +def test_g4_tiff_bytesio(): + """Testing the stringio loading code path""" + from io import BytesIO + file = "Tests/images/lena_g4_500.tif" + s = BytesIO() + with open(file,'rb') as f: + s.write(f.read()) + s.seek(0) + im = Image.open(s) + + assert_equal(im.size, (500,500)) + _assert_noerr(im) + +def test_g4_eq_png(): + """ Checking that we're actually getting the data that we expect""" + png = Image.open('Tests/images/lena_bw_500.png') + g4 = Image.open('Tests/images/lena_g4_500.tif') + + assert_image_equal(g4, png) + +def test_g4_write(): + """Checking to see that the saved image is the same as what we wrote""" + file = "Tests/images/lena_g4_500.tif" + orig = Image.open(file) + + out = tempfile("temp.tif") + rot = orig.transpose(Image.ROTATE_90) + assert_equal(rot.size,(500,500)) + rot.save(out) + + reread = Image.open(out) + assert_equal(reread.size,(500,500)) + _assert_noerr(reread) + assert_image_equal(reread, rot) + + assert_false(orig.tobytes() == reread.tobytes()) + diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index cd3f2915b..d230bffa7 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -2,13 +2,6 @@ from tester import * from PIL import Image -import random - -codecs = dir(Image.core) - -if "group4_encoder" not in codecs or "group4_decoder" not in codecs: - skip("tiff support not available") - def test_sanity(): file = tempfile("temp.tif") @@ -63,83 +56,4 @@ def test_gimp_tiff(): ]) assert_no_exception(lambda: im.load()) -def _assert_noerr(im): - """Helper tests that assert basic sanity about the g4 tiff reading""" - #1 bit - assert_equal(im.mode, "1") - - # Does the data actually load - assert_no_exception(lambda: im.load()) - assert_no_exception(lambda: im.getdata()) - - try: - assert_equal(im._compression, 'group4') - except: - print("No _compression") - print (dir(im)) - - # can we write it back out, in a different form. - out = tempfile("temp.png") - assert_no_exception(lambda: im.save(out)) - -def test_g4_tiff(): - """Test the ordinary file path load path""" - - file = "Tests/images/lena_g4_500.tif" - im = Image.open(file) - - assert_equal(im.size, (500,500)) - _assert_noerr(im) - -def test_g4_large(): - file = "Tests/images/pport_g4.tif" - im = Image.open(file) - _assert_noerr(im) - -def test_g4_tiff_file(): - """Testing the string load path""" - - file = "Tests/images/lena_g4_500.tif" - with open(file,'rb') as f: - im = Image.open(f) - - assert_equal(im.size, (500,500)) - _assert_noerr(im) - -def test_g4_tiff_bytesio(): - """Testing the stringio loading code path""" - from io import BytesIO - file = "Tests/images/lena_g4_500.tif" - s = BytesIO() - with open(file,'rb') as f: - s.write(f.read()) - s.seek(0) - im = Image.open(s) - - assert_equal(im.size, (500,500)) - _assert_noerr(im) - -def test_g4_eq_png(): - """ Checking that we're actually getting the data that we expect""" - png = Image.open('Tests/images/lena_bw_500.png') - g4 = Image.open('Tests/images/lena_g4_500.tif') - - assert_image_equal(g4, png) - -def test_g4_write(): - """Checking to see that the saved image is the same as what we wrote""" - file = "Tests/images/lena_g4_500.tif" - orig = Image.open(file) - - out = tempfile("temp.tif") - rot = orig.transpose(Image.ROTATE_90) - assert_equal(rot.size,(500,500)) - rot.save(out) - - reread = Image.open(out) - assert_equal(reread.size,(500,500)) - _assert_noerr(reread) - assert_image_equal(reread, rot) - - assert_false(orig.tobytes() == reread.tobytes()) diff --git a/Tests/test_file_tiff_small.py b/Tests/test_file_tiff_small.py index d0780fa87..6f00261a3 100644 --- a/Tests/test_file_tiff_small.py +++ b/Tests/test_file_tiff_small.py @@ -2,7 +2,7 @@ from tester import * from PIL import Image -from test_file_tiff import _assert_noerr +from test_file_libtiff import _assert_noerr """ The small lena image was failing on open in the libtiff decoder because the file pointer was set to the wrong place From d2c9ee14ad5eaefa5085f84458d16611d48d42b9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 13:52:04 -0700 Subject: [PATCH 039/102] skipp these test is libtiff support is not included --- Tests/test_file_tiff_small.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_file_tiff_small.py b/Tests/test_file_tiff_small.py index 6f00261a3..dbc16435f 100644 --- a/Tests/test_file_tiff_small.py +++ b/Tests/test_file_tiff_small.py @@ -4,6 +4,11 @@ from PIL import Image from test_file_libtiff import _assert_noerr +codecs = dir(Image.core) + +if "group4_encoder" not in codecs or "group4_decoder" not in codecs: + skip("tiff support not available") + """ The small lena image was failing on open in the libtiff decoder because the file pointer was set to the wrong place by a spurious seek. It wasn't failing with the byteio method. From 25f26f74e8168df83e335fcb16e75edd67713ef2 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 13:53:43 -0700 Subject: [PATCH 040/102] rename to include libtiff --- Tests/test_file_libtiff_small.py | 52 ++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Tests/test_file_libtiff_small.py diff --git a/Tests/test_file_libtiff_small.py b/Tests/test_file_libtiff_small.py new file mode 100644 index 000000000..dbc16435f --- /dev/null +++ b/Tests/test_file_libtiff_small.py @@ -0,0 +1,52 @@ +from tester import * + +from PIL import Image + +from test_file_libtiff import _assert_noerr + +codecs = dir(Image.core) + +if "group4_encoder" not in codecs or "group4_decoder" not in codecs: + skip("tiff support not available") + +""" The small lena image was failing on open in the libtiff + decoder because the file pointer was set to the wrong place + by a spurious seek. It wasn't failing with the byteio method. + + It was fixed by forcing an lseek to the beginning of the + file just before reading in libtiff. These tests remain + to ensure that it stays fixed. """ + + +def test_g4_lena_file(): + """Testing the open file load path""" + + file = "Tests/images/lena_g4.tif" + with open(file,'rb') as f: + im = Image.open(f) + + assert_equal(im.size, (128,128)) + _assert_noerr(im) + +def test_g4_lena_bytesio(): + """Testing the bytesio loading code path""" + from io import BytesIO + file = "Tests/images/lena_g4.tif" + s = BytesIO() + with open(file,'rb') as f: + s.write(f.read()) + s.seek(0) + im = Image.open(s) + + assert_equal(im.size, (128,128)) + _assert_noerr(im) + +def test_g4_lena(): + """The 128x128 lena image fails for some reason. Investigating""" + + file = "Tests/images/lena_g4.tif" + im = Image.open(file) + + assert_equal(im.size, (128,128)) + _assert_noerr(im) + From 52cbacf0286ee8f94aeaaa693944c002a3afc4bc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 21 Apr 2013 13:54:30 -0700 Subject: [PATCH 041/102] renamed --- Tests/test_file_tiff_small.py | 52 ----------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 Tests/test_file_tiff_small.py diff --git a/Tests/test_file_tiff_small.py b/Tests/test_file_tiff_small.py deleted file mode 100644 index dbc16435f..000000000 --- a/Tests/test_file_tiff_small.py +++ /dev/null @@ -1,52 +0,0 @@ -from tester import * - -from PIL import Image - -from test_file_libtiff import _assert_noerr - -codecs = dir(Image.core) - -if "group4_encoder" not in codecs or "group4_decoder" not in codecs: - skip("tiff support not available") - -""" The small lena image was failing on open in the libtiff - decoder because the file pointer was set to the wrong place - by a spurious seek. It wasn't failing with the byteio method. - - It was fixed by forcing an lseek to the beginning of the - file just before reading in libtiff. These tests remain - to ensure that it stays fixed. """ - - -def test_g4_lena_file(): - """Testing the open file load path""" - - file = "Tests/images/lena_g4.tif" - with open(file,'rb') as f: - im = Image.open(f) - - assert_equal(im.size, (128,128)) - _assert_noerr(im) - -def test_g4_lena_bytesio(): - """Testing the bytesio loading code path""" - from io import BytesIO - file = "Tests/images/lena_g4.tif" - s = BytesIO() - with open(file,'rb') as f: - s.write(f.read()) - s.seek(0) - im = Image.open(s) - - assert_equal(im.size, (128,128)) - _assert_noerr(im) - -def test_g4_lena(): - """The 128x128 lena image fails for some reason. Investigating""" - - file = "Tests/images/lena_g4.tif" - im = Image.open(file) - - assert_equal(im.size, (128,128)) - _assert_noerr(im) - From ed9945c71fe798872e429f51479a6f2ee86e7be3 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Mon, 22 Apr 2013 11:48:06 +0200 Subject: [PATCH 042/102] Allowing to pass font as file-like objects --- PIL/ImageFont.py | 10 +++++----- _imagingft.c | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 8ec60fef9..d5816813a 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -129,9 +129,9 @@ class ImageFont: class FreeTypeFont: "FreeType font wrapper (requires _imagingft service)" - def __init__(self, file, size, index=0, encoding=""): + def __init__(self, file=None, size=10, index=0, encoding="", file_like=None): # FIXME: use service provider instead - self.font = core.getfont(file, size, index, encoding) + self.font = core.getfont(file, size, index, encoding, file_like) def getname(self): return self.font.family, self.font.style @@ -212,10 +212,10 @@ def load(filename): # @return A font object. # @exception IOError If the file could not be read. -def truetype(filename, size, index=0, encoding=""): +def truetype(filename=None, size=10, index=0, encoding="", file_like=None): "Load a truetype font file." try: - return FreeTypeFont(filename, size, index, encoding) + return FreeTypeFont(filename, size, index, encoding, file_like) except IOError: if sys.platform == "win32": # check the windows font repository @@ -224,7 +224,7 @@ def truetype(filename, size, index=0, encoding=""): windir = os.environ.get("WINDIR") if windir: filename = os.path.join(windir, "fonts", filename) - return FreeTypeFont(filename, size, index, encoding) + return FreeTypeFont(filename, size, index, encoding, file_like) raise ## diff --git a/_imagingft.c b/_imagingft.c index e29e3a244..e3e5bf638 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -99,17 +99,18 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) FontObject* self; int error; - char* filename; + char* filename = NULL; int size; int index = 0; unsigned char* encoding = NULL; + Py_buffer file_like; static char* kwlist[] = { - "filename", "size", "index", "encoding", NULL + "filename", "size", "index", "encoding", "file_like", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|is", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*", kwlist, Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding)) + &size, &index, &encoding, &file_like)) return NULL; if (!library) { @@ -124,8 +125,12 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) if (!self) return NULL; - error = FT_New_Face(library, filename, index, &self->face); - + if (filename && file_like.len<0) { + error = FT_New_Face(library, filename, index, &self->face); + } else { + error = FT_New_Memory_Face(library, (FT_Byte*)file_like.buf, file_like.len, index, &self->face); + } + if (!error) error = FT_Set_Pixel_Sizes(self->face, 0, size); @@ -137,6 +142,9 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) } if (error) { + if(file_like.len < 0) { + PyBuffer_Release(&file_like); + } PyObject_Del(self); return geterror(error); } From 0aa05780c5ec72e0264221c0bf2cb07078f14bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 22 Apr 2013 11:55:17 +0200 Subject: [PATCH 043/102] test_file_tiff: skip JPEG-in-TIFF tests if libjpeg is not available. --- Tests/test_file_tiff.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index d230bffa7..4347bda8b 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -43,6 +43,10 @@ def test_mac_tiff(): def test_gimp_tiff(): # Read TIFF JPEG images from GIMP [@PIL168] + codecs = dir(Image.core) + if "jpeg_decoder" not in codecs: + skip("jpeg support not available") + file = "Tests/images/pil168.tif" im = Image.open(file) From 315503e9d53c5b525d455f58fd1ad9d6c8150897 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 23 Apr 2013 21:09:32 -0700 Subject: [PATCH 044/102] Workaround for python issue: http://bugs.python.org/16754 in 3.2.x < 3.2.4 and 3.3.0 --- setup.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 65b8b1e42..1113c32a6 100644 --- a/setup.py +++ b/setup.py @@ -45,8 +45,18 @@ def _find_include_file(self, include): def _find_library_file(self, library): - return self.compiler.find_library_file(self.compiler.library_dirs, library) - + # Fix for 3.2.x <3.2.4, 3.3.0, shared lib extension is the python shared lib + # extension, not the system shared lib extension: e.g. .cpython-33.so vs .so + # See Python bug http://bugs.python.org/16754 + if 'cpython' in self.compiler.shared_lib_extension: + existing = self.compiler.shared_lib_extension + self.compiler.shared_lib_extension = "." + existing.split('.')[-1] + ret = self.compiler.find_library_file(self.compiler.library_dirs, library) + self.compiler.shared_lib_extension = existing + return ret + else: + return self.compiler.find_library_file(self.compiler.library_dirs, library) + def _find_version(filename): for line in open(filename).readlines(): From 364bf517fb91ef6804a535b200fdd77f4b5704e9 Mon Sep 17 00:00:00 2001 From: "Daniel D. Beck" Date: Wed, 24 Apr 2013 14:50:38 -0400 Subject: [PATCH 045/102] fix typo in homebrew pre-requisite install command --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 974d5ccf8..287413c52 100644 --- a/README.rst +++ b/README.rst @@ -149,7 +149,7 @@ The easiest way to install the prerequisites is to use homebrew: http://mxcl.git :: -$ brew install libtiff lbjpeg webp littlecms +$ brew install libtiff libjpeg webp littlecms If you've built your own python, then you should be able to install Pillow using From 450a068ccb2956c5a00a73703aad9470d60abbcc Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 18:48:43 +0200 Subject: [PATCH 046/102] Removing buffer from imagefont --- PIL/ImageFont.py | 28 ++++++++++++++++++++++------ Tests/fonts/FreeMono.ttf | Bin 0 -> 592752 bytes Tests/test_imagefont.py | 19 ++++++++++++++++++- _imagingft.c | 21 +++++++++++---------- 4 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 Tests/fonts/FreeMono.ttf diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index d5816813a..32177f1d8 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -29,6 +29,7 @@ from __future__ import print_function from PIL import Image import os, sys +import warnings class _imagingft_not_installed: # module placeholder @@ -129,9 +130,19 @@ class ImageFont: class FreeTypeFont: "FreeType font wrapper (requires _imagingft service)" - def __init__(self, file=None, size=10, index=0, encoding="", file_like=None): + def __init__(self, font=None, size=10, index=0, encoding="", file=None): # FIXME: use service provider instead - self.font = core.getfont(file, size, index, encoding, file_like) + if file: + warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + font = file + + if isinstance(font, basestring): + self.font = core.getfont(font, size, index, encoding) + else: + bytes = font.read() + font.seek(0, 2) + size = font.tell() + self.font = core.getfont("", size, index, encoding, bytes, size) def getname(self): return self.font.family, self.font.style @@ -212,10 +223,15 @@ def load(filename): # @return A font object. # @exception IOError If the file could not be read. -def truetype(filename=None, size=10, index=0, encoding="", file_like=None): +def truetype(font=None, size=10, index=0, encoding="", filename=None): "Load a truetype font file." + + if filename: + warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + font = filename + try: - return FreeTypeFont(filename, size, index, encoding, file_like) + return FreeTypeFont(font, size, index, encoding) except IOError: if sys.platform == "win32": # check the windows font repository @@ -223,8 +239,8 @@ def truetype(filename=None, size=10, index=0, encoding="", file_like=None): # 1.5.2's os.environ.get() windir = os.environ.get("WINDIR") if windir: - filename = os.path.join(windir, "fonts", filename) - return FreeTypeFont(filename, size, index, encoding, file_like) + filename = os.path.join(windir, "fonts", font) + return FreeTypeFont(font, size, index, encoding) raise ## diff --git a/Tests/fonts/FreeMono.ttf b/Tests/fonts/FreeMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f88bcef9c138ae61473f852d10803c195601d51e GIT binary patch literal 592752 zcmeF)4_Kvh{`mjb{kPLhGZPbHGM$vBnaPL^u_0t8gb*4+Lx^n%A%xg5GC~Mp5JGHr z4?+mBAvUyx5JEF^tdKQq)Xe!lU#D~X^yxC}etzHUcm1yG_i=q5`+nc=Kd<-ee&6@G z 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%0Ajwxlc4 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%0D^tuaogCtC#98eyovD?XTp)z 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%0AeSyf)(mUV>BY96D>KUtGNO_}T2Q)0 zx@Y;d=sor~)cq_fUA)Ke59+#$!#nKnFfUqRgIuPa%x=ZJ;F=h5*SSQ_O!+Vg@)g16 zz#;usj8C>$ZROEeq*!*zt!g$KrAUxzk!%IWJ&^A##jTOL;_}K~$TjD28x@c85`TwT z90Kez;uJfK@-}aA%%Jk9_9Ee{zbBqU|B*{O zZE+aQPG1X-+jUQ7n{0+}vIla5agVX~j|NY?O!6mS-tR}OzJpG18Og$;bU``GBdT%~ zLWjD0sKBY645rd!RD=MbG)jL&{)bv@kFu-0lmG{$5Sj68TIAgz**5NzThUV+Hj#5) ze{-D5@L>jP$-&%yfUsbS!d8F^46B-tHYR+nFtc%VWoDo}ECxcCY#bSj4qUc=U&Jd; z^mXiIM{A!TPOyE49+(+4hWtHSj&0lizT=znVV9-6?VY68hUb4I#<7Mvg+Z!Z)uP!= z2%Hlx1Vd>}7)J;y^XfB&V%46)FBn3UYSF=dHaeGq0?6X3;u@e0@zqryXKt{1#S z6jdEjD^8VxQ4ZP8lu1EklHfrf1OQoF&1WemsM2b2nd@~@Iax2Rg~k21_mABeFdV(7SUyo4HA(*7J=vb!DClYG8ag%BoNw*) z_TY$(5f0^-Gx^TWfkeD4?)2_))E*9P@&pD4+Y()dfHBwaWY;_Tx^R>w)saFvwYkNV zHW(dml`ORn*-%Iv6Jvf}+$Wwu9Ha+(?t{Wtg(^}Lp@G3KAEi+UJ|s|7$H_q3g=^!x z=-T)&u1#r6XdYVJ3|!;>%oJ=jp+xJe+yn++T9CJ&mAi{P1+I?+i|Feo)eg`qypTzr z#MC=bR1V>7AC^ff&RFrzx+kXqV>+ZnH-V?V%=j+)U_b$<*J(Q z%0b#J&PJ1)01G%IPx<6YF00yngDfHo+kiBe3is8i(-LY(RK>QkB%qN_<#AQg%szD? z7{je`LomQz*4D_{UMZX^9vD3N2Vs9pOZP=Hy?rx7M^COR9vSZo->NU9PgvTzublq3 z&PX7Z--bo@qU`A2J-vO0C;FQHU0*KuhLWwJqx-z}ZH1og+wuo)-;fBlw#6-h-z@y1 zCDrm+z_JyK^p?I&*G}f#zGysZ2|)Hu^Y@A~;xNW;N`Ob&LE}UbfC}cnx^oW~tHTu< zv|+@gP`;P!Y$i{0I~s8(3OG?sm;&Aw)RZ_1JoT&DZ#WJ}l~_CR1Ii8uA`YGKNI*Sq z#Or7QE_?${0aeCnXwvjp>YKBn0yW2sPRlt53l#RWWBi>480mBMZrjn1D$nOTF4>P3uh+E zyUP8%EJ%e`pIL)2bSZJ~YIr@@;p@x2v*VlhQ&D3DKi2n>n`WqG~qk}jzD|4 ziq;n-l4x^K|C9myxb`vfL(=NdCs_k!AZ5apTonyR#U;NE=2d;l)*2E-OfA1~YjL7i@bL_Kz?)NjH(+2~!T9nqURJ6coEm z9*^mjZ=0M>*0SN?P4wwqHa2;3g4y1Oi>6x-<(w|6_{{D)^g1Kn21JW{$L5*sZi^To zR$X=+HV|a>?a=L40qy$pLKQAn1nAm&& z2`7Y^e92M~rqhd>A|ST|7Ef9(FUH%g;L62Y>9&h;CRy33bETW-6%~eL)PN~+|J}fl zaxtxr01h zpQ_fgQEosa{)} zYIEDIbU)7zWP(ZDD_$xfp+V4!K~+Tyu}{Q)oaZ^B9xb#*)yKEi|ny z@5(6ShXvJhmBb?TU}d=&ev)1Oc6#LVobKBD@5gq+eEu!9@Xu0z=wuF*&XOBM-@%gQ8lSiz5 zW@L9RWH`9((i7ehZtt3*&n{sfhvolz;cG&51I_HA9T)-}kdjXns|Pngj)a4!V57B= zjfUd=RCLQ!oZGx-Lkkq$WhG@ZE{qlDk~X@a7H^=``L1F$NxN+!*-uh!NmK+^3 z7)T`a%y^V5F^2h~avd&|i^>fc*_oYSd5DUqTsY7u@#ZRvA_-m;pR>dC^pcxlATA zX-<9-gCwo~7WT7nF5KdDwMO%ird%lI8eo`aL+wo+c<*kDc7{WlV8Rn>6&+G|xNS8* z{@21#0ss1j`(AHw8pDC64SRY=dJBUE{2Oe=cv_s@6O$MAE9_(WSc|WR?++R0JP&M; zb~cL8i}8k$uEaaxA<=XMa-RX4#=U-yvq+2OTUw+UJGeg!Mg5_?!_e~BiD3(oZ(S-u$@bNu$B+w!Ke!m*jLx@3Oqt=9Wa`la|MApENVcWqXh1o%F>! zrT5xg5;H%^+W-8R=#-qMy`R8@`NVDsMF_-We@+)Ic4;?Vd}0qBJ`|79TF;Q151bBh z1NQx>%NmDrLW(7&4yFQkXv;~!*qngng$1YfjssVwx zF&x6dqyYed8Y^n=#|)LYiE9WpY)rOSVj+WAdxK~Q#VYMdW9L-&X#3FUI=7>zIM5Lt z?Vfs}YqG6bGBB@~8Kma6$*%RIUFp$cd4DCpy|*u0Zta3=63VoD{=da;aRTSAhiPAr zYp^S+8(v;&hH6a}in9ZP)q?3cLd6T`T6obZIz))0D{}$01Qn@VI#TqE(drF1Cp!w5 zU4k-zk(@JzlNp+9D0cR=IndJWENROt3YhUY7;JG^gnE96WH#`KP zH`X7cIK|J00-pubLdR!8$~5Joa;y}EYWPD)Q5p|>?M$`|-5r840G|Zw3cR~8d}nm@ zk3Klqd*)1U=wv>9v$!Gq<o3lve-`vN*v-j>lb)Bik$T-?I{1fkZl2~2!JX?-r(q`?<^_4CM0xNe&n_@-8)c&{kz}NQ z&TUd9c{_O0La80y;Dqc!TB5}jXiivjg@FoO>m$nS@pBwN6qFzoH#(1Lpm{K0&n!-D*5lpWUEJKYVS3!DP2OYd#nGYZ z-tI$t_MIy0vlF`X63jWq=Uiynj01p)2GX%G&sc6@b}gAxkO_SrIdBs5Mi$oaY$?4s`Jgp^|a{7p{f0+*FYFp5<^th!h!emX){Aq$-bNer@4yzbyzK$UwKnxe+>=E#oA%A8%pDC^zHvvOFeO zSKqD!Bu{N#<{diJ^*r`SH1|K)4r#j%^l?}Td$+vAMjSAhp(V!k_0q#*$G_4M25C1B5DaB=xDMzu8ii#%H940K||c< z>)zXK4cMcHQ{CmUe5k7}+`L3X3}(27U``XZME-EpwSt;RR9cdkw|HEl-C%}0()wqi z%St_6*(R$g7fD(RBO?WPb-ig|s&@61Ao4@umRxf@;3uu(4h#?mJjc z81}8)=Ag|8TroN;ixzw}Wykr~0S#QeJS1a<)dDR|y5nNW2ODOH4c}Y(>Vo?YMjd03a z@1~#tNtstuMKlE`W&=LOi!zF+Qvm24B$Z9eIwZAPf4lmQ z?d%uT!O0%0eKLV<9SzjZH`ngq{S%k;FCqNFd3#9dx@r$w2ypCGokXBlD;~QzqWrMg z1^06f{fw!{&K7z)kk+@ESh>}n8cYM}bN2QZOsv(^E`R#i%gZ~=o;kMt80@4|7}!4% z&!F;o9DW~;XhL$&i}&yX?g4%>0Y!2U`ydZIP86cdI<^B`EU6-n01rF1W;iR>jMdZ{ z#u(vb7#-I~MjcOc@Q#Uwpk`W__?%&HAKn~D`ZCUeYYzR^l6FTUp4~fYbC5@tofwiN zzq$71;KVU@>I(*s*<#qf{o{9vS3x2nb)s*$meS zP{-YX0M@@H{9gx9fH^QQ9gMW&H_S6DFb8}qqG#41+WlR#X8u>=e{J-ae&gi7iNFyP zapOv}XV%;7!H)y{Z;=0OqQ7|dY?S{7ceUtu#pudxT)&>6>*7Qc!4I1yo819t4IsON zP0f*LODvvPESk0aomMN$FAWg*2>(9}r%I5(R`~x1Dt>Rp`|bk=y3TeTz<>Ou>nz*n z%DLnxl26Nct-XjpAAThH_=oYz#%eDn*&ytZ83>#Ups*xsZehQgPeZ57V2R=YE_6An zjgqlykgPUf{@^fLm{K}D6auHkg)CMqE)d2!laaooQuPjevZ&^&dPWdw^tAg;g{fXU zN*4Vpl8Hnzzp1TbFSORqe49Q*J_~%>gY53wtrUk_q|1#8IAP)URm?~_OhuH1h%%o_ znFR9!l%XOqo<3)H^H12~ayoIM%6oP$tkQ`?qX_NLQ9hy*=lGUW4QDPLFGc&>$toR~ z5WX-@J+C$o>e&^X{Quy8*`wdQhlh(e0YU z`2-rz3~?Z(a=;)ZQ!sda{Ny8bCRCh@Cipd+@r&}#^G#BYJn?f`wf|XOsvmJys_jg7 zVby|P2jYhVXF6MOG7y|WM#EgI+WQXP`!Z$pq38OmxB?e`x}^IPOWrStz@5DNFQ`oT zE`RxDJx8Qh@gobbcY&(O(z*Y+g36IRaimk_h~3@M364bg$yn-JyomWo*R=UK*OukK z0MFV~{!q{c)ww#(&J|StAeKqXLu--HuBeT6zR)d~66BC0IgU1`scd5LLgO`H^x$o>;Mdc;(+u&kREIFLV zgzX1jDUNO|VmKm(>7)oPxDJ;ZT{kx2dfG#kk10cwW*o8!m&`bQrjd5M5E*1waz_4u z|5X|J>i6t2O(&^ylm9l-%USycRUW^?Uw*BAczHotaXT1pRm3))M7?L!s6((&t97WF zOK{6n-PoIQoHCRjK*52kgXf<)0Aw{g;h?gI$h*bCHUzy91cY)4Ale6?sJFiu^il#D zaz{~beOL08pT$L%W1p5RK~rrT`>$NiYqE>iCX=r`%YI@BO6HoK>aw(fo&oj+PsZ_f zLGYLzF9@GlLg()x=La?8Ih|%~h#g4a;iQ^DDhE_~6_px<2&b#Rl;m`Q9^Wf}?MK8W z2Q-XaPAvO;ulyyRW55A60W~}aA$2h!C%i>NFGe~#-wO~b@SG{`1tK2BeCC99{ubG& zOzz-FGaB9noo36zP=lr-DWTd7u4Y&>luVGN^Jxw$(2(?2jV8XYHsD-ql)O0Yyhwu? z3$PgA+hYW}RB16{51cF#d%4G1ee37Z0PK)~~)0inQcJ^xwKOIY^Xp*vu2!udiw1N!9RHk)Fh451+P5;>k` z+U%f@CI@$<`_)(zMSm%wfp2z@REWG!%7b`$=c%rXyEeP~;tBPgr!OY{%RPs-?S5d_ z%nbu}r_JiYr(F;1+ImCTfjYgOWpr*AD8tgA(kYw;(gmH}C(2+)Blm`uefnfl=>#}9 zPS3>(&ya_iWlFB z!l8RSHpJD-H*5u&+tg34fg5IaJ+K>M2445TztklbJ#E4*^S=_F_qc7JL~cbEJQoGK zPy!Bt7uCqq!W#rS(2DFtIl^}`OwMq$&KRa*j56JY7?Pb4`B1W|p}g*Ievl?Z*@a<| ztkSsNC2h*MnFF2!Exx8grR7vW?PszZn+g15sWRkiUrunj57RVPn~bwcxS ztz*bNpG91gNa0)g7?@r>CS@cG&6 zd-kr&M?_!l^j+_|$?a!b-o$yub)x9=q=Z|3*#({WQHT(iA;AS1+6o>5;8UF7JVfa+ zaWm?QMW|XGFBOX_I!NHFhIsCK2-`5=%Tsy|&Wxhog`YU5LJrZ!Qc#bHz+W{Z0?)T-iAt~PT9m|cjO+s`OJrMZ#k0d_~`3C?ekS{m*>t@eZEg$@fiCP zpARy9VE#YZ%j`5{JBUn0+Ln|4_VSV=IEu>0GQc+(bZ8Zu4AP*W2pKEHVu?}!)G;-Y z3e+^Yk(47>AM9mc?ZX(xExFonx)X^|IAQeV*cQKkTOuFFN8*=81Nb$GHD*8f1vmv^ zr`W^xV?X2rWqSpx3j%yDU_()H6$%~WcnZP0`Npcxr((90(Tsx<*DDJr{dE~1PM z<@Sg1Ap**=Z$K`EHnb-2lnz61!-Xck6TTFX?GftjGNEe{YxbG>!fUG6D z-rI*_)oCe#umL92lAet4>RGsU`{~o{;?t*dV}AeGx4uGu7vH^SVuVeM#B;o7_ygfZ zP6al`TiAEt&kUk+ILQNnVxcUq4KE05Aq|_e9Va-TsI^o)pDGiYAf!nU=okvIl_pq_ zcAMfBU+uL2MnC?scldI(_XYg^FXX+#dFcW_*@^>+;jEd9Gx0}Rj1zj zsw?O0rg+Z2Gx%kCu@+jeySb9r(Z?L9a#U5p1@jgQKkX3#WrU=ZYNnHfj_SU_+M$d- zz6Hd|TbPeKDLo{dbgyMv?qWC*$ofmnqctL+s=oEoKo>a=Se<>4{ z)+!2hLyVBd52UioPuzRoqv$46mIpz1R^P2A! zE%(20|GH2x(R%%3*I&6clnU7F*6y^et=Hjj1#;daw~@@a(BHl2Zy#z3!h9wxr`p;< zq_^T6Cv*Z1zhRkD3e>wIj^m!C!wJ=RH~l1@LGMb`I|J;NIl<8s=OqkKzC1?mT8jVa zeaP|^7+s)*Iet=B{Z?H%VBm$=zq!Y}eqXGwNivzu&3!FCzjxRxUALWjnV#x222YP& ze&7AakKDt0+?@fN&4%9C(%k?P2xPrmuS7Rn6T#5B`;VWv7X`o>&bK};Uc?@NH!CC1 zN`lp{>fmS296mB#bm$&41uTPPa;Y{kDU7zHmNrs=mHGD;hx0g_jYexbjv_n6X!-mL z7WRNgvPtD&U_i1(Y?XG{Bu zL7@DzbCB`z<4zcomKQ#cY*(lADBE2}QW?DP5EEQTiy2tT66kuH@P`H@NX>)!hvW*2kD*~YG5Q|;QO5WC4~(g`!$0c2vb0r>e2u+i*@9*#COMLGZO0ssCO z{M)yLfBYJ%?~Gujgx7@zo(@e&{OGO3_u{CMiaNm*hx8UH@GK}k5<8Uhb$j_?TU`cd z{|9@LAQCY6=pmQDH<{dyD%dcF^Uj^;;<=STT`h2_k3eN)lPSCCkxNfG;zms;R8*GQ} z|6S0dx3gAyaNqBQKlSZ2N)O%N2!C{X^mbND&opXk|1RWbrFI&nNAK5a<++|7y`8nv zgZmniADy21b{eIJ?q7@i)YGH4bD{L$ems}!r-tO`eC;$!kKV5fm7kU9(c4)oJ-Ba8 z@>5SweLIcPL-(&nepaGKZ)dgipuOLT{H)YYqx9(gTCM!l)1$YuR(fz>L-M23Q{PUb z^w9llk)L{c^mfii5AM_W(3t+Y&~_T7NAK79(qxWmI@>5Tb-p*R-!F>(Mk4{g0JB`vq_pe2M>gmzj zxlnp=Kc2gG`v>=Pex9$LM(NS}b)oXJ58Wq0QF`e9)yU6E^yuxZ zmL9a%kp9u>S*e{y>CyYOTKTD`M{j4X^x(dR&^mf)t5AIu&{M6G^-%g|S(EY2CpOxs*+gU9=Xm3^a586Mc{H)YY zqx9(gTCM!l)1$YuR(fz>L-M23Q{PUb^w9llk)L{c^mfii5AM_W(3t+Y&~_T7NAK79 z(qxWmI@>5Tb z-p*R-!F>(Mk4{g0JB`vq_pe2M>gmzjxlnp=Kc2gG`v>=Pex9$LM(NS}b)oXJ58Wq0QF`e9)yU6E^yuxZmL9a%kp9u>S*e{y>CyYOTKTD`M{j4X^x(dR zx}_sc)xIdg%Uh$7Vn_vr;>a(xdllwenL>kKWE&>A`&s$&XG? zeLIcPL-(&me(LGb+qqDBaR2W_|D3O#M(NS}b)oXJ58Wq0QF`e9 z)yU6E^yuxZmL9a%kp9u>S*e{y>CyYOTKTD`M{j4X^x(dRJom!= zKluH!eH=b>ex9$LM(NS}b)oXJ58Wq0QF`e9)yU6E^yuxZmL9a% zkp9u>S*e{y>CyYOTKTD`M{j4X^x(dRhW8?W=V z(7NU2r%`(Jew|N# z&PR{l&RXfgeXEk6mFTH&r%`(7{tJ{0c28>&H zX>phpT@Q;q%EACg`ct%!kJM(1i-!HpQ`tgq~_uO~c zJ<<<+dE$$s6OS);;dPHcK6+rw(W9F`@x_S={Nl*bna43osJ+xR|F>d~h}zG# zPiteyhfm1O|FzgFK84DRS&S>HT~h63RO*rei$uVUzG5}bk!s@r0jwtDR2eUsrYdWw z8jq5ABE}4m5GaH%r;17wKH-igj$+#c-1BNn6W!6$ih5;DDy9oTZ=e8|(nN@wE|Xfc zxWvI!%L6E=s1_Yf^KzJK{VKf*WigoRy7kDRH+6mB%B%l~HJxs0IUNX|jz&+T;^R{_ z@1-ZNJ-~ik^S`>yEET^fyEn!6$zMNP8Y{14E_2T^~rq+(mirV;_#W9WDVQk3{~ zo>i7qm!^`pVo|GZ?e9(YdIKnPo20)v(UPle&WR7ca%&_a9(m;>kq8*M^ckqz1?YGV zSWd-lEh1Iav!He@B$}7e7SE!zq>3V>LS&E|vCrfJ;@y$R zD<2V$@MjrNO*}55pe-songly)!*Ng()KE2nY=B0f6g{t4i8A#H0}3vXL(Eo^Jk*8@ z4@lYII77u$FWdFr@4ff`eE)mjfAPeNuRHPLnRnDa^^SM2U67R$=5<0WdEADgxKk`W zhmXQIDwThieGRp5lT^c#BQ3ai#l&jdMME4%NxG^91Yhqr>0_5k=70A}CZqMUW)o_5TO{lE zB)9Yvx8Zf}9~Cc?EEf9OZZVooe=3>q(egd1^b_}SgXc#i??msvu&;XVaUBy~^FI)T z2^4Ck|M+*^`0i`;oe&UR0=}8hznkFqea+*>eJS?q=jiud)U?~gKJ2;2`d@-i+_?CA zjC&`(%d-!nmTbQu8w+z@1A#JCjl6ED5mh3qUL&!`>!LZMV+wkWV1%7YDN;p3j?_c- z2zi~hqL>fVo&~6;>E8QIQh;p?up{>bn^1-i_2WWe(DN|?b?C$>=)Xeni_p+NU8)gsRhLa zsq`JH%K8*3NUK0)87E5|Jd`TlQ4ze)E^zd_3-6w9GJ937F1(@f{^?+Jh16n270hJ!mqP{F4(5n)N7mYwaAc1~zGfUlu@~NP2u^mb1rkTxG z3skbi^2n((E>wOdeJeqQtJJa5K%0cNSQEexZe}w*d(a}`?K0@nULf)a{cImgjUHcdw$wyfKja9f#zzQW>O2iGmNU7k61lRNz@gGcam}@Iwu1(LGpyYq$ zLLK^N*M0K`0s6uOs3w>Cc*ovVkM4 z@3Q}`{hdzW3@~_7vmfDPqI&ZD|GBJRtknIVowdA@{IlM-~G+s{w{Fj2K7LZz#-3z^*xJhH zp2z`g`J`i$dspJrcdL`#|^QLW=zyHWjbOoi?czlPhVenH&sc>pru8tvzOwEDkR_WV1+i&$3TH z{gN5D)i(b3i6!qbrdS8wIR7K|GU#_(z91eK3w#~e%tX)@18paTXFX;C*arN!hlH1a z6EWb)h;Isf2-lA-z0SVPd*Kj1r+$OB4+%TiZ`mQVbBp-MlHWgun(u!l9>VYK^FUg_ zH+Dv}JdW#M#r2Hf2ngVX19-l4eIqage*#h?{X{NmjB*u#-TA`)$G zO+-ZRR5aR=8ZUNDr|Dhyw!!H=o>*=KR;L}T;F{D;}+gtA8x zPa@v+3?GBy{K!Av0p91h0 z740s90<#u^Rckk6K3MJ+J{l~`7+TVdP89k zGxGJG8QBirz8m{j6q+V9ZD?+es|RiE;*Zc?6o3lQlgJ(fx{UUqz_Q1P+y1$w<)57f zdIXB^i^4AaF|p_Q9EF{N0@J{v!jcT=k|>cb71HA$e~}Av)MB1=KTXuL-Cj8Y^_TDJ^awfC7m7jb>uJYpYEC}ji+L<@EQ2G8P$jy+tW^&+V&InbQ z4*-?|TlYFopfJ_4*2Po}eF8m+u9MGmcgq=z|hb$xT3X+jz zQ7MDqeu84p_0cL+KoxSiZAk9%%2vP!z%?YNco}aSt?k&)sEki*T#xa}`(41~&^T}6 zLN;b7h2b><^0;W~EQ0gwKF;^4c>GkhOq{k%a!J>=heqVh#Bc8l4q|>V z80eYq@1OR+U`xe3t>t9Lk$zf}cg+t%_P+$whGVEjPFx`9mPA2m!;7gvI4ISyiDWFy zYv2Pt$*o#|fEBXxt-sX)9%wkQaPL(G?imu2a0u|a^(MlEr4s#sd*x!KcaY$OVoaSV z+$BUf31#+jB>C2hc8|p4CxU_UwfC2^eWiFj89BNCkpNz$NH}+50uG*Rp z1fiQ2Wa)YAE2o4iqka&A3(CTif5t;&C3rw52P1}A4?vV^fN$CZm^yO6qqs0;a1ZhQ zCblvF#i2=D!p5C;mb&m0qQ=jrxYX|n25Ns#vOXH`pZ@xE|5fq$cr5kbsTeBML%!yJ z#`)R`?*Tlfeo#bsOgRvh;#K~M#~fgQPhh)5v~?9^ZOdUT5|mH~G^HU@z{CUa8SrSh z=IO@O5N(L8-GY#$%0CXycORWG3QxYU$BwH1lzbcpgFgP^uAud;3)(lA<8+_nQ zFc1tpf0BCEnJ=aLBgx(0U`PA?EsCSyj>Ue+4E@tDPxlY>q<~Ewt9`%49Z8Jq zycZwEz8R>&fT!wGI(Rqbe2Dq?Edbm5ro_}xB;kDxz2D|l@{~^`;jj8^SpO0QF#rpiAB{KCT;8+c+7CO1P zs~#>k9u(<^NC7*HK~uqs(ic(QD@i`j|Xu9(j znw+eJ_25rwx_YsasyYgM?IXSd&PAP@CirAaN+0-2xRrqQNS!56BDoh>ektOhSp)~W ziUe3pTeB!w>x|MD&VUB_L1-CJ*MRoY38Hy9030AyNQlEA864+`ZM2jIKOT#zdOnie z8;>6@XE|rxlHD|RImz2K>?cV7fHU|zUW zovCt5i7VVBKsF0DBuf`Yp=cXcy23HfHPBGc zKwI^tVt0=o4|D;rTJQh!FrGSTRAG(jqsl?*u-eev0geUM9NKqo-jDtuHIOcE^PT)EP`S0_zcSHQ_H$Kw}s(W~9W1(E;JRup#h*^s}3 zhVsEZB$iNa{nL{lq6?#oefSdh69a3QcF;he<<66Ek#P24HOWbiyi|4az=9LrVeT^q z`V(Pk*^5#xSkU%mqI9z=B`muDR z29g!kb~&RiAD?}FIeQ`=AE|w)jg3Z3A?j%ZEPKU<3A0><8Dn zIBpc6foK`&R6Rp*NVLAz&0y*n>Z2^h1J8 z^;a5(dxtuu@9W~17zVNxYz;Z)EUpaE7$n@m*5!U2dYAwR;> z2Pi99!L+e);b$%nb&(9tYJrf4CJNmcw-H>5RxoZB!i8jB*$0#~tXCeghCJ8@5sZm} zUrzXd4lfT8gqlgfgp?(Wb`p2ly>ewp?)NFFGHu_5K#0(lQXE@}gVtqX3Xv2HRQfYn zEZ3UFy>!lUtRm))v_~TC>!hxhRH2YcgzqZGVuv3wu;KoWj{g7Er|^H!^1wp$(?~dy zDohoE9}EP0{)9YgDFtSRpAk&`99X-F4IT*!#RTqZOhcQf(D z4c*INTFR!g(A!ELyz>?1yk|}{3eDiDSilD*2VsI4NhnP@9)`=csagz^yTm01Q~KQI zIfc}?{iGQyn-d9py=|@Zi1Vda8rDU>|!?{5ogVYjsgvK zw^uGgBus$%!yDP>t!BCl0PB%E$Y6$buTB$+U|=yqkTgSDn#U2zE~7pgtm_VsVE+Jk}p7Moq#P%7`e>Oc)< zWiZgao&6>j>uB#dbYN_U^PmYBM5|do)S_6UjZ{vY!1X$a9Yrp7iKge9f zS#=p-redtuC&J-`BM{7t_4a}{WaIu1Y}~&D9$-m$yHG{QsY~uuG5;6`Vv^fAt`XsP z6(K!E2X(SopqYTZD&WX+=)Jor=R9O~>yZHR;f3)9CIW3(bF@n>49PLC;%kR>YbC#E zgj7V>i`76-7~x`tW4O@jm9s-~yHECjbLj=!mdxO6I!Fd2&~hZ-IrrC5VV=ujo~v*?&j9iVWC>kWof9O3@i!} z;M%aQCj$U@j!a(1g$Q{QMG_)lXjh9I&$EaK8CY4tR4ekS2Ba{h3rqvFox6)qxEN$< zl*>{94D5qu^@1-l^U0mqBG6Lm9g@>txr3x^piauL7u8G$RgxCArr3+pl0}k6w}6+s zPQ~L>OHGM|&+I;|T&;m-?ED7`JANJr21%}LFZgNE>d`(rUhq!$TTi8$gMnh5eRP?o zc>s+?cyF|o$np)HzEgs800s~_+OSii+yp32!n6)?-5J8pjvGcw6R8%I(%KOeSjV1pEMhZZ?0ph z4u5EJy8i<*-*{`bML~Qw?08s9WLwDY5-kmo@M@l%jGcsv9gO8wRBRcOhuayj?KS0U ztXHmtSV_qYh1RoPnnl$@js~4pUqEZlIr*Z(;r+0Of|$d7L-wpX%CKhvt+_COWa+Dx zzuNKs414!KB_pi6oV6zsux@LAPb#$3mo5LWxBa?EWMe=)6-!-OHr?MlhQ%cj=K4WfBXh`KIHLL0$hu7yWOIodiIgqT%^j)O=2p{T^g&3+(Fg2! zMRXC4wkpsbaaE-C1Di!f#C})l=p;)bNvJpsB>Q9L67h{)te``l@x*$hOvljDWRkQ8y%|zw<_%%Pq^wQ zsA0kH1|I+|jE$tO89VT{4J_$sqrvVV1V=J36(81A#R&X!3^wm4wvBa8liO#qe}e@D^t2^C2> zfv*!DWfSIihHJsk*}kZg!-IYOU(i=Uwt78ch;aB%XUqV2KNPgH~AtJD3< zFVs#>_ZOy8(3-87KG+WG^2FB&O5)P}ab$16?xGb{83e}=&Lbs=%q_UH^ zU3lp$P!bonH>9(23@J@uSwEHmjv`6e+M0q?y4Mxe{W5G+!813Znj;eh85;y{bqq$p zN`fmkVU^@;R2i~hR&cpmN<3RWeckGAZ&`UOfcXe z8{>Mbrcc)a|9Qa_X#?^(*&M3BvK6S0H>vv@GP|orZe_#agWmGZvl6pkPLApl)$Vq0pS^%1~vyAD`86R!}gQ&!%wn9 zqN7R?yiW#hk(LnGLptIpgYSRmw}OG*e)3+DYi;)a#QH}EQZd$abs|xdRFj(>tIg9C zyLHEh{>r_h<&q_P(Kca=P_>Z^Xm%wBb#A9jHu%(dZe^la4f2$kAgGpuJV}p3R8tRI zD0fmcq62XF43xqZO1x7Y0n5g<;+3$Tx21OV{PCxHxLZdbpk}6g8e8V#+pfK~_6+%R zCW8Su23p!!{`%KnzUZTRH}X(UYn}k?gOGHm@9*K)q_taW~u$>=>;xuJ7(M;4)QnpSVspdiI=V- z)dcRqe(9gy+AeuJ6ZB3U_SUxkG>2bZBBSlX)k4)tHVshU$?qc-+P z_M9arRkew)aHeW= zZIo$qZE=C~0~wwcf6>%a(I=eRwVmH0W9^ph-L%7fpE}#r1&uZDQ~R^rF9*BRO0zD5 z9$=$O9v~ef8XkHFSF%`!v5&8|ah1_VF@!eNN$=v(Hr4KoWiW7LYtmK)mZzVrP|QWm z7q3pmbA)}Ia18NL9*}jFsk!F3*~yOAKEwx;J^xyUCuG^6+bf7|HY3IZePX1Z#nB~f zF-WbTXV}pa$}l;x;VhP;9)(<~7#ND*C@HXC33AtsA48%IYTxo(ZDtGW@v~n94VRhSlFM)u{!LcPvVWYv z1NTvkn~=3Vr8%2{9DNkC6cihBPGkXNi^wx=FA=U#edp#>w)WCpPLJLGkhRJBklpTa ziW?4D?PjNR!fZYvIn8#+8mnz$|2cmQ?fZdVPI0#d?D7d0t!V-#Qh+C*Behz#dlVl= z2GK_J)}X0?QHGUAkpv6QNKd4Vy!MmM7!-B4us3Ucg#P z*B_sM`#hWfYmbC0!YhAB{Ced#^MmuBg14(#*skryNVzxBgomR8Zmy~|K$F)BYn8$G zOGy!kMpVsY%TJgE(5}THV9R5#PO(5*L({>O3!8C`UQo^#CTOtQL+yE=X?^bbM6jc+ z@0;bldpbH?QNJsn4J9(6vEIp%bwl&>I$h|)U-CYDiH29#OTzs^5dW*f#G-T{NOuU+ z7{+36U%5CYa%Yi?0h%4pqo~qv4{gt-EGFx^Yp%L_*lMyQGad1C++lH7dV4EwizA+< zwpr8suh=AFrB<8~&~nsldc=-T7i7fY5oySk8t`Gzo54T;FyMcLBz62Ja=&4dcnHYP zKzj0F@7iUHJ^7*kC%)%3*l zZeqf&q`XPq#Pr^KH+j>0@51kM=H7)xlf2*W_j&%$^CuDRot>RIbLPyMGpEf+I`u0f zvEzgXN@dc(AaGw+**Vf38UDnkL(OsxzDMp4ZGCTv$-0QyBzypNHP!|Wr^indoR zY1AOm*d;cjr5zT6A@Ny9&nht}b#HL%XT=?mrcZkg-oJ|Mve*w-0 zz-qK!37dp7@T?Ha2hIX?fCh^W2juB70JVqhSB!HA77TiY~K~j<@&%@4{iqW3lJKA1E zoOmL;s{53vAx1{teF~e|9inkg!Y>QsOaZ4pEP9-&7^n0`qH#*6=`4G2w7-IJV@tx| z$WokH8P1nmQa-lPaGV@Q95E0as9|HV2Pb6{IXJS<|NY=Fo<6b4!>+>ob$9fRY~jL; z0-9ZZ@ZM*lhPC$@9^=d>?LSEv(ZRchf!evJ~2rP;#)F|6pIZ}?GQ{yK-)vcn*} zN=xN{DnOr&Pr}KxB(xxw1VqRX8(xVKk0yztGo>;#0wXT043Cg<#R%vP!tN0?ac&YZ zMz~4+)mbD%j5=#7!zwKcMJ>l?syn0r8#<<1m$HWrFaA)Sy?il?N&l1S-hY*tv<6;3 zapyoFiu?UzNBI3CB*BaQ*2O*BifG!|5&dX_$bO%NQDm97U}tf&mvq!VUp zz%at;@*JK{I+z-Fs1^vUs+6W}y)qnMOUNZ#9vQj`fjDZyX@p8$U`kTm2>#cPZ2sq{ zl-PT7fz2}>D);;Me((1Wt?>IR`r~l#wxV7V<5m5LFA9GjM)1azu|41NTHtN8a;;-= z4FExq-r)T;kaQE_L|}^Ctipwat+;Yv3;r)5v%0c!*GRRH{Qbahb6$nkhKwEIWNFn* zP6NVnl4VEMhk1QpRE>#`gN|Z{($4DH9(SSk z685my-G=rp?T5&yhOoy==`TCOB0)~@> zlQV!NvyHvS-0il;rX&}ni=+u9MfH41QfW%6%UeAJ-Jt&imBZPCvj0~hf4%B9An8&6 zBd{K_*&gf*$0AyZ<`QbtkP?G!lOx2ygIR>SBxI!#%|qP9se*j#cfa$~Dblx|m3GFI zk~+Xrf9s3^MXSHvJ^I*Rnf%ZL_j)(n>(f-Y*Qf7>-7>wjl)<&$igA0=@NEA$uJuFZ zd4y!)q^eQs&?M3X(3_gTNRdLjcfJ)DXKe|_j+x#43w=<; z&Wy7}Tz5Sa=~cxnLB2dZcNQX9Aji;n$-p}vDRw{216IYE9}IGWOFOT{puGlp0I z?EvWs^Q0vpuMks#(+QoaDSQzo0_j?zkZT3$h(mc~ZBlDGEf4%6vZZAXN0kf^ru-z0 ztg*eHID&2xiB2gny%C|>gY_XCQ(E9)ZeaB)v*ByYTyV6ua1r&ZH%7qbIu zPZT5vcV98A-Yz4dJ-^jpXqqn`z`X)EB|oq}q% zv->Cll$$hBiwGEYCv{Ix-EuCmXGi8F9x`;D5{BatVgRe4;-dp4kZz?&VfKZlHzfD!K-4|B^M3~_@>Y4K2i3)F25ic%VLwf1^E(0 z!Sqn#yG^=VTU``2c1#onKar=BEncV|;p#+S^!x#))O z$5>iX@l-j5eZ0U6KO*TR+#9D1#}n8QNVJJ1zfC2Uc4lZfiSI^J)L>@@gApRyEGLKU z>7yCB+WOPW0B97#iA3cv;gJ3SVZ`xOw!I3P9%xxfCdeSiP$dIMKwK~+QPMyY`%!@k zaA7F&$RcOebY^*^qaxfYomB@yrxi%55y?PDv7rzrBm-sFT_I_GWZg5H28#H2F`&GN z9VoH1=Y|NGj~Uth)bVmgbB3_$K6;VmQsn@pGDe7eY<_sMEU3Ym%FI^ z3#WVs+NrbKxt7Ym+^_ww?0(5?26(_od5T>>@HXmy{T+za(e^s!6_`hlU7nPM^6vfHk^S~K&#aP#-+nWT9(Usk@WbwY$q}=k{1w9RHvQ-Iz1_>d|F>Qq7(b-L+8=kj@|Czz3+Ct!}e?UR{Fjh zEdnllD(j;^yInV0j4JPgw|$>>SMS&Eb_thVzCXNnIa;^d0e;Ha@xTMh2`_{%ycfD! z@m^|U0_FH&i`m=2PwVTaptQGLS--Emf4e83-L|N9Pe8jZcpuiU-REAoBtm5+gkCWT68IC#V#z}r_2MObe;W}jSWG&8)Uomz7X$)M88TGDCd3~UeIqhV)Y!lcI|fHvgxd^`~j!D zuif?gw7atBXXTQpc2_v zyGQQR?rOk$`WcfZL}PE`1(26fW{8V3JieCRQE= zs;ZqRHy88es6*rn4gyK#RlZ<><`(ft`EcByFOM-zE8h6|hq=SoB*a*%u|{VL&MVd9 z-P*0)Apk|N(XVbk5obR{ZVN{iCXZiM8Aj?PK!o5tTjKUh6-QoqPIXQ}q0_1P-VYuq z2s7E`lWsq4t0B-I+t3|K@&yn1eQ^VI1$^KKcmh6Lze)V};RgbegD?8Lz%@ql>w5Zz z{XK#W`#}BcM3-ax%4K^6u5osKZ1=Jq+P7pobtuQT=u=wr)Cci^-ahbIOy6g;kI81h}m8rQc6siFs6R^bV+~H2UV6qMG>0< z0gmQGj*ll}e78p4frn&go&5}a9uUC~)?ZY4^nTT^+}^LA?D-b)z`NXq`eeo1eIwd` zT(*O9tna9DL}?Qovc3Yz+^)xbJ?{X|L-F1v@vea1ty2zy-EfuTr9*bZG`V!sD2DwJLp`H^+aA68xGHKmd?~~NNg%pZ+BL@L^ zvC_KE?!z`@!!ib)&TRwIj99mx8iaZg1C^Uk<2HxlH^hN^@4@n1j`^ixqMgcvXmHYDS z&}G0}ew_pKKqK*|FUC1AUnOB)mJr-(1B|(-#N1sZ=OP67ReA^fZz~3@{zYUl%O)O` zQbm60oj#b7NP!`Z{s>|(v~>lAGRCuz&gw`nMZu6z6^4^!+NUH$xycZAodQ|&YdRA= zUEFe~XOIhj5}X4h`NzUt3Od8iT#9mqE^7#~v-!M34a#sv>CF(l=QXh+NLnBf^eDlj`fH^(!6N=%vd;Y89AM5Q$wX_&vm!%` z|8ZvE9{)d?naBwLW?t;!{kK`6bwqpCLY5DE<{0Pf2ip{R(|F6sd14K`IlM9QuqQQo za1(=u6#hQsOQF?tdOe+HO=k>E1g5};Jrv3yvKf$$8AMc&m+NB43-o;ILB53Sw9;hF zV`#~~6!(!}p@my>QxdaH)2$_^?*=Rt5*Bzof>*yComA$0+$@&nn`Zt|hYE?k~E0spKucvn$zR z#Qa#4yGWNgP>^eaQla1v>x4gnDbuJ>A#yC?59Qe*EwyxMAS7Nw#d5NIQ4K-2ee~yTF^T?RgS)SD@~rvTO(H z-pZ#?U4^8IhFS6(om77Z_WE0UK0y5@)W4`-eV40=FH}F@-M`+d-g@`4YuI)^)m`dp z7%{)9%3X%`M<};CPbVtJ}s&Kx+W{8P1g|-dxIenCqs*6YxtS zWiK?GU8%B`?YEd9oko3r$x@UYnE0$juu4!fytGZ9%@+#_rE3K|Mr~^e2;0tu$PP%Y zO&U^?nx4Mc?apx5WM&16a?2|HZa3%uD$CHUG+$!s%DDLTsloiLocx&7J7}y=WBk|j zeER>RvFiVmu^uePnwGZzSQkWwIyx?XMr5dG%DJYsR}PxRncB`jqYv#ZUl?8P`bC!0 z0_^5zgJzmeA;}t&Yor`9R9`uyR$1N%T%IRoACz>T3)u$RFVG&!9ht}}cVok`%TfOh zbu3m494R}ww|&-{Jb ziz=t~Kr3>5u$mPbfZ)7D0;Cq$6+xJ1Zr%iB3>} z7s`t&6X8I77+i3>-@nsJ%_tZ;6z8a;4@w&qYpSKb#pT}AjLekOjI8B|q|Y|oL#9+$ z7tUL-$_=+7*QgIOl6@Ke;w*ct*kgCVR$Qi>Y1`>2#M*YR9*99B-3P>@a4w0Z3I&fx z1`Wfp9CW!HG)1hzQHTaTNcsX$E|6q->`aEaBWy}TqeMXkp#Vu42n7Qq3I>v)Pt=6+ z5wfr=E%p@_ZO_Ht@3j^AO3IjoFGUx271PRdNuiO zpHCWk)*{sy^$$H1_VW=vlc|4rN*$?$^GM!Y*;58qmY3ZV(hM%B!Lqh z#YG^V1~Nt$QuNJ(^x>RA$W_WYnSj`()2j?BiL2>M^Mv(eIJ}Z69FvEm1~kuEo{*J6 z6s&s_IB0kO(;Wq@R^?Q}jFpni-maW^K*9Ki3?l(b2LIf$+S8ASNo792|Gjw$^U{OK zv6DyD&Pa&0xG|%os5;*_+jRSawJ|miqI1->QvbS=PUd}jQh7!peX(5*EJ?iI!w+HG z)okEtv^@`4=nL^)pbw_+Q>iS!0ohJ(RRbugLjhw2R1eYP$%xgGzKw*#a55#ftxJZ- z4;j=XB^V=$+pQxCtI`WxV4Da0dW4-cbtZW%)aN8e1*vfd}@hhxe#@ zcKgU(rQ7-iTR#~@dw7qk_bgw;PUDZDq*vd7z2Fhl!+TV{FZnram1?3SO8E>sb}v=XQ5uItY_~7Hr0XOv-l*`OOy4!le!$(XY~54 z==S8gV$>c^h3Iz#*4aY5+j;`bf+ppbQ*$$_Ci9JHQKfn=PF6Tz+)5!;9yM4NT;7vh)y}JJGj!wQ&sYU5- zd`ja}dbR`4q~o^BLDRkM*fxY56mZ!OYzWwM2P??+QbJrB@t@(M65=XFmDpq9*g<+B zMLOh?DuvR=`DKKpOfKMhwbNTk$M$fp%r%t@vml+|Dd~hvCR9dE6$}L19)hB>T-sQb zj6`g#odq6f2G>F^4Pw(WJTw7*^vOy1hpZfur<0Ew8(%!R zFh?W>2G1>NyP&pmq1VecC3!Edm|mP=ZTVnKRZ8aQg+38?MW7&%WEGYKE?hTyRZh^C zG@xqqAkU&>*@lUwBZBisj!%lko`oO6r;>_1c453Am=%Ht;v$heMXF;UgHYO_kbvG= zDjq7zs{t~BiL`6dIVm?m9okkuK|JsEzJF;F{Fw@-Pny+UR9IS}1$`nG!6f+-_w);M zg!qYUusYEV9~Db1!S!i`*84YcO^Xsvf`*yRyg+k*OJ zPq8f>%(h!F1cD%Qdhhw3f+dwo%Ht=q>7-I-LP{+VPO*q=QW!RVO9m=f$lZ=02IwKA z4#L&|5E_QtiT!AgqZnx)U)VhsDENHBumR+QRXlF79Qef53*^#g-XMDg)e-(S9F}(0KLXREmBULKjrb%)GK@8!<-m8qyrn?$T%u#j-GPH zp&+7Wp>h}M70Piq@5ryYt#2-Hq6jJEu%9gzE_AHeRhLcS2PKt|zR01dtSeb1xr`yE z_3uPCav?&T9eHpEu;86DND&?>r3(BWEAbd5yI?m@^7c9++kF&g1FjzZwY;CWuen3$$e{*W; z{EpPrj^ON=xRixC_PU4X(Ot+*H`&QFXaE`UNkE1n)vn|a47Xr}aLW92eaXZe6(5PM z2w#ygCX^2yqwtbrX*FEX_lKD$y8JoaHBa_|dDXP>p5Xi_xM<=eKcabq))cXuocIxv z1BI1X5BZX-QuI?1zqzYUrBHOr$DS#}T_^;}f;~jKMv*;)0+Ns>S=vlI?vM|U=~!jy zK3ZkzM2T5cL>w7{b2z-g{#d>_Blp&2&sW zJ!hALe(>xI5{lvhB@MZgh|B5C^-c-aj>PJTOj4%s2?q*qWO z($NvNp@GuVdmxUDGNl(1nRTT}TJEfJTq=i3w>&s0?ut*2#c2eouE=4WJQm?q70MY1 zuVq9^QN}VlV}g>0;W3d;jL=SJc*2&z*`p>@ZeTm(`8b9IJ;>ytgsR}Ydq8^pfS-}~lHtxPGyMz75fpzkVk_t)Y1jonMEj8Jp1Tsh` z(O?k!8cvai{}dVw9DwCu@@3vbWCybclPaxVsgzSI%`I021)j&rd?gfwBqLw5V9yF$ zo+J#0ED#A8Urve~pB*63e|!;}O5R_O(RFesP3vC`GcO%e85wBQ8Zz|azO^9NNP}`b z`K-8JbILKVC?{PpmA+2wM1DUaAKT?`IOPXJp8ko$+f5%R*A(7y78ne^6GR?i8P7%9 zc!)qDB?tJ_2%qq4564qX0Vt*`GewI>auk_}RR(iWa5!R~!Z}iK%mL=YaWW=D20P`r zB_1UYD(K}wh~x?tkQSC}NV;6pneMS&+)403Ue-+5e8S%J0!c#78nQz$WH1oCQX{Jd zYN=lBEnj$PW^l&bL;e0C3;q5wd$lxSnMk6dwc<GH>?s2CpB zk#w7fM+aqSz&?{rJCTwN2`$WJ{zLNbprjz=9!MEt+yiKiDd9<{3tb6l__u@3s^9Y-Gfop3?xWfrZM z_kay&y~uSDDc{pq-mm`qPWg#A!wUsEHhqx%e($^MW7M$E7dI;JLk5No6eW_Huu4b( zmhlh}fRSHTqRdWW3OH< zMdl$1(Un>$Fvf=U1Y+Y-Ou$K`5Hb*hNpi?gCtR0;G!SS`YJuQ5Z_1*e~PrFO|15B)X7Y`5t^ z)~9lK<3*J>_Dp6!O1;7md{u+Kelpsfg%wqS_`eCt_m0$tJOy^jN=jP|DLO?;9^n*{ zNtBd$EEc4SA=^J>kh-d_N@;8C9Dxa#C{IKPqSzJdwIGy`H!i{{h;J05&>N^hI{RvA zhU_f1uWT!`<0+BuPo=2AIu+s_r14!|bu{XZv+Is4>l$qvFDKC&MMOqtd`&1&gTF>i zXR&8j3g#2SN@!d)4(z#wgEHwwMf#cWh`KQ}`=LQ}2KLv43Xwx$S9YM7qLN5*{5y}D zerALy!$D!M-4y3}l8JDV;|n*hnKrW}%Izj%SvbToCmdp%SkJTnfTAW$oj9de%qN$e zLAI@-V39xBmzhzV`J7{njk3wod|%7DuJu@koUKp8c@5-($wtCcW>lYug2 z9uneK7ZVLumx6aS5WP9_|zz;;nmLEkAU27W3eO_QPh9}zbmh^s&v!qDJq zTW&x;Q`JEu2-rsBC_>{fppo*$k(1YdLnHhUqkR&4afwv+Ebbri$?En#AMsf{!@;R` zi|3!w+WlRy*QYUp+_=5Jfe+$G`tsQpQHN*4ztN+>zfmWijodCcvXXxziDV3!%jn7r zuxR)@O7QUJ8x$B_`{4d*^vLa@0H#J!LKnE;8>rB^7V>&_fc$Q@52!QZo$ z-Xv;#;dw3nUG*Rpl@n(eU)SGRj~@(iFVoqNw_;pwXhLj5BSc*3A!^?+g@7aE(wEsX zWV{sRb#|hRD9^l%M6~z5Y7bir>2me7Q%)H^j}J!sTP92mR#&j=34izj{w84GA8PkQ zndZ?I9ZVDDd|~59Pe2`Mw?bYQDAfQa63NZUpz%wMd+$~ot$L5_v7=^76};S9hYw>H zMCsu#fUV(GHU;}%jhxTh$=0Ae2;bdF&U_;48xk1MvP*|AS!cStOQ@9gHZ0^Gg8Sz{ zREX$}o;COdjwtzDB=wMK@ zV0?;i>XyM_C3#kCQv4YbO`yM@a4*jec_uwr2`3OQp=<;snmF-nqy>?uP(*Ih{iTi< zD4o*j)aj$FOtI4M)1oNDP%8X9P!P%jT6YRNjr9OYR0Vm>MD$`C@W|s#33!DG-AvBq30*ybq8drBDx!d zL}-e=qbNLhCd%VAtru+eas+Vh!w4v_P|&YoGcr11VyDJ_ zPzXO(j3bL|)_vp1;!-hQ_>bc;Tm#aMK6-R+M&;j)OOH#if>}lV2L~P`{aU4LRx5dg z^xI`?qzt9>AdVx-uXS;sY}RMXp*0Xy9w%8U(16xQbfLaMxdr?l=Qb!Gr z5OH`qyP)L@WnwS|1M~@$<{b$rDZN`pKOH-16%fOVyNlC^84Mt?H4)5!u#}vVQxFkb_f^4@Y~?t; zL`kcBVV^(8)aCn1rO?saz8v$XIIb=Qiy|&A7<-?O#7K;td?eO_Hg1R3YMwK44A^#P zhK~gD3qy@y>r|kng3=i($z4{WiE{u_yGsp90)^?uVpw?tAexH=4@7fH#Oy~*h1@m& zQpqSU9)-1pwy+ew@cNU_T2uB8}E3o%*9}ALZ~RqjK0H zqRO$#*pINwN9s@B3e*Cgda5tW?fR49sz~Jx*b9Gz-8)jh9!ES`AMlq`e5BL9EC+oy zNO&f}Dqc+Y5CJF{H84wY*tf&@97$@37Lj)@MLfUG1Nx&64{jOvmh!$;mRab#A-(EPMdOUACBRYroz?HdlQx!3D` zB>%u*=CD9PNzLNYcB<>)uB*HEX3lWS<13Qt>h*arFPgO-D zkD-y%zU(3g;W`(BeWX3uzF7=N2)m>S&jpcbm*S$c4noXHc`n`7%jru=FfoP8rAu0Q z5ttVlh|5XzDS_9z2Ujp5cPw=0;iTMhBI_7Ws6ysgWVU-T)D3jZ8OXd)Hh5|KqwQP< zrjts-HVz_(30c#8EF<0>@18ts8L(4Yaa(M1NoG9EgvG_xv~m(628x? z5QmULnH=B{GZ5FqhfSJW948nOgHpOU%1Ht%Eo@wHzNWi0NWU*V!IA1eF~o4)7lxtB zRNRF$3=h1&M>6CYgnIT|mVff12}P^gE~V?3kUz|Q_|_TQimqSY{T_Hs>$`T|H5F@1 zk+8%APuU85?Bi*rArRSKWN>!sO7O=kP(aGO9Rca=hudVF%j#i$gQFjE&m$LaB^k^^ zDM;BPg=jxLAeBLahjbgswziB?JmLr~cfo3vA;4 zaVfb%k!HgW$wi_w=~bDvLpowAg}nAw;r(M)YA{uV!ggNp4_d) zZJ%@CWmR$E)hoiWhMyOb`w+$sw##+&nXl}0?spee(#0=9-o(%H)HbO zz#Z1v%9~D}Syxp!6C9*7y9$SQnc^9#VL}Qnwc9PzdN}trQi5Rtk~AyBLb`YeS`9cS zrO1o>Qpld@mrI$D@%5HiHwt5O4!J4pp=6(_A8`Wx?tVMjCp3B%8vDs`d0Be*;tcvbTJzwAU7bOH>1=QW zaJL8im+s7sr5GG(SR;QcnXC&Mf-Y5PI(VKuFXD1%=k_^4`N2aBbYfM?Yp-#S7?v>Z zR?1N!>mrv<&Q&bA`|~2!)cpWG1mEfYgHo}v(svYHseJCbXT!l&%Q2JE;K7Hx%)od0-UAe zd0b3_QP0wOk{tVF_0+$!E&=@xcl8W~}LA`W$xE z%9YJ~_hJ@GT2{BNk8_!-fHxNK6oDy;ba4j3Bt=XRemDWpM6&B5gA=*0C?S>HEEIXn zVNoE^9iz#n*JR^@S5W7dUupNu;`iF!{?54URlz#wzy4f^PsA-4fX2RCEU_}oXep4Q zPOt2W6AFt*7?FJ;gd4^gXD!ICsWtA=346;W86 zYIUA35BJl1;8|0Z=c_t`H5F~RV*UE{S8mwgEYWw~>Hhtlcixe*rn6Sz<60^46p`7I zNS8=T5gSjCFT$FP)zhSx5@5s9MUp8xi~tUDu6KZtGLAE4GNc1!!|sBR=JQG^jTO(> zwzmgURDAvNUV7nP@F_3lr>40?v_CvxIJA}L(u4j2_3;F5(?8VVu`L0GA< z^5tbjluQjaDpoT8$Rp>^J8I*CRcD=WsL#7>%Q-ydf)_71e`U)BMLUl<{D#}yq0W^}iaeW)fYY=N~su!dg zq!`g&i4`|N41_~0JOq-j8&|ht@zA*}@wjOdiZ<1+Xa1?B1E+2n(fB>DT25=M6Fl!m zta}f5ei&~4SXD@o1`DsSlRw%f116&?!RsQKvI|)&ak{JTdxHMlavvWdnH;?nv%BR! zYI}Om7d%Gl((4p^V03Q^?!}3dhHGT@L2po~+l(Y^$YUcZ)Wb2-H7kZP*xA`9Bf51- z5{N;nV&C}vxaQzC(7<4yckdtgi&S1%4(N9a#`F@Of*qg&d>jWBxF$&hy3Be_SIUOH z5(00p>748h(5?fCq~GZcMmJTP3e|!wZZpO_<{07}`k6lO89E;#;^IH~BtG7R2-w|? zLkk)**7d(LF_Qw270BOXOW+A2{e9mqaW}9F#y# z&?A!G5Rs~Me<1P(;xm$sXh9Hrq63pj#s=I<7)pnGQ%Hr|7M(@*CHoZnn4o&(357Or zhxm_~aoDOOX02I6yLL4359~H#&sx%OPPd!=DYi8%Kezw9!DfnigQEcw-r|}Mx~UE_ zV6rqjBvTZBy7bvfr`dxCLf@>}o|SUH!Fj3w+^zC?58G$<9tipUyB^wq2I)M1IPOvZ zghPjobwTgWT7?d)3c&8ScIC;GIU7@#TZvD=+QrSYa_wSUr-K$QO~YABk6yb9d1}bD zO9xCk->1lImQ{F7zHaW&#VhKbTVKDaXu`DPSn4-Z2bNAfV&rmO^?jqH^VL0{f`8Q8 z`SI+lF2b?W<({r44!fkUCuv*cDzjvYQOYrBNe5O7isQ)Yg5)Ys=+z!d6ke6X&ZNAu z-M@pV4PJ_@zOUd(!DTKI7lV4faiYoRT`A&xIN)Bdi^SNK-LRLluUEt-3LQKk8GhlF z;O&*lmEe7}F3l>+hbeu(z-H-6DR_m2vT#2fVl!=Nz6y!s<&!qa35beas<)bO@9dR;4?2%WFE} zUZvE8QYho5g$wu)5l3;GP$A~o3Dcn_i^>%r$r&%TYEHgKY;>6jt5`EblEA%n}}V7h$RIGXh*<}$ah>|G?1($gA$N8!!dL@X=HnjhjAF}TV5ZE z;M3CHlScL6`+S+1J{TrO&Zw#?%&+DLW))}nOEQC1!NSVQLZ~t^UlBNBD8?WDI80UI z5YBJ^VaV1C*@=7(sL=jH-qT<`iIN>k+tGzi`^QHbj^ZPQ{4G!ewA5G$=&xJl%{|wt z0np+^1$RUdb&zu3=kAKNU40VVq!;v1lsZ^8)HTozIF?Ov+a|4+bALNnH{ehqe~@1} zd~Kj;!v)FUAen4Syyd;O_+GCS&tDiE=khPf@%wX@_+4?;81tii4%-G8JlLto`&mW0 za?(S>Qvh9b8A!B=s6j^paJZ_A^=(|EBtKocRL70dCckct~^+- zk4Hw6T%2=2^wfjAe#2dc=rM}I2RcJA(*S;4!jV@B;~QNXp2bWrTeKl223d0B?LXYV zSTJm5G4c(#Ofp;)>N}cYq59 zh=tK0BOO60=&ZE-91P6v2v>Tfz+;7a3P$?E05G0Y5l<9@Q|uv*ofz^nr86f_7|@4| zF~-pq0-?iH=zxZ6HYkH^fZx;sM35YS{p*r6rpfGk~y zGvvnLfb6nCraR*Oa<})BMC+1X#4g&@>0VYBL7ymnXACk3;ucXr@AVOr%HbVI5fgX7$gD%BXNID2*(8Sx$nM9z@l@F3N| zwtGw1CB<@roctKcrPLWH> z&aCWx#+ia~Mz4?F3B!nAa%QYGYPIY;al3lgjy}|$KpH-NhVV1(m4xT%%68`&`Mi}s zooB9?%;!9-N;;e4JZp+z$2!ltlE`jzo(+`0>^uuaWgj`uvC2R`#(9p{o`_@4bAmF! z?e5Tykafy56vnk6@m(N0$ZK4;20E97&wd|oJ@bEr<@4EdZZ z%csca0eDXE*l-q5d1ARNFT}GqF|!LJtss29e8h3+96RX<675lY-?WG)DfsG zFRv`2-&OK=wfsFy{;r|l73K1GWnj{bd4Y*-jg2c>*K`Dy<5yervUMG;ZS80-()V=P zV=D?!aeC_-Jk173E75t2vJ{;wvl~~gYgvj18|>OBz$0G{U_b=uYJ8&wZoD?4Xs`-k zsFgra+kqLaZL62I)Dn>R>>ps54;X0R%@Vu-P&gQ>h)N)$68{aswFd!3ncvvf-rTw- zP(HY#vb3^t$S{=sLz_1I1d$@AwgXe$4rt5pUppXQkAG|M-%@-^7u>G_4oc;?R-(pQ zz|)GfevQgb7M~JWyHJW9cgrNqEon|`#m|OAI zj8-@H)>tQN*rVvc2mN-Yt->^kkTp9YjIlaNGOj}Suu>HGVSJpe+Xk<)0F0zRA0Xqh(R+5SF_aJ_`7 zj}EI))_(;3VWSpo+yrI25e!pX#9AUf72%z5NqD1mW@BjI{z@Sf#6;0aAEU76_OE7& zu+WT_3F|iYn`F=SJTy5_*|WI;HCrUUmr1;?llWZ$ytGJ`WwW4wvH%n{7h$|J!M5h2 zp=?y3-xZ}d7^xufx2_>AIw;ET0OM-}7M4mp6C0=bTqJQr>(Rzii^KxW3{jiC z28r669Ha@~vuT|82T^JN(NgO+hoin%gPYhC zx_`|G^$`alSnc&|*ItYMiC5b^g?j4a82$URS1N7teXDg}=n1C3>YwU0O3c~w65)Nc z`e=SyB$kM;+avDlf$-IiQi7T|1<}C1y;5z0%H|71dp0MuN7$ds{$D7N=xS~+{`a3} z8>0T>qt&tju-lN>xT8IrsLJNzM3WJ&O0-J+kJh72A+-O|4nh>))Nh~IfAp)-W<&t| z{}KoF{b;%We!Bmx6D>q`Y?8Hz8xZb@`e-MMrj)xy1^dLl&W z(m+ zUa^r1)~#tk7adKF0d%#xo!X}tlG!IUu4!yr+7g(xZdpt7^1!s_<&A6F8v{!L36-=r zH8up6ZIsnXY7fkDdJjx&MXO6YAQP7a8k^BvTVTB-BUeQ_a9S$~0Gi;^4g$C>(7Kks zR0JqD23nTV*q!f{#>7aRL{QN;sD?oE8VN#E>spMV2~A;C8=6~M0?Qf$>)IPvtZOL= z;Jgu7P(OF_%z1MIV`eN0EEqF;_Lv!S7Y#?vj;2<8+PJ>aZl`(m+LmUF40vo?x~5|z z0X%)e>~WJ(f6UnWY4vj#5zG_o=gycgXHH<^%-Ml4fmvf_&#fOfZ`zpIfm!or&zd=B z0w!h-aPnVpxkAoGTVtT1v14g-OFPE72s76XkXjl7O-t7|Vg{EtHm?UjOFsOaMQ0O28pu!-fsL=L5_$&2f8KOw5>e^w_?( zad|UHpz(<1jdE^E0?jLI;%aNe1ffbp>+*H08*#GR(A2!Vi7?*Y*KG+AT%d9FGQi&p z3!!h_nx!q6UlgxxZKFwdD9-^GliJZLkr!#cB^<|A?j=HXm4y;0a{1L@(XQ^ z?dw`Pnt_4HR|9AYw6MGt#DoqVlKp!MFAYdq>m4&1a{6m(-2ggi19a<`wlsspfdG(d zt0ZwCq@BjGp~+qoz1^>t$L0SW1obwSopsuax)O=|)k`;GMmidSTKP#Iq!_7ONRj2{ ztY)GBdl3*{0E3X&YsDg7i7}v+R*Vtcqcq_3i#NjW1}yU44@*F#EsYrRK7F=#pbbd@ zE81FD_v;_5?0+VaMWjmNtaLUk!>+d$e7016e>I-unRXv)rS;I#xT2$M<=U3grjFI9 zh0Tg}va6t` zmR6xn)h1~p@%#VYFCEMJS|TPNWZ*$}(W*<=7Fy{X4|NWaS5cU5)ZP(O7 z^e7aJ2!b4o2j*7clh5}399SHMSsbC2Ys0l_jiPJDpq(~|jwDtu#k-?}hpqSoQugfs z<30do4B9vqk^DM*r%mW}EeQRwN*r$VO@L*~4eMDVEKpupd6MCAk_y{HI(!B);NhPI zuMF}6$wdz90nm>ZAWA%lIKX1$>nuTrw^9&nxl{~QK|xdv#n4cwhH7vO8IFA0BXR59 zXjo0?;5ZI<7*4?9a1xG_^~w}wDvpEGF=I1v5Ig|K!8s5|=fRtBfwB+>v;%Pu!ojeB zEQUAK5{&c~+~Is8vaS6anOiO zl{2`uuqrl~RkI;%C>zFVSS=gQMzE2}2g-k74;;}4x7v7vH8j$umgOke8d*8g=`T!kR8MhMo!Mf>`=CZEoIBt za@N2a*$TFjHL+&4iXFyUU^iXO*05H#R{2=@gdNV>SUc-r>)3j>fgQm%vLo41Y!f@0 zZDz-?W7%=+cy@wvJv)(YVJESZ*(tDroyNAZ)7crg9po%_HamxHW9K5v_4(`qb|Jfn zUCb_Fm$L2bGIlw;0y){QVpp?kkoDj?c0IcRSu}29JJ`+a7Pb@F`fdYX48gs07yR9C zhrj%t>@M~%b~n3+-OK*X?qm0}-RuF}^!pHdm_5QCWskAP*%RzZ_7r=XJp~;1Ady~Dz-e&KxciDT$O7uSafc=Mk$Ub5pvrpKk>@)T``+|MR zzG7dqZ`il&JN7;91N@Qw#C~SKuwU74?05DD`;+ZO_Q4()Js9U)-eA-Q2?yc@n%8eLR_`@Km10)43lv-(~VFp3MV1hv)JqHEkB&M@pj(9*YWjy13!XqQddRM@>|dRIln&lhqV8RZUaVRlk~{W~y0gwi-}#)Lb=B9iZl`1!|!h zREyMNb)Z_J4pK|iGPPW-P%G6cb+B5k4pE1y!_*qJRvoU6P)Dkx)X{34Iz}CUCb*4H?JwTnU&Qa&8^VIq30(GIfNIg(JNIh6RL|v>N zs$8KiQJ1RA)a7b}+NiEjSE@~Fv${$>Ol?tDt83I&b**~1a-rI$wyPb=rRq9$y}Cg? zLfxnysUD?nQjbi9vt0$-@s$0~P)RWay)Kk^d)UE32>KW>p>RIa9>N)B* z^<4El^?daL^+NR`^ig;k z>VMP^)sNJV)lbw<)z8$=)i2a9)vwgA)o;{q)$i2r)gRO!)t}U#)nC+K)!)?L)j!lf z)xB!B+M_8N)3~N;nx<=p1}{y`(qgn&El!Kq5;T|Q);wCGmZW(#pO&npXsKG7mah4= z3@sCqShg0>a}x4by70 zTF4qBq~t*oMO&?{(OR{&+TmK8)~$LUS2JHxKqjscrl(tDbTHCB0qaCXqryZ}Ipq;2~(N5A%)=tq*)lSp4YNu;wXlH6? zX=iKaXxp@Nwez&|wF|ThwTrZiwM(>1we8wv+U436+LhW>+SS@M+O^ts+V$EE+Kt*x z+79hz?G|mPcB^)q)~SWGu(nI<(r(x8(C*ak(*C90t=*&DtNmNMPrF~+tv#SUs6C`T ztUaPVsy(JXu05eWsXe7Vtv#bXt39VZuf3qXsJ*1Uti7VWs=cPYuDzkXslBDWt-YhY ztG%b~(cafS(Eg)+sC}e;tbL+=s(q$?u6?0>sePq=t$m|?t9_?^ul=C?sQsk zs{N+@uKl6?sqNLewH{s3na*`p*K{5EY)oC~mL8+W>T!C!o}jyQx9-ss^(5V^`}AZz zMNie!^mN^?XXu%FmY%H#^c+1`&(jC!`Fep~s0Z~Ty;vWpm*|7^QoT$s*DLf&y-FXf zSL;Lcq53erMz7U}>m&4$`Y3(0UZ;=I$Lizs@%jXPqCQEVtk>&P^r`wZeY!qFpQ+E% z571}pbM(3TJbk{tKwqdY(ht-R(ht@T(HHB7>Pz&c`Z9gF-k>+?EA*9mlisYa(ht*H z^ws(ry;WbUAFj9Q?Rtm4PG7HY(2vkJ>PPBF>6`SU_09S*`my?P`tkY+`ic4${UrTl z{S^IF{WN{6e!6~!ex`nwezty&zD++@KTkhjzd*lGzevAWzeK-O->zS#U#?%FU#VZE zU#(xGU#nlIU$5Vw->BcD@6d17Z_#(^x9Yd)oq9+Q>$~(W{dWBh{Z9QZ{a^as`aSx+ z`oH!2^!xSQ`UCod`a}A|`XlZs_>5#D#Yi>MjC8|qWEh!7mXU1)j2t7^$TJ2Q`9^_JXatQSqu3Z| zlo*4IQlrc$H!6%uqska;R2xH#p~f(y#;7%h8zYR7#wcU7QD=-X#v0>{@x}yWqA|&s zY}6Z5jH$*nW4bZJm}$&14lrgLbBwvhJY&AGz*uN3G7dBjG7dHlF%}z#8cU3&#xi5M z(O@(hD~y#!lhJIfG7d9ZjMc^(qt#ez9B#B3?M8>O&RB13Fpe-b8b=yO8Jmowjm^d} z#<9k6#_`4p#)-xj<0Ru`;}qjm<1}Ndak_Daai(#Wakg=evCTNwIL|oWxWKs3xX8HJ zxWu^B*lt{ATy9)pTxncoTy0!qTx(osTyNZ9+-Tfn>@aRNZZUQmw;Hz@okqwA8@r4y z<96c?<4)r)<6p+z#y!Tp#=njGjQfq<#skKK#zV%##v{g~#$(3g#uLVq##6@A#xusV z#&gE=#tX)a#!JS_#w*6F#%spw#v8_)##_eQ#yiHl#(Tyd<9*`;<3GlS#z)4-#wW(7 z#%IRo#uvty##hGI#y7^d#&^c|#t+7i#!tr2#xKUN#&5>&#vjI?#$Kb_=rI+OncP%O z&D4<=%QS^)!G%B8j5FiS1k+`@O^=yqCLu7$XC|8|W~!NHrkj2#pXb>#2jRnnq|0Rs=}-^tIWY>wK>EbY7R4N%vy7}Il>%ijxtA^ zb>0CToE$DC`nRUmF89E)#f$kwdQr^_2v!cjpj|}4)bR7 z7IUY0t9hH*X@<K4(5}zF@v+zGS{^zGA*=zGl8|zG1#;zGc2`zGJ>?zGv<+ z-#0%n|6_h=eq?@Zeqw%VerA4deqnxTer0}beq(-XerJAf{$T!S{$&1a{$l=W{$~De z{$c)U?lrqjL}CagIPR~|1f?i5g%FmA5eViN@ghOEgj;w-BI4P+$Ul@UQbejq6Y0V) zGDN1x64@dkazw7k69YuPC=i7rD2ha}7${1_AWi7%GN|8c{2T zixFa^7$ruFIx$9!730KsF+ofelf-0EFQ$m8Vw#vPW{8<$mN-Dn7IVa0F;C1F3&cXP zNE|2*5(kSz#A0!%SR$5+Wn#H#5RGDmSSgxBvsfh#6D?x3SR-1+T5-5&6YZiytP|_S z262SgD2^0IiA~~Yu~{4=jupp=XNj}LIbxeQ zSDYu#7Z->N#YN&`af!H8Y!{b_%f%JqN^zCAT3jQp71xRD#SP*{ag*2~ZWgzQo#Iw; zo9GlF5f-~dm$+TrA?_4+iGPW^#XaI)@o#Y-V&-;<`^9eYfN}?7kRKKgDqYBG@`!jy zIUZT2P8JV~N5rGb&EhffxOhT5DV`Efi)X~M;yL9}@w|9JyeM80FN;^itKv1~KIMM# zx_CppDc%xqi+9Ak;ytlPxmUa|J`n#AABvB}$Kn(5srXEMF1`?7im$}i;v4a;_)dH; zeh@#3pTy7N7xAn3P5dtY5PyojqFeM>ip4B$sg`Ex$RuwfP!-CJY^7MKR+^P=`K=5q)5@~4t$>wdXv}J?T5Gs9!Ws#^*=VcI8e@&M##!U73D!hwk~P_?x29NA zt!dDx&9G)#v#bNG+14Cut~Jk^Z!NGET8pd$t%IzCtwXHE)}huCYpJ!&T5dI1jn)cl zrPX9LTdSv({T1tRt+A){)jx)+Xy{YqNEXb*y!q zb-Z|cOI>kEGI?dW@oo=0BooStAoo$_CZL`j`&a=+9F0d}NF0wARF0n4P zwp*83ms?j@S6WwDS6kOu*IL(E*IPGOH(EDYJFJ_nTdbYdt=4T;rxmio)-J2dy4||N z`hUc|2Y4ID(La0u2$HvVw+j`^HMZk8ZgCs}M*v4Bal!^!mMqDV+?2!$8cC2KKm#Bp zDo*dc_nz44y%#5On$w)#oWx0-?j&}4w`2c*yEAt<$bR4Fd!Fxm{-5;lc4lsOXUp8| z&TPSl?T^?WwLfNm+`iWSg#AhTQ}%WCr|r+!pS3?{f8M^{{(}8Q`%Cth?XTE3*k853 zW`EuOhW$bBwTYnU;@NfuUiHz7FHd@z+O=7b+%6fs=B90cv zh-1ZZ;&^ca?qNDnoFq;b_qJXoP7(JJr;7WE)5PiG3~{EwkqmLRxW70@JV1w!m%f#hkzj&BB5f@p|E zu_T&eS+qo3tcWW`M|4F`tco>pP#hBL;;?v>xJo=)JVrcLJWf1bJV88BJV`uRJViWJ zJWV`ZJVQKFJWD)VJV!iNJWo7dyg%^zUXT)d4=fvm5_2LWSi{eY-%i=5I2Juz#HSu-v4e?F!E%9yf9r0c9 zJ@I{UqxgaNq4<%wN&Hy+MEq3TEPf__E`A|?DSjn>Eq)_z5x*6`6TcU?ird5=#2>|< z#Gl1q#9zhV#NWj~#6QKq#J|OV#O>k^@n3PLxXZDegp+hq_%)=oGwk607n~>(j^ntF z=SW968E1pD(b?o|c8+qkI7d6jILA82ImbIEIQMc+bWU8nsd5y zhI6KKmUBPnZ0G*YInD!|F(>Qf9N!st@=n1iI)O9coa;Q$d64s9=RD^j&O@C^XUds& zW}I24~;1z7dw|YmpYd@mpl8NhdB>-9^qW! z9B>}#l%0xGb!txCnRDiy1*hRGI!jK|S$0}Z+gWk0bUIGg={c*;nsd-O!d7ATd=NZm3oo6}EcAn!r*Lj}veCGwu3!N7^ zFLqwyywrJ_^K$1E&MTc)Ij?qJ*Lk1we&++u2b~W&A9gc7EgB;{4Y6o%4I=R_8Y756&N*KRJJP{^I=A`J3~1=O4~L zoqsw1cK+ks?%d)0*SXWV%eCBun{-p|kehag-4S=xwOxT+W+eb}w-+buV)-clWywb06+L!o9*h;6BnVyA`+U*4(-~ z=gzweZo^%4m)xei?6%ytyW(EycHFMpb64Fp_n>>oU3U+=k8-baAMHNIeXRR9_wnu% z+$XwEa-Zxz#eJ&#H23N5Gu&so&vKvbKF58o`#ksg?hD)(x-W8H?7qZ(srxebixL|8)Q5{@eYJd%Jsw z`(O7?_b%Kil<<;X${X_1-mo{~je52xJjZiA4<|bn?v2{uZS*#Io4upFE#A@IG2XG> zao+LX3EsWD6TOqXlf8R;r+D}APWA5Vo#vhHo#CD7o#oxnJKMXzcaHY}Z_LYjInVdT zy}VcOieBJNc;|W#^d96r*gMaAi1$!$(wp+8y%}%TD|uVJ^Sy1}1>SaVhj*d3)7$0k z_Ac`FczeBl-o@S}-lg7U-sRqY?_u7kdS$QTRlS;5_vXBLZ^3JLi{6sg z^p?Gr*Y;MtE4_}_^?Kf_x8@!64teX|Vee7iRoPqQ_d@SQ-iy7LcrW!{=Dpl|h4)JDRo<(;*Lbh> zUgy2udxQ5z?`rQF?@ivDy|;L8_1@;a-Ft`kPVZgbyS?{#@Acm2z2EzQ_d)MN-iN)9 zcpvpX=6&3|*87C_N$*qMb>64F&v>8pKIeVjyWabP_eJkZ-j}_vcsF=o^}gnP-TQ|3 zP48RYx4rLp-}S!dec!v$`+@gE??>KE-jBVXct7=S_I~F5-1~+1OYc|Suf5-Rw|Kwx ze&_w(yVbkR`-AsK?@!*Jy}x*W_5SAl-TR04Pw!vezrFu>w|jSZ|Ml+l?vj>F$fQik zA(@uLazu_wTMFq&S9(%PB{On^+$cB6&GIO@MIJ4Wk;ls8GBMDraVjDPo6FBFVB$=kYh3{bJCaNGA|3VC<8em&y^3950Vd-=gEi2 zhssGgC8y<#oRuZHRh}=m$qVFmxkFwkcgkIIx4cO1k$dGnd9l1iUMeq>m&^U~Ve;Yf z5%LOoKt58IWkptHP1fa{oRaV`AqpN`E2< zugDwZSLN5_*X1|lH|4kFx2@}}Ps{Jf@5=AV@5>wI59AN!kK|4A$MPrgr}Ad`Gx>A* z3;9d=EBR~r8+nWTt^A$*y}VW4CjTJ+DE}n?EdL_^D*q<`F8?9_DgPz^E&n5Lmv_kj z$~)y<%2ElHR4Fy2(rQ?Zs8MArp&aEZPf4XzMr}|V)h4xB9i_IYqt!9$SaqB_UY(%s zrA|~Qsgu>c)hX&e>Qr@Kb(%U|ouSTDXQ}(Cv(^38IqCswOl4J0`D$F{RY4V1peEG0 z>VfJ(>cQ$f^$_(?HL0f5w3<<~s-(86^VK$Wf!eNis0-CjwM*?*7pXmJuiB?BR+p$t z)n)2(wO>6Ds9vOAtX`sCs$QmEu3n*Dsa~aCtzM&Et6ryGuil{EsIFGms5hxMtGB4Ps<)}P zt9Ph(s&}b(tM{n)s`sh)s}HCTst>6TtBND!I>T~Mz z>U#AB^+ok1^=0)Hb%Xk<`kMN>`iA5Z={ZRc#-K2i3exiP= zZdN~2KUcp{zf`|czgE9dx2WH$->KiLTh(pq59*KVPwLO=FY2%AZ|d*rAL^g#U+UlL zKk9aMhx)I&Q{9!p(WOi>lgbR?Lbc({NM>#{vmvuFvnjJVb5v$a z=IG2ZnPW4@Wsb+sKHn>IV&J$#oQjT>KI9vM#apwE5*cxRZ z<|EMEiXD*4Wh$&YA48n;`)QqpK0I`OrQ8`>z+-q@uhFd4hZ`ms*~T?#a80&RO&Zj6 z+qldP3X|I|NH!Lo3;Ovwi+$ML9xI5uG=R)w7i6o69dC{5@Q!j7n>UA>CUAGe<27T* z@D6IArU{02p!P#eJcf5t`WB_%8B5}}V#x4LO5dUeZk1Qs*zVbe5T#~Y^Qn4keq3>_-No)}xV6GMjgP#HQD?4?v)6F7VO zP3Ls`@aVoOcBVF)<$vHveh$s(#4{%G3@55lXk#xP z_T8;^TK23~1D$TYmfl-kI9PUPSGo=G#{StxD_t_VZPib)wT#cnkdq5*_BQANgA8rc zT(+BtOZqv~1i@{Vmn*fh7N({8$c35{IP5g7*Fw94B`p0+?rJ34jr4Al z&x(E~*E=J+j=h6zQ%8iU+3td%GeX&b5=*)6+WTmlEuT`3!p_Q9!^)^l= zN`rOkXf3UAM`rdLDIS?QOks_}%S#5dOP324&?q@gO1cm7S!Y* zM^zrg#UwrjDx4@s;OHceDx+l{R))6f{+h>Qcq`R#o`UTZESX?r7k{yB3O&Y&fyY$B zY~Ak*-@kBWS zMbyWPdK(b*&AZne``={X$g zFDhLzimYnjDzsZOUDL`cUDI?MA3JOLuGaFldFnTAJ*E~_96^drN8mcaQAg0K%{B%P zXOWAD4>3KjZuF-=TRR>XWXf{b>`%Q&TgVlS8iFX$Abn7W#zLk;9&H^LFd z-WKLyH!-I*19`fM&g_jeJ4W9RHS32L(#tw4*F0&^Zt17q=`9Tu=~;Vc znDLNS=wjDwh-cc%^?4fKsD7g>3k@0)JDQ8^=;0aTm_|_hj^;q{XeVTDh<0ZVyWsU} zH-gZz_MVWH8$l4}G#aJ7l)@0_ENTdXkAgYCb!+wXXav~wZcnot>2U+BBAUAz>&o<+ zPM==WvC;?4b6r2}%R|QUaMTbc>S3L23Jp1eKMgyv;VeG1p%f^pjJ*XqTE$pj?^PGP z3L2_{Qy*qbv!_CK9?K22rx!_u=53!J#uAG#9=bRa0Le8CYVQbNrLWXc<7`pqc)5V0 zXrr~mI2(cyd8meZ3}fg-RgyjIk3!20_spk3-_<04r<44hPV#p;$=~TDf2WiDolcg9 z7rLt}^^P$8X~5w{3Oe+{2!{bP2BhAhcYAd6Q|yBjteaqTrPElhBpI%ht4jzv zd9XthVt*;iOr)W$tM}^esn_bZtQ1G*Dq}iPk%tHBGSbo6;CEjLx9G!qp~bumnk zNe;3TPWb?Px*y6FB+}7FbccfK8kYDZTJ7$NZRTJm7oD#bFiln=!qFUrRAyaJnA07o zqgHJd*=0;Q!bt-Nn~>YG8B^;uVvdp+T8JHGFnlS-MhdAASM6KS#Wmlau7KfbrWhJC z1rITWI-3CqlCF!K(YQ&-1Q%kD0e*Ewza7y7qb}UwcWhF6IwkZxqQdd)paneD4o^+6(CmrPHNeAJoYT}nC9pvXp2l;vCpJ)Dg=AUQ&`7)s=%#M;8GR1R0S?o zflF23Rw;7+#k@Dr7gU)jvDJew97atiGjWmd0q^8bQbOz^Ikhz z4CL-IZe5&gMY7PFVGyxP&sGh%LC=~8c%==mp(&gYP8%1_$Sh40hxUV%0-yB01wccZ zQF?oMWu*-7qjugTFI-LTTuolqfDceRlv~N&jntlnc6x7Pez~05S6&@qpGs=?LL)Ve zzun!2tMdsG7@_cWXG}3;1c%#8tL#h+HmNtq2v7v% zzZpU?v#1aRV5Kp_-49@3bm>Q{3=$Muut4yNmF}@_Mb1cfGyqN9w4y?gl zu~<%C-cHRd)>B&->#nAD7aH*CH5St|hcS?(w;f)nHJ-zOFdT+D6 z)*jvm{ab4%FJ2ldK`Re!$BhE1eRw+!U@f(Gp`6~kP+cfz&M$Xrkb_ngSCnDOTTRV& z*74Uc^+wUkz1I3->hjfY^73-Be0Zp$%a615_2GFcf6bJ?j`APo@*k%1H+1>+BWi;s zUH+yi|1y`qrOV%LrB_V(JG%T`Q~n;6e|2eSPM3d4mtViFn)1VIl!i@+@?)K6u>5tD z9|MYu5*>)jzmD>+m*GZ@dU(B^s-f%V(ZiY=^>EGfur78Zx!y=FuBV!a)Wlkd%5w{1`d(zFJH1Vdf>XcQ_El>F(JuOHPCh1E%&}n19SYL!;s6V_A-OO*{T-UNi8Eob_ z14P9!50^1N1Q%FFCZiDF%pdT9He3Sr&Qfa?+%}{1`l}uwZlX_okVc=)0BwW*;s+`E z8ycW&G;z>ceV!Xlq(PF2#nqvbQLF({#>A@Nn_Oyix=>pglT(baK`WdA{u}fsJV0?w z9BLfLyd_u~C3PTdE@{5`2=&e{A1GIr7RrY;V{ajjZ8SP{9=3R`iK`YULoHl5+G(Ztt2FRaa)&Mt7Bi`CT#ErVU z21%PJ)55d7!&QOYevt=lHpKz}uV+<7HUPneBcssfq*P>JxmdYv= zY#xXd)QFMk5I178)LBL3_8LA6BQUe!j{?>Ej-Tml%ctrjKRtZcrWJ z^#I}cBV)u;AAe-z*t?^3Z-kS9I9>P5JRG5RI<@Vbvlde_ESya+Lo z^fE+QRQu8So9z=e@i-G7MmF(S6Q@Z`)#7Y1^NFD+aV`T52$2jw(vvvH|LMIl+O8j8 z8C}=MH=6eYsW+M^10)rWbUc$(;V8#=s2ZYTg{mPUBrhr_uPi4oEhi6_Q`^_dsiift zq4PPKy61Cb<>qr_<>qrmXL4QpKrjUfwk4M=! z7sk?F9g?^uaW1Jx*}MDVHQdvW zB&H)??&YyK?(W9HPFNt+J*tb?6@gBvPag1Yhv_!<*91b+=K33>wUqhlO8>bwTBFy;01kQY4ii{DNFN`~wCxq|C z;i&yYzeWOPa42KFsF55@4@0uk=!+2NJMA2b#;cQN?dT3VhP&)YR&b@3LOzoFSU2E9eqdCEWxA;4|yaY4lKL1@`B!_cMt|;uRPbS z!$OD?RzO`K!UhxLN+j17p-$t#J?dkB@EZ^ zaqe!dJdb6(Fv~`BHDtA1zOp<=bTmC0fw-=eyLFD@!LDt=y-jc2ZVZvwJBgTKW^#1} zEfqzjl2loOwnF=wH?tTmjbZPwzjT&~qu=m&!2 zTv=ZdTIR~jns%`EQCM8?5{7Rb6PXf17w8p3lN}tfh(@priPj=RFS@HsxZ09n5+wsu zi}3nNf!9|GyuMP%7v*7H^riATCFSTW`1y(qSNH~AbGzobUGsC|a2*@B4MQ7iQw(9V zBSB6NyCIn>=5XICk%iv*$Z@e9mE(5d=m{%Q*B4lFW}B&i78j;)d4e%%%8t+Mfcco| zb-=|5xH!Q$RZ&O7J_ubeY*mZIlM@vMgoP#FGuZ+)W#I^1$bgF#aA5-O?SOkb;KEIe z32d5S;ifDma+ER1v5Y6kz$i@Qk1=fZTNDvSG1MCRBiz|gm?+wdM`Sp0tVyDE#{ZCp zOFO}(o#4_=aA_yFwB@luF~Fx!WiE4Lmbo#@T-q}CZJGPF%zax9Fl#)bZOdh*iVRsKS%EPU09gu;XdhO3(j0aS14inn8xOI)2B8PEtbS%uhUFV_IQ#;wU4 zdI~je%{u2(pL4YS!o&?+TLKC!1fjtgbd3sQ#L+q|f}zC1_|Rfue51xf#OSdwfmUP; zQ)A6><>y$I=UA5KxQFJroO4E&vtu(xY7iQ!L1?4~p{XZA)A$HYJrNqIL1-Eup=o@C zrtuL@>T)2Q;&7V784hPTEKxYi{AZc}Ec2gb{)u*f0FX?C#fF(B-O*8q?SsUH3$wWB}9{HK`z6!V{A z{!`3_F0a7mSdmg*k?KRS&n^{W1r>NXF2v+j(wJ6pXJzR zIrdqOeU@XN<=AIA_F0a7mSdmg*k?H|u$&fHP75rj1(wqS%V~k-w7_y&U^y+YoEBJ4 z3oNGvmeT^uX@TXmz;aq(IW4f97FbRTET;vQ(*nzBf#tNoa#~j(Mc3D zRil$A1WsWZ$45FV5ol|wd2eeX$J9G53B=v+40_Xi0?+Jt^l&!R9LzJAn29pPyftKF zYbxcfiIm|?l%c3a;OI%Be>p&y;&}p*^=hr#}-WO4JJxamBm~Hj%=kpvLo22qc>HF^P^W{ zAp&hpHQa1XBULOTX2k*%o|QxiF6zhtcl%!%pPxQrM*$6q8ov>rc(ZzNcqzt-zbiv z)4qLtui5I|$Ge00#wgDy%El=3h$Qy)!CnN~no8x-L@N2detmionAvwkcV>D=5cNMq~U`UTuM@db$5I@_N8Gy_Q4Pmmm(#9O$Q?oF~c_0L{lqqS@c>Qia`6a zFem#^2#L$1*J3>ao&Ehra1QrjTOW@$9Bh3$nt1JxI!PSvg9{O8_d;grgW6G(#*V($ zJS=GKiqZ!~42o?tt^S1pIBFR((g#k7(PVTiL6jpfGubbmX}L`KNJ1=zY3Xg1nHa5sMLJyg3#tBF4E40{&lw&42W|Ctjv^fUvxt_E+26#~) zvxwD_PHy7`Go;f?z`2%mdI>n!l1^@COLTG@As2v7ZUg56_*_e$3*eIvrsNmt9*usL zeXg?4CGfe*K9|7fD*IdlpWAty+j*QzFwRXd&LtS<5{&1=V3PV)fgcBIohz_}giG*7lvaF=i4qSFFTdu@Za5O6(OYu~)3bUa=B;#Y*fIE3sFs#9pxy zd&NrZ6)Uk=i4qSFFU|uo8R2O6(0Qu{W&5-mnsT!%9=rX(NpiKbhX` zAJ9wdqgM@V8j4Q&ZH|ug#fYSH*+W)h4_S#lWF_{DmDn>@V$WEKJ!2*IjFs3kR+^p` zhOIuPQML`(KGY~@40JcH>?bR+pRB}wvJ(5rO6(Uav0tpjez6k!#Y*fKE6q&NSqI{3 zjy)Kz2D%$p_Kuan$7{#g8~F>tF=GlL=eBK2l#cp$b=~7?->_#i&PXQj9rsjrmpVi_sZmR#scM^uuh} zGXxvIuSj`gj|WaJ=txqpj2*<)84Cv87@@6pYY`W<)H|b^q(R*RxiK2X5teMaQVwfq z9ziYa5w4e)uzQcbNot1@Rhs$|0>d-sODx)9 zmV-;s>Sg?_tOU~-$|V8C({^68Utpu&H-OpF%0fg+A=gx=Sx>Fh<^Z<=x0#92JGn7G zi|g@lD5XB!#ewryjo$j>p1Fe|EF@En&O@4F8g7VskEv5OZLLI|v0D+h5Oi>f2rf)B zm7(z&X-cVHqfWH(>?kh8(x3jaOKn+MZDNBMzcm^*H%6y+5gHAP&jhJusnZcu z7Lb5Dh=%^$7!CahxnpSP2R@F?!tjtRqgL3yvp!nwtRAl8@aIso(J2otOB)h>IYxCG5(2bEpRQ%Fyg8zQ3i$%5ZNL_mnJ+V6$lzd(}o(=ISjR zavwtC_Q*Vr)R$Y05&R4ikM&cm=mg zR+l^q^lb#WmBz?6Ite_wZ4O(`rQ+h?1LcOzDqvh(=~oE=y(-Lh8*dnMuGa9FGQu?09`t ze+AgvT(j|E8=$L6a}5ZhCK&)%>FYgm1e-l_1nQXhwoy2v$TZZ|TkOnNy+FHC2<~ER zUt@aLHQJ3|xQK6hLhq3q-Gwn5{(l;-v#eXQtXs3JTeD;^<+5ZjAtWKq(%lEZX>7@o zwFI1mHcQqLa1z=qSxdl4XtRZqu8}FgDC%wi>@!8x4QOlK%@Ars@lbz?XDUUYsTxJp z%9#Ug0bOK&n)^?CPONhB|{1!7p;iz3A_(#4KZS%)fKFEf?_0>Ug|4T z2&$kj30hsLach!|lgpBggOFQ^Y#iX+N@U{z=T;&c2RIjnY@A${Y#fB7Lb7Dz0B4~i z8wWUzz*(|!fEQh^K&@5j*0DPcwa~65T{rl$88h`FaV4tkA!esWo|eh`v!%aZj2d>j|(bYL~;ZP@zD!=_7c#U5$=w0#3Nc~zGVQb9l>bZ7ww zqAB;vgfh|laUFwGL@oiBly(h(Bexyx8o22FEPz8US9Rw#Vd7w>C)-kku9H27spBqgc9qBScFT)sJ=) zsMWc+bH0t~Bm}=(ZsJtPG88=!0@o z>ia|b=qL^W_0};Siy3{z>p4bC>XD;?=p*=~bb4%n)_T~0e07Gt!mW$*aC&#MgV&f8 zW5-^rD^M@6#|B;84cEpUOt^WqjmwmJwwXlf$;Sw$fpigE zp7|~rM6bT+J$YJ{Nty(Q=xBAdg6|y1=(Q4oP63F~q`iXc?~pZ`0lC3F8^gv|@VEtT%NPLs&H1^OT@wGl+?u znbN~J&|K5#1dL;vgr;nw^UZ4w_c|+0r5g*S4d1&c4$ewYWM{1nbA{n*^I!-oz&c%s zXR1dKV94RCo5R&dBNbeLz1pp((O`|X=(olwTHbWSFia6l9OQf*G7>cwPD3q260v+z z9qBeOVZ$AVFl`tdZI%zOW9GOvgh$;w2&=BQz@4iFBurr#L|)}wj>pQ}_&9_Cch9Xt zpd{{C>9h|am6>=NStpfu419MEdx0Y`Wywbjh*ll4H{)$EHh; zO_v;-E;%+`a`}R-CClWD!yee!jH{GdwJvdC116WBv~in4C&oWt6*UanElSAZq>BfW zmCnb}8$26p+FuO2U0ZoM9&d9z-sX6G&GGn}$h(kR++)nKLqsQGYd1%JOXSQY zBflkZE*bePfwO3^(UK#-C9YVdaUsXXOOB0~92+mWiE*J9#4u0P3d(fWM8RBJ2er4_ z>@`-J>r5trVfGT>)<=V!i;Ttr9BmT(8S~w8V3r0 z6f5aw@HT)RF+8*hZtcd6@2mJYZA_>2wPEd+-NR?4@BFCaNKLQN#chjR3vzVka+8yo zWp%3N_CYG`rg1jU9M9bscF34KE$fga8o7%fRdS%~SPst}o@FFHfG ziD*8C(KcXxDlLtf`FwrU)P1?Ul0n|f4Ly7;Le+N~heox6!`<%9)S-4~sD=CZQmuB! zGdUUNF1a^x*V$X_U%n>q59f<8{BcsSNj?&L$o zTmDYThYFm(2J)c-=Tfkdnqwn1$3|+7jno_)sW~=MbL2hE<;Z)AkbFEjHdb?Ntmepj ziue2tkoOcg&2V#Uyyn<=&9U*CW8*bPdkb?p+5?M_TEVA<$DEG^M?J)K+PLo=8W&?7 zrZO<&^bn>kT+D2g)(R_qW$je!@Q~|~e6Hs*Z2HBX!>#Y|>0vTvpnhlhV>G$)={O(Q zl6v;X<~$5{EJ;vODTtcs0H2l}bAFZ-r=O(;@M*;n^e`UTe}0y8%+85$yzZ?;V5OJF zHL5Tvy3N&&S)(N`wCplY;>plY;>plY;>plY;>plY;>pl*uY9<+TPw0$15eOhcpJm$}axX*^T&xW|qhPXe${Miuqd7Spy5ck;-_t_BV zqaryzDuR&Zjty}>Dgrw5XG5Hiih#~?&totj6#<>UJ2t!ds0iq@)IPM>nB$`&2>H9K zF#ig-KOGdy`E*bW@mTI@(GfVQWuF!qfwO*K8J{!+I8_zx)&psQ^J{!+I4~{+$jy_L|{puXmn};zz%8~PFUkXBg&%RWjeW`p@ zBj?w-{p*FH7FI|cJza-;6t_dv%+$RHgBP}JtER(I9b#hB1p)K(&bot17A|pU)^Tks zZi;L+ZDWb*b+A$Fv}qjfl`EqdV(N4CdTm4xNSc7j)Uqa|rVs2H#fkMf7<9c612kGV z=8JtIjn)#Jn&p-HNUgqxaV^VXjzgcraoNIcjQv8SyX!67iyoGc#!Dlu`a#_WOr-`N=K*S*2Z(VVAjWxs80P_EoCk<;9w5effEZ_sZ=45+ zaULMXd4L#a#XHW5cbpaPI4j<9R=ne^c*j}sj{Sm~fhK0-!H-x0yQR$Fie) zOWEug{xN~Rsyyv-f-y;z%+oF>;H1^^bYTE+ntbJHixcoEWH=Vjkkne97f17BB^?2i zosc7Ka)P-^-*rCg>j+pyjUsRnvh-o+vqc?YJQjh=Ks%n0lPN8E^@BT9fB#O`fGT&r+Lb zsm-(0=2>dvTIT$x`03c_&6F}aG zjs}bb0KfozS`$%SzsZuH88I?i|)8N)WGiU8A^Iv>+7I_C%oUyX+>vSB`kV7P}x z9giZ1Igf|s84t^YZqEFoPP*0oZNNtHi z?U~5)yeH4|o;=Tc@;vX!^Smd|^PW7l==IlGxNE8nKeY2+n~%nKsO-ZJ@)`Mx0qU$xfFCSLoQ!o zy9NQIqKz)jxytQQ<#wrZyHxWohEDvDR|B_YwrZ|vP(~>KDwnA`F-*=U7oG^1 zyM%BYZk=k~A#xY)VWzP&A`chh5yf1d7ZvjCM##?;J#wNO`?|}utZ~cK zxMgZAExZ(wuQ6AimF0O>malU^)ww;`nUH5^LY|!o`Pn?lRBRJVo*fE#b|~c8p^#^X zLcY#rsI#nK0%l~TUdK&Foq4l+zRBgE<8sV#Ip(-u=D1(zw(4Adj^%ZZ<#monv^nk# zIyjDa+zxbr95|PO4(J09`I2-%@0qd{X!kT!E%7hV?rGrTwvh)tJGJTS0>o*k415_8 z;!KAc;{?98TK$j~)BdtiAv<&Qz-#k? z#NU^wI6SW_@L*ry!M?zQeSydF0*~bd9?J_nmKS&|FVKEwxVyQSJd_uBC@=6(Uf`j; z;7{0HEIZWaF!y#LoDq`huF_&_fqfJO9?T1VX?PCHi!20%@$8U6E?8aBv)SRj^aEI0 zXbKp|ch*;WtF3x^cM}(prYAdalMdrv`p#;1cq=Y)YBh$Z^*pof6k{@P(9dO96jvGGklW)t|!vi0whT)%# zV5~H4uGIA%UwZoh?oa70=qTNxIs6#aNJ}>cJg^u_IxE!EY~mMqm@DuwS6~yrz$Siy zP5fe&guKWmVv&_!k(FPOm0yuf#3GxB#VQGSkyT!?N&;T2(nnUT(#KV-asD;>h>JD) zh>A7(h>JCnq+*Re;$n?H;$n^Suk(9035)ExEV800vZ5)nqA9YXDYECX$V#KgN~1`( zNnnA4`OsEQ;G`^yw3QS1q-oD0ZRG?$ZE(z!IHdXntP}!P3IQ7%0UH|u8yf)|8vz>| z0V{-njg5fLQ((a*DP z)l$G}DPS8TU>hS~8zW#FBVZdNU>hS~8zW#FBVZdNU>hS~8zW#FBVZdNU>hS~8zW#F zBVgBQz)PY5FNp^1It_S9G+@_hz)PY5yG{dkod)bW4cK)Wu_QFLg&MFS5wHt2;C0V{U8n&Y5&^G!2JAu&*o7Lf z3pHRDYQUyMz@|jNrbNJ|M8Kv*z@|jNdzk`up$69n@dzk`up$63fP4junRTd9ZLbbPy^nv z6!4CvfX-`R8JWhDfL*8oyHEo;Pu9U*Bb*i5dt<50yYr> zHW30g5dt<50yYr>UTF+?r7_@@#(-V40k1R$ywVu(N@Kt)jRCJT2E5W3@JeIA#zDZw zLBPgAz$=XbkJkZ@*8z{$0gu-KkJkZ@*8#6I2E5W3@JeIAD~$oKGzPrV7|>A-Yzv_I zL_kM1fOG%zI3MshAMiLI@HijvI3MshAB5vP{SF@T;qj+LaYd zkN=ZA{!jAwKgr|iB#$E%&ZolpR5+gs=TqT)Dx6P+^QrJWqQdit3eO`dV>IuojFEv= z;U&=uFNs!oo>1X=LWSoE6`m(lc%D$s-z{m$S}%>ddFkeCo`no~s&tRL@a8>$y7N{+OqKJukW(Cfp)VKZuFDP_aAB z?2qV!&aU7Z%Byck$Mrb4$p_%a_G!l%^%v2GY85}}0Q$=Vr z7(z2sMQAiALNkLxXl9TIjRYe!54l=!g?jVj`Q=QSbBh&B7(pAP3l`1jE zVvf)>B0^IMgr*S@no1xvjfl`x0^!64eLJ%LgR6*g&KOFJaI|@CF1{X!xFtr9MK`yf z4ip^*c>I=a69HRw!fU$quaebb_iAr2d+7%#W>0;b0%JIiD%{{4$2XX(t>YAhYpn-x zG;ti?Y%Z6^-J5YDemrFW-(ar09*BWkt_N^jZXL%r(iPWn5`JUR@QTxLGkP4|U@o?f zQxvYZj^i2ZEnFBN^gDyPQQ@xZcm#^ob~$tab^;46U}L|=2NF})@^kfTwj z$ib*#gho9gH0lvyJp)H4E*I@*%7lKtOgJ)YvLNOvWI-V0PlqfB;PC$<>wd-t?PqJy zyJcGT*5YY2)=#3byQMG+9_-9OHdi4-1EEoq2#uOT$Zbl725|nu$S*3 zx#3A=Zu9NegYbT-2tTr1MJ|_K$I!}&3=o7|E;2xXbGgU>0nX(j0|YpiD+r{%LAYNG zoh^Kq!CC2?hpTh@sWjG4qp`sha}_dQ z5OV3sd;xA+6(P$dt%Lw)xulg4;PuV@D|P#fsVQ-ru(@7W)8T#AvcJ&~beXWTo=6)E z$rOw!oO*myc++ky1AbT7z!&ZId4`mJg>`y;-G6Bv4LYqv0vw&21XsU1%)4~egPtbM9@KV_nyt>d zXO^5C$j3Ar-cOqX)@iL2bn3i1=@^`)H+&IhkEKfM3+nYf-?2{AIUt5_V)TEb;O;T< z#|-@1!QCSi`&pR1lXs6nDs(oOJPz&I=QYq-#}2%TcN~{=#tfu)&%7jYnS6|#0XmQ~ zrbjed#6ExAGvFW9zc@RVoVZQoC68I0NdG{?V6HlKOuRVVgwj9P5X*0a#s^aBAC0}I zq%%tYyhA*x#s`yX%H6q6W+iT&kEO&9zYOwJAlyT`JbnmkAR&GP@Q9QdO}U4p6WCK_ zMxlXLot#4b?}EYC9YI()uGw(6{;03@C=$`ARW-bbRgWlw9{FMpVx@<13H)v zgnLMrm-sP`csihi=|H%LbQ5y0y)!@u(}8dg>1HzKhdyE)HyXk~+6{(u_tZ04iJSgo zX){0vQYsMcAzfbLS0Uo*fDWbu;U3aWNX*CM>3|NV1K}Rh%}7kt1MM^ z|2Ro3;RcNlq|9i_JtWO5J;8}5)%ajiO}U4p6Z)qDVkvQS^`q^Zsv?N$J8 zCS0XbX=Zpet2Z4|kfk6;flt9W1$hbz6ci~4D43vNl7cA;rYT?!vxJpQkR^Uu;+G|U zS>l%^ep%v|C4O1rmnD8#;+G|US>l%^ep%v|C4M<#lp{ttVg$F!Ec`Y2m>ewL>n%+O z+H-Rvf?MXNAIxFXdQI~0FY}LhyINWftR2A5%;2!8L11VQietTaXN>3#2CS41U|c?6 zdMOj9Xh|I)Xi23sP(25rMh@sGgA^Ud{7lV(FpkOCvaE!avTRFQM_JxocUcO!1v6yyZ#@z4lkh)jJ=uCD;Ai1~(t5V_T)@x6|D^SN>&1Xyg8xbD zrPiwezZ(CO)@!Uc0=^pmlh!rX+X24=|C81`t#<={5B?{u_gWtW{2}~LS|7Hq1^fy8 zPgt|e9gUzz9t?j{>nBDt7cvQo)r5@kzXo%{&kk0w6~_+!aW0RCk1Q-H5aeh%>G zlh*_OLh>tsZ%Ez%_^Zk91HLhN6W|{we+u~K0NEL8x zWC<{iy8>Ptc{Je1j9zFZMt6?xv{IwHMt1?;J$ez~J);i?{D{#5fFC)Ewi;a=Z312% zT?c%4^eVuQ9(@Ynr;a`i@YC(ntb~2KeTJ2?&$Q13e3pGbz-QZ8z&Sey*tZLSi*^xk zU|$KiW3O6Cd(B=0e9%UD?8iv-ul%0;o|Tl}SCCMJ|5j2ZGaIc$W>e-^E15Yivm5fOScVms?cYT{y373~FSyyO}n6&`i-Leju^cJK(3CM}C zA$$>Od=oR0Gb6JZZm#r0S`)pb`K8EL2`ct-^ zfV-~et*2?dZ9T`--jo(K(IrV(u6d4{C$-M7fgSTqo2PC)T^s$h&C{|x)ZkR>Y^z|M zXO*m-)+N>z)|}O{*6{sPK8vQ#3D8XICr(aOh?0bq>ReLz!c5pR`6g0_C>+{PVfsN7 zfA~CtE{I%iwr|QZLvk3#u%yraPr=^=9(JI3yEETTTjV8>gJSbdY(&ZQX>&qI5%$SwjOnY;A@f-2yJhSjPb`phgn#DQHo|L`x;LJ^^%P1VJk? z4LXS+D`y4P9_up1{2HY2IHW!g^{-ex>nYaD&>q*C(zwuv$>iI#E>6CQDfnhUfkuuf ze=rp2<&cud7z(s=L^;P$prb>I*0ab5nmVFD+kygp9Z{fjL4no|DO&S_0^J=^pnpMu z1_vd9x}0jAf!gT$%~K1jY`jh&b`j@&RV`YXiqZy%|mdU8&)J8R|gxaE{ zI!m3V&QUpaqB=!QsZ~`{JJkhhpW3gUrJj<>fOnAIl0G_pZ2GwL@#z!N_e!6bJ}G^2 z`rheN()UT9n!a!PwDjreGty_K&r07feRlf(>2uQgbRk_#2kD9Qx#AbZ&t@do^tI~s>KgS{ z^>+1c)bxYuqv{jt)9Ul4re9HCRo_(KRX6s1cc(qB5C`TQwl)9ffT|Geg>Lhg^HLcdvR<%oQR~M^?sb{OFW;Xo)RMV$e4^_IR zZ$w?+jJm#4y;r?oeOP^5eM)^+eL;Om>AHSheOrBB{Yd>({X+dl{a*c1{Z;)_-LCG+ zq%tEJC*x(5N~vSj29;K}I!bx!Om$y%f0b1aQ4d!4QukI^9#FIDLbXj@r1q*y)#d7$ z>dC6Csu|3$tcRLDKIZ>*FW2s|pP!U|<`I4UPW1NsslU^oPhXEdPheb1LOYz@*8rI< zm>*n|*^KAwGn?>yZRQv}-yVwr&5syI#bRI{ff#ybafkXZ!hc{)nSxf@Y3+k1dL+i1 zrq#hL;W7B`o`IR|OE8yxgY_2cUDgMzk3maaZ{1*h3p3E4SiiJ>XZ^`armdly>oN zx!kT{JOK~=X6Sq72^|XfM|j?1p1(EE-@7nDYNo{?qd0zcJt1 zg0{d+OOM6Yke-F1^w2A5JxWJ(JtG^!+|^19{RU49{jmnE6rXpEnR(ZFX5NJ#GRM5@ z5;O05Bzgt^FbnF>pOOX+>Bu#T13nSlkFTwkw7$j7I@vr=GtaZlGq=37ykwn=921zw z>8Jju^R$pxI71p5oJSZQ32ThP#IGq#y@bN_(-0dui1P>+?|{x-N$kY)ahPkJVaBm5 zteUlGt)LyQvYvpM%5$t2S+B5OXT1sf`hC_%V8eXQ`m*&6SS~kNKeujy)$%v%Kge`A z;lf@yCUIio)Wlh^Rtkv+A>Xr;nCbsteLnR6I>&w;lU6!)W$H@HN_A7POi~9^hpnO1 zV^UAGMpI8uy~fDhFzmByl5a`A4Yuj~(H|COMwWFl{!YW++4#%hFR&7Kekbw%|K)jy zev5gAp3&Zb-jn$5PqofM-xsV0-Aw}|tP>MIM@-8+)8VBzgs*pN2HI*u*&QD#C+MT*2rRT{LLZpPoQ(SA23u07&;lcD@70s9zlZwTKe zMm0UL1b5L}J{$J;gjJ<^=|(=UFDzIe12?o~KjY*Tk7IPaP+LZv#*C z^@(_P&~JLqj(Ja_bk`ktUXS!zSDc1+NLsG3->sy!+=q*B!{6Be8p2U})-!>d?{NJ8;9i!hShZ8@+vxYuD_x}qWo0v+RpV*n$ zm)M_pWMVGSOmq^55|2qdDe;WN^AayfyejdA#9I>YN_-&kvBY(W>$S8eMAFBzV4m3| z?A?TnQHXw?p^Ta5*~#($)2r2h)RA4`nb9}@GjIN9HdrgEb*;R*Hdr_7S`q68$x0f6 zq}h-L*NR9gX|N&^f=CF~S~rLl5o;w4B0;Q(gzyL<1XogP#oFN7AR-|I5fN*%B0)l4 z&)oZ-?>=A5Zs~3a=lbQmbI(2Z+;i@|b7ny1e3A^7#BDB;@uKo^{jpzt4%YJ?lF2=w zeHZeMraxjnh8E*@2>dR>CX)FO;qNg}#i2h%?avS=m#Nt6`yrAHVV$V`4(^LutRL&a z_|0t=4HZ86hsg2(!r4Bi{)6z(>A#>{&ZK?)xloq`#y- z0J$Kl*ioof$Dm4^i)w7|Ky_^$vU!u)qP~kNYKKuR?fXoGiBMT7bP7Ygn-WL~P(MiF zQcNlbRjS@cHL4F#b?QUd{oh8;Qgl0{6jW{K9-w}p8$iQAqd*ftVW9g!Q$RC7^FWJ0 zka=*0m=g^0D}23r9kCCCx9wpRkG-DXy2np zAj=o%Kfm>M2#uKBCR>7K;{3-DH~u-~x0~oRTA-8lygkkwm!b&3G*k4y%+*|CUW>Gua$Ak1b$}*iyEfJ;7G8XW1&Y zmaS(S*k-ncy~cL1U2HEqz}{qUv19CQ_AdK?eaOzTkJ!iT3j2&*XSdiL_9e$~Jg0IN zcZkd2vbYd;ggeR=b7fF<=$6e$axyxKD*T!{n-CQ3x$PIBL+&FiKyT?s( z)7%`lz%6l4xK(b0d(OS!Uh%2C$ZNdAr}2mRY(AII=L`7~{uo~YwdgZ&_o;!q&n3PI z?mbuecK$lw!}s$y_+fsOpWws%eSV6c;ph29ewlyDukoAwHoq%S0xQUZA$UT%kO|qI zClm-pLa9(LoDeF7vqF_nE7U_3x>;xut_dANm(VK=2sedW!kBPdxGOvm9tyLFRG#?9uhOeEHNY=5s!++VwrecJSm10 zc8h)Dpg1Ish~wfN@t!y-PK$Hmg196;5m&_x@wxayd?lqyqNGWVlqMaPvZY)pUn-PJ zq+?QrbV@oSotJ8)3(_U2NxC9kmD;82QjgRx-H?W*QE5U7OZTNIX-1lt7NuqBskA0- zO54(|Ov$V)%ZBX9>2ju=Bj?Ela*3<#ZnF_8A_HCQjRD`m13n#Ij)>k zPAlh>YNbxOs5B~d7->g zQ&mybR7Xuy53AW~u9~kFswL_%wL(3mo>9-MHR=WRlG>zRQLn1)>UFh8?N@K8!|JFy zp@!A_>XbU8&cmC7W%a4Lrf#a+>TZyN`jre-ED!2dnNY*Z3l;>6png>j)hoYtRTZoa z)(0Dc&B2!7wO~iEE7%(x2;PLc*%;K!?n1@vA=JtqL8WX3>SXIsCEI}-83PqERkPqd zM2427g|s8uQLR`j(~fH=wbR-;ty-(oE^3Y1Wvx|f(>k?otxp@&hO`lFT)U&)(1XuwdX0WTzoa+m zSM;lTyMA5o(fjoq`mjE#Pv~L&zCNYT==1ubzN|mh*Yr(&Ti-P(gEeHsFgzpO$TV_{ zJfpxUGD?kd3@}_E9<{>k~%rZmf5%Z{7Y?hhF&6DP7^PE|2)|nU0M)R`SYPOl3 zX1CdA4w^&eh&gWFG4Gj^=CnCyE|^Q^6LZzvFrS+*%vV;bC0d&0SZUT_E8EJo@~uLv z#5!hGSf{Kr)_JSOx?o+hnyf3vSzG#YtdS^o?2_x zrnPPD+LX=OvTfL&oo;8^Id-01U>Dh?cDa4RuC&kERd%giZ#US@c8h(@?y$S;UVFg4 zY2UKP?A!KT`+@z?p0yv@kL?xvnZ0gr**o@2hjDmEbu8zQli_4JA?Jv5)G2n#oa4?( z=d^Rqsdnm|i%z3+*=cp!oKC0P>2n61A!o!HckVd%oJnWenR6DLCFhB=>TEdAofpn4 zH`Ntg&2`)~_pqDo=DPWApeO?@qZh?!3F`F1t_NHFwk9c6U9>V?Eh3JkLw_GQAux&nxhXyi%{+JK_|=anM*Oh|JW=oQu{_p!8u9ax zJjus+JBg34Q@^} zjd9FB*oL_N5OW4(qW)nBI}r{?+WlXV{?}pbAAc^hXsmxk;GH^s1=;Yi?`LW&>Sr`x zrVNdRZGgViNOUc*Z!6GPah-`a`~2z1CwnrJxG&s5_w0{iq@P@O5|iuB495E+`(v?z z?Lm5?KCD9Hl50(3Y%`u0wx>Hu9`msb*_Yra*iesb!}6ql0`K?dUObaJ%i?p4#w4~4 z>p}C1>Pem>)|1R9?SB>5PufG`=(x#qA?zgA4#it6H}P1c-+Vk2%>_R3NL z@%2weeEVa3KMseYe#S8wU+Y<a$`{@{!s~$=JiYq(2!P8(7aCrh1u)m^|!b)d=Ig3(J6=`(!qe zjBkIxf1i)WkIMMyJAE0v55(35#}DF@aeLr8VtHiqYt|R@aXieSu`r%G0AqW| z_<4PtB-%{MgyVB0>?x%G2>dWw>joO$NYaZ4$M!%n7veUA(Ox$aJzrohRA*Eto)KMj<3Z*Yeev=Zb6U}_{T zvk&jt1N=Cij-O>zBJPR#4fuo)qkYl3f9se$FG!5--)}<$I?K@B4%KxJ?8i8iaK@2( zFvk9j)blmv42KL~-XpSU~#tFJ_d@byc`x^b^SlIS=yWbqQq)$k^-#;<`WBx%plh+07jPr-k zo)eDz3L+NcJ_2_kn=!vF!TzNE3hil?u;0R4_<$WKrl`QDfoduzP!p)7LV>!#=hS=t zmt55E1Ji*S>a)NXfqzk5fu+C_^@ku6{3X>B{7vvPYA5(7O{aCu(>%Hjbfuy%;3@R& zJCDA4m(lm`27Dt-!8cnJe6>ZxcUu%y1yl>T9{x4}H3PN4|E~dc0PX_n1%gu^zUQLg zi!KVj>7wDQE{eMA@2R+=lW_kUMEo+pjbIss@v{h)hu(YpG46|ZcXE%9@(T&cGUx|A Z{pN4K`}L3fzn`ys@^Am|-~U?J_FwB5@0S1o literal 0 HcmV?d00001 diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 3c4e1f1b8..27af95cd3 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1,6 +1,7 @@ from tester import * from PIL import Image +import StringIO try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available @@ -8,5 +9,21 @@ except ImportError: skip() def test_sanity(): - assert_match(ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") + +def test_font_with_name(): + font_name = "Tests/fonts/FreeMono.ttf" + font_size = 10 + assert_no_exception(lambda: ImageFont.truetype(font_name, font_size)) + +def test_font_with_filelike(): + font_name = "Tests/fonts/FreeMono.ttf" + font_filelike = StringIO.StringIO(open(font_name, 'rb').read()) + font_size = 10 + assert_no_exception(lambda: ImageFont.truetype(font_filelike, font_size)) + +def test_font_old_parameters(): + font_name = "Tests/fonts/FreeMono.ttf" + font_size = 10 + assert_warning(DeprecationWarning, lambda: ImageFont.truetype(filename=font_name, size=font_size)) + diff --git a/_imagingft.c b/_imagingft.c index e3e5bf638..910e4bfde 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -102,15 +102,17 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) char* filename = NULL; int size; int index = 0; - unsigned char* encoding = NULL; - Py_buffer file_like; + unsigned char* encoding; + unsigned char** file_like; + int file_like_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "file_like", NULL + "filename", "size", "index", "encoding", "file_like", "file_like_size", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*i", kwlist, Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding, &file_like)) + &size, &index, &encoding, file_like, + &file_like_size)) return NULL; if (!library) { @@ -125,10 +127,10 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) if (!self) return NULL; - if (filename && file_like.len<0) { + if (filename && file_like_size <= 0) { error = FT_New_Face(library, filename, index, &self->face); } else { - error = FT_New_Memory_Face(library, (FT_Byte*)file_like.buf, file_like.len, index, &self->face); + error = FT_New_Memory_Face(library, (FT_Byte*)file_like, file_like_size, index, &self->face); } if (!error) @@ -142,13 +144,12 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) } if (error) { - if(file_like.len < 0) { - PyBuffer_Release(&file_like); - } PyObject_Del(self); return geterror(error); } + fprintf(stderr, "> %d %d %s\n", error, file_like_size, self); + return (PyObject*) self; } From b170c5627e1795c23a36c596972571b6927c8e67 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 18:54:57 +0200 Subject: [PATCH 047/102] Restablishing old changes --- _imagingft.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index 910e4bfde..bf0d23ec3 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -103,7 +103,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) int size; int index = 0; unsigned char* encoding; - unsigned char** file_like; + unsigned char* file_like; int file_like_size = 0; static char* kwlist[] = { "filename", "size", "index", "encoding", "file_like", "file_like_size", NULL @@ -111,7 +111,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*i", kwlist, Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding, file_like, + &size, &index, &encoding, &file_like, &file_like_size)) return NULL; From af7213234956bdceed0439b26abdb4e7155a024d Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 20:57:13 +0200 Subject: [PATCH 048/102] Correction of the unbufferizing --- PIL/ImageFont.py | 4 +--- _imagingft.c | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 32177f1d8..7cca722dd 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -140,9 +140,7 @@ class FreeTypeFont: self.font = core.getfont(font, size, index, encoding) else: bytes = font.read() - font.seek(0, 2) - size = font.tell() - self.font = core.getfont("", size, index, encoding, bytes, size) + self.font = core.getfont("", size, index, encoding, bytes) def getname(self): return self.font.family, self.font.style diff --git a/_imagingft.c b/_imagingft.c index bf0d23ec3..9f9dd35c4 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -106,10 +106,10 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) unsigned char* file_like; int file_like_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "file_like", "file_like_size", NULL + "filename", "size", "index", "encoding", "file_like", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|isz*i", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|iss#", kwlist, Py_FileSystemDefaultEncoding, &filename, &size, &index, &encoding, &file_like, &file_like_size)) @@ -148,8 +148,6 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) return geterror(error); } - fprintf(stderr, "> %d %d %s\n", error, file_like_size, self); - return (PyObject*) self; } From f1c245c9c5bab8d2e92e7e3630ac1becf623c067 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 21:10:42 +0200 Subject: [PATCH 049/102] Deprecation message correction --- PIL/ImageFont.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 7cca722dd..7ae57a389 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -133,7 +133,7 @@ class FreeTypeFont: def __init__(self, font=None, size=10, index=0, encoding="", file=None): # FIXME: use service provider instead if file: - warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) font = file if isinstance(font, basestring): @@ -225,7 +225,7 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): "Load a truetype font file." if filename: - warnings.warn('`file` parameter deprecated, please use `font` instead.', DeprecationWarning) + warnings.warn('filename parameter deprecated, please use font parameter instead.', DeprecationWarning) font = filename try: From 6d8ba56c4499a47940769e98e3f50cfb2fb71d27 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 21:25:06 +0200 Subject: [PATCH 050/102] Adding Python 3 support for StringIO --- Tests/test_imagefont.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 27af95cd3..11b26efb6 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1,7 +1,11 @@ from tester import * from PIL import Image -import StringIO +try: + from io import StringIO # python 3 +except ImportError: + from StringIO import StringIO # python 2 + try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available From 5577801aaab0ed7ccf30f818454278c1839513b2 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 21:45:12 +0200 Subject: [PATCH 051/102] Changing StringIO to BytesIO --- Tests/test_imagefont.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 11b26efb6..8305656e2 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1,10 +1,7 @@ from tester import * from PIL import Image -try: - from io import StringIO # python 3 -except ImportError: - from StringIO import StringIO # python 2 +from io import BytesIO try: from PIL import ImageFont @@ -22,7 +19,7 @@ def test_font_with_name(): def test_font_with_filelike(): font_name = "Tests/fonts/FreeMono.ttf" - font_filelike = StringIO.StringIO(open(font_name, 'rb').read()) + font_filelike = BytesIO(open(font_name, 'rb').read()) font_size = 10 assert_no_exception(lambda: ImageFont.truetype(font_filelike, font_size)) From 282562ec19d6e88ea054e11f327e7fd1cbc97870 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 22:03:37 +0200 Subject: [PATCH 052/102] Adding Python3 basestring compatibility without changing basestring --- PIL/ImageFont.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 7ae57a389..fcff4eb81 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -41,6 +41,15 @@ try: except ImportError: core = _imagingft_not_installed() +# Python3 compatibility for basestring +try: + basestring # attempt to evaluate basestring + def isstr(s): + return isinstance(s, basestring) # Python2.x +except NameError: + def isstr(s): + return isinstance(s, str) # Python3.x + # FIXME: add support for pilfont2 format (see FontFile.py) # -------------------------------------------------------------------- @@ -136,7 +145,7 @@ class FreeTypeFont: warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) font = file - if isinstance(font, basestring): + if isstr(font): self.font = core.getfont(font, size, index, encoding) else: bytes = font.read() From 4d136d94cef5130cc8e5415b444255b65d4569a1 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 22:32:43 +0200 Subject: [PATCH 053/102] Better unity with Image.py file (on string type testing and warnings) --- PIL/ImageFont.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index fcff4eb81..90a050076 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -29,7 +29,11 @@ from __future__ import print_function from PIL import Image import os, sys -import warnings + +try: + import warnings +except ImportError: + warnings = None class _imagingft_not_installed: # module placeholder @@ -41,14 +45,12 @@ try: except ImportError: core = _imagingft_not_installed() -# Python3 compatibility for basestring -try: - basestring # attempt to evaluate basestring - def isstr(s): - return isinstance(s, basestring) # Python2.x -except NameError: - def isstr(s): - return isinstance(s, str) # Python3.x +if bytes is str: + def isStringType(t): + return isinstance(t, basestring) +else: + def isStringType(t): + return isinstance(t, str) # FIXME: add support for pilfont2 format (see FontFile.py) @@ -142,10 +144,11 @@ class FreeTypeFont: def __init__(self, font=None, size=10, index=0, encoding="", file=None): # FIXME: use service provider instead if file: - warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) + if warnings: + warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) font = file - if isstr(font): + if isStringType(font): self.font = core.getfont(font, size, index, encoding) else: bytes = font.read() @@ -234,7 +237,8 @@ def truetype(font=None, size=10, index=0, encoding="", filename=None): "Load a truetype font file." if filename: - warnings.warn('filename parameter deprecated, please use font parameter instead.', DeprecationWarning) + if warnings: + warnings.warn('filename parameter deprecated, please use font parameter instead.', DeprecationWarning) font = filename try: From 028e63865e584c34f3d59c1d6f10241afb982f14 Mon Sep 17 00:00:00 2001 From: Nicolas Pieuchot Date: Thu, 25 Apr 2013 23:03:37 +0200 Subject: [PATCH 054/102] Changing bytes variable name not to squeeze bytes type --- PIL/ImageFont.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 90a050076..271669146 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -151,8 +151,8 @@ class FreeTypeFont: if isStringType(font): self.font = core.getfont(font, size, index, encoding) else: - bytes = font.read() - self.font = core.getfont("", size, index, encoding, bytes) + font_bytes = font.read() + self.font = core.getfont("", size, index, encoding, font_bytes) def getname(self): return self.font.family, self.font.style From 43d0aaac246c05a1e436f55a9147c837a5693fb0 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 25 Apr 2013 21:15:32 -0700 Subject: [PATCH 055/102] More logical name for the font buffer --- _imagingft.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index 9f9dd35c4..08d38da24 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -103,16 +103,16 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) int size; int index = 0; unsigned char* encoding; - unsigned char* file_like; - int file_like_size = 0; + unsigned char* font_bytes; + int font_bytes_size = 0; static char* kwlist[] = { - "filename", "size", "index", "encoding", "file_like", NULL + "filename", "size", "index", "encoding", "font_bytes", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|iss#", kwlist, Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding, &file_like, - &file_like_size)) + &size, &index, &encoding, &font_bytes, + &font_bytes_size)) return NULL; if (!library) { @@ -127,10 +127,10 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) if (!self) return NULL; - if (filename && file_like_size <= 0) { + if (filename && font_bytes_size <= 0) { error = FT_New_Face(library, filename, index, &self->face); } else { - error = FT_New_Memory_Face(library, (FT_Byte*)file_like, file_like_size, index, &self->face); + error = FT_New_Memory_Face(library, (FT_Byte*)font_bytes, font_bytes_size, index, &self->face); } if (!error) From 39c62f76ab763ab28f5111b15f50165efb779f3c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 25 Apr 2013 21:17:58 -0700 Subject: [PATCH 056/102] Buffer lifetime needs to be the same as the font lifetime --- PIL/ImageFont.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 271669146..288bc2954 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -151,8 +151,8 @@ class FreeTypeFont: if isStringType(font): self.font = core.getfont(font, size, index, encoding) else: - font_bytes = font.read() - self.font = core.getfont("", size, index, encoding, font_bytes) + self.font_bytes = font.read() + self.font = core.getfont("", size, index, encoding, self.font_bytes) def getname(self): return self.font.family, self.font.style From 2e3cc80aa5036c6740e964d544173e6f01af4919 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 25 Apr 2013 21:58:04 -0700 Subject: [PATCH 057/102] Added font rendering tests --- Tests/test_imagefont.py | 51 +++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 8305656e2..9a1a0811c 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -9,22 +9,53 @@ try: except ImportError: skip() +from PIL import ImageDraw + +font_path = "Tests/fonts/FreeMono.ttf" +font_size=20 + def test_sanity(): assert_match(ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") def test_font_with_name(): - font_name = "Tests/fonts/FreeMono.ttf" - font_size = 10 - assert_no_exception(lambda: ImageFont.truetype(font_name, font_size)) + assert_no_exception(lambda: ImageFont.truetype(font_path, font_size)) + assert_no_exception(lambda: _render(font_path)) +def _font_as_bytes(): + with open(font_path, 'rb') as f: + font_bytes = BytesIO(f.read()) + return font_bytes + def test_font_with_filelike(): - font_name = "Tests/fonts/FreeMono.ttf" - font_filelike = BytesIO(open(font_name, 'rb').read()) - font_size = 10 - assert_no_exception(lambda: ImageFont.truetype(font_filelike, font_size)) + assert_no_exception(lambda: ImageFont.truetype(_font_as_bytes(), font_size)) + assert_no_exception(lambda: _render(_font_as_bytes())) + # Usage note: making two fonts from the same buffer fails. + #shared_bytes = _font_as_bytes() + #assert_no_exception(lambda: _render(shared_bytes)) + #assert_exception(Exception, lambda: _render(shared_bytes)) +def test_font_with_open_file(): + with open(font_path, 'rb') as f: + assert_no_exception(lambda: _render(f)) + def test_font_old_parameters(): - font_name = "Tests/fonts/FreeMono.ttf" - font_size = 10 - assert_warning(DeprecationWarning, lambda: ImageFont.truetype(filename=font_name, size=font_size)) + assert_warning(DeprecationWarning, lambda: ImageFont.truetype(filename=font_path, size=font_size)) +def _render(font): + txt = "Hello World!" + ttf = ImageFont.truetype(font, font_size) + w, h = ttf.getsize(txt) + img = Image.new("RGB", (256, 64), "white") + d = ImageDraw.Draw(img) + d.text((10, 10), txt, font=ttf, fill='black') + + img.save('font.png') + return img + +def test_render_equal(): + img_path = _render(font_path) + with open(font_path, 'rb') as f: + font_filelike = BytesIO(f.read()) + img_filelike = _render(font_filelike) + + assert_image_equal(img_path, img_filelike) From 031e81eef6bcf856e886756a687d57dc55a6c039 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 19:57:45 -0400 Subject: [PATCH 058/102] Wording --- README.rst | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 287413c52..76845b21e 100644 --- a/README.rst +++ b/README.rst @@ -26,9 +26,7 @@ PIL is not setuptools compatible. Please see http://mail.python.org/pipermail/im Porting ------- -Pillow is a functional dropin for the Python Imaging Library. To run -under Pillow, existing code needs to be modified to import the Imaging -modules from the PIL namespace instead of the global namespace. +Pillow is a functional drop-in for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging modules from the PIL namespace instead of the global namespace. Change:: @@ -38,9 +36,7 @@ to:: from PIL import Image -Note that if your code imports _imaging, that will also be hosted in -the PIL namespace. The preferred, future proof method of importing the -private _imaging module is:: +Note that if your code imports _imaging, that will also be hosted in the PIL namespace. The preferred, future proof method of importing the private _imaging module is:: from PIL import Image _imaging = Image.core From b98a162efe79585b3fc69f4e44d33ce204acff56 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:04:16 -0400 Subject: [PATCH 059/102] Wording --- README.rst | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 76845b21e..c44ead3f6 100644 --- a/README.rst +++ b/README.rst @@ -18,15 +18,12 @@ The fork author's goal is to foster active development of PIL through: - Regular releases to the Python Packaging Index - Solicitation for community contributions and involvement on Imaging-SIG -Why a fork? ------------ +Porting your Python code from PIL to Pillow +------------------------------------------- -PIL is not setuptools compatible. Please see http://mail.python.org/pipermail/image-sig/2010-August/006480.html for a more detailed explanation. Also, PIL's current bi-yearly (or greater) release schedule is too infrequent to accomodate the large number and frequency of issues reported. +.. Note:: PIL and Pillow currently cannot co-existent. If you want to use Pillow, please remove PIL first. -Porting -------- - -Pillow is a functional drop-in for the Python Imaging Library. To run under Pillow, existing code needs to be modified to import the Imaging modules from the PIL namespace instead of the global namespace. +Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL code with Pillow, it needs to be modified to import the Imaging modules from the **PIL namespace instead of the global namespace**. Change:: @@ -36,11 +33,19 @@ to:: from PIL import Image -Note that if your code imports _imaging, that will also be hosted in the PIL namespace. The preferred, future proof method of importing the private _imaging module is:: +.. Note:: If your code imports _imaging, it will no longer work. + +The preferred, future proof method of importing the private _imaging module is:: from PIL import Image _imaging = Image.core +Why a fork? +----------- + +PIL is not setuptools compatible. Please see http://mail.python.org/pipermail/image-sig/2010-August/006480.html for a more detailed explanation. Also, PIL's current bi-yearly (or greater) release schedule is too infrequent to accomodate the large number and frequency of issues reported. + + What about image code bugs? --------------------------- From 6f89ddf7e7284ddeadcdb6abd6db8bbf66fe741d Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:08:01 -0400 Subject: [PATCH 060/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c44ead3f6..7179884ce 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: Pillow >= 2.0.0 supports Python versions: 2.6, 2.7, 3.2, 3.3; Pillow < 2.0.0 supports Python versions: 2.4, 2.5, 2.6, 2.7. +.. Note:: Pillow >= 2.0.0 supports Python versions: **2.6, 2.7, 3.2, 3.3**; Pillow < 2.0.0 supports Python versions: **2.4, 2.5, 2.6, 2.7**. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From 878f671992c039542ec1615c306cf54339acf412 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:08:48 -0400 Subject: [PATCH 061/102] Styling --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 7179884ce..42abf410a 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: Pillow >= 2.0.0 supports Python versions: **2.6, 2.7, 3.2, 3.3**; Pillow < 2.0.0 supports Python versions: **2.4, 2.5, 2.6, 2.7**. +.. Note:: **Pillow >= 2.0.0** supports Python versions: **2.6, 2.7, 3.2, 3.3**; **Pillow < 2.0.0** supports Python versions: **2.4, 2.5, 2.6, 2.7**. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From 62084abd39f556e6898f76a5a791990841a194b2 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:11:39 -0400 Subject: [PATCH 062/102] Fix rest ; other nits --- README.rst | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 42abf410a..1c2aebdf4 100644 --- a/README.rst +++ b/README.rst @@ -111,7 +111,7 @@ Installation If there is a binary package for your system, that is the preferred way of obtaining Pillow. [[UNDONE: Binary links]] Building from Source -+++++++++ +++++++++++++++++++++ Some of Pillow's features require external libraries. @@ -140,11 +140,12 @@ Once you have assembed the prerequisites, run: $ pip install pillow Platform Specific Instructions -+++++++++ +++++++++++++++++++++++++++++++ -Mac OSX -******* -We don't currently have official binary builds for OSX. You'll need Xcode to build the package. Xcode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever Xcode compiled your python. +Mac OS X +******** + +We don't currently have official binary builds for OS X. You'll need Xcode to build the package. Xcode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever Xcode compiled your Python. The easiest way to install the prerequisites is to use homebrew: http://mxcl.github.com/homebrew/ . Then run: @@ -152,7 +153,7 @@ The easiest way to install the prerequisites is to use homebrew: http://mxcl.git $ brew install libtiff libjpeg webp littlecms -If you've built your own python, then you should be able to install Pillow using +If you've built your own Python, then you should be able to install Pillow using :: @@ -179,6 +180,8 @@ The library prerequisites are installed with:: Windows ******* +XXX + Donations --------- From f63f9bb09df53785ae752f97b62d0c37d4538fea Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:18:14 -0400 Subject: [PATCH 063/102] Fix rest --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 1c2aebdf4..18fe27a95 100644 --- a/README.rst +++ b/README.rst @@ -160,7 +160,7 @@ If you've built your own Python, then you should be able to install Pillow using $ pip install pillow Ubuntu or Debian -****** +**************** If you didn't build Python from sources, make sure you have Python's build support files on your machine. :: From 9c38b8fc7d3f2bad3e0d31b70176b8598ed385a0 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:20:13 -0400 Subject: [PATCH 064/102] Rest --- README.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 18fe27a95..c59edd299 100644 --- a/README.rst +++ b/README.rst @@ -151,16 +151,17 @@ The easiest way to install the prerequisites is to use homebrew: http://mxcl.git :: -$ brew install libtiff libjpeg webp littlecms + $ brew install libtiff libjpeg webp littlecms If you've built your own Python, then you should be able to install Pillow using :: -$ pip install pillow + $ pip install pillow Ubuntu or Debian **************** + If you didn't build Python from sources, make sure you have Python's build support files on your machine. :: @@ -197,8 +198,6 @@ Pillow is a volunteer effort led by Alex Clark. Any contributor interested in re | Alex Clark (fork author) | http://gittip.com/aclark4life | +--------------------------------------+---------------------------------------+ - - Python Imaging Library ====================== From 1eb842296cc8ac8d2ee236fbc35d422239f36c42 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:22:54 -0400 Subject: [PATCH 065/102] Kill tab --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index c59edd299..a79d1b012 100644 --- a/README.rst +++ b/README.rst @@ -31,14 +31,14 @@ Change:: to:: - from PIL import Image + from PIL import Image .. Note:: If your code imports _imaging, it will no longer work. The preferred, future proof method of importing the private _imaging module is:: from PIL import Image - _imaging = Image.core + _imaging = Image.core Why a fork? ----------- From a7014f985b97444cb6b24f7469b549ed7aacd971 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:30:51 -0400 Subject: [PATCH 066/102] Styling, wording, and other nits --- README.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index a79d1b012..ff1bfdcf6 100644 --- a/README.rst +++ b/README.rst @@ -23,7 +23,7 @@ Porting your Python code from PIL to Pillow .. Note:: PIL and Pillow currently cannot co-existent. If you want to use Pillow, please remove PIL first. -Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL code with Pillow, it needs to be modified to import the Imaging modules from the **PIL namespace instead of the global namespace**. +Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the **PIL namespace instead of the global namespace**. Change:: @@ -33,9 +33,9 @@ to:: from PIL import Image -.. Note:: If your code imports _imaging, it will no longer work. +.. Note:: If your code imports ``_imaging``, it will no longer work. -The preferred, future proof method of importing the private _imaging module is:: +The preferred, future proof method of importing the private ``_imaging`` module is:: from PIL import Image _imaging = Image.core @@ -108,20 +108,20 @@ Current platform support for Pillow. Binary distributions are contributed for ea Installation ------------ -If there is a binary package for your system, that is the preferred way of obtaining Pillow. [[UNDONE: Binary links]] +If there is a binary package for your system, that is the preferred way of installing Pillow. [[UNDONE: Binary links]] Building from Source ++++++++++++++++++++ -Some of Pillow's features require external libraries. +Some of Pillow's features require external libraries. -* libjpeg provides JPEG functionality. +* libjpeg provides JPEG functionality. - * Pillow has been tested with libjpev versions 6b, 8, and 9 + * Pillow has been tested with libjpeg versions 6b, 8, and 9 * zlib provides access to compressed PNGs -* libtiff provides group4 tiff functionality. +* libtiff provides group4 tiff functionality * Pillow has been tested with versions 3.x and 4.0 @@ -131,13 +131,13 @@ Some of Pillow's features require external libraries. * libwebp provides the Webp format. -If the prerequisites are installed in the standard library locations for your machine, no configuration shoule be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations. +If the prerequisites are installed in the standard library locations for your machine, no additional configuration should be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations (i.e. by editing setup.py and/or setup.cfg) -Once you have assembed the prerequisites, run: +Once you have installed the prerequisites, run: :: - $ pip install pillow + $ pip install Pillow Platform Specific Instructions ++++++++++++++++++++++++++++++ From 4cbe53c547059929a550a0c90c7abd0faa71de17 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:33:04 -0400 Subject: [PATCH 067/102] Styling --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ff1bfdcf6..d75b14f0a 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: **Pillow >= 2.0.0** supports Python versions: **2.6, 2.7, 3.2, 3.3**; **Pillow < 2.0.0** supports Python versions: **2.4, 2.5, 2.6, 2.7**. +.. Note:: Pillow **>= 2.0.0** supports Python versions: **2.6, 2.7, 3.2, 3.3**; Pillow **< 2.0.0** supports Python versions: **2.4, 2.5, 2.6, 2.7**. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From b066819aa5e9f7f4ba47e69d5c83f736e7d01ab5 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:40:23 -0400 Subject: [PATCH 068/102] Wording and other nits --- README.rst | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.rst b/README.rst index d75b14f0a..0741de48c 100644 --- a/README.rst +++ b/README.rst @@ -21,11 +21,9 @@ The fork author's goal is to foster active development of PIL through: Porting your Python code from PIL to Pillow ------------------------------------------- -.. Note:: PIL and Pillow currently cannot co-existent. If you want to use Pillow, please remove PIL first. +.. Note:: PIL and Pillow currently cannot co-exist. If you want to use Pillow, please remove PIL first. -Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the **PIL namespace instead of the global namespace**. - -Change:: +Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the **PIL namespace instead of the global namespace**. I.e. change:: import Image @@ -95,7 +93,7 @@ Current platform support for Pillow. Binary distributions are contributed for ea +----------------------------------+-------------+------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3 |x86,x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ -| Gentoo Linux |Soon | 2.7,3.2.4 |x86-64 | +| Gentoo Linux |Soon | 2.7,3.2 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ | Windows Server 2008 R2 Enterprise|Yes | 3.3 |x86-64 | +----------------------------------+-------------+------------------------------+-----------------------+ @@ -108,7 +106,9 @@ Current platform support for Pillow. Binary distributions are contributed for ea Installation ------------ -If there is a binary package for your system, that is the preferred way of installing Pillow. [[UNDONE: Binary links]] +.. Note:: XXX Why are we recommending binaries when we only provide Windows eggs? + +If there is a binary package for your system, that is the easiest way to install Pillow. [[UNDONE: Binary links]] Building from Source ++++++++++++++++++++ @@ -145,9 +145,9 @@ Platform Specific Instructions Mac OS X ******** -We don't currently have official binary builds for OS X. You'll need Xcode to build the package. Xcode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever Xcode compiled your Python. +We don't currently have official binary builds for OS X. You'll need XCode to build the package. XCode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever XCode compiled your Python. The easiest way to install the prerequisites is via homebrew: http://mxcl.github.com/homebrew/ . -The easiest way to install the prerequisites is to use homebrew: http://mxcl.github.com/homebrew/ . Then run: +After you install homebrew, run: :: @@ -159,17 +159,16 @@ If you've built your own Python, then you should be able to install Pillow using $ pip install pillow -Ubuntu or Debian -**************** +Debian/Ubuntu +************* -If you didn't build Python from sources, make sure you have Python's build support files on your machine. - -:: +If you didn't build Python from source, make sure you have Python's build support files on your machine:: sudo apt-get install python-dev python-setuptools - # or for python 3 - sudo apt-get install python3-dev python3-setuptools +Or for python 3:: + + sudo apt-get install python3-dev python3-setuptools The library prerequisites are installed with:: From 375ce6d1fe34ec9737c6edc140b6abfbf1e25809 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:42:18 -0400 Subject: [PATCH 069/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0741de48c..59bfccafe 100644 --- a/README.rst +++ b/README.rst @@ -57,7 +57,7 @@ Then open a ticket here: and provide a link to the first ticket so we can track the issue(s) upstream. -.. Note:: Prior to Pillow 2.0.0, very few image code changes were made. Pillow 2.0.0 adds Python 3 support and includes many bug fixes from around the internet. +.. Note:: Prior to Pillow 2.0.0, very few image code changes were made. Pillow 2.0.0 adds Python 3 support and includes many bug fixes from many contributors. Documentation ------------- From 9b0ae4ea5a31530e25e81c89c20687972451e5f5 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:45:39 -0400 Subject: [PATCH 070/102] Move platform support into Installation section --- README.rst | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 59bfccafe..cb16d921b 100644 --- a/README.rst +++ b/README.rst @@ -73,8 +73,11 @@ Pillow needs you! Please help us maintain PIL via: - Freenode Chat (irc://irc.freenode.net#pil) - Image-SIG Discussion (http://mail.python.org/mailman/listinfo/image-sig) +Installation +------------ + Platform support ----------------- +~~~~~~~~~~~~~~~~ Current platform support for Pillow. Binary distributions are contributed for each release on a volunteer basis, but the source should compile and run everywhere platform support is listed. In general, we aim to support all current versions of Linux, OS X, and Windows. @@ -103,15 +106,13 @@ Current platform support for Pillow. Binary distributions are contributed for ea .. [1] x86 only .. [2] In some cases, x86 support may indicate 32-bit compilation on 64-bit architecture (vs. compilation on 32-bit hardware). -Installation ------------- .. Note:: XXX Why are we recommending binaries when we only provide Windows eggs? If there is a binary package for your system, that is the easiest way to install Pillow. [[UNDONE: Binary links]] -Building from Source -++++++++++++++++++++ +Build from source +~~~~~~~~~~~~~~~~~ Some of Pillow's features require external libraries. @@ -139,11 +140,11 @@ Once you have installed the prerequisites, run: $ pip install Pillow -Platform Specific Instructions -++++++++++++++++++++++++++++++ +Platform instructions +~~~~~~~~~~~~~~~~~~~~~ Mac OS X -******** +++++++++ We don't currently have official binary builds for OS X. You'll need XCode to build the package. XCode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever XCode compiled your Python. The easiest way to install the prerequisites is via homebrew: http://mxcl.github.com/homebrew/ . @@ -160,7 +161,7 @@ If you've built your own Python, then you should be able to install Pillow using $ pip install pillow Debian/Ubuntu -************* ++++++++++++++ If you didn't build Python from source, make sure you have Python's build support files on your machine:: @@ -178,9 +179,9 @@ The library prerequisites are installed with:: sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev Windows -******* ++++++++ -XXX +.. Note:: XXX Mention easy_install Pillow (which should install the right egg)? Donations --------- From bdeb8307e3089c2f1328ed28dd7399c0da580bcb Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:48:33 -0400 Subject: [PATCH 071/102] Wording and nits --- README.rst | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index cb16d921b..6c6a3fbf9 100644 --- a/README.rst +++ b/README.rst @@ -140,8 +140,8 @@ Once you have installed the prerequisites, run: $ pip install Pillow -Platform instructions -~~~~~~~~~~~~~~~~~~~~~ +Platform-specific instructions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mac OS X ++++++++ @@ -165,18 +165,19 @@ Debian/Ubuntu If you didn't build Python from source, make sure you have Python's build support files on your machine:: - sudo apt-get install python-dev python-setuptools + $ sudo apt-get install python-dev python-setuptools -Or for python 3:: +Or for Python 3:: - sudo apt-get install python3-dev python3-setuptools + $ sudo apt-get install python3-dev python3-setuptools -The library prerequisites are installed with:: +The library prerequisites are installed on **Ubuntu 10.04 LTS** with:: - # Ubuntu 10.04 LTS - sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev - # Ubuntu 12.04 LTS - sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev + $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev + +The library prerequisites are installed with on **Ubuntu 10.04 LTS** with :: + + $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev Windows +++++++ From bf5ab42009030f7fbfa38308325266180be5b4e9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:51:58 -0400 Subject: [PATCH 072/102] Wording and nits --- README.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 6c6a3fbf9..01f42eae2 100644 --- a/README.rst +++ b/README.rst @@ -146,9 +146,10 @@ Platform-specific instructions Mac OS X ++++++++ -We don't currently have official binary builds for OS X. You'll need XCode to build the package. XCode 4.2 on 10.6 will work for the Official Python binary distribution, otherwise, use whatever XCode compiled your Python. The easiest way to install the prerequisites is via homebrew: http://mxcl.github.com/homebrew/ . +**We don't currently provide binaries for OS X.** So you'll need XCode to install Pillow. (XCode 4.2 on 10.6 will work with the Official Python binary distribution, otherwise, use whatever XCode compiled your Python.) -After you install homebrew, run: + +The easiest way to install the prerequisites is via `Homebrew `_. After you install Homebrew, run: :: @@ -175,7 +176,7 @@ The library prerequisites are installed on **Ubuntu 10.04 LTS** with:: $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev -The library prerequisites are installed with on **Ubuntu 10.04 LTS** with :: +The library prerequisites are installed with on **Ubuntu 12.04 LTS** with :: $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev From 1e57fa3e0d47b05a14bf8fa753f7e98fbd531637 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 20:56:09 -0400 Subject: [PATCH 073/102] Styling --- README.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 01f42eae2..1fea2c6e0 100644 --- a/README.rst +++ b/README.rst @@ -116,21 +116,21 @@ Build from source Some of Pillow's features require external libraries. -* libjpeg provides JPEG functionality. +* **libjpeg** provides JPEG functionality. * Pillow has been tested with libjpeg versions 6b, 8, and 9 -* zlib provides access to compressed PNGs +* **zlib** provides access to compressed PNGs -* libtiff provides group4 tiff functionality +* **libtiff** provides group4 tiff functionality * Pillow has been tested with versions 3.x and 4.0 -* libfreetype provides type related services +* **libfreetype** provides type related services -* littlecms provides color management +* **littlecms** provides color management -* libwebp provides the Webp format. +* **libwebp** provides the Webp format. If the prerequisites are installed in the standard library locations for your machine, no additional configuration should be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations (i.e. by editing setup.py and/or setup.cfg) From 81a4a4a058aa8056d400127656a9162616babe61 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:01:19 -0400 Subject: [PATCH 074/102] Wording --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 1fea2c6e0..4196ef738 100644 --- a/README.rst +++ b/README.rst @@ -146,7 +146,7 @@ Platform-specific instructions Mac OS X ++++++++ -**We don't currently provide binaries for OS X.** So you'll need XCode to install Pillow. (XCode 4.2 on 10.6 will work with the Official Python binary distribution, otherwise, use whatever XCode compiled your Python.) +**We don't currently provide binaries for OS X.** So you'll need XCode to install Pillow. (XCode 4.2 on 10.6 will work with the Official Python binary distribution. Otherwise, use whatever XCode you used to compile Python.) The easiest way to install the prerequisites is via `Homebrew `_. After you install Homebrew, run: @@ -164,7 +164,7 @@ If you've built your own Python, then you should be able to install Pillow using Debian/Ubuntu +++++++++++++ -If you didn't build Python from source, make sure you have Python's build support files on your machine:: +If you didn't build Python from source, make sure you have Python's development libraries installed:: $ sudo apt-get install python-dev python-setuptools @@ -172,11 +172,11 @@ Or for Python 3:: $ sudo apt-get install python3-dev python3-setuptools -The library prerequisites are installed on **Ubuntu 10.04 LTS** with:: +Prerequisites are installed on **Ubuntu 10.04 LTS** with:: $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev -The library prerequisites are installed with on **Ubuntu 12.04 LTS** with :: +Prerequisites are installed with on **Ubuntu 12.04 LTS** with :: $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev From 1e21f01c9e8d56c460146a1027bda7d0ff78dca7 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:01:59 -0400 Subject: [PATCH 075/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4196ef738..88caf2188 100644 --- a/README.rst +++ b/README.rst @@ -159,7 +159,7 @@ If you've built your own Python, then you should be able to install Pillow using :: - $ pip install pillow + $ pip install Pillow Debian/Ubuntu +++++++++++++ From d1b1520d79c9ad19d4e8bf39067238fec261d472 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:10:54 -0400 Subject: [PATCH 076/102] Consistency --- README.rst | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/README.rst b/README.rst index 88caf2188..18691284a 100644 --- a/README.rst +++ b/README.rst @@ -143,6 +143,25 @@ Once you have installed the prerequisites, run: Platform-specific instructions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Linux ++++++ + +**We don't currently provide binaries for Linux.** If you didn't build Python from source, make sure you have Python's development libraries installed:: + + $ sudo apt-get install python-dev python-setuptools + +Or for Python 3:: + + $ sudo apt-get install python3-dev python3-setuptools + +Prerequisites are installed on **Ubuntu 10.04 LTS** with:: + + $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev + +Prerequisites are installed with on **Ubuntu 12.04 LTS** with :: + + $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev + Mac OS X ++++++++ @@ -161,28 +180,12 @@ If you've built your own Python, then you should be able to install Pillow using $ pip install Pillow -Debian/Ubuntu -+++++++++++++ - -If you didn't build Python from source, make sure you have Python's development libraries installed:: - - $ sudo apt-get install python-dev python-setuptools - -Or for Python 3:: - - $ sudo apt-get install python3-dev python3-setuptools - -Prerequisites are installed on **Ubuntu 10.04 LTS** with:: - - $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev libfreetype6-dev liblcms1-dev - -Prerequisites are installed with on **Ubuntu 12.04 LTS** with :: - - $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms1-dev libwebp-dev Windows +++++++ +**We currently provide Python eggs for Windows.** + .. Note:: XXX Mention easy_install Pillow (which should install the right egg)? Donations From 377359dc5f03b5a1546513a38644716fc82ea408 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:12:28 -0400 Subject: [PATCH 077/102] Styling, wording, nits, et al --- README.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 18691284a..bea82bcb1 100644 --- a/README.rst +++ b/README.rst @@ -118,13 +118,13 @@ Some of Pillow's features require external libraries. * **libjpeg** provides JPEG functionality. - * Pillow has been tested with libjpeg versions 6b, 8, and 9 + * Pillow has been tested with libjpeg versions **6b**, **8**, and **9** * **zlib** provides access to compressed PNGs * **libtiff** provides group4 tiff functionality - * Pillow has been tested with versions 3.x and 4.0 + * Pillow has been tested with libtiff versions **3.x** and **4.0** * **libfreetype** provides type related services @@ -167,6 +167,8 @@ Mac OS X **We don't currently provide binaries for OS X.** So you'll need XCode to install Pillow. (XCode 4.2 on 10.6 will work with the Official Python binary distribution. Otherwise, use whatever XCode you used to compile Python.) +.. Note:: XXX I'm not sure we need to mention the bit about XCode + The easiest way to install the prerequisites is via `Homebrew `_. After you install Homebrew, run: From bbff9bd4c34d57fff597e40f50f044d4aa9807d1 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:16:03 -0400 Subject: [PATCH 078/102] Wording --- README.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index bea82bcb1..ae74f9c6c 100644 --- a/README.rst +++ b/README.rst @@ -109,12 +109,16 @@ Current platform support for Pillow. Binary distributions are contributed for ea .. Note:: XXX Why are we recommending binaries when we only provide Windows eggs? -If there is a binary package for your system, that is the easiest way to install Pillow. [[UNDONE: Binary links]] +If there is a binary package for your system, that is the easiest way to install Pillow. Currently we only provide binaries for Windows. + +.. Note:: UNDONE: Binary links + +.. Note:: XXX Do we really need to provide binary links? At least in the case of eggs… probably not IMHO. Build from source ~~~~~~~~~~~~~~~~~ -Some of Pillow's features require external libraries. +Some (most?) of Pillow's features require external libraries. * **libjpeg** provides JPEG functionality. @@ -132,7 +136,7 @@ Some of Pillow's features require external libraries. * **libwebp** provides the Webp format. -If the prerequisites are installed in the standard library locations for your machine, no additional configuration should be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations (i.e. by editing setup.py and/or setup.cfg) +If the prerequisites are installed in the standard library locations for your machine (e.g. /usr or /usr/local), no additional configuration should be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations (i.e. by editing setup.py and/or setup.cfg) Once you have installed the prerequisites, run: From eee43319bbd80c884d87acf9a38adc4488330044 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 3 May 2013 21:17:46 -0400 Subject: [PATCH 079/102] Consistency --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ae74f9c6c..9cc7fc9d8 100644 --- a/README.rst +++ b/README.rst @@ -150,7 +150,7 @@ Platform-specific instructions Linux +++++ -**We don't currently provide binaries for Linux.** If you didn't build Python from source, make sure you have Python's development libraries installed:: +**We don't currently provide binaries for Linux.** If you didn't build Python from source, make sure you have Python's development libraries installed. In Debian or Ubuntu:: $ sudo apt-get install python-dev python-setuptools From 5ca04bb728b4011119a4191979609399e6dcefbf Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Tue, 7 May 2013 23:23:51 +0300 Subject: [PATCH 080/102] a test that fails for images with integer resolution --- PIL/TiffImagePlugin.py | 20 ++++++++++---------- Tests/test_file_tiff.py | 11 ++++++++++- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 7fd27f5c3..b137968a8 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -615,7 +615,7 @@ class TiffImageFile(ImageFile.ImageFile): return pixel self.load_prepare() - + if not len(self.tile) == 1: raise IOError("Not exactly one tile") @@ -635,7 +635,7 @@ class TiffImageFile(ImageFile.ImageFile): # # Rearranging for supporting byteio items, since they have a fileno # that returns an IOError if there's no underlying fp. Easier to deal - # with here by reordering. + # with here by reordering. if Image.DEBUG: print ("have getvalue. just sending in a string from getvalue") n,e = d.decode(self.fp.getvalue()) @@ -649,10 +649,10 @@ class TiffImageFile(ImageFile.ImageFile): # we have something else. if Image.DEBUG: print ("don't have fileno or getvalue. just reading") - # UNDONE -- so much for that buffer size thing. + # UNDONE -- so much for that buffer size thing. n, e = d.decode(self.fp.read()) - + self.tile = [] self.readonly = 0 self.fp = None # might be shared @@ -750,19 +750,19 @@ class TiffImageFile(ImageFile.ImageFile): # Decoder expects entire file as one tile. # There's a buffer size limit in load (64k) # so large g4 images will fail if we use that - # function. + # function. # # Setup the one tile for the whole image, then # replace the existing load function with our # _load_libtiff function. - + self.load = self._load_libtiff - + # To be nice on memory footprint, if there's a # file descriptor, use that instead of reading # into a string in python. - # libtiff closes the file descriptor, so pass in a dup. + # libtiff closes the file descriptor, so pass in a dup. try: fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) except IOError: @@ -990,7 +990,7 @@ def _save(im, fp, filename): if type(v) == str: atts[k] = v continue - + except: # if we don't have an ifd here, just punt. pass @@ -1007,7 +1007,7 @@ def _save(im, fp, filename): break if s < 0: raise IOError("encoder error %d when writing image file" % s) - + else: offset = ifd.save(fp) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 4347bda8b..8b53140bc 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -60,4 +60,13 @@ def test_gimp_tiff(): ]) assert_no_exception(lambda: im.load()) - +def test_xyres_tiff(): + from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION + file = "Tests/images/pil168.tif" + im = Image.open(file) + assert isinstance(im.tag.tags[X_RESOLUTION][0], tuple) + assert isinstance(im.tag.tags[Y_RESOLUTION][0], tuple) + #Try to read a file where X,Y_RESOLUTION are ints + im.tag.tags[X_RESOLUTION] = (72,) + im.tag.tags[Y_RESOLUTION] = (72,) + im._setup() From af94b45cbcae3d808d2b27dda06bfa68678b6c8d Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Tue, 7 May 2013 23:33:21 +0300 Subject: [PATCH 081/102] allow integer image resolution as well as rational --- PIL/TiffImagePlugin.py | 4 ++++ Tests/test_file_tiff.py | 1 + 2 files changed, 5 insertions(+) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index b137968a8..2c6e3dd9b 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -723,6 +723,10 @@ class TiffImageFile(ImageFile.ImageFile): xres = getscalar(X_RESOLUTION, (1, 1)) yres = getscalar(Y_RESOLUTION, (1, 1)) + if xres and not isinstance(xres, tuple): + xres = (xres, 1.) + if yres and not isinstance(yres, tuple): + yres = (yres, 1.) if xres and yres: xres = xres[0] / (xres[1] or 1) yres = yres[0] / (yres[1] or 1) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 8b53140bc..071b999dc 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -70,3 +70,4 @@ def test_xyres_tiff(): im.tag.tags[X_RESOLUTION] = (72,) im.tag.tags[Y_RESOLUTION] = (72,) im._setup() + im.info['dpi'] == (72., 72.) From 6a942c306568425f7ee9b274519ad2c8a28bf149 Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Tue, 7 May 2013 23:49:45 +0300 Subject: [PATCH 082/102] add assert to test --- Tests/test_file_tiff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 071b999dc..ddca24876 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -70,4 +70,4 @@ def test_xyres_tiff(): im.tag.tags[X_RESOLUTION] = (72,) im.tag.tags[Y_RESOLUTION] = (72,) im._setup() - im.info['dpi'] == (72., 72.) + assert_equal(im.info['dpi'], (72., 72.)) From e3f8395293625cb30d4a3144d197f493eddae8a8 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Tue, 7 May 2013 23:55:48 +0200 Subject: [PATCH 083/102] Fix test hardcoded for little endian --- Tests/test_numpy.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 3253c2b5f..5f8097ef8 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -41,7 +41,10 @@ def test_numpy_to_image(): assert_exception(TypeError, lambda: to_image(numpy.uint64)) assert_image(to_image(numpy.int8), "I", (10, 10)) - assert_image(to_image(numpy.int16), "I;16", (10, 10)) + if Image._ENDIAN == '<': # Little endian + assert_image(to_image(numpy.int16), "I;16", (10, 10)) + else: + assert_image(to_image(numpy.int16), "I;16B", (10, 10)) assert_image(to_image(numpy.int32), "I", (10, 10)) assert_exception(TypeError, lambda: to_image(numpy.int64)) From 290e3e92a688842146047b5cb5f867898d26fb86 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 8 May 2013 16:06:16 -0400 Subject: [PATCH 084/102] Wording --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1113c32a6..c5a7bbbf6 100644 --- a/setup.py +++ b/setup.py @@ -389,7 +389,7 @@ class pil_build_ext(build_ext): def summary_report(self, feature, unsafe_zlib): print("-" * 68) - print("SETUP SUMMARY (Pillow %s fork, originally based on PIL %s)" % (VERSION, PIL_VERSION)) + print("SETUP SUMMARY (Pillow %s PIL fork, originally based on PIL %s)" % (VERSION, PIL_VERSION)) print("-" * 68) print("version %s (Pillow)" % VERSION) v = sys.version.split("[") From ebac93a6c5147c783ea3720ef014524530698a5e Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 19:30:13 -0400 Subject: [PATCH 085/102] Move COPYING -> docs/ --- COPYING => docs/COPYING | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename COPYING => docs/COPYING (100%) diff --git a/COPYING b/docs/COPYING similarity index 100% rename from COPYING rename to docs/COPYING From 1e54021afc568e34a088beff6a7f55c148c11b47 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 19:56:02 -0400 Subject: [PATCH 086/102] Flake8 fixes --- setup.py | 66 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/setup.py b/setup.py index c5a7bbbf6..5132156f5 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from __future__ import print_function import glob import os -import platform +import platform as plat import re import struct import sys @@ -12,8 +12,7 @@ from setuptools import Extension, setup, find_packages _IMAGING = ( - "decode", "encode", "map", "display", "outline", "path", - ) + "decode", "encode", "map", "display", "outline", "path") _LIB_IMAGING = ( "Access", "AlphaComposite", "Antialias", "Bands", "BitDecode", "Blend", @@ -45,18 +44,20 @@ def _find_include_file(self, include): def _find_library_file(self, library): - # Fix for 3.2.x <3.2.4, 3.3.0, shared lib extension is the python shared lib - # extension, not the system shared lib extension: e.g. .cpython-33.so vs .so - # See Python bug http://bugs.python.org/16754 + # Fix for 3.2.x <3.2.4, 3.3.0, shared lib extension is the python shared + # lib extension, not the system shared lib extension: e.g. .cpython-33.so + # vs .so. See Python bug http://bugs.python.org/16754 if 'cpython' in self.compiler.shared_lib_extension: existing = self.compiler.shared_lib_extension self.compiler.shared_lib_extension = "." + existing.split('.')[-1] - ret = self.compiler.find_library_file(self.compiler.library_dirs, library) + ret = self.compiler.find_library_file( + self.compiler.library_dirs, library) self.compiler.shared_lib_extension = existing return ret else: - return self.compiler.find_library_file(self.compiler.library_dirs, library) - + return self.compiler.find_library_file( + self.compiler.library_dirs, library) + def _find_version(filename): for line in open(filename).readlines(): @@ -137,8 +138,10 @@ class pil_build_ext(build_ext): _add_directory(include_dirs, "/usr/X11/include") elif sys.platform.startswith("linux"): - for platform_ in (platform.processor(),platform.architecture()[0]): - if not platform_: continue + for platform_ in (plat.processor(), plat.architecture()[0]): + + if not platform_: + continue if platform_ in ["x86_64", "64bit"]: _add_directory(library_dirs, "/lib64") @@ -149,7 +152,8 @@ class pil_build_ext(build_ext): _add_directory(library_dirs, "/usr/lib/i386-linux-gnu") break else: - raise ValueError("Unable to identify Linux platform: `%s`" % platform_) + raise ValueError( + "Unable to identify Linux platform: `%s`" % platform_) # XXX Kludge. Above /\ we brute force support multiarch. Here we # try Barry's more general approach. Afterward, something should @@ -167,7 +171,6 @@ class pil_build_ext(build_ext): # # locate tkinter libraries - if _tkinter: TCL_VERSION = _tkinter.TCL_VERSION[:3] @@ -183,8 +186,7 @@ class pil_build_ext(build_ext): os.path.join("/py" + PYVERSION, "Tcl"), os.path.join("/python" + PYVERSION, "Tcl"), "/Tcl", "/Tcl" + TCLVERSION, "/Tcl" + TCL_VERSION, - os.path.join(os.environ.get("ProgramFiles", ""), "Tcl"), - ] + os.path.join(os.environ.get("ProgramFiles", ""), "Tcl"), ] for TCL_ROOT in roots: TCL_ROOT = os.path.abspath(TCL_ROOT) if os.path.isfile(os.path.join(TCL_ROOT, "include", "tk.h")): @@ -196,8 +198,6 @@ class pil_build_ext(build_ext): else: TCL_ROOT = None - - # # add standard directories # look for tcl specific subdirectory (e.g debian) @@ -236,8 +236,9 @@ class pil_build_ext(build_ext): if _find_include_file(self, "jpeglib.h"): if _find_library_file(self, "jpeg"): feature.jpeg = "jpeg" - elif sys.platform == "win32" and _find_library_file(self, - "libjpeg"): + elif ( + sys.platform == "win32" and + _find_library_file(self, "libjpeg")): feature.jpeg = "libjpeg" # alternative name if _find_library_file(self, "tiff"): @@ -284,7 +285,9 @@ class pil_build_ext(build_ext): elif _find_library_file(self, "tk" + TCL_VERSION): feature.tk = "tk" + TCL_VERSION - if _find_include_file(self, "webp/encode.h") and _find_include_file(self, "webp/decode.h"): + if ( + _find_include_file(self, "webp/encode.h") and + _find_include_file(self, "webp/decode.h")): if _find_library_file(self, "webp"): feature.webp = "webp" @@ -342,7 +345,6 @@ class pil_build_ext(build_ext): exts.append(Extension( "_webp", ["_webp.c"], libraries=["webp"])) - if sys.platform == "darwin": # locate Tcl/Tk frameworks frameworks = [] @@ -350,8 +352,9 @@ class pil_build_ext(build_ext): "/Library/Frameworks", "/System/Library/Frameworks"] for root in framework_roots: - if (os.path.exists(os.path.join(root, "Tcl.framework")) and - os.path.exists(os.path.join(root, "Tk.framework"))): + if ( + os.path.exists(os.path.join(root, "Tcl.framework")) and + os.path.exists(os.path.join(root, "Tk.framework"))): print("--- using frameworks at %s" % root) frameworks = ["-framework", "Tcl", "-framework", "Tk"] dir = os.path.join(root, "Tcl.framework", "Headers") @@ -405,8 +408,7 @@ class pil_build_ext(build_ext): (feature.tiff, "TIFF G3/G4 (experimental)"), (feature.freetype, "FREETYPE2"), (feature.lcms, "LITTLECMS"), - (feature.webp, "WEBP"), - ] + (feature.webp, "WEBP"), ] all = 1 for option in options: @@ -470,9 +472,11 @@ class pil_build_ext(build_ext): if ret >> 8 == 0: fp = open(tmpfile, 'r') multiarch_path_component = fp.readline().strip() - _add_directory(self.compiler.library_dirs, + _add_directory( + self.compiler.library_dirs, '/usr/lib/' + multiarch_path_component) - _add_directory(self.compiler.include_dirs, + _add_directory( + self.compiler.include_dirs, '/usr/include/' + multiarch_path_component) finally: os.unlink(tmpfile) @@ -501,12 +505,10 @@ setup( "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", - "Programming Language :: Python :: 3.3", - ], + "Programming Language :: Python :: 3.3", ], cmdclass={"build_ext": pil_build_ext}, ext_modules=[Extension("_imaging", ["_imaging.c"])], packages=find_packages(), scripts=glob.glob("Scripts/pil*.py"), - keywords=["Imaging",], - license='Standard PIL License', - ) + keywords=["Imaging", ], + license='Standard PIL License',) From 04c1aee829d396a8ce28852cf98eadadf2a5da17 Mon Sep 17 00:00:00 2001 From: Angel Nunez Mencias Date: Sun, 12 May 2013 01:56:15 +0200 Subject: [PATCH 087/102] Check qtables NULL pointer --- encode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/encode.c b/encode.c index 90a8095fc..bc0bc495e 100644 --- a/encode.c +++ b/encode.c @@ -519,7 +519,7 @@ static unsigned int** get_qtables_arrays(PyObject* qtables) { int i, j, num_tables; unsigned int **qarrays; - if (qtables == Py_None) { + if ((qtables == NULL) || (qtables == Py_None)) { return NULL; } @@ -589,7 +589,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) int streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */ int xdpi = 0, ydpi = 0; int subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */ - PyObject* qtables; + PyObject* qtables=NULL; unsigned int **qarrays = NULL; char* extra = NULL; int extra_size; From 714211b32776894ce24425acaca72ac5c3867658 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 19:57:26 -0400 Subject: [PATCH 088/102] Update URL --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5132156f5..36c4dc557 100644 --- a/setup.py +++ b/setup.py @@ -491,7 +491,7 @@ setup( _read('docs/CONTRIBUTORS.txt')).decode('utf-8'), author='Alex Clark (fork author)', author_email='aclark@aclark.net', - url='http://python-imaging.github.com/', + url='http://python-imaging.github.io/', classifiers=[ "Development Status :: 6 - Mature", "Topic :: Multimedia :: Graphics", From 79186baec7a8b4dee7c965c184c161b54ee1f299 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:01:03 -0400 Subject: [PATCH 089/102] _find_version appears unused --- setup.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 36c4dc557..e9b0f51b9 100644 --- a/setup.py +++ b/setup.py @@ -59,12 +59,13 @@ def _find_library_file(self, library): self.compiler.library_dirs, library) -def _find_version(filename): - for line in open(filename).readlines(): - m = re.search("VERSION\s*=\s*\"([^\"]+)\"", line) - if m: - return m.group(1) - return None +# XXX Who or what still uses this? +#def _find_version(filename): +# for line in open(filename).readlines(): +# m = re.search("VERSION\s*=\s*\"([^\"]+)\"", line) +# if m: +# return m.group(1) +# return None def _lib_include(root): From 5d38c7689955fcf2691eaf9fa51a8651d5744004 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:12:27 -0400 Subject: [PATCH 090/102] Clean up SETUP SUMMARY; remove PIL_VERSION --- setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index e9b0f51b9..ff642cf0d 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,6 @@ except ImportError: NAME = 'Pillow' VERSION = '2.0.0' -PIL_VERSION = '1.1.7' TCL_ROOT = None JPEG_ROOT = None ZLIB_ROOT = None @@ -393,9 +392,9 @@ class pil_build_ext(build_ext): def summary_report(self, feature, unsafe_zlib): print("-" * 68) - print("SETUP SUMMARY (Pillow %s PIL fork, originally based on PIL %s)" % (VERSION, PIL_VERSION)) + print("PIL SETUP SUMMARY") print("-" * 68) - print("version %s (Pillow)" % VERSION) + print("version Pillow %s" % VERSION) v = sys.version.split("[") print("platform %s %s" % (sys.platform, v[0].strip())) for v in v[1:]: From 717b9599a3aa2dbb614a5ee0ead0bb91128b012e Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:13:16 -0400 Subject: [PATCH 091/102] Bump --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ff642cf0d..dbb83fd48 100644 --- a/setup.py +++ b/setup.py @@ -83,7 +83,7 @@ except ImportError: NAME = 'Pillow' -VERSION = '2.0.0' +VERSION = '2.1.0' TCL_ROOT = None JPEG_ROOT = None ZLIB_ROOT = None From f5c5e4621b867894185608c159ec7904b4fd5d7b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:14:48 -0400 Subject: [PATCH 092/102] Bump --- docs/HISTORY.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 67ce68f29..ed5101cf8 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -1,6 +1,9 @@ Changelog (Pillow) ================== +2.1.0 (2013-07-01) +------------------ + 2.0.0 (2013-03-15) ------------------ From d95162920a6b50b021db7b5304f1605ef3108d7b Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:19:21 -0400 Subject: [PATCH 093/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 9cc7fc9d8..11cb85ba5 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: Pillow **>= 2.0.0** supports Python versions: **2.6, 2.7, 3.2, 3.3**; Pillow **< 2.0.0** supports Python versions: **2.4, 2.5, 2.6, 2.7**. +.. Note:: Pillow **>= 2.0.0** supports Python **2.6, 2.7, 3.2, 3.3**; Pillow **< 2.0.0** supports Python **2.4, 2.5, 2.6, 2.7**. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From 8a657e19498f03ec2beb14b0a44f9c80f7bdbcf8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:20:20 -0400 Subject: [PATCH 094/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 11cb85ba5..f72d49397 100644 --- a/README.rst +++ b/README.rst @@ -21,7 +21,7 @@ The fork author's goal is to foster active development of PIL through: Porting your Python code from PIL to Pillow ------------------------------------------- -.. Note:: PIL and Pillow currently cannot co-exist. If you want to use Pillow, please remove PIL first. +.. Note:: PIL and Pillow currently cannot co-exist in the same environment. If you want to use Pillow, please remove PIL first. Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the **PIL namespace instead of the global namespace**. I.e. change:: From e1e19608b04df85564e30c183eecfa92ef5a668f Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:20:52 -0400 Subject: [PATCH 095/102] Wording --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index f72d49397..fe6f37e6e 100644 --- a/README.rst +++ b/README.rst @@ -18,8 +18,8 @@ The fork author's goal is to foster active development of PIL through: - Regular releases to the Python Packaging Index - Solicitation for community contributions and involvement on Imaging-SIG -Porting your Python code from PIL to Pillow -------------------------------------------- +Porting your PIL code to Pillow +------------------------------- .. Note:: PIL and Pillow currently cannot co-exist in the same environment. If you want to use Pillow, please remove PIL first. From 7f43e99d365100dea1e6b9667c4328d368c2d0ef Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:22:07 -0400 Subject: [PATCH 096/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index fe6f37e6e..38084c7fe 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: Pillow **>= 2.0.0** supports Python **2.6, 2.7, 3.2, 3.3**; Pillow **< 2.0.0** supports Python **2.4, 2.5, 2.6, 2.7**. +.. Note:: Pillow **< 2.0.0** supports Python **2.4, 2.5, 2.6, 2.7**; Pillow **>= 2.0.0** supports Python **2.6, 2.7, 3.2, 3.3**. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From 18ae40c561fb35f7fd5a80907e676ffabbb69e33 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:25:28 -0400 Subject: [PATCH 097/102] Styling --- README.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 38084c7fe..e97f25a0f 100644 --- a/README.rst +++ b/README.rst @@ -13,17 +13,17 @@ Introduction The fork author's goal is to foster active development of PIL through: -- Continuous integration testing via Travis-CI -- Publicized development activity on GitHub -- Regular releases to the Python Packaging Index -- Solicitation for community contributions and involvement on Imaging-SIG +- Continuous integration testing via **Travis-CI** +- Publicized development activity on **GitHub** +- Regular releases to the **Python Packaging Index** +- Solicitation for community contributions and involvement on **Image-SIG** Porting your PIL code to Pillow ------------------------------- .. Note:: PIL and Pillow currently cannot co-exist in the same environment. If you want to use Pillow, please remove PIL first. -Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the **PIL namespace instead of the global namespace**. I.e. change:: +Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the ``PIL`` namespace *instead* of the global namespace. I.e. change:: import Image From d6d68dfc98d750393b5f8b58359cfcea0f327336 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:25:51 -0400 Subject: [PATCH 098/102] Wording --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index e97f25a0f..2300d049f 100644 --- a/README.rst +++ b/README.rst @@ -31,7 +31,7 @@ to:: from PIL import Image -.. Note:: If your code imports ``_imaging``, it will no longer work. +.. Note:: If your code imports from ``_imaging``, it will no longer work. The preferred, future proof method of importing the private ``_imaging`` module is:: From 4e9a8ef7d7598b13df8880309adcafaef6e23f28 Mon Sep 17 00:00:00 2001 From: Angel Nunez Mencias Date: Sun, 12 May 2013 02:34:07 +0200 Subject: [PATCH 099/102] Use the JPEG Plugin save instead of calling the ImageFile directly --- PIL/PdfImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index a9d8f4e41..725f22ecf 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -149,7 +149,7 @@ def _save(im, fp, filename): im.putdata(data) ImageFile._save(im, op, [("hex", (0,0)+im.size, 0, im.mode)]) elif filter == "/DCTDecode": - ImageFile._save(im, op, [("jpeg", (0,0)+im.size, 0, im.mode)]) + Image.SAVE["JPEG"](im, op, filename) elif filter == "/FlateDecode": ImageFile._save(im, op, [("zip", (0,0)+im.size, 0, im.mode)]) elif filter == "/RunLengthDecode": From 9444a3f97b72ccff12dc4349eb4793d34d7150f9 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:46:51 -0400 Subject: [PATCH 100/102] Styling --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 2300d049f..54203d545 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Pillow ====== -.. Note:: Pillow **< 2.0.0** supports Python **2.4, 2.5, 2.6, 2.7**; Pillow **>= 2.0.0** supports Python **2.6, 2.7, 3.2, 3.3**. +.. Note:: Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7; Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow From 637b276337210f1622b6be4aa19e463b3d6d40fd Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:51:46 -0400 Subject: [PATCH 101/102] Add links --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 54203d545..7c3ea8714 100644 --- a/README.rst +++ b/README.rst @@ -13,10 +13,10 @@ Introduction The fork author's goal is to foster active development of PIL through: -- Continuous integration testing via **Travis-CI** -- Publicized development activity on **GitHub** -- Regular releases to the **Python Packaging Index** -- Solicitation for community contributions and involvement on **Image-SIG** +- Continuous integration testing via `Travis CI `_ +- Publicized development activity on `GitHub `_ +- Regular releases to the `Python Package Index `_ +- Solicitation for community contributions and involvement on `Image-SIG `_ Porting your PIL code to Pillow ------------------------------- From a2663641b6415db6ff3885ce944beeec4435c4f8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 11 May 2013 20:55:06 -0400 Subject: [PATCH 102/102] Wording --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 7c3ea8714..c3e40bb02 100644 --- a/README.rst +++ b/README.rst @@ -67,11 +67,11 @@ The API documentation included with PIL has been converted (from HTML generated Community --------- -Pillow needs you! Please help us maintain PIL via: +PIL needs you! Please help us maintain the Python Imaging Library here: -- GitHub Code (https://github.com/python-imaging/Pillow) -- Freenode Chat (irc://irc.freenode.net#pil) -- Image-SIG Discussion (http://mail.python.org/mailman/listinfo/image-sig) +- GitHub (https://github.com/python-imaging/Pillow) +- Freenode (irc://irc.freenode.net#pil) +- Image-SIG (http://mail.python.org/mailman/listinfo/image-sig) Installation ------------