Exemplo n.º 1
0
        /// <summary>
        /// Compresses a 4x4 block of pixels.
        /// </summary>
        /// <param name="rgba">The rgba values of the 16 source pixels.</param>
        /// <param name="mask">The valid pixel mask.</param>
        /// <param name="block">Storage for the compressed DXT block.</param>
        /// <param name="flags">Compression flags.</param>
        public static unsafe void CompressMasked(byte* rgba, int mask, byte* block, SquishFlags flags)
        {
            // fix any bad flags
            flags = FixFlags(flags);

            if ((flags & (SquishFlags.BC1 | SquishFlags.BC2 | SquishFlags.BC3 | SquishFlags.BC4 | SquishFlags.BC5)) != 0)
            {
                CompressMaskedBC(rgba, mask, block, flags);
                return;
            }

            // get the block locations
            byte* colourBlock = block;
            byte* alphaBock = block;
            if ((flags & (SquishFlags.Dxt3 | SquishFlags.Dxt5)) != 0)
                colourBlock = block + 8;

            // create the minimal point set
            ColourSet colours = new ColourSet(rgba, mask, flags);

            // check the compression type and compress colour
            if (colours.GetCount() == 1)
            {
                // always do a single colour fit
                SingleColourFit fit = new SingleColourFit(colours, flags);
                fit.Compress(colourBlock);
            }
            else if ((flags & SquishFlags.ColourRangeFit) != 0 || colours.GetCount() == 0)
            {
                // do a range fit
                RangeFit fit = new RangeFit(colours, flags);
                fit.Compress(colourBlock);
            }
            else
            {
                // default to a cluster fit (could be iterative or not)
                ClusterFit fit = new ClusterFit(colours, flags);
                fit.Compress(colourBlock);
            }

            // compress alpha separately if necessary
            if ((flags & SquishFlags.Dxt3) != 0)
                AlphaBlock.CompressAlphaDxt3(rgba, mask, alphaBock);
            else if ((flags & SquishFlags.Dxt5) != 0)
                AlphaBlock.CompressAlphaDxt5(rgba, mask, alphaBock);
        }