@@ -419,6 +419,10 @@ def _open(self) -> None:
419419 self ._mode = "RGBA"
420420 self .pixel_format = "BC1"
421421 n = 1
422+ elif dxgi_format in (DXGI_FORMAT .BC2_TYPELESS , DXGI_FORMAT .BC2_UNORM ):
423+ self ._mode = "RGBA"
424+ self .pixel_format = "BC2"
425+ n = 2
422426 elif dxgi_format in (DXGI_FORMAT .BC3_TYPELESS , DXGI_FORMAT .BC3_UNORM ):
423427 self ._mode = "RGBA"
424428 self .pixel_format = "BC3"
@@ -526,7 +530,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
526530 bitcount = len (im .getbands ()) * 8
527531 pixel_format = im .encoderinfo .get ("pixel_format" )
528532 args : tuple [int ] | str
529- if pixel_format in ("DXT1" , "DXT3" , "BC3" , "DXT5" ):
533+ if pixel_format in ("DXT1" , "BC2" , " DXT3" , "BC3" , "DXT5" ):
530534 codec_name = "bcn"
531535 flags |= DDSD .LINEARSIZE
532536 pitch = (im .width + 3 ) * 4
@@ -538,10 +542,16 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
538542 elif pixel_format == "DXT3" :
539543 fourcc = D3DFMT .DXT3
540544 args = (2 ,)
541- else :
542- fourcc = D3DFMT .DXT5 if pixel_format == "DXT5" else D3DFMT . DX10
545+ elif pixel_format == "DXT5" :
546+ fourcc = D3DFMT .DXT5
543547 args = (3 ,)
544- if fourcc == D3DFMT .DX10 :
548+ else :
549+ fourcc = D3DFMT .DX10
550+ if pixel_format == "BC2" :
551+ args = (2 ,)
552+ dxgi_format = DXGI_FORMAT .BC2_TYPELESS
553+ else :
554+ args = (3 ,)
545555 dxgi_format = DXGI_FORMAT .BC3_TYPELESS
546556 else :
547557 codec_name = "raw"
0 commit comments