mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	Merge parallel horizontal edges in ImagingDrawPolygon
This commit is contained in:
		
							parent
							
								
									fe668716ed
								
							
						
					
					
						commit
						5491bd5eda
					
				|  | @ -734,7 +734,7 @@ ImagingDrawRectangle( | |||
| 
 | ||||
| int | ||||
| ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, int op) { | ||||
|     int i, n; | ||||
|     int i, n, x0, y0, x1, y1; | ||||
|     DRAW *draw; | ||||
|     INT32 ink; | ||||
| 
 | ||||
|  | @ -753,10 +753,28 @@ ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, i | |||
|             return -1; | ||||
|         } | ||||
|         for (i = n = 0; i < count - 1; i++) { | ||||
|             add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3]); | ||||
|             x0 = xy[i * 2]; | ||||
|             y0 = xy[i * 2 + 1]; | ||||
|             x1 = xy[i * 2 + 2]; | ||||
|             y1 = xy[i * 2 + 3]; | ||||
|             if (y0 == y1 && i != 0 && y0 == xy[i * 2 - 1]) { | ||||
|                 // This is a horizontal line,
 | ||||
|                 // that immediately follows another horizontal line
 | ||||
|                 Edge *last_e = &e[n-1]; | ||||
|                 if (x1 > x0 && x0 > xy[i * 2 - 2]) { | ||||
|                     // They are both increasing in x
 | ||||
|                     last_e->xmax = x1; | ||||
|                     continue; | ||||
|                 } else if (x1 < x0 && x0 < xy[i * 2 - 2]) { | ||||
|                     // They are both decreasing in x
 | ||||
|                     last_e->xmin = x1; | ||||
|                     continue; | ||||
|                 } | ||||
|         if (xy[i + i] != xy[0] || xy[i + i + 1] != xy[1]) { | ||||
|             add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[0], xy[1]); | ||||
|             } | ||||
|             add_edge(&e[n++], x0, y0, x1, y1); | ||||
|         } | ||||
|         if (xy[i * 2] != xy[0] || xy[i * 2 + 1] != xy[1]) { | ||||
|             add_edge(&e[n++], xy[i * 2], xy[i * 2 + 1], xy[0], xy[1]); | ||||
|         } | ||||
|         draw->polygon(im, n, e, ink, 0); | ||||
|         free(e); | ||||
|  | @ -764,9 +782,9 @@ ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, i | |||
|     } else { | ||||
|         /* Outline */ | ||||
|         for (i = 0; i < count - 1; i++) { | ||||
|             draw->line(im, xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3], ink); | ||||
|             draw->line(im, xy[i * 2], xy[i * 2 + 1], xy[i * 2 + 2], xy[i * 2 + 3], ink); | ||||
|         } | ||||
|         draw->line(im, xy[i + i], xy[i + i + 1], xy[0], xy[1], ink); | ||||
|         draw->line(im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink); | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user