Ë
    ÚŠ±j±#  ã                   ó`   — d Z ddlmZmZ ddlmZ dZd„ Zd„ Zdd	„Z	d
„ Z
d„ Zdd„Zdd„Zdd„Zy)z]Utility functions useful for writers or QR Code objects.

DOES NOT belong to the public API.
é    )ÚchainÚrepeaté   )Úconsts)Úget_default_border_sizeÚ
get_borderÚget_symbol_sizeÚcheck_valid_scaleÚcheck_valid_borderÚmatrix_to_linesÚmatrix_iterÚmatrix_iter_verbosec                 ó(   — | \  }}|dkD  r||k(  rdS dS )z±    Returns the default border size (quiet zone) for the provided version.

    :param tuple(int, int) matrix_size: Tuple of width and height of the matrix.
    :rtype: int
    é   é   é   © )Úmatrix_sizeÚwidthÚheights      úP/var/www/io.vulcan-creative.com/venv/lib/python3.12/site-packages/segno/utils.pyr   r      s$   € ð  �M€Eˆ6Ø˜’
˜u¨šˆ1Ð5°AÐ5ó    c                 ó    — |�|S t        | «      S )a&      Returns `border` if not ``None``, otherwise the default border size for
    the provided QR Code.

    :param tuple(int, int) matrix_size: Tuple of width and height of the matrix.
    :param border: The size of the quiet zone or ``None``.
    :type border: int or None

    :rtype: int
    ©r   )r   Úborders     r   r   r       s   € ð Ð'ˆ6ÐQÔ-DÀ[Ó-QÐQr   Nc                 óZ   — |€t        | «      }| \  }}|d|z  z  }|d|z  z  }||z  ||z  fS )aÁ      Returns the symbol size (width x height) with the provided border and
    scaling factor.

    :param tuple(int, int) matrix_size: Tuple of width and height of the matrix.
    :param scale: Indicates the size of a single module (default: 1).
            The size of a module depends on the used output format; i.e.
            in a PNG context, a scaling factor of 2 indicates that a module
            has a size of 2 x 2 pixel. Some outputs (i.e. SVG) accept
            floating point values.
    :type scale: int or float
    :param int border: The border size or ``None`` to specify the
            default quiet zone (4 for QR Codes, 2 for Micro QR Codes).
    :rtype: tuple (width, height)
    r   r   )r   Úscaler   r   r   s        r   r	   r	   .   sK   € ð  €~Ü(¨Ó5ˆØ�M€Eˆ6Ø	ˆQ�‰ZÑ€EØ
ˆa�&‰jÑ€FØ�5‰=˜& 5™.Ð(Ð(r   c                 ó,   — | dk  rt        d| › d�«      ‚y)zˆ    Raises a :py:exc:`ValueError` iff `scale` is negative or zero.

    :param scale: Scaling factor.
    :type scale: float or int
    r   z.The scale must not be negative or zero. Got: "ú"N)Ú
ValueError)r   s    r   r
   r
   F   s&   € ð �‚zÜÐIÈ%ÈÐPQÐRÓSÐSð r   c                 óN   — | �#t        | «      | k7  s| dk  rt        d| › d�«      ‚yy)z    Raises a :py:exc:`ValueError` iff `border` is negative.

    :param int border: Indicating the size of the quiet zone.
    Nr   z8The border must not a non-negative integer value. Got: "r   )Úintr    )r   s    r   r   r   Q   s<   € ð Ðœs 6›{¨fÒ4¸Àº
ÜÐSÐTZÐS[Ð[\Ð]Ó^Ð^ð 9CÐr   c              #   ó¨   K  — ||z  }d}| D ]B  }||}}||z  }|D ]#  }||k7  r|s||f||ff–— |}|dz  }|s|dz  }|}Œ% |sŒ7||f||ff–— d}ŒD y­w)aÞ      Converts the `matrix` into an iterable of ((x1, y1), (x2, y2)) tuples which
    represent a sequence (horizontal line) of dark modules.

    The path starts at the 1st row of the matrix and moves down to the last row.

    :param matrix: An iterable of bytearrays.
    :param x: Initial position on the x-axis.
    :param y: Initial position on the y-axis.
    :param incby: Value to move along the y-axis (default: 1).
    :rtype: iterable of (x1, y1), (x2, y2) tuples
    r   r   Nr   )	ÚmatrixÚxÚyÚincbyÚlast_bitÚrowÚx1Úx2Úbits	            r   r   r   [   sž   è ø€ ð ˆ�J€AØ€HØò ˆØ�AˆBˆØ	ˆU‰
ˆØò 	ˆCØ˜3Š¡sØ˜1�g  A˜wÐ&Ò&Ø�Ø�!‰GˆBÙØ�a‘�Ø‰Hð	ò Ø�q�'˜B ˜7Ð"Ò"Ø‰Hñùs   ‚A AÁAc              #   óv  ‡‡‡K  — t        |«       t        ‰«      Št        ‰«       t        ||«      }|\  Š}dg‰z  }t	        | ‰|z   «      t	        | ||z   «      }}|D ]U  }d|cxk  r|k  rn n| |   n|Št        t        j                  ˆˆˆfd„|D «       «      «      }	t        d‰«      D ]  }
|	–— Œ ŒW y­w)al      Returns an iterator / generator over the provided matrix which includes
    the border and the scaling factor.

    If either the `scale` or `border` value is invalid, a :py:exc:`ValueError`
    is raised.

    :param matrix: An iterable of bytearrays.
    :param tuple(int, int) matrix_size: Tuple of width and height of the matrix.
    :param int scale: The scaling factor (default: ``1``).
    :param int border: The border size or ``None`` to specify the
            default quiet zone (4 for QR Codes, 2 for Micro QR Codes).
    :raises: :py:exc:`ValueError` if an illegal scale or border value is provided
    r   c              3   ó\   •K  — | ]#  }t        d |cxk  r‰k  rn n‰|   nd ‰«      –— Œ% y­w)r   N©r   )Ú.0ÚjÚrr   r   s     €€€r   ú	<genexpr>zmatrix_iter.<locals>.<genexpr>’   s*   øè ø€ Ò'lÐ[\¬°q¸A´~Àµ~¨q°ªtÈ3ÐPU×(VÑ'lùs   ƒ),N)	r   r"   r
   r   ÚrangeÚtupler   Úfrom_iterabler   )r$   r   r   r   r   Ú
border_rowÚwidth_rangeÚheight_rangeÚir)   Úsr2   r   s     `        @@r   r   r   z   sÁ   úè ø€ ô �vÔÜ�‹J€EÜ�eÔÜ˜ VÓ,€FØ�M€Eˆ6Ø�˜‘€JÜ % v g¨u°v©~Ó >ÄÀvÀgÈvÐX^ÉÓ@_�€KØò ˆØ˜aœ &�ˆF�1ŠI¨jˆÜ”E×'Ñ'Õ'lÐ`kÔ'lÓlÓmˆÜ˜˜eÓ$ò 	ˆAØ‹Iñ	ñùs   …B4B9c              #   óØ  ‡ ‡‡	‡
‡‡‡‡‡K  — ddl m} t        |«       t        ‰«      Št	        ‰«       t        ||«      }|\  ŠŠ‰‰k(  Š‰xr ‰dk  Š|j                  ‰‰dd¬«      Š	|j                  ‰	‰‰«       ˆ	ˆˆˆˆ ˆfd„Š
t        | ‰|z   «      t        | ‰|z   «      }}|D ]@  Št        t        j                  ˆ
ˆˆfd„|D «       «      «      }t        d‰«      D ]  }|–— Œ ŒB y­w)	a¨      Returns an iterator / generator over the provided matrix which includes
    the border and the scaling factor.

    This iterator / generator returns different values for dark / light modules
    and therefor the different parts (like the finder patterns, alignment patterns etc.)
    are distinguishable. If this information isn't necessary, use the
    :py:func:`matrix_iter()` function because it is much cheaper and faster.

    If either the `scale` or `border` value is invalid, a py:exc:`ValueError`
    is raised.

    :param matrix: An iterable of bytearrays.
    :param tuple(int, int) matrix_size: Tuple of width and height of the matrix.
    :param int scale: The scaling factor (default: ``1``).
    :param int border: The border size or ``None`` to specify the
            default quiet zone (4 for QR Codes, 2 for Micro QR Codes).
    :raises: :py:exc:`ValueError` if an illegal scale or border value is provided
    r   )Úencoderé   F)Úreserve_regionsÚ
add_timingc                 ó˜  •— d| cxk  r‰k  �r.n t         j                  S d|cxk  r‰	k  �rn t         j                  S ‰|    |   }‰s¨‰|    |   }|dk7  r#t         j                  t         j                  f|   S ‰rY‰	dkD  rT| dk  r‰	dz
  |cxk  r‰	dz
  k  sn ‰dz
  | cxk  r‰dz
  k  r+n n(|dk  r#t         j                  t         j                  f|   S | ‰dz
  k(  r|dk(  rt         j
                  S ‰s*| dk(  rd|cxk  r‰	dz
  k  s-n |dk(  rd| cxk  r‰dz
  k  sn ‰r7| dk(  r|dkD  s
|dk(  r(| dkD  r#t         j                  t         j                  f|   S | dk(  r|dk  s‰s|‰	d	z
  kD  s|dk(  r2| dk  s
‰s+| ‰dz
  kD  r#t         j                  t         j                  f|   S | dk  r|dk  s‰s|‰	dz
  kD  s‰s0| ‰dz
  kD  r(|dk  r#t         j                  t         j                  f|   S | dk  r|dk  s‰s|‰	dz
  kD  s‰s| ‰dz
  kD  r|dk  rt         j                  S t         j                  t         j                  f|   S t         j                  S )
Nr   r   é)   é   é   é   é   é	   é
   )r   ÚTYPE_ALIGNMENT_PATTERN_LIGHTÚTYPE_ALIGNMENT_PATTERN_DARKÚTYPE_VERSION_LIGHTÚTYPE_VERSION_DARKÚTYPE_DARKMODULEÚTYPE_TIMING_LIGHTÚTYPE_TIMING_DARKÚTYPE_FORMAT_LIGHTÚTYPE_FORMAT_DARKÚTYPE_FINDER_PATTERN_LIGHTÚTYPE_FINDER_PATTERN_DARKÚTYPE_SEPARATORÚTYPE_DATA_LIGHTÚTYPE_DATA_DARKÚTYPE_QUIET_ZONE)
r:   r1   ÚvalÚalignment_valÚalignment_matrixr   Úis_microÚ	is_squarer$   r   s
       €€€€€€r   Úget_bitz$matrix_iter_verbose.<locals>.get_bit·   s`  ø€ à�Œ?�F�?ôD ×)Ñ)Ð)ðE  ! Aœ~¨�~ôD ×)Ñ)Ð)ðC ˜‘)˜A‘,ˆCÙà 0°Ñ 3°AÑ 6�Ø  CÒ'Ü"×?Ñ?Ä×AcÑAcÐdÐerÑsÐsÙ ¨¢Ø˜Aš %¨"¡*¨qÔ"<°5¸1±9Ô"<Ø &¨¡¨aÔ <°&¸1±*Õ <ÀÀQÂÜ &× 9Ñ 9¼6×;SÑ;SÐTÐUXÑYÐYà˜ ™
’? q¨A¢vÜ!×1Ñ1Ð1á 1¨¢6¨a°!Ô.?°e¸a±iÔ.?ÀQÈ!ÂVÐPQÐTUÔPbÐX^ÐabÑXbÔPbÙ  q¨A¢v°!°a²%¸QÀ!ºVÈÈAÊÜ×0Ñ0´&×2IÑ2IÐJÈ3ÑOÐOà�Q’˜A šE©(°q¸5À2¹:²~Ø˜Qš A¨¢E±(¸qÀ6ÈAÁ:º~Ü×0Ñ0´&×2IÑ2IÐJÈ3ÑOÐOð �A’˜1˜qš5©°a¸%À!¹)²mÙ$¨¨V°a©Zª¸AÀºEÜ×8Ñ8¼&×:YÑ:YÐZÐ[^Ñ_Ð_ð �A’˜1˜qš5©°a¸%À!¹)²mÙ$¨!¨f°q©jª.¸QÀºUÜ×,Ñ,Ð,Ü×*Ñ*¬F×,AÑ,AÐBÀ3ÑGÐGä×)Ñ)Ð)r   c              3   óD   •K  — | ]  }t         ‰‰|«      ‰«      –— Œ y ­w)Nr/   )r0   r1   r]   r:   r   s     €€€r   r3   z&matrix_iter_verbose.<locals>.<genexpr>ß   s   øè ø€ Ò'ZÈ¬©w°q¸!«}¸e×(DÑ'Zùs   ƒ N)Úsegnor=   r   r"   r
   r   Úmake_matrixÚadd_alignment_patternsr4   r5   r   r6   r   )r$   r   r   r   r=   r8   r9   r)   r;   rZ   r]   r   r:   r[   r\   r   s   ` `      @@@@@@@r   r   r   —   sö   ÿøè ø€ õ( Ü�vÔÜ�‹J€EÜ�eÔÜ˜ VÓ,€FØ�M€Eˆ6Ø˜‘€IØÒ'˜U R™Z€Hà×*Ñ*¨5°&È%Ð\aÐ*ÓbÐØ×"Ñ"Ð#3°U¸FÔC÷$*ñ $*ôL !& v g¨u°v©~Ó >ÄÀvÀgÈvÐX^ÉÓ@_�€KØò ˆÜ”E×'Ñ'Õ'ZÈkÔ'ZÓZÓ[ˆÜ˜˜eÓ$ò 	ˆAØ‹Iñ	ñùs   ‹CC*)r   N)r   )Ú__doc__Ú	itertoolsr   r   Ú r   Ú__all__r   r   r	   r
   r   r   r   r   r   r   r   ú<module>rf      sE   ðñ÷
 $Ý ð1€ò
6òRó)ò0Tò_óó>ô:Jr   