)EjBdZddlmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZGd d eZGd d eZGd deZd7dZ d8d9dZd:dZd:dZGddeZd;d ZGd!d"ejZGd#d$ejejZGd%d&eZGd'd(eZGd)d*ejZ d 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 ImageFileceZdZdZdS)FormatrN)__name__ __module__ __qualname__JPEGDC:\PYTHON\MyICR_Suite\python\Lib\site-packages\PIL/BlpImagePlugin.pyr r ,s DDDrr ceZdZdZdZdZdS)EncodingrN)r r r UNCOMPRESSEDDXTUNCOMPRESSED_RAW_BGRArrrrr0s L CrrceZdZdZdZdZdS) AlphaEncodingrrN)r r rDXT1DXT3DXT5rrrrr6s D D DDDrriintreturntuple[int, int, int]c<|dz dzdz|dz dzdz|dzdzfS)N r?rr)r s r unpack_565r)<s2 "W  "a1f_$:QX!O KKrFdatabytesalphabool1tuple[bytearray, bytearray, bytearray, bytearray]c Tt|dz}ttttf}t|D]N}|dz}tjd||\}}}t |\} } } t |\} } }tdD]}tdD]}|dz}|dz }d}|dkr| | | }}}n|dkr| | |}}}n||dkrA||kr"d| z| zdz}d| z| zdz}d| z|zdz}nN| | zdz}| | zdz}| |zdz}n5|dkr/||kr"d| z| zdz}d| z| zdz}d|z| zdz}nd \}}}}|r ||||||g|||||gP|S) E input: one "row" of data (i.e. will produce 4*width pixels) zCV}}*-*- Ao%1&$DD'' B'' Bq - -A1XX - -(qya<< "b!qAA\\ "b!qAA\\Vb[Q.Vb[Q.Vb[Q."WN"WN"WN\\Vb[Q.Vb[Q.Vb[Q.%/ 1a-FMM1aA,////FMM1a),,,,? - -D Jrc t|dz}ttttf}t|D]i}|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}|dkr| | | }}}n\|dkr| ||}}}nO|d kr"d | z| zd z}d | z|zd z}d | z|zd z}n'|d kr!d | z| zd z}d |z| zd z}d |z| zd z}||||||gŌِk|S)r0z<8BblockrAr?r@coderBrCrDrErFrGrHhighr alphacode_indexrJ color_coderKrLrMs r decode_dxt3r[ys? YY"_F ;; Y[[)++ >CV}}(,(, BS38^$!%//+E5!<<$T5"55'' B'' Bq , ,AD1XX , ,#$q519"2) D!GAADHAR"a1q519o5= ?? "b!qAA1__ "b!qAA1__R"*AR"*AR"*AA1__R"*AR"*AR"*AA q!Ql++++5 , ,< Jrc t|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 |dkr| dz | d zdzz}n | |dz z dz}|d kr|}nJ|d kr|}nA||krd|z |z|d z |zzdz}n&|dkrd }n|dkrd}nd|z |z|d z |zzdz}| dd|z|zzz dz}|d kr|||}}}n\|d kr|||}}}nO|dkr"d|z|zdz}d|z|zdz}d|z|zdz}n'|dkr!d|z|zdz}d|z|zdz}d|z|zdz}||||||g+?*|S)zG input: one "row" of data (i.e. will produce 4 * width pixels) rPzrVa0a1rA alphacode1 alphacode2r?r@rWrBrCrDrErFrGrHr rY alphacoderJrZrKrLrMs r decode_dxt5rdsB YY"_F ;; Y[[)++ >CV}}9,9, BS38^$#E511B!%22!WQ1 -aB?47b=Q !WQ1 - +E5!<<$T5"55'' B'' Bq( ,( ,A1XX' ,' ,"#q1uqy/"b((!+!>$ FII$**!+r!1zQ$6N OII!+"0D!E MI>>AA!^^AA"WWi-2-Q"0DDJAA!^^AA!^^AAi-2-Q"0DDJA"a1q519o5= ?? "b!qAA1__ "b!qAA1__R"*AR"*AR"*AA1__R"*AR"*AR"*AA q!Ql++++O' ,( ,T JrceZdZdS)BLPFormatErrorN)r r rrrrrfrfsDrrfprefixc,|dS)N)BLP1BLP2) startswith)rgs r_acceptrls   / 0 00rc"eZdZdZdZdZddZdS) BlpImageFilez Blizzard Mipmap Format BLPzBlizzard Mipmap Formatr"Nonec|jJ|jd|_t|js&dt |j}t |t jd|jdd}|jdkr8t jd|jdddk}nt jd|jdd}t jd|jdddk}t jd|jdd}|jdtj t jd |jd |_ |jdkr`t jd|jdd}|jdtj |||f}d }n||||f}d }|j }|rd nd|_ tj|d|jz||g|_dS)Nr2zBad BLP magic HM$ Q88;q@E#]4aAA!DN GLLBK ( ( (]5$',,q//::  : }T47<<??;;A>H GLLBK ( ( (51DFF5.ADF*##%%$/VV% _Wfty.@&$OOP rNr"rp)r r r__doc__formatformat_descriptionrrrrrnrnsEF1 Q Q Q Q Q Qrrnc\eZdZdZddZejddZdd Zdd Z ddZ ddZ dS)_BLPBaseDecoderTbufferImage.DecoderInputr"tuple[int, int]c ||n)#tj$r}d}t ||d}~wwxYwdS)NzTruncated BLP file)r) _read_header_loadr8errorOSError)rrers rrz_BLPBaseDecoder.decode*sc &       JJLLLL| & & &&C#,,A % &us(+AA  ArpcdSNrrs rrz_BLPBaseDecoder._load3s rctjd|d|_tjd|d|_dS)N<16I@)r8r~ _safe_read_offsets_lengthsrs rrz_BLPBaseDecoder._read_header7sD fdoof.E.EFF  fdoof.E.EFF rlengthr!r+cH|jJtj|j|Sr)fdr r)rrs rrz_BLPBaseDecoder._safe_read;s%w"""#DGV444rlist[tuple[int, int, int, int]]cg}tdD]`} tjd|d\}}}}n#tj$rYnwxYw|||||fa|S)N<4Br2)r7r8r~rrappend)rr<r rMrLrKrJs r _read_palettez_BLPBaseDecoder._read_palette?ss % %A #]5$//!2D2DEE 1a<     JJ1a| $ $ $ $ s-AAApaletter,r-r6c`t}t||jd} t jd|d\}n#tj$rYn4wxYw||\}}}} |||f} |r| | fz } || q|S)NrT> <     JAq!Q"#QA aT  KKNNN  s*A))A;:A;N)rrr"rr)rr!r"r+)r"r)rrr,r-r"r6) r r r _pulls_fdrabcabstractmethodrrrrrrrrrr'sI     GGGG5555rrceZdZddZddZdS) BLP1Decoderr"rpc|j\|_|_}|jtjkr|dS|jdkrp|jdvrA|}|||}||dSdt|j}t|dt|j}t|)Nr)r2r'zUnsupported BLP encoding zUnsupported BLP compression ) r _compression _encodingr r_decode_jpeg_streamrr set_as_rawr}rf)rr,rr*rs rrzBLP1Decoder._load\s37904>5   + +  $ $ & & & & &  ! # #~'',,..w66%%%%%H$t~2F2FHH$S)))Gdn1E1EGGC %% %rcddlm}tjd|d\}||}|jJ||jd|jz ||jd}||z}|t|}tj |j |j dkrX|jdj}t!|t"sJ|jd|ddfg|_||dd dS) Nr) JpegImageFilerRr2rCMYK)rrxBGR)JpegImagePluginrr8r~rrrtellrrr_decompression_bomb_checkrmoderr isinstancetuple_replacerconverttobytes)rrjpeg_header_size jpeg_headerr*imagers rrzBLP1Decoder._decode_jpeg_streamnsT222222$mD$//!2D2DEE oo&677 w"""  a(47<<>>9:::t}Q/00T! gdmm,, ' 333 :  :a=%DdE** * ***Q-00tAw6G0HHIEJ  e,,4466>>>>>rNr)r r rrrrrrrr[s<&&&&$??????rrceZdZddZdS) BLP2Decoderr"rpcV|j\|_|_}|_|}|jJ|j|jd|jdkr|jtj kr| ||}n|jtj krt}|jtjkrd|jjdzdzdz}t#|jjdzdzD]-}t'|||D]}||z }.n`|jtjkrb|jjdzdzdz}t#|jjdzdzD],}t-||D]}||z }-n|jtjkrb|jjdzdzdz}t#|jjdzdzD],}t1||D]}||z }-nrdt3|j}t5|dt3|j}t5|d t3|j}t5|||dS) Nrrrr2r1rPzUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )rrr_alpha_encodingrrrrrrrrr6rrstatexsizer7ysizerNrrr[rrdr}rfr)rr,rr*linesizeybrrs rrzBLP2Decoder._loadsIMF4>5$2F$$&&w"""  T]1%&&&   ! !~!666w668<// {{'=+=== $ 01 4:Q>H#TZ%5%9a$?@@&&!,T__X-F-F!N!N&&A AIDD&&)]-??? $ 01 4:R?H#TZ%5%9a$?@@&&!,T__X-F-F!G!G&&A AIDD&&)]-??? $ 01 4:R?H#TZ%5%9a$?@@&&!,T__X-F-F!G!G&&A AIDD&&UT=Q8R8RTTC(---Dd4>.B.BDD$S)))GT$2C-D-DFFC %% % rNr)r r rrrrrrrs(,,,,,,rrc"eZdZdZd dZd dZd S) BLPEncoderTr"r+c Rd}|jJ|jdd}tt|dzD]5}||dz|dzdz\}}}}|t jd||||z }6t|dkr|dz }t|dk|S)Nrrwr2rris)im getpaletter7r5r8pack)rr*rr rKrLrMrJs r_write_palettezBLPEncoder._write_palettesw"""'$$VV44s7||q()) 3 3A Q!a%1!45JAq!Q FKq!Q22 2DD$ii'!! K D$ii'!! rbufsizer!tuple[int, int, bytes]c |}dt|z}tjd|gdR}|jJ|jj\}}|tjd||zgdRz }||z }t |D]F}t |D]4}|tjd|j||fz }5Gt|d|fS)Nr)rrrrrrrrrrrrrrrrr)rr5r8rrrr7getpixel) rr palette_datarr*whyxs rencodezBLPEncoder.encodes**,,  3|#4#44{668Y888w"""w|1  FAE8Y8888 q D DA1XX D D D$'*:*:Aq6*B*BCCC D4yy!T!!rN)r"r+)rr!r"r)r r r _pushes_fdrrrrrrrsAJ    """"""rrr Image.Imagerz IO[bytes]filename str | bytesrpc Z|jdkrd}t||jddkrdnd}|||jJ|t jdd|jjd krdnd }|dkr)|t jd |n|t jd tj |t jd ||t jd d |t jd d |t jd g|j R|dkrP|t jdd|t jdd tj ||tj dd|j zd |jgdS)NPzUnsupported BLP image mode blp_versionBLP1rirjrrrrwrzr sC>#"""""      W   w      G   LLLL %66666r2222jCCCCL     (   1111(Q(Q(Q(Q(Q9&(Q(Q(QV11111cgy2111h"?"?"?"?"?/"?"?"?J-----/---`"""""$"""BTTTT6L'w???,f555v{+++v{+++L'///uj)))))r