Click or drag to resize
Bitmap block compression

CanvasBitmap supports block compressed bitmaps. These can be loaded from a DDS file, or created with CreateFromBytes(ICanvasResourceCreator, Byte, Int32, Int32, DirectXPixelFormat).

Block compressed bitmaps are great for bitmap heavy applications (such as games) because they take up less memory and can be drawn more efficiently. A block compressed bitmap uses up to 1/8th of the memory of an uncompressed bitmap. As a result, the GPU needs to access much less memory when drawing the bitmap, resulting in faster drawing.

About Block Compression

Block compression is different to the compression employed by PNG or JPG files. Compressed file formats are stored compressed but when they are loaded by Win2D they are decompressed into a bitmap with a format such as DirectXPixelFormat::B8G8R8A8UIntNormalized, which uses 32 bits (4 bytes) per pixel. So a 256x256 bitmap would take up 256 * 256 * 4 = 262,144 bytes.

A block compressed bitmap uses 8 or 16 bytes (depending on the format -- more on this later) to store a block of 4x4 pixels. So in this case a 256x256 bitmap would take up 256 * 256 / (4*4) * 8 = 32,768 bytes, or 256 * 256 / (4*4) * 16 = 65,536 bytes. That's up to 8 times smaller! Since block compression is supported directly by the GPU hardware, the bitmap can be kept compressed in memory and drawn directly from the compressed format without ever having to completely uncompress it.

Win2D supports three block compressed formats. The table below describes these formats, along with an uncompressed format for comparison.

DirectXPixelFormatSize of 4x4 bitmapSize of 256x256 bitmapAlpha
BC1Unorm8 bytes32,768 bytes1 bit
BC2Unorm16 bytes65,536 bytes4 bit
BC3Unorm16 bytes65,536 bytes~8 bit (compressed)
B8G8R8A8UintNormalized64 bytes262,144 bytes8 bit
BC1Unorm, BC2Unorm and BC3Unorm differ mostly in how they support alpha. BC1 supports only 1-bit alpha. BC2 supports each pixel in the block having a unique 4-bit alpha value. BC3 compresses the alpha values.

See Direct2D Block Compression documentation and Direct3D Block Compression documentation for more information about how block compression works.

Authoring DDS files

Block compressed images can be saved in DDS files. Although these can be generated by plugins to applications such as Photoshop or Paint.NET, care must be taken to ensure that the resulting file is saved with premultiplied alpha. Win2D will load any DDS file containing a BC1Unorm, BC2Unorm or BC3Unorm image and assume that it is authored with premultiplied alpha.

If you are authoring a C++ project then you can use the Image Content Pipeline to convert the image, as described on MSDN.

Alternatively, you can use texconv.exe from texconv.exe can be built using the DirectXTex_Desktop_2015.sln solution. The following command converts "smoke.png" to a BC3Unorm with premultiplied alpha:

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png