B ]J@sddlZddlZddlmZmZddlmZGdddeZdddZ y ej j Z Wne k rjdZ YnXdd d Zdd d Zd dZdS)N)Image ImageColor) isStringTypec @seZdZd+ddZddZd,ddZd-d d Zd.d d Zd/d dZd0ddZ d1ddZ d2ddZ d3ddZ d4ddZ d5ddZd6ddZddZdd Zd7d#d$Zd8d%d&Zd9d'd(Zd:d)d*ZdS); ImageDrawNcCs||jr|d}|dkr(|j}||jkrR|dkrJ|jdkrJd}ntd|dkrd|j|_nd|_|j|_tj |j||_ ||_|dkr|j d|_ n|j d |_ |d krd |_ nd |_ d|_ d|_dS) a Create a drawing instance. :param im: The image to draw in. :param mode: Optional mode to use for color values. For RGB images, this argument can be RGB or RGBA (to blend the drawing into the image). For all other modes, this argument must be the same as the image mode. If omitted, the mode defaults to the mode of the image. rNZRGBAZRGBrz mode mismatchP)IF)1rrr r L)loadreadonlyZ_copymode ValueErrorpaletteimrcoredrawdraw_inkinkfontmodefillfont)selfrrZblendr//tmp/pip-build-ktz6qwqq/Pillow/PIL/ImageDraw.py__init__1s0   zImageDraw.__init__cCs"|jsddlm}||_|jS)zH Get the current default font. :returns: An image font.r) ImageFont)rrZ load_default)rrrrrgetfontZs  zImageDraw.getfontcCs|dkr&|dkr&|jr|j}q|j}n|dk rnt|rDt||j}|jrbt|tj sb|j|}|j |}|dk rt|rt||j}|jrt|tj s|j|}|j |}||fS)N) rrrrZgetcolorrr isinstancenumbersNumberrr)rrrrrr_getinkfs"    zImageDraw._getinkrcCs.||\}}|dk r*|j|||||dS)z Draw an arc.N)r$rZdraw_arc)rxystartendrwidthrrrrarc{sz ImageDraw.arccCs@|||\}}|dkr"|}|dk r<|j||j|dS)zDraw a bitmap.N)r r$r draw_bitmapr)rr%bitmaprrrrrr+s zImageDraw.bitmapcCsV|||\}}|dk r,|j||||d|dk rR||krR|j||||d|dS)z Draw a chord.Nrr)r$rZ draw_chord)rr%r&r'routliner(rrrrchords zImageDraw.chordcCsN|||\}}|dk r(|j||d|dk rJ||krJ|j||d|dS)zDraw an ellipse.Nrr)r$rZ draw_ellipse)rr%rr,r(rrrrellipses zImageDraw.ellipsecs||d}|dk r|j|||dkrdkrxtdt|dD]}||}dd||d|f|||dffD}|d|dkrqRfdd } |d|dkr|dd |dkp|d|dko|dd |dk} |dd d|dd df|dd d|dd dfg} | rb|dd |dd } } n|dd |dd } } || | d | d |d krR| r| ||dd || ||dd g}n&| ||dd || ||dd g}|j||ddqRWdS)z6Draw a line, or a connected sequence of line segments.rNZcurverc Ss>g|]6\}}tt|d|d|d|ddqS)rrih)mathdegreesatan2).0r&r'rrr sz"ImageDraw.line..c sZ|\}}|d8}dd}tdd||tt|f||tt|ffDS)NZrcSs0g|](\}}||dkr t|nt|qS)r)r0floorceil)r3pZp_drrrr4sz:ImageDraw.line..coord_at_angle..)tupler0cosradianssin)coordZanglexyZdistance)r(rrcoord_at_angles z&ImageDraw.line..coord_at_angler6r5)r()r$rZ draw_linesrangelenpiesliceline)rr%rr(ZjointripointZanglesrAZflippedZcoordsr&r'Z gapCoordsr)r(rrHs8 $ $$&*zImageDraw.linecCsT||||\}}|dk r0|j||d|dk rP||krP|j||ddS)z(Experimental) Draw a shape.Nrr)closer$rZ draw_outline)rshaperr,rrrrrLs zImageDraw.shapecCsV|||\}}|dk r,|j||||d|dk rR||krR|j||||d|dS)zDraw a pieslice.Nrr)r$rZ draw_pieslice)rr%r&r'rr,r(rrrrrGs zImageDraw.pieslicecCs(||\}}|dk r$|j||dS)z#Draw one or more individual pixels.N)r$rZ draw_points)rr%rrrrrrJszImageDraw.pointcCsL|||\}}|dk r(|j||d|dk rH||krH|j||ddS)zDraw a polygon.Nrr)r$rZ draw_polygon)rr%rr,rrrrpolygons zImageDraw.polygoncCsN|||\}}|dk r(|j||d|dk rJ||krJ|j||d|dS)zDraw a rectangle.Nrr)r$rZdraw_rectangle)rr%rr,r(rrrr rectangles zImageDraw.rectanglecCst|trdnd}||kS)z Draw text.  )r!str)rtextsplit_characterrrr_multiline_checkszImageDraw._multiline_checkcCst|trdnd}||S)NrOrP)r!rQsplit)rrRrSrrr_multiline_splitszImageDraw._multiline_splitr/leftc sr*||||| | Sdkr:fdd}df dd }||}|dk rd}| r| dk r|| n|}|dk r||| ||d| | fn||dS)Ncs|\}}|dkr|S|S)N)r$)rr)rrrgetink,szImageDraw.text..getinkrc s}yLjjf|d\}}|d|d|d|df}WnVtk ry"jj|f}Wntk r}YnXYnX|r|d|d|d|df}j|||dS)N) directionfeatureslanguage stroke_widthrr)Zgetmask2rAttributeErrorZgetmask TypeErrorrr*)rr\Z stroke_offsetr>maskoffset) argsrYrZrkwargsr[rrRr%rr draw_text2s0 $  z!ImageDraw.text..draw_text)rN)rTmultiline_textr )rr%rRrranchorspacingalignrYrZr[r\ stroke_fillrarbrXrcrZ stroke_inkr) rarYrZrrbr[rrRr%rrRs6    zImageDraw.textc  Csg} d}||}|jd|| dd|}x:|D]2}|j|||| | | d\}}| |t||}q0W|\}}xt|D]\}}|dkrn@|dkr||| |d7}n"|d kr||| |7}ntd |j||f|||||| | | | d ||7}|d}qxWdS) NrA)rr\r)rYrZr[r\rWcenterg@rightz)align must be "left", "center" or "right")rYrZr[r\rh)rVtextsizeappendmax enumeraterrR)rr%rRrrrerfrgrYrZr[r\rhZwidths max_widthlines line_spacingrH line_width line_heightrWtopidxrrrrdbsH    zImageDraw.multiline_textc CsB||r ||||||||S|dkr0|}||||||S)z*Get the size of a given string, in pixels.N)rTmultiline_textsizer getsize)rrRrrfrYrZr[r\rrrrls zImageDraw.textsizec Csld}||} |jd||dd|} x0| D](} || ||||||\} } t|| }q,W|t| | |fS)Nrri)rr\r)rVrlrnrF)rrRrrfrYrZr[r\rprqrrrHrsrtrrrrws   zImageDraw.multiline_textsize)N)N)Nr)N)NNr)NNr)NrN)NN)NNr)N)NN)NNr) NNNr/rWNNNrN) NNNr/rWNNNrN)Nr/NNNr)Nr/NNNr)__name__ __module__ __qualname__rr r$r)r+r-r.rHrLrGrJrMrNrTrVrRrdrlrwrrrrr0s^ )     <      Q / rcCs*y ||Stk r$t||SXdS)a A simple 2D drawing interface for PIL images. :param im: The image to draw in. :param mode: Optional mode to use for color values. For RGB images, this argument can be RGB or RGBA (to blend the drawing into the image). For all other modes, this argument must be the same as the image mode. If omitted, the mode defaults to the mode of the image. N)getdrawr]r)rrrrrDraws  r}cCs`d}|rd|kr6yddlm}Wntk r4YnX|dkrJddlm}|rX||}||fS)a (Experimental) A more advanced 2D drawing interface for PIL images, based on the WCK interface. :param im: The image to draw in. :param hints: An optional list of hints. :returns: A (drawing context, drawing resource factory) tuple. NZnicestr) _imagingagg) ImageDraw2)rr~ ImportErrorrr})rZhintshandlerrrrr|s    r|c Csv|}|\}}y.|||f}t|||kr0dS||||f<Wnttfk rVdSX||fh} t} x| rpt} x| D]\}}x|d|f|d|f||df||dffD]\} } | | f| ks| dks| dkrqy|| | f}Wnttfk rYqX| | | f|dkr.t|||k}n||ko>||k}|r||| | f<| | | fqWq~W| } | } qlWdS)a (experimental) Fills a bounded region with a given color. :param image: Target image. :param xy: Seed position (a 2-item coordinate tuple). See :ref:`coordinate-system`. :param value: Fill color. :param border: Optional border value. If given, the region consists of pixels with a color different from the border color. If not given, the region consists of pixels having the same color as the seed pixel. :param thresh: Optional threshold value which specifies a maximum tolerable difference of a pixel value from the 'background' in order for it to be replaced. Useful for filling regions of non-homogeneous, but similar, colors. Nrr)r _color_diffr IndexErrorsetadd)imager%valueZborderZthreshZpixelr?r@Z backgroundZedgeZ full_edgeZnew_edgestr9rrrr floodfills<   6  rcs<ttr,tfddtdtDStSdS)zJ Uses 1-norm distance to calculate difference between two values. cs g|]}t||qSr)abs)r3rI)color1color2rrr43sz_color_diff..rN)r!r:sumrErFr)rrr)rrrr.s "r)N)NN)Nr)r0r"rrrZ_utilrobjectrr}rr,ZOutliner]r|rrrrrr!s      8