
    \
jt0                        d Z ddlZddlmZ ddlmZmZ ej        Zej	        Z
ej        Zej        Zej        ZdZdZdZdZ G d d	ej                  Z G d
 dej                  Zedz  Z G d dej                  Z G d dej                  Z G d dej                  Zd Zd Z G d de          Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&dS ) zDecoder for BMP files.

Currently supports version 3 and 4 bitmaps with BI_RGB and BI_BITFIELDS
encoding.  Alpha channel is supported for 32-bit BI_RGB only.
    N)	ImageData)ImageDecoderImageDecodeException         c                   4    e Zd ZdZdefdefdefdefdefgZdS )BITMAPFILEHEADERr   bfTypebfSizebfReserved1bfReserved2	bfOffBitsN)__name__
__module____qualname___pack_WORDDWORD_fields_     Q/DATA/AppData/hermes/venv/lib/python3.11/site-packages/pyglet/image/codecs/bmp.pyr
   r
   @   sB        F	4	5			eHHHr   r
   c                   X    e Zd ZdZdefdefdefdefdefdefdefd	efd
efdefdefgZdS )BITMAPINFOHEADERr   biSizebiWidthbiHeightbiPlanes
biBitCountbiCompressionbiSizeImagebiXPelsPerMeterbiYPelsPerMeter	biClrUsedbiClrImportantN)r   r   r   r   r   LONGr   r   r   r   r   r   r   J   sr        F	5	D	T	T	t	% 		D!	D!	e	5!HHHr   r   	   c                       e Zd ZdZdefdefdefdefdefdefdefd	efd
efdefdefdefdefdefdefdefdefdefdefdefgZdS )BITMAPV4HEADERr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   
bV4RedMaskbV4GreenMaskbV4BlueMaskbV4AlphaMask	bV4CSTypebV4EndpointsbV4GammaRedbV4GammaGreenbV4GammaBlueN)	r   r   r   r   r   r'   r   CIEXYZTRIPLEr   r   r   r   r*   r*   \   s        F	5	D	T	T	t	% 		D!	D!	e	5!	u				e	&		% 	)HHHr   r*   c                   (    e Zd ZdZdefdefdefgZdS )	RGBFieldsr   redgreenblueN)r   r   r   r   r   r   r   r   r   r6   r6   u   s0        F		%	HHHr   r6   c                   4    e Zd ZdZdefdefdefdefgZd ZdS )RGBQUADr   rgbBluergbGreenrgbRedrgbReservedc                 0    d| j         | j        | j        fz  S )Nz<%d, %d, %d>)r>   r=   r<   selfs    r   __repr__zRGBQUAD.__repr__   s    dmT\ JJJr   N)r   r   r   r   BYTEr   rC   r   r   r   r;   r;   ~   sT        F	D	T	4		HK K K K Kr   r;   c                     t          j        | j                  |z   }t          j        t	          | j                                      |                    S N)ctypes	addressofcontentspointertypefrom_address)ptroffsetaddresss      r   ptr_addrP      sA    s|,,v5G>$s|,,99'BBCCCr   c                    |t          j        |          z   t          |           k    rt          d          t	          t          j        |           |          }t          j        |t          j        |                    j        S )NzBMP file is truncated)	rG   sizeoflenr   rP   rJ   castPOINTERrI   )bufferrN   rK   rM   s       r   	to_ctypesrW      si    d###c&kk11"#:;;;
&.((&
1
1C;sFN40011::r   c                       e Zd Zd Zd ZdS )BMPImageDecoderc                     dgS )Nz.bmpr   rA   s    r   get_file_extensionsz#BMPImageDecoder.get_file_extensions   s	    xr   c           
      .   |st          |d          }|                                }t          j        |          }|d d         dk    rt	          d|p|z            t          |dt                    }|j        }t          j        t                    }t          ||t                    }||j
        z   }	|j
        t          j        t                    k     rt	          d|p|z            |j        }
|j        |
dk    s|j        dk    rt	          d|p|z            dk     rd	pd}t                    |j        }|t           t"          fvrt	          d
|p|z            d}|j        }|dk    r|
dz   dz  }t          j        t(          }n|dk    r|
dz   dz  }t          j        t*          }n|dk    rt          j        |
}t,          }n|dk    r|
dz  }t          j        t0          }n|dk    r|
dz  }t          j        t2          }ns|dk    rW|
dz  }|t           k    rt4          }t          j        nI|t"          k    rt0          }t          j        n*t	          d
|p|z            t	          d||p|fz            |dz   dz  }|t          j                  z  |dk     rW|t           k    rL|j        pd|z  }t          ||	t:          |z            }t          ||z  z            } ||||
||          S |dk    r2|t           k    r't          ||z  z            } ||d |
||          S |t"          k    r|j
        t          j        t<                    k    r,t          ||t<                    }|j        }|j         }|j!        }nG|t          j        t                    z   }t          ||tD                    }|j#        }|j$        }|j%        } G fddt          j&                  }t          |||          j'        } ||||||
||          S d S )Nrbr   s   BMzNot a Windows bitmap file: %rr   zUnsupported BMP type: %rr   z#BMP file has corrupt parameters: %rzUnsupported compression: %r               r       zUnsupported bit count %d: %rc                   *    e Zd ZdZd z  z  fgZdS )*BMPImageDecoder.decode.<locals>._BitsArrayr   dataN)r   r   r   r   r   )	bits_typeheightpacked_widths   r   
_BitsArrayrg      s-        Y5>?r   rl   )(openreadrG   c_bufferr   rW   r
   r   rR   r   r   r   r   r   absr!   BI_RGBBI_BITFIELDSr    c_ubytedecode_1bitdecode_4bitdecode_8bitc_uint16decode_bitfieldsdecode_24bitdecode_32bit_rgbc_uint32r%   r;   r*   r+   r,   r-   r6   r7   r8   r9   LittleEndianStructurerh   )rB   filefilenamebytesrV   file_headerbits_offsetinfo_header_offsetinfo_headerpalette_offsetwidth
pitch_signcompressionclr_usedbitcountpitchdecoderpalettebitsr_maskg_maskb_maskfields_offsetfieldsrl   ri   rj   rk   s                            @@@r   decodezBMPImageDecoder.decode   s    	($''D		''!9&/83CtDF F F  +;<<!+#]+;<<(:<LMM+k.@@.> ? ???&*h.>$?A A A #%A::+.!33&59ITJL L LaZ&B+!
V!/v|444&-1ATBD D D )q==QY1$EI!GG]]QY1$EI!GG]]IE!GG^^AIEI&GG^^AIEI"GG^^AIEf$$*"N		,,*"O		*1X5EFH H H '.(H<L1MMO O O b i 8 88b==[F22",@xH(8JKKGV[&5>@ @D74%
KKK^^v 5 5V[&,*?@B BD74ufeZHHHL((!V]>%B%BBB'0B(68 8$/$1$0 2M"233!4"6=)DD        V9   
 V[*==BD74 &%= = =) )(r   N)r   r   r   r[   r   r   r   r   rY   rY      s7          h= h= h= h= h=r   rY   c                 0   |dz  dz   dz  dz  }t          j        ||z  z              }d}| D ]U}	|	D ]P}
t          d          D ]>}||
dz  dz	           }|j        ||<   |j        ||dz   <   |j        ||dz   <   |dz  }|
dz  }
?QVt          ||d	|||z            S )
Nr   r_   ir   r`      r   r   RGB)rG   rs   ranger>   r=   r<   r   )r   r   r   rj   r   r   	rgb_pitchrV   irowpacked_rgbs                r   rt   rt     s    A:"d*a/In 2366F	A   	 	F1XX  v}23Jq	 #q1u #q1uQ1	 UFE6:	3IJJJr   c                    |dz  dz   dz  dz  }t          j        ||z  z              }d}| D ]H}	|	D ]C}
|
dz  dz	  |
dz  fD ]3}||         }|j        ||<   |j        ||dz   <   |j        ||dz   <   |dz  }4DIt          ||d	|||z            S )
Nr   r   r      ra      r   r   rG   rs   r>   r=   r<   r   )r   r   r   rj   r   r   r   rV   r   r   r   indexr   s                r   ru   ru     s    A:"d*a/In 2366F	A   	 	F!D=Q.=  enJq	 #q1u #q1uQ	 UFE6:	3IJJJr   c                     |dz  }t          j        ||z  z              }d}| D ]8}	|	D ]3}
||
         }|j        ||<   |j        ||dz   <   |j        ||dz   <   |dz  }49t          ||d|||z            S Nr   r   r   r   r   r   )r   r   r   rj   r   r   r   rV   r   r   r   r   s               r   rv   rv   !  s    	In 2366F	A   	 	E%.C
F1ILF1q5MKF1q5MFAA	 UFE6:	3IJJJr   c                     t          j        ||z  z              }t          j        || t          |                     t	          ||d|||z            S )NBGRrG   rs   memmoverS   r   r   r   r   rj   r   r   rV   s          r   ry   ry   0  sM    n/22F
N64V---UFE6:3EFFFr   c                     t          j        ||z  z              }t          j        || t          |                     t	          ||d|||z            S )NBGRAr   r   s          r   rz   rz   5  sM    n/22F
N64V---UFFFJ4FGGGr   c                     | sdS d}d|z  | z  s|dz  }d|z  | z  d}| |z	  |z	  r|dz  }| |z	  |z	  |d|z
  z
  }|dk     rd| fS |dfS )Nr   r   r`   r   )maskshiftshift_upss       r   	get_shiftr   :  s     q EEzT! 
 EzT!  H5=X
% A 5=X
%  	XA1uu1"u!tr   c                 ~   t          |          \  }}	t          |          \  }
}t          |          \  }}dt          | d                   z  }t          j        ||z  z              }d}| D ]<}|D ]7}||z  |z	  |	z  ||<   ||z  |
z	  |z  ||dz   <   ||z  |z	  |z  ||dz   <   |dz  }8=t	          ||d|||z            S r   )r   rS   rG   rs   r   )r   r   r   r   r   rj   r   r   r_shift1r_shift2g_shift1g_shift2b_shift1b_shift2r   rV   r   r   r   s                      r   rx   rx   N  s    "6**Hh"6**Hh"6**HhCQLL In 2366F	A   	 	F&X5AF1I!F?x78CF1Q3K!F?x78CF1Q3KFAA		 UFE6:	3IJJJr   c                       t                      gS rF   )rY   r   r   r   get_decodersr   a  s    r   c                      g S rF   r   r   r   r   get_encodersr   d  s    Ir   )'__doc__rG   pyglet.imager   pyglet.image.codecsr   r   rs   rD   rw   r   r{   r   c_int32r'   
FXPT2DOT30rq   BI_RLE8BI_RLE4rr   r|   r
   r   r4   r*   r6   r;   rP   rW   rY   rt   ru   rv   ry   rz   r   rx   r   r   r   r   r   <module>r      sg  H   " " " " " " B B B B B B B B~~_
	


    v3       v3     A~    V1   2    ,   
K 
K 
K 
K 
Kf* 
K 
K 
KD D D; ; ;l= l= l= l= l=l l= l= l=\K K K K K KK K KG G G
H H H
  (K K K&      r   