
    7jn7                     P   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 dddd	d
dddddddddddddddddddddddddddddddddddddddddddddddddddddddd
Zd Zd Zd Zd Zd  Zddd!d"Zd#Zd$ Zd%Zd& Zd'Zd( Zd0d)Zd* Zd+ Zd, Zd- Zd. Zd/ Zy)1zAFunctions that help us work with Quantum Painter's file formats.
    N)Path)Template)ImageImageOpsIMAGE_FORMAT_RGB888   Fi   	   )image_formatbpphas_palette
num_colorsimage_format_byteIMAGE_FORMAT_RGB565   i      IMAGE_FORMAT_PALETTET                     IMAGE_FORMAT_GRAYSCALE   )
rgb888rgb565pal256pal16pal4pal2mono256mono16mono4mono2c                 N    dj                  | D cg c]  }|d c}      S c c}w )N|4d)join)valuesis     D/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/painter.py_render_textr-   U   s%    88/1"vY/00/s   "c                 <    t        t        t        |                   S N)r-   rangelen)metadatas    r,   _render_numerationr3   Z   s    c(m,--    c                 D    t        | D cg c]  }||   	 c}      S c c}w r/   )r-   )r2   keyr+   s      r,   _render_valuesr7   ^   s    2A32332s   c                 j   | j                  d      }ddd|d    d|d    g}t        |       dk(  r|j                  d	       n|j                  d
t	        |        dt        | d       dt        | d       ddt        | d       g       g }t        |       D ]c  \  }}|d   s|d   \  }}}}	||z
  |	|z
  z  }
|d   |d   z  }|j                  d|dd|dd|dd|dd|	dd|
dd|ddd|
z  |z  dd       e |r"|j                  d       |j                  |       d j                  |      S )!Nr   z// Image's metadataz// ----------------z
// Width: widthz// Height: heightr   z// Single framez//        Frame: z// Duration(ms): delayz//  Compression: compressionz# >> See qp.h, painter_compression_tz//        Delta: delta
delta_rectz	// Frame 3dz: (, z) - (z) >> r(   /z	 pixels (d   z.2fz%)z// Areas on delta frames
)popr1   appendextendr3   r7   	enumerater)   )r2   sizelinesdeltasr+   vltrbdelta_pxpxs               r,   _render_image_metadatarR   b   s   <<?D 	
T']O$
d8n%&	E 8}&' 	 28 <=>x ABCx GHHklx ABC	
 	 h' 	PDAqW: <JAq!QA!a%(Hgh/B MMIaV3qfBqfE!Br!BuU]^`Taabcefhbiirsv  zB  tB  EG  tG  HK  sL  LN  O  P	P LL34LL 99Ur4   c                 ^   i }d| j                   |   j                         D ]a  \  }}t        t        |            t	        | j
                  |j                  dd            }t        |t              r|j                  }|||<   c dj                  fd|j                         D              S )zEGiven a command name, introspect milc to get the arguments passed in.r   -_rC   c              3   R   K   | ]  \  }}d |j                         d|    yw)z//    z | N)ljust).0arg_nameval
max_lengths      r,   	<genexpr>z#command_args_str.<locals>.<genexpr>   s-     e}xQTvhnnZ89SEBes   $')args_passeditemsmaxr1   getattrargsreplace
isinstancer   namer)   )clicommand_namera   rY   
was_passedrZ   r[   s         @r,   command_args_strrh      s     DJ # = C C E 	*S]3
chh 0 0c :; c4 ((CX	 99eX\XbXbXdeeer4   )font_metadataimage_metadatac                   ||t        d      t        | |      }t        j                  j	                         j                  d      | j                  j                  j                  t        j                  dd| j                  j                  j                        t        |      t        |      | j                  j                  |j                  dd      |d}|K|j!                  dddj#                  d	d
ddj#                  |d   D cg c]  }| c}       g      d       n-| |j!                  dd|t%        |      d       nt        d      |j!                  dt'        |      i       |S c c}w )Nz6Cant generate subs for font and image at the same timez%Yz[^a-zA-Z0-9]rU   rT   )year
input_file	sane_name
byte_countbytes_linesformatgenerator_commandcommand_argsfontrC   z// Font's metadataz// ---------------z// Glyphs: r@   glyphs)generated_type
var_prefixr2   imagegfx)rv   rw   rr   r2   z+Pass metadata for either an image or a fontlicense)
ValueErrorrh   datetimedatetodaystrftimera   inputrd   resubstemr1   render_bytesrq   rb   updater)   rR   render_license)re   	out_bytesri   rj   rf   ra   subsr+   s           r,   generate_subsr      sX    ^%?QRRC.D ##%..t4hhnn))VVOS#((..2E2EF)n#I.((//)11#s;	D  $ 		$$diiM(4K(Lq(LMNO# 		
 		 
	#%!-.~>	
 	 FGGKKN4012K# )Ms   	E1z// Copyright ${year} QMK -- generated source code only, ${generated_type} retains original copyright
// SPDX-License-Identifier: GPL-2.0-or-later

// This file was auto-generated by `${generator_command}` with arguments:
${command_args}
c                 B    t        t              }|j                  |       S r/   )r   license_template
substitute)r   license_txts     r,   r   r      s    +,K!!$''r4   z${license}
#pragma once

#include <qp.h>

extern const uint32_t ${var_prefix}_${sane_name}_length;
extern const uint8_t  ${var_prefix}_${sane_name}[${byte_count}];
c                 B    t        t              }|j                  |       S r/   )r   header_file_templater   )r   
header_txts     r,   render_headerr          ./J  &&r4   z${license}
${metadata}

#include <qp.h>

const uint32_t ${var_prefix}_${sane_name}_length = ${byte_count};

// clang-format off
const uint8_t ${var_prefix}_${sane_name}[${byte_count}] = {
${bytes_lines}
};
// clang-format on
c                 B    t        t              }|j                  |       S r/   )r   source_file_templater   )r   
source_txts     r,   render_sourcer      r   r4   c                     d}t        t        |             D ]D  }||z  dk(  r|dkD  r|t        |       k7  r|dz   }n
|dk(  r|dz   }|dj                  | |         z   }F |j                         S )N r   z
   z   z 0x{0:02X},)r0   r1   rq   rstrip)bytesnewline_afterrI   ns       r,   r   r      s|    E3u: 7}!a!eSZGOE!VEME,,U1X667 <<>r4   c                 b    t        j                  dd|       } t        j                  dd|       } | S )Nz\rr   z[\n]{3,}z\n\n)r   r   )strs    r,   clean_outputr     s+    
&&C
 C
&&gs
+CJr4   c                 6    t        t        | |z  dz              S )zMRescales a byte value to the supplied range, i.e. [0,255] -> [0,maxval].
    g     o@)intround)rZ   maxvals     r,   rescale_byter     s     uS6\E)*++r4   c                    |d   }|d   }|dv rg d}n,t         j                         D ]  \  }}|d   |k(  s|d   g} n |vrt        ddj                  |       d      |dk(  r(t	        j
                  |       } | j                  d	      } | S |d
k(  r5| j                  d	      } | j                  dt        j                  |      } | S |dv r| j                  d	      } | S )z.Convert an image to the requested format.
    r   r
   )r   r   )r   r   r   r   r   zNumber of colors must be: r@   .r   RGBr   P)palettecolors)r   r   )	valid_formatsr^   r{   r)   r   	grayscaleconvertr   ADAPTIVE)imrq   ncolorsr
   validrU   fmts          r,   convert_requested_formatr     s   
 \"G.)L II"
 $))+ 	FAs>"l2\*+		 e5dii6F5GqIJJ //#ZZ I 
/	/ZZZZU^^GZD
 I	 
G	GZZIr4   c                 Z    | dz	  dz  dz  |dz	  dz  z   }|dz	  dz  dz  |dz	  dz  z   }||gS )Nr      r   r   r    )rN   grO   msblsbs        r,   	rgb_to565r   @  sJ    FTMaAFTM
2CFTMaAFTM
2C:r4   c                 *   |d   }|d   }t        t        j                  |            }t        dt        j                  |      z        }t        j                  t        j                  |      dz        }| j                  \  }}|dk7  r||z  |dz
  z   |z  }	n||z  |z  }	|dk(  r| j                  dd      }
t        |
      }d	}g }t        |	      D ]W  }d}t        |      D ]4  }||z  |z   }||k  s|t        |
|   |dz
        t        ||z        z  z  }6 |j                  |       Y n|d
k(  r| j                  dd      }
t        |
      }g }| j                         }t        d|dz  d      D ](  }|j                  ||dz      ||dz      ||dz      f       * g }t        |	      D ]P  }d}t        |      D ]-  }||z  |z   }||k  s||
|   |dz
  z  t        ||z        z  z  }/ |j                  |       R |dk(  rn| j                  dd      }| j                  dd      }| j                  dd      }d	}t        |||      D cg c]  \  }}}t        |||      D ]  }|  }}}}}|dk(  rf| j                  dd      }| j                  dd      }| j                  dd      }d	}t        |||      D cg c]  \  }}}|||fD ]  }|  }}}}}t              |	k7  rt        dt        |       d|	       |fS c c}}}}w c c}}}}w )zUConvert the supplied image to the equivalent bytes required by the QMK firmware.
    r   r
   r   r   r   r   rawRNr   r   r   r   r   GBr   zWrong byte count, was z, expected )r   mathlog2ceilrH   tobytesr1   r0   r   rE   
getpalettezipr   	Exception)r   rq   r   r
   shifterpixels_per_bytebytes_per_pixelr9   r:   expected_byte_countimage_bytesimage_bytes_lenr   	bytearrayxbyter   byte_offsetpalredgreenbluerN   r   rO   s                            r,   convert_image_bytesr   F  s   
 \"G.)L$))G$%G!dii001Oii		' 2Q 67OggOUF1 %?Q3FGO[#fn>//jj,k* 	*+ 	#AD?+ l/1A50<K0H'TU+#VZ]^_bi^iZj#jkD	l
 T"	# 
/	/jj,k* mmoq'A+q) 	AANNCAJAE
CAJ?@	A 	*+ 	#AD?+ c/1A50K$<!$LQTUVY`U`Qa#abD	c
 T"	# ,,jj$

5#&zz%% ),S%)>^^gaA9UVXY[\K]^4T^T^	^,,jj$

5#&zz%% ),S%)>UUgaAAqRS9U4TUTU	U
9~,,0Y0@L_K`abbY! _ Vs   
L
=L
c                   	
 d	g 
g }d}	
fd	
fd}t        dt        |       dz         D ]Q  }|t        |       k(  rdnd}|s%| |   }|j                  |       t        |      dk  r=	rRt        dj	                  t        |            dd	j                  |D cg c]  }d
j	                  |       c}      d       |rU|d   |d   k7  rd}|rt        |      dk(  s|s |rt        |      nt        |      dz
          |d          |d   g}d}t        |      dk\  r>|d   |d   k(  r3d}t        |      dkD  r! ||dt        |      dz
          |d   |d   g}4t        |      dk(  s|sF ||       g }d}T 
S c c}w )NFc                 x    r&t        ddj                  t        |             d|        j                  |        y )NzAppending byte:z	0x{0:02X}=)printrq   r   rE   )c
debug_dumpoutputs    r,   append_bytez+compress_bytes_qmk_rle.<locals>.append_byte  s0    #[%7%7A%?aHar4   c                     dt        |       z          rRt        dj                  t        |             ddj                  | D cg c]  }dj                  |       c}      d       j	                  |        y c c}w )N   zAppending {0} byte(s):[r@   {0:02X}])r1   r   rq   r)   rF   )rN   er   r   r   s     r,   append_rangez,compress_bytes_qmk_rle.<locals>.append_range  sj    C#a&L!*11#a&93		hiJjcd9K[K[\]K^Jj@kmpqa Kks   A<r   r   TzTemp buffer state {0:3d} bytes:r   r@   r   r      r   )r0   r1   rE   r   rq   r)   )r   temprepeatr   r   endr   r   r   r   r   s           @@@r,   compress_bytes_qmk_rler     s   JFDF
 1c)nq() 3y>)du!AKKN4yA~3::3t9EsDIItxVyopW`WgWghiWjVyLz|  ABx48#SY#-CI#d)a-@DG$Rz4yA~$r(d2h"6t9q= aTQ!89 Hd2h/D4yC3T";< M+ Wzs   F)r   )__doc__r|   r   r   pathlibr   stringr   PILr   r   r   r-   r3   r7   rR   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r,   <module>r      sw     	   
 .! .! /! /! /! /! 1! 1! 1! 1!AGT1
.4(Vf& 48 *Z (
 '
  '
,&RP f/r4   