K i@dZddlmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZGd d eZGd d eZGd deZd%dZ d& d'dZd(dZd(dZGddeZd)dZGddejZGddej4ej6ZGddeZGddeZGddej>Z d*d Z!e jDejFeee jHejFd!e jJd"ee jJd#ee jLejFe!e jNd$e y)+a Blizzard Mipmap Format (.blp) Jerome Leclanche The contents of this file are hereby released in the public domain (CC0) Full text of the CC0 license: https://creativecommons.org/publicdomain/zero/1.0/ BLP1 files, used mostly in Warcraft III, are not fully supported. All types of BLP2 files used in World of Warcraft are supported. The BLP file structure consists of a header, up to 16 mipmaps of the texture Texture sizes must be powers of two, though the two dimensions do not have to be equal; 512x256 is valid, but 512x200 is not. The first mipmap (mipmap #0) is the full size image; each subsequent mipmap halves both dimensions. The final mipmap should be 1x1. BLP files come in many different flavours: * JPEG-compressed (type == 0) - only supported for BLP1. * RAW images (type == 1, encoding == 1). Each mipmap is stored as an array of 8-bit values, one per pixel, left to right, top to bottom. Each value is an index to the palette. * DXT-compressed (type == 1, encoding == 2): - DXT1 compression is used if alpha_encoding == 0. - An additional alpha bit is used if alpha_depth == 1. - DXT3 compression is used if alpha_encoding == 1. - DXT5 compression is used if alpha_encoding == 7. ) annotationsN)IntEnum)BytesIO)IO)Image ImageFileceZdZdZy)FormatrN)__name__ __module__ __qualname__JPEGX/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.pyr r ,s Drr ceZdZdZdZdZy)EncodingrN)r r r UNCOMPRESSEDDXTUNCOMPRESSED_RAW_BGRArrrrr0sL CrrceZdZdZdZdZy) AlphaEncodingrrN)r r rDXT1DXT3DXT5rrrrr6s D D Drrc<|dz dzdz|dz dzdz|dzdzfS)N r?rr)is r unpack_565r&<s2 "W  "a1f_$:QX!O KKrc t|dz}ttttf}t|D]/}|dz}tjd||\}}}t |\} } } t |\} } }tdD]}tdD]}|dz}|dz }d}|dk(r| | | }}}n|dk(r| | |}}}nx|dk(r@||kDr"d| z| zdz}d| z| zdz}d| z|zdz}nL| | zdz}| | zdz}| |zdz}n3|dk(r.||kDr"d| z| zdz}d| z| zdz}d|z| zdz}nd \}}}}|r||j |g||j g2|S) E input: one "row" of data (i.e. will produce 4*width pixels) zCV}*- Ao%11&$D' B' Bq -A1X -(qya< "b!qA\ "b!qA\Vb[Q.Vb[Q.Vb[Q."WN"WN"WN\Vb[Q.Vb[Q.Vb[Q.%/ 1aFMM1aA,/FMM1a),? - -*-X Jrc &t|dz}ttttf}t|D]M}|dz}|||dz}tjd|}tjd|d\}}tjd|d\} t |\} } } t |\} }}tdD]}d}tdD]}d|z|zd z}||}|rd}|dz}nd }|d z}|d z}| d d|z|zzz d z}|dk(r| | | }}}nY|dk(r| ||}}}nM|d k(r"d | z| zd z}d | z|zd z}d | z|zd z}n&|d k(r!d | z| zd z}d |z| zd z}d |z| zd z}||j |gP|S)r(z<8Br?r@rArBhighr%alphacode_indexrD color_coderErFrGs r decode_dxt3rUys Y"_F ; Y[)+ >CV}(, BS38$!!%/++E5!<$$T5"5' B' Bq ,AD1X ,#$q519"2) D!GADHAR"a1q519o5= ? "b!qA1_ "b!qA1_R"*AR"*AR"*A1_R"*AR"*AR"*AA q!Ql+5 , ,(,T Jrc zt|dz}ttttf}t|D]}|dz}|||dz}tjd|\}}tjd|d}|d|ddzz|ddzz|dd zz} |d |d dzz} tjd |d\} } tjd |d\} t | \}}}t | \}}}tdD])}tdD]}dd|z|zz}|dkr | |z dz}n|dk(r| dz | d zdzz}n | |dz z dz}|d k(r|}nF|d k(r|}n>||kDrd|z |z|d z |zzdz}n$|dk(rd }n|dk(rd}nd|z |z|d z |zzdz}| dd|z|zzz dz}|d k(r|||}}}nY|d k(r|||}}}nM|dk(r"d|z|zdz}d|z|zdz}d|z|zdz}n&|dk(r!d|z|zdz}d|z|zdz}d|z|zdz}||j |g,|S)zG input: one "row" of data (i.e. will produce 4 * width pixels) rJzr?r@rArBr%rS alphacoderDrTrErFrGs r decode_dxt5r^s Y"_F ; Y[)+ >CV}9, BS38$##E51B!!%2!WQ1 -aB?47b=Q !WQ1 - ++E5!<$$T5"5' B' Bq( ,A1X' ,"#q1uqy/"b(!+!>$ FI$*!+r!1zQ$6N OI!+"0D!E MI>A!^A"Wi-2-Q"0DDJA!^A!^Ai-2-Q"0DDJA"a1q519o5= ? "b!qA1_ "b!qA1_R"*AR"*AR"*A1_R"*AR"*AR"*AA q!Ql+O' ,( ,#9,v Jrc eZdZy)BLPFormatErrorN)r r rrrrr`r`srr`c$|jdS)N)BLP1BLP2) startswith)prefixs r_acceptrfs   / 00rc eZdZdZdZdZddZy) BlpImageFilez Blizzard Mipmap Format BLPzBlizzard Mipmap Formatc&|jjd|_t|js#dt |j}t |t jd|jjdd}|jdk(r6t jd|jjdddk7}nt jd|jjdd}t jd|jjdddk7}t jd|jjdd}|jjdtjt jd |jjd |_ |jdk(rdt jd|jjdd}|jjdtj|||f}d }n||f}d }|jj}|rd nd|_ tj|d|j z||g|_y)Nr*zBad BLP magic HMM$ Q8;q@E#]]4aA!DN GGLLBKK (]]5$'',,q/:  :: }}T477<<?;A>H GGLLBKK (51DF5.ADF**##%$V% __Wftyy.@&$OP rNreturnNone)r r r__doc__formatformat_descriptionrrrrrhrhsF1QrrhcjeZdZdZd dZej d dZd dZd dZ d dZ d dZ y)_BLPBaseDecoderTc |j|jy#tj$r}d}t ||d}~wwxYw)NzTruncated BLP file)r) _read_header_loadr0errorOSError)rbufferers rr|z_BLPBaseDecoder.decode)sH &     JJL|| &&C#,A % &s #A AA cyNrrs rrz_BLPBaseDecoder._load2s rctjd|jd|_tjd|jd|_y)N<16I@)r0rw _safe_read_offsets_lengthsrs rrz_BLPBaseDecoder._read_header6s8 fdoof.EF  fdoof.EF rc^|jJtj|j|Sr)fdr r)rlengths rrz_BLPBaseDecoder._safe_read:s)ww"""##DGGV44rcg}tdD]B} tjd|jd\}}}}|j ||||fD|S#tj$rY|SwxYw)N<4Br*)r/r0rwrrappend)rr6r%rGrFrErDs r _read_palettez_BLPBaseDecoder._read_palette>szs %A #]]5$//!2DE 1a JJ1a| $  %  <<   s*AA-,A-c<t}t|j|jd} t j d|j d\}||\}}}} |||f} |r| | fz } |j| Q#tj$rY|SwxYw)Nr !JAq!Q"#QAaT  KKN<<    s'BBBN)rz$bytes | Image.SupportsArrayInterfacerztuple[int, int]r)rintrbytes)rlist[tuple[int, int, int, int]])rrr4boolrr.) r r r _pulls_fdr|abcabstractmethodrrrrrrrrrr&sSI   G56?C rrceZdZddZddZy) BLP1Decoderc|j\|_|_}|jtjk(r|j y|jdk(re|jdvr4|j }|j||}|j|ydt|j}t|dt|j}t|)Nr)r*r#zUnsupported BLP encoding zUnsupported BLP compression ) r _compression _encodingr r_decode_jpeg_streamrr set_as_rawrvr`)rr4rr3rs rrzBLP1Decoder._load[s379904>5    +  $ $ &   ! #~~',,.w6%1$t~~2F1GH$S))0dnn1E0FGC % %rcddlm}tjd|j d\}|j |}|j J|j |j d|j jz |j |jd}||z}|t|}tj|j|jdk(rU|jdj}t!|t"sJ|jdj%|ddfg|_|j'|j)dj+d y) Nr) JpegImageFilerLr*rCMYK)rrqBGR)JpegImagePluginrr0rwrrrtellrrr_decompression_bomb_checkrmoderr isinstancetuple_replacerconverttobytes)rrjpeg_header_size jpeg_headerr3imagers rrzBLP1Decoder._decode_jpeg_streamms2$mmD$//!2DE oo&67 ww"""  a(477<<>9:t}}Q/0T!gdm, '' 3 :: ::a=%%DdE* ****Q-00tAw6G0HIEJ  e,446>rNr)r r rrrrrrrrZs &$?rrceZdZddZy) BLP2Decoderc|j\|_|_}|_|j }|j J|j j |jd|jdk(rB|jtjk(r|j||}n4|jtjk(rt}|jtjk(rp|jj dzdzdz}t#|jj$dzdzD]'}t'|j)||D]}||z } )n|jtj*k(rn|jj dzdzdz}t#|jj$dzdzD]&}t-|j)|D]}||z } (n|jtj.k(rn|jj dzdzdz}t#|jj$dzdzD]&}t1|j)|D]}||z } (nidt3|j}t5|dt3|j}t5|d t3|j}t5||j7|y) Nrrrr*r)rJzUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )rrr_alpha_encodingrrrxrrrrrr.rrstatexsizer/ysizerHrrrUrr^rvr`r)rr4rr3linesizeybrrs rrzBLP2Decoder._loadsIMF4>5$2F$$&ww"""  T]]1%&    !~~!6!66w68<</ {''=+=+== $ 0 01 4:Q>H#TZZ%5%5%9a$?@&!,T__X-F!N&A AID&&))]-?-?? $ 0 01 4:R?H#TZZ%5%5%9a$?@&!,T__X-F!G&A AID&&))]-?-?? $ 0 01 4:R?H#TZZ%5%5%9a$?@&!,T__X-F!G&A AID&&8T=Q=Q8R7STC(---d4>>.B-CD$S))-T$2C2C-D,EFC % % rNr)r r rrrrrrrs,rrc eZdZdZddZddZy) BLPEncoderTc 8d}|jJ|jjdd}tt|dzD]1}||dz|dzdz\}}}}|t j d||||z }3t|dkr|dz }t|dkr|S)Nrrpr*rris)im getpaletter/r-r0pack)rr3rr%rErFrGrDs r_write_palettezBLPEncoder._write_palettesww"""''$$VV4s7|q() 3A Q!a%15JAq!Q FKKq!Q2 2D 3$i'! K D$i'! rc |j}dt|z}tjd|gd}|jJ|jj \}}|tjd||zgdz }||z }t |D]F}t |D]6}|tjd|jj||fz }8Ht|d|fS)Nr)rrrrrrrrrrrrrrrrr)rr-r0rrrr/getpixel) rbufsize palette_datarr3whyxs rencodezBLPEncoder.encodes**,  3|#44{{668Y8ww"""ww||1  FAE8Y88 q DA1X D D$''*:*:Aq6*BCC D D4y!T!!rN)rr)rrrztuple[int, int, bytes])r r r _pushes_fdrrrrrrrsJ "rrc b|jdk7r d}t||jjddk(rdnd}|j ||j J|j t jdd|j jd k(rdnd }|dk(r&|j t jd |n|j t jd tj|j t jd ||j t jd d |j t jd d |j t jd g|j|dk(rJ|j t jdd|j t jdd tj||tjdd|jzd |jgy)NPzUnsupported BLP image mode blp_versionBLP1rbrcrkrrprzrss>#  W w  G L %6 6666r2jCL ( 1'Q9&&'QT1cggy221h"?/"?J-/-`"$$"BT6L''w?,,f5v{+v{+L''/uj)r