o
    }si'                     @   s  U d Z ddlZddlmZ ddlmZmZmZmZ dZ	e
ed< dZe
ed< d	Ze
ed
< dZe
ed< dZe
ed< g dZg dZdee dedB fddZeeZeepUeZd6de
dedejfddZeefde
de
deejejf fddZ			 	d7d!ejd"ed#e
d$e
d%e
d&e
d'ed(eddfd)d*Z	+	,	 d8d!ejd"ed#e
d$e
d-e
d.e
d'eddfd/d0Zd1ejdefd2d3Zd1ejdefd4d5ZdS )9u   Label rendering utilities — generates PIL Images for warehouse labels.

Label specs (203 DPI / 8 dots-per-mm):
  small  55 × 32 mm   →  440 ×  256 dots
  large 100 × 150 mm  →  800 × 1200 dots
    N)BytesIO)Image	ImageDraw	ImageFontImageOps   	LABEL_DPIi  LABEL_W   LABEL_Hi   LARGE_LABEL_Wi  LARGE_LABEL_H)z,/System/Library/Fonts/Supplemental/Arial.ttfz/Library/Fonts/Arial.ttfz//usr/share/fonts/truetype/dejavu/DejaVuSans.ttfz?/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttfz//usr/share/fonts/truetype/freefont/FreeSans.ttfz-/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf)z1/System/Library/Fonts/Supplemental/Arial Bold.ttfz/Library/Fonts/Arial Bold.ttfz4/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttfz</usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttfz-/usr/share/fonts/truetype/ubuntu/Ubuntu-B.ttfpathsreturnc                 C   s"   | D ]}t j|r|  S qd S N)ospathexists)r   p r   4/var/www/warehouse.soldered.com/app/labels/render.py_find+   s
   r   Fsizeboldc                 C   s@   |rt nt}|rzt|| W S  ty   Y t S w t S )zEReturn a TrueType font at *size* pixels, falling back to PIL default.)
_bold_path_regular_pathr   truetype	Exceptionload_default)r   r   r   r   r   r   	load_font6   s   r   whc                 C   s    t d| |fd}|t|fS )z6Return a blank white label canvas and its draw object.L   )r   newr   Draw)r    r!   imgr   r   r   	new_labelA   s   r'     0   code128canvasdataxywidthheight	symbologyhrt_textc           #      C   s  ddl }ddlm}	 |dv }
t }|
rUddd |D }z$|d}t|d	kr/|dd
 n	|d
ddd
 }|||	 d}W n tyT   |j	||	 d}d}
Y n	w |j	||	 d}|j
|ddddtdd |d t|d}|||ftj}|dd }| |||f t| }td|d }t|dd}|
rTd}d}d}d}d}|tdtdd t|D d  d  }|d }|dd  }|d d }|| d! }|jd"||d#}|t|| d!  |d! |d  d!  }|j||f|d|d$ |jd"||d#}|t|||  d!  |d! |d  d!  }|j||f|d|d$ |jd"||d#}|t|||  d!  |d! |d  d!  }|j||f|d|d$ dS |dur[|n|} |jd"| |d#}|d! |d  }!|||! d!  }"|| d! }|j|"|f| d|d$ dS )%ax  Render a barcode horizontally onto *canvas*.

    Args:
        canvas:    The label image to draw onto.
        data:      Barcode payload string.
        x, y:      Top-left position in dots.
        width:     Target width in dots.
        height:    Target height in dots for the bar area (HRT drawn below).
        symbology: 'code128' (default) or 'ean' for EAN-13.
    r   NImageWriter)eanean13 c                 s       | ]	}|  r|V  qd S r   isdigit.0cr   r   r   	<genexpr>b       zdraw_barcode.<locals>.<genexpr>r6         0writerF皙?      .@       @)module_widthmodule_height
quiet_zone
write_textdpioptionsr"   c                 S      | dk rdS dS N   r   r#   r   vr   r   r   <lambda>{       zdraw_barcode.<locals>.<lambda>
      r   g:Fqc?g4A/?g[X驅?gS+=?g81s?c                 s   s,    | ]\}}|d  rdndt | V  qdS )         N)int)r<   ir=   r   r   r   r>      s   * r[      rY   r   r   fontfillra   )barcodebarcode.writerr4   r   joinget_barcode_classlenljustr   Code128writer   seekr   openconvertresizeLANCZOSpointpaster   r%   maxr   strsum	enumeratetextbboxr\   text)#r+   r,   r-   r.   r/   r0   r1   r2   bcr4   is_eanbufdigitsEAN13Clsd12bc_objbarcode_imgdraw	text_sizera   q_fraclg_fraccg_fracrg_fracend_fracfull13first_digit
left_groupright_grouptybboxd_xhrttwtxr   r   r   draw_barcodeG   st   
,


 (,,r      ,   
bar_lengthbar_thicknessc              
   C   s>  ddl }ddlm} d}	t }
|dv rfddd |D }z7|d	}t|d
kr0|dd }nt|dkrA|dddd }n	tdt| ||| d}d}	W n t	ye   |j
|| d}Y n	w |j
|| d}|j|
ddd|	ddtdd |
d t|
d}|	rt|d n|}|||ftj}|dd }|jddd}| |||f |	st| }td|d }t|dd}|jd ||d!}|d" |d  }|d# |d$  }td|d% |d% fd&}t|}|jd'|d|d( |jddd}|| d# }||d"  |jd"  }| |||f dS dS ))u  Render a barcode rotated 90° CCW onto *canvas*.

    Args:
        canvas:        The label image to draw onto.
        data:          Barcode payload string.
        x, y:          Top-left of the rotated barcode on the canvas.
        bar_length:    Length of the bars — becomes the HEIGHT after rotation.
        bar_thickness: Thickness of the bar strip — becomes the WIDTH after rotation.
        symbology:     'code128' (default) or 'ean' / 'upc' for EAN-13.
    r   Nr3   F)r5   upcr7   c                 s   r8   r   r9   r;   r   r   r   r>      r?   z(draw_barcode_vertical.<locals>.<genexpr>r6   r@   rA   r^   rB   zToo few digits for EAN-13: rC   TrE   rF   rG   g      ?   )rH   rI   rJ   rK   text_distance	font_sizerL   rM   r"   gGz?c                 S   rO   rP   r   rR   r   r   r   rT      rU   z'draw_barcode_vertical.<locals>.<lambda>Z   )expand   rX   r_   r`   rY   rZ   r[   rW   r#   )rY   rY   rb   )rd   re   r4   r   rf   rg   rh   ri   
ValueErrorr   rj   rk   r   rl   r   rm   rn   r\   ro   rp   rq   rotaterr   r   r%   rs   r   rw   r$   rx   r0   )r+   r,   r-   r.   r   r   r1   ry   r4   rz   r{   r|   r}   r~   r   r   target_tr   r   ra   r   r   thtxt_imgtxt_drawr   r   r   r   r   draw_barcode_vertical   sd   


	

r   r&   c                 C   sz   | j \}}|d d }|| }t| djdtjjd}| }| 	 }d| d| d| d	| d	| d	| d
S )u   Convert a PIL Image to a ZPL string using the ^GF (Graphic Field) command.

    Sends one full-label bitmap to the printer — no host fonts needed.
    r^   r   r"   1)ditherz^XA^PWz^LLz^MNT^LH0,0^FO0,0^GFA,,z^FS^XZ)
r   r   invertrn   r   DitherNONEtobyteshexupper)r&   r    r!   bytes_per_rowtotal_bytesbwrawhex_datar   r   r   image_to_zpl   s    
r   c                 C   s0   ddl }t }| j|dd || dS )z2Encode a PIL Image as a base64-encoded PNG string.r   NPNG)formatzutf-8)base64r   save	b64encodegetvaluedecode)r&   r   r{   r   r   r   image_to_png_b64  s   r   )F)r(   r)   r*   N)r   r   r*   )__doc__r   ior   PILr   r   r   r   r   r\   __annotations__r	   r   r   r   _REGULAR_PATHS_BOLD_PATHSlistrt   r   r   r   boolr   tupler'   r   r   r   r   r   r   r   r   <module>   sz    
	(	
l
R