U
    Pe0                     @   s  d Z ddlmZmZmZ dZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dd Z"dd Z#dd Z$d d! Z%d"d# Z&G d$d% d%e'Z(G d&d' d'e)Z*G d(d) d)e+Z,e-d*krdd+l.Z.e/e.j0dkre1d, e.2d e.j0dd+ D ]Z3e1d-e3 z e,e3d.Z4e1e4 e45d/ W nZ e6k
r Z7 ze1d0e7 W 5 d+Z7[7X Y n. e*k
r Z7 ze1d1e7 W 5 d+Z7[7X Y nX q&d+S )2a  
DDS File library
================

This library can be used to parse and save DDS
(`DirectDraw Surface <https://en.wikipedia.org/wiki/DirectDraw_Surface>`)
files.

The initial version was written by::

    Alexey Borzenkov (snaury@gmail.com)

All the initial work credits go to him! Thank you :)

This version uses structs instead of ctypes.


DDS Format
----------

::

    [DDS ][SurfaceDesc][Data]

    [SurfaceDesc]:: (everything is uint32)
        Size
        Flags
        Height
        Width
        PitchOrLinearSize
        Depth
        MipmapCount
        Reserved1 * 11
        [PixelFormat]::
            Size
            Flags
            FourCC
            RGBBitCount
            RBitMask
            GBitMask
            BBitMask
            ABitMask
        [Caps]::
            Caps1
            Caps2
            Reserved1 * 2
        Reserverd2

.. warning::

    This is an external library and Kivy does not provide any support for it.
    It might change in the future and we advise you don't rely on it in your
    code.

    )packunpackcalcsize            i   i   i   i   @   i  @ i   i   i   i    i @  i   i    iDXT iDXT1iDXT2iDXT3iDXT4iDXT5c                 C   sp   | t krdS | tkrdS | tkr$dS | tkr0dS | tkr<dS | dkrHdS | dkrTd	S | d
kr`dS | dkrldS d S )N	s3tc_dxt1	s3tc_dxt2	s3tc_dxt3	s3tc_dxt4	s3tc_dxt5r   rgbar   alphar   	luminance   luminance_alphaDDS_DXT1DDS_DXT2DDS_DXT3DDS_DXT4DDS_DXT5dxt r   4/tmp/pip-unpacked-wheel-xzebddm3/kivy/lib/ddsfile.py
dxt_to_strc   s$    r   c                 C   sp   | dkrt S | dkrtS | dkr$tS | dkr0tS | dkr<tS | dkrHdS | dkrTd	S | d
kr`dS | dkrldS d S )Nr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
str_to_dxtw   s$    r   c                 C   s   | |  |  S Nr   )valbr   r   r   align_value   s    r#   c                 C   s   | |@ |kS r    r   )r!   flr   r   r   check_flags   s    r%   c                 C   sP   t d| d } t d|d }|tkr0| | d S |ttttfkrL| | d S dS )Nr   r   r      )maxr   r   r   r   r   )whr   r   r   r   dxt_size   s    r+   c                       s$   e Zd Z fddZdd Z  ZS )	QueryDictc                    sZ   z|  |W S  tk
rT   ztt| |W  Y S  tk
rN   t|Y nX Y nX d S r    )__getitem__KeyErrorsuperr,   __getattr__AttributeError)selfattr	__class__r   r   r0      s    zQueryDict.__getattr__c                 C   s   |  || d S r    )__setitem__)r2   r3   valuer   r   r   __setattr__   s    zQueryDict.__setattr__)__name__
__module____qualname__r0   r8   __classcell__r   r   r4   r   r,      s   	r,   c                   @   s   e Zd ZdS )DDSExceptionN)r9   r:   r;   r   r   r   r   r=      s   r=   c                       sv   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ee	e
Zdd Zdd ZeeeZ  ZS )DDSFile))sizer   )flagsr   )heightr   )widthr   )pitchOrLinearSizer   )depth   )mipmapCount   )pf_size   )pf_flags   )	pf_fourcc   )pf_rgbBitCount   )pf_rBitMask   )pf_gBitMask   )pf_bBitMask   )pf_aBitMask   )caps1   )Zcaps2   Nc                    sb   t t|   d| _d | _t  | _}d| _g | _g | _	tj
D ]\}}d||< q>|r^| | d S )Nr   )r/   r>   __init___dxt_fmtr,   metacountimagesimages_sizefieldsload)r2   filenamer^   fieldindexr4   r   r   r[      s    
zDDSFile.__init__c              	   C   s  || _ t|d}| }W 5 Q R X |d d dkrJtd|d d d}t|}td}|dd|  |d| d   }}t||krtdt||}| j}t	j
D ]\}	}
||
 ||	< q|j|krtd|j|f |j|krtd	|j|f t|jttB tB tB std
t|jts0tdd| _t|jtrft|jttB s^td|j| _t|jt}t|jt}t|jt}d }d } }}|s|s|r|j}|r|rtd|rd}np|r|sd}n^|r|sd}nL|r|rd}n:t|jtr:|j }|t!t"t#t$t%fkrBtdntd|rft&|dd }t&||j' d}t|jt(r|dkr||j) }nt*|j'|j)|}|j'}|j)}| j+}| j,}t-| jD ]}|dkrt&|| d| }nt*|||}|d | ||d   }}t||k rtd| |.||f |.| |dkrP|dkrP qpt/d|d }t/d|d }qt|dkrtdt|| jk rtd|| _0d S )Nrbr   s   DDS zInvalid magic header {}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIzTruncated header inz&Invalid header size (%d instead of %d)z+Invalid pixelformat size (%d instead of %d)zNot enough flagszNot a DDS texturer   zInvalid mipmap without flagsr   zFile have RGB and Luminancer   r   zUnsupported FOURCCzUnsupported format specifiedr   )r   r   r   r   zTruncated image for mipmap %dzNo images availablezNot enough images)1rd   openreadr=   formatr   lenr   r^   r>   rb   r?   rH   r%   r@   	DDSD_CAPSDDSD_PIXELFORMAT
DDSD_WIDTHDDSD_HEIGHTrX   DDSCAPS_TEXTUREr_   DDSD_MIPMAPCOUNTDDSCAPS_COMPLEXDDSCAPS_MIPMAPrF   rJ   DDPF_RGBDDPF_ALPHAPIXELSDDPF_LUMINANCErN   DDPF_FOURCCrL   r   r   r   r   r   r#   rB   DDSD_LINEARSIZErA   r+   r`   ra   rangeappendr(   r\   )r2   rd   fddatafmtZfmt_sizerH   headerr^   namerf   ZhasrgbZhasalphaZhasluminancebppr   blockZpitchr?   r)   r*   r`   ra   iimager   r   r   rc      s    "






zDDSFile.loadc              	   C   s   t | jdkrtdttj}t| }t| }| j	j
}g }tdD ]0}||krn|||| d}nd}|| qLt|d8}	|	d |	td|  | jD ]}
|	|
 qW 5 Q R X d S )Nr   zNo images to save   wbzDDS rh   )rh   )rm   r`   r=   dictr>   rb   listkeysvaluesr^   getr{   rf   r|   rj   writer   )r2   rd   rb   Zfields_keysZfields_indexZmgetr   idxr7   r}   r   r   r   r   save(  s"    


zDDSFile.savec           
      C   s,  |dkst |dkst |dks$t |dks0t |dks<t | j}| j}t|dkr|dksbt | D ]}	d||	< qj|| _td|_td|_d|_	t
tB tB tB |_||_||_t|_| jtO  _t||_d|_d|_d|_d|_d	|_|d
kr`dst |dkst | j	tO  _	d|_d|_d|_d|_d|_|dkr| j	tO  _	d	|_nf| j	tO  _	|dkrt|_nF|dkrt|_n4|dkrt |_n"|dkrt!|_n|dkrt"|_|#| nV|t|kst || jkst |#| | jt$O  _| jt%t&B O  _t||_'d S )N    )rgbr   dxt1dxt2dxt3dxt4dxt5r   rh   ri   i   i      l      ~ )r   r   Tr   r   r   r   r   r   )(AssertionErrorr^   r`   rm   r   r]   r   r?   rH   rJ   rn   ro   rp   rq   r@   rB   rA   rr   rX   rz   rC   rN   rP   rR   rT   rV   rv   rw   ry   r   rL   r   r   r   r   r|   rs   rt   ru   rF   )
r2   levelr   r   rB   rA   r~   r^   r`   kr   r   r   	add_image>  sp    












zDDSFile.add_imagec                 C   s   d| j | j| jt| jf S )Nz3<DDSFile filename=%r size=%r dxt=%r len(images)=%r>)rd   r?   r   rm   r`   r2   r   r   r   __repr__  s       zDDSFile.__repr__c                 C   s   | j }|j|jfS r    )r^   rB   rA   )r2   r^   r   r   r   	_get_size  s    zDDSFile._get_sizec                 C   s   | j |d |d d d S )Nr   r   )rB   rA   )r^   update)r2   r?   r   r   r   	_set_size  s    zDDSFile._set_sizec                 C   s
   t | jS r    )r   r\   r   r   r   r   _get_dxt  s    zDDSFile._get_dxtc                 C   s   t || _d S r    )r   r\   )r2   r   r   r   r   _set_dxt  s    zDDSFile._set_dxt)N)r9   r:   r;   rb   r[   rc   r   r   r   r   r   propertyr?   r   r   r   r<   r   r   r4   r   r>      s   gF
r>   __main__Nz,Usage: python ddsfile.py <file1> <file2> ...z=== Loading)rd   zbleh.ddszERR>zDDS>)8__doc__structr   r   r   rn   rq   rp   Z
DDSD_PITCHro   rs   rz   Z
DDSD_DEPTHrw   ry   rv   rx   rt   rr   ru   ZDDSCAPS2_CUBEMAPZDDSCAPS2_CUBEMAP_POSITIVEXZDDSCAPS2_CUBEMAP_NEGATIVEXZDDSCAPS2_CUBEMAP_POSITIVEYZDDSCAPS2_CUBEMAP_NEGATIVEYZDDSCAPS2_CUBEMAP_POSITIVEZZDDSCAPS2_CUBEMAP_NEGATIVEZZDDSCAPS2_VOLUMEZDDS_DXTNr   r   r   r   r   r   r   r#   r%   r+   r   r,   	Exceptionr=   objectr>   r9   sysrm   argvprintexitrd   Zddsr   IOErrorer   r   r   r   <module>   sl   9	 k



