
    7jB                        d dl Z d dlmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZmZ d dlZd Zd Z G d d	      Z G d
 d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d dej                        Zd ZdefdZd Zd Zd Z ej@                  ejB                  ee        ejD                  ejB                  e        ejF                  ejB                  e        ejH                  ejB                  dejB                  jK                                  ejL                  ejB                  dejB                  jK                                 y)     N)
rgb_to_hsv)FunctionType)Image	ImageFile
ImageChops)o8o16leo32lec                 B    t        | dz        t        | dz  dz	        z   S )Ni  i      )o16r   )is    H/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/painter_qgf.pyo24r      s#    q6z?RX" 4555    c                     t        | d   dz  | d   dz  | d   dz        }t        |d   dz        t        |d   dz        t        |d   dz        fS )Nr   g     o@      )r   int)ehsvs     r   rgb888_to_qmk_hsv888r      s\    
QqTE\1Q4%<1
>CASVe^!4c#a&5.6IJJr   c                       e Zd ZdZd Zy)QGFBlockHeader   c                     |j                  dt        | j                        z   t        | j                   dz        z   t        | j                        z          y )Nr      )writer   type_idr   lengthselffps     r   r   zQGFBlockHeader.write    sL    
dll#$},-. t{{#$ 	r   N)__name__
__module____qualname__
block_sizer    r   r   r   r      s    Jr   r   c                   X    e Zd ZdZdZdZd Zd Zed        Z	e	j                  d        Z	y)	QGFGraphicsDescriptorr      iQGF c                     t               | _        t        j                  | j                  _        t        j                  | j                  _        d| _        d| _        d| _        d| _        d| _	        y )Nr   r   )
r   headerr*   r   r    versiontotal_file_sizeimage_widthimage_heightframe_countr"   s    r   __init__zQGFGraphicsDescriptor.__init__0   sW    $&3;;299 r   c                    | j                   j                  |       |j                  dt        t        j                        z   t        | j                        z   t        | j                        z   t        | j                   dz        z   t        | j                        z   t        | j                        z   t        | j                        z          y )Nr       )r-   r   r   r*   magicr   r.   o32r/   r   r0   r1   r2   r!   s     r   r   zQGFGraphicsDescriptor.write:   s    "
'--./ $&&'( D(((J67	8
 $""#$ $##$% $""#$		
r   c                 2    | j                   | j                  fS Nr0   r1   r3   s    r   
image_sizez QGFGraphicsDescriptor.image_sizeG   s    !2!222r   c                 "    |\  | _         | _        y r:   r;   )r"   sizes     r   r<   z QGFGraphicsDescriptor.image_sizeK   s    .2+$+r   N)r$   r%   r&   r   r    r7   r4   r   propertyr<   setterr(   r   r   r*   r*   +   sI    GFE
 3 3 3 3r   r*   c                       e Zd ZdZd Zd Zy)QGFFrameOffsetDescriptorV1r   c                     t               | _        t        j                  | j                  _        dg|z  | _        || _        y )Nr6   )r   r-   rB   r   frame_offsetsr2   )r"   r2   s     r   r4   z#QGFFrameOffsetDescriptorV1.__init__V   s5    $&8@@(\K7&r   c                     t        | j                        dz  | j                  _        | j                  j	                  |       | j                  D ]  }|j	                  dt        |      z          ! y )N   r   )lenrD   r-   r    r   r8   )r"   r#   offsets      r   r   z QGFFrameOffsetDescriptorV1.write\   s_     !3!34q8"(( 	FHHS6{# 	r   Nr$   r%   r&   r   r4   r   r(   r   r   rB   rB   S   s    G'r   rB   c                       e Zd ZdZdZd Zd Zed        Zej                  d        Zed        Z
e
j                  d        Z
y	)
QGFFrameDescriptorV1r      c                     t               | _        t        j                  | j                  _        t        j                  | j                  _        d| _        d| _        d| _        d| _        d| _	        y )Nr   r     )
r   r-   rK   r   r    formatflagscompressiontransparency_indexdelayr3   s    r   r4   zQGFFrameDescriptorV1.__init__l   sU    $&2::188
"&
r   c                 8   | j                   j                  |       |j                  dt        | j                        z   t        | j                        z   t        | j
                        z   t        | j                        z   t        | j                        z          y Nr   )	r-   r   r   rO   rP   rQ   rR   r   rS   r!   s     r   r   zQGFFrameDescriptorV1.writev   s~    "
dkk?#djj>" d&&'( d--.	/
 tzz?# 	r   c                 &    | j                   dz  dk(  S )Nr   rP   r3   s    r   is_transparentz#QGFFrameDescriptorV1.is_transparent       

T!d**r   c                 ^    |r| xj                   dz  c_         y | xj                   dz  c_         y )Nr   rW   r"   vals     r   rX   z#QGFFrameDescriptorV1.is_transparent   !    JJ$JJJ%Jr   c                 &    | j                   dz  dk(  S )Nr   rW   r3   s    r   is_deltazQGFFrameDescriptorV1.is_delta   rY   r   c                 ^    |r| xj                   dz  c_         y | xj                   dz  c_         y )Nr   rW   r\   s     r   r`   zQGFFrameDescriptorV1.is_delta   r^   r   N)r$   r%   r&   r   r    r4   r   r?   rX   r@   r`   r(   r   r   rK   rK   h   sp    GF + +     + + __   r   rK   c                       e Zd ZdZd Zd Zy)QGFFramePaletteDescriptorV1   c                     t               | _        t        j                  | j                  _        d| j                  _        dgdz  | _        y )Nr   )r   r   r   rF   )r   r-   rd   r   r    palette_entriesr3   s    r   r4   z$QGFFramePaletteDescriptorV1.__init__   s:    $&9AA 23a7r   c                 &   t        | j                        dz  | j                  _        | j                  j	                  |       | j                  D ]@  }|j	                  dt        |d         z   t        |d         z   t        |d         z          B y )Nre   r   r   r   r   )rG   rg   r-   r    r   r   )r"   r#   entrys      r   r   z!QGFFramePaletteDescriptorV1.write   s     !5!56:")) 	EHHS%(|$%(|$ %(|$ 	r   NrI   r(   r   r   rd   rd      s    G8r   rd   c                   T    e Zd ZdZdZd Zd Zed        Zej                  d        Zy)QGFFrameDeltaDescriptorV1rF      c                     t               | _        t        j                  | j                  _        t        j                  | j                  _        d| _        d| _        d| _        d| _        y )Nr   )	r   r-   rk   r   r    lefttoprightbottomr3   s    r   r4   z"QGFFrameDeltaDescriptorV1.__init__   sL    $&7??6==	
r   c                    | j                   j                  |       |j                  dt        | j                        z   t        | j                        z   t        | j
                        z   t        | j                        z          y rU   )r-   r   r   rn   ro   rp   rq   r!   s     r   r   zQGFFrameDeltaDescriptorV1.write   sg    "
tyy>"txx=! tzz?# t{{#	$ 	r   c                 ^    | j                   | j                  | j                  | j                  fS r:   rn   ro   rp   rq   r3   s    r   bboxzQGFFrameDeltaDescriptorV1.bbox   s!    yy$((DJJ;;r   c                 :    |\  | _         | _        | _        | _        y r:   rt   )r"   ru   s     r   ru   zQGFFrameDeltaDescriptorV1.bbox   s    7;4	48TZr   N)
r$   r%   r&   r   r    r4   r   r?   ru   r@   r(   r   r   rk   rk      sB    GF < < 
[[< <r   rk   c                       e Zd ZdZd Zd Zy)QGFFrameDataDescriptorV1r   c                 n    t               | _        t        j                  | j                  _        g | _        y r:   )r   r-   rx   r   datar3   s    r   r4   z!QGFFrameDataDescriptorV1.__init__   s%    $&6>>	r   c                     t        | j                        | j                  _        | j                  j	                  |       |j	                  t        | j                               y r:   )rG   rz   r-   r    r   bytesr!   s     r   r   zQGFFrameDataDescriptorV1.write   s=     ^"
tyy!"r   NrI   r(   r   r   rx   rx      s    G
#r   rx   c                       e Zd ZdZdZd Zy)QGFImageFileQGFzQuantum Graphics File Formatc                     t        d      )Nz"Reading QGF files is not supported)NotImplementedErrorr3   s    r   _openzQGFImageFile._open   s    !"FGGr   N)r$   r%   r&   rO   format_descriptionr   r(   r   r   r~   r~      s    F7Hr   r~   c                      y)zgHelper method used by PIL to work out if it can parse an input file.

    Currently unimplemented.
    Fr(   )prefixs    r   _acceptr      s    
 r   xc                    d}d }|D ]p  }t        |dd      }t        |      D ]S  }|j                  |       |j                          |j	                         j                  d      } | |||       |}|dz  }U r y )Nr   n_framesr   RGB)getattrrangeseekloadcopyconvert)r   images	frame_num
last_frameframenfridxr   s           r   _for_all_framesr      s    IJ 	eZ+: 	CJJsOJJL::<''.Diz*JNI		r   c                   t         j                  j                  | |      }t         j                  j                  ||      }|d   }|r"t         j                  j	                  |d         }	| xs t        |      t        	      k  }
|
r|n	}d}d }|r4|1t        j                  | |      }|j                         }|r| j                  |      }t         j                  j                  ||      }t         j                  j                  ||      }|d   }|r"t         j                  j	                  |d         }| xs t        |      t              k  }|r|n}t        |      t        j                  z   t        |      k  r|}|}}	|}
|}d}|xs ddg| j                  }t        |      }|dxx   dz  cc<   |dxx   dz  cc<   |||||
dS )Nr   FTr   r   re   )ru   graphic_data
image_datause_delta_this_frameuse_raw_this_frame)qmkpainterconvert_requested_formatconvert_image_bytescompress_bytes_qmk_rlerG   r   
differencegetbboxcroprk   r    r>   list)r   r   use_rle
use_deltasformat__kwargs	convertedr   raw_datarle_datar   r   r   ru   diffdelta_framedelta_converteddelta_graphic_datadelta_raw_datadelta_rle_datadelta_use_raw_this_framedelta_image_datas                         r   _compress_imager     s   44UGDI;;229gFL AH;;55l1oF$FHX(F/XJ !Dj,$$UJ7 ||~ **T*K "kkBB;PWXO!$!@!@RY!Z 02N!$!C!CDVWXDY!Z+2{'`c.6ISQ_M`6`$1I~~
 $%(A(H(HHCPZO[1))%="-
'+$ *1*uzz*DzQ1Q1 $  40 r   c                   |d   }t        ||fi |}|d   }	|d   }
|d   }|d   }|d   }|j                         |j                  | <   t        d| dd	d
d|j                         dd|j                         dd       t	               }||_        d|_        |d   |_        |rdnd|_        |j                  j                  dd      |_        |j                  |       |d   rv|
d   }t               }t        t        t         |            |_        t        d| ddd
d|j                         dd|j                         dd       |j                  |       |rZt%               }|	|_        t        d| ddd
d|j                         dd|j                         dd       |j                  |       |j                  |j
                  |j                  d}|d   r?|j)                  dj*                  |j,                  |j.                  |j0                  gi       |j3                  |       t5               }||_        t        d| ddd
d|j                         dd|j                         dd       |j                  |       y )Nr   ru   r   r   r   r   zFrame 3dz base26s 5dd / 04XhFimage_format_byter   r   durationrN   has_palettez palettez delta)rQ   deltarS   r   
delta_rectz data)r   tellrD   vprintrK   r`   rX   rO   rQ   infogetrS   r   rd   r   mapr   rg   rk   ru   updatern   ro   rp   rq   appendrx   rz   )r   r   r   r#   rD   metadatakwargsr   outputsru   r   r   r   r   frame_descriptorpalettepalette_descriptordelta_descriptorframe_metadatadata_descriptors                       r   _write_framer   J  s    YG eZ:6:G6?D>*L&J"#9: !56 (*wwyM$
s2he$S)2779R.RWWYsO1MN+- 4&+#%&9:+=44 "ZZ^^J=2 }q/8: .2#6JG2T-U*F3r((+C0"'')BtBGGIc?RSTU  $ 46 $ 	F3r(&)#.a	"~T"'')CPQRSr" (33!**!''N
 g|!!  ""##	.
  	 OON# /0O%O
s2he$S)2779R.RWWYsO1MN"r   c           
         | j                   j                         }|j                  dg       }|j                  | j                  | j
                  d       |j                  dd      }|rt        nd at        |j                  dg             }t        j                  t        | g|      }g  |fd       t        t                    d	k7  rt        d
      |j                         }t!               }	t              |	_        d   |	_        t        ddd|j                         dd|j                         dd       |	j'                  |       |j                         }
t)        |	j"                        }t        ddd|j                         dd|j                         dd       |j'                  |       t        j                  t*        |d   ||j                  dd      |j                  dd      ||      } ||       |j                         |	_        |j/                  |d       |	j'                  |       |j/                  |
d       |j'                  |       y)z:Helper method used by PIL to write to an output file.
    r   )widthheightverboseFc                       y r:   r(   )_argsr   s     r   <lambda>z_save.<locals>.<lambda>  s    r   append_images)r   c                 :    j                  |j                        S r:   )r   r>   )_idxr   _last_frameframe_sizess      r   r   z_save.<locals>.<lambda>  s    K4F4Fuzz4R r   r   zMismatching sizes on framesr   zGraphics descriptor blockr   r   r   r   r   r   zFrame offsets block
qmk_formatr   Tr   )r   r#   r   r   rD   r   N)encoderinfor   r   r   r   r   printr   r   	functoolspartialr   rG   set
ValueErrorr   r*   r2   r<   r   rB   r   r/   r   )imr#   	_filenamer   r   r   r   for_all_framesgraphics_descriptor_locationgraphics_descriptorframe_offset_locationrD   write_framer   s                @r   _saver     sU    ..%%'K z2.HOObhh"))<= ooi/GU#AF "=>M&&?S]?STN KRS 3{!677 $&779 /1&)+&6#%0^"
)#.a	"~T"'')CPQRSb! GGI./B/N/NOM
#C("'')BtBGGIc?!LM ##L+l:SXZgrgvgv  xD  FJ  hK  U`  Ud  Ud  en  pt  Uu  ER  ]e  fK; +-'')'GG(!,b! GG!1%r   .zimage/)'r   colorsysr   typesr   PILr   r   r   PIL._binaryr   r	   r   r
   r8   qmk.painterr   r   r   r   r*   rB   rK   rd   rk   rx   r~   r   r   r   r   r   register_openrO   register_saveregister_save_allregister_extensionlowerregister_mimer(   r   r   <module>r      sT      , , 6 6 6
K "3 "3P *,  , d .< <D# #"H9&& H| ?F?D6x   L''w ?   L'' /   ++U 3   ,,,2E2E2K2K2M1N.O P   L''6,2E2E2K2K2M1N)O Pr   