Exemple #1
0
        public void compressImage(java.awt.image.BufferedImage image, DXTCompressionAttributes attributes,
                                  java.nio.ByteBuffer buffer)
        {
            if (image == null)
            {
                String message = Logging.getMessage("nullValue.ImageIsNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }
            if (attributes == null)
            {
                String message = Logging.getMessage("nullValue.AttributesIsNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }
            if (buffer == null)
            {
                String message = Logging.getMessage("nullValue.BufferNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }

            ColorBlock4x4       colorBlock          = new ColorBlock4x4();
            ColorBlockExtractor colorBlockExtractor = this.getColorBlockExtractor(image);

            BlockDXT3           dxt3Block      = new BlockDXT3();
            BlockDXT3Compressor dxt3Compressor = new BlockDXT3Compressor();

            int width  = image.getWidth();
            int height = image.getHeight();

            for (int j = 0; j < height; j += 4)
            {
                for (int i = 0; i < width; i += 4)
                {
                    colorBlockExtractor.extractColorBlock4x4(attributes, i, j, colorBlock);
                    dxt3Compressor.compressBlockDXT3(colorBlock, attributes, dxt3Block);

                    AlphaBlockDXT3 dxtAlphaBlock = dxt3Block.getAlphaBlock();
                    buffer.putLong(dxtAlphaBlock.alphaValueMask);

                    BlockDXT1 dxtColorBlock = dxt3Block.getColorBlock();
                    buffer.putShort((short)dxtColorBlock.color0);
                    buffer.putShort((short)dxtColorBlock.color1);
                    buffer.putInt((int)dxtColorBlock.colorIndexMask);
                }
            }
        }
Exemple #2
0
        /**
         * Compress the 4x4 color block into a DXT2/DXT3 block using 16 4 bit alpha values, and four colors. This method
         * compresses the color block exactly as a DXT1 compressor, except that it guarantees that the DXT1 block will use
         * four colors.
         * <p/>
         * Access to this method must be synchronized by the caller. This method is frequently invoked by the DXT
         * compressor, so in order to reduce garbage each instance of this class has unsynchronized properties that are
         * reused during each call.
         *
         * @param colorBlock the 4x4 color block to compress.
         * @param attributes attributes that will control the compression.
         * @param dxtBlock   the DXT2/DXT3 block that will receive the compressed data.
         * @throws ArgumentException if either <code>colorBlock</code> or <code>dxtBlock</code> are null.
         */
        public void compressBlockDXT3(ColorBlock4x4 colorBlock, DXTCompressionAttributes attributes, BlockDXT3 dxtBlock)
        {
            if (colorBlock == null)
            {
                String message = Logging.getMessage("nullValue.ColorBlockIsNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }
            if (attributes == null)
            {
                String message = Logging.getMessage("nullValue.AttributesIsNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }
            if (dxtBlock == null)
            {
                String message = Logging.getMessage("nullValue.DXTBlockIsNull");
                Logging.logger().severe(message);
                throw new ArgumentException(message);
            }

            // The DXT3 color block is compressed exactly like the DXT1 color block, except that the four color palette is
            // always used, no matter the ordering of color0 and color1. At this stage we only consider color values,
            // not alpha.
            this.dxt1Compressor.compressBlockDXT1(colorBlock, attributes, dxtBlock.colorBlock);

            // The DXT3 alpha block can be compressed separately.
            this.compressBlockDXT3a(colorBlock, dxtBlock.alphaBlock);
        }