Example #1
0
        public bool CanHandleRequest(TexImage image, IRequest request)
        {
            switch (request.Type)
            {
            case RequestType.Loading:
                LoadingRequest loader = (LoadingRequest)request;
                return(loader.Mode == LoadingRequest.LoadingMode.FilePath && Path.GetExtension(loader.FilePath).Equals(".dds"));

            case RequestType.Compressing:
                CompressingRequest compress = (CompressingRequest)request;
                return(SupportFormat(compress.Format) && SupportFormat(image.Format));

            case RequestType.Export:
                return(SupportFormat(image.Format) && Path.GetExtension(((ExportRequest)request).FilePath).Equals(".dds"));

            case RequestType.Rescaling:
                RescalingRequest rescale = (RescalingRequest)request;
                return(rescale.Filter == Filter.Rescaling.Box || rescale.Filter == Filter.Rescaling.Bicubic || rescale.Filter == Filter.Rescaling.Bicubic || rescale.Filter == Filter.Rescaling.Nearest);

            case RequestType.Decompressing:
                return(SupportFormat(image.Format));

            case RequestType.PreMultiplyAlpha:
            case RequestType.MipMapsGeneration:
            case RequestType.NormalMapGeneration:
                return(true);

            default:
                return(false);
            }
        }
Example #2
0
        public bool CanHandleRequest(TexImage image, IRequest request)
        {
            switch (request.Type)
            {
            case RequestType.Loading:
            {
                LoadingRequest    loader = (LoadingRequest)request;
                FREE_IMAGE_FORMAT format = FreeImage.GetFIFFromFilename(loader.FilePath);
                return(format != FREE_IMAGE_FORMAT.FIF_UNKNOWN && format != FREE_IMAGE_FORMAT.FIF_DDS);        // FreeImage can load DDS texture, but can't handle their mipmaps..
            }

            case RequestType.Export:
            {
                ExportRequest     export = (ExportRequest)request;
                FREE_IMAGE_FORMAT format = FreeImage.GetFIFFromFilename(export.FilePath);
                return(format != FREE_IMAGE_FORMAT.FIF_UNKNOWN && format != FREE_IMAGE_FORMAT.FIF_DDS);
            }

            case RequestType.Rescaling:
                RescalingRequest rescale = (RescalingRequest)request;
                return(rescale.Filter != Filter.Rescaling.Nearest);

            case RequestType.SwitchingChannels:
            case RequestType.GammaCorrection:
            case RequestType.Flipping:
            case RequestType.FlippingSub:
            case RequestType.Swapping:
                return(true);

            default:
                return(false);
            }
        }
Example #3
0
        /// <summary>
        /// Rescales the specified image.
        /// </summary>
        /// <param name="image">The image.</param>
        /// <param name="libraryData">The library data.</param>
        /// <param name="request">The request.</param>
        private void Rescale(TexImage image, PvrTextureLibraryData libraryData, RescalingRequest request)
        {
            int width  = request.ComputeWidth(image);
            int height = request.ComputeHeight(image);

            Log.Info("Rescaling to " + width + "x" + height + " ...");

            EResizeMode filter;

            switch (request.Filter)
            {
            case Filter.Rescaling.Bilinear:
                filter = EResizeMode.eResizeLinear;
                break;

            case Filter.Rescaling.Bicubic:
                filter = EResizeMode.eResizeCubic;
                break;

            case Filter.Rescaling.Nearest:
                filter = EResizeMode.eResizeNearest;
                break;

            default:
                filter = EResizeMode.eResizeCubic;
                break;
            }

            Utilities.Resize(libraryData.Texture, (uint)width, (uint)height, (uint)image.Depth, filter);
            UpdateImage(image, libraryData);

            // Updating image data
            image.Rescale(width, height);
        }
Example #4
0
        /// <summary>
        /// Rescales the specified image.
        /// </summary>
        /// <param name="image">The image.</param>
        /// <param name="libraryData">The library data.</param>
        /// <param name="request">The request.</param>
        /// <exception cref="TexLibraryException">Rescaling failed</exception>
        private void Rescale(TexImage image, DxtTextureLibraryData libraryData, RescalingRequest request)
        {
            int width  = request.ComputeWidth(image);
            int height = request.ComputeHeight(image);

            Log.Debug("Rescaling to " + width + "x" + height + " ...");

            TEX_FILTER_FLAGS filter;

            switch (request.Filter)
            {
            case Filter.Rescaling.Bilinear:
                filter = TEX_FILTER_FLAGS.TEX_FILTER_LINEAR;
                break;

            case Filter.Rescaling.Bicubic:
                filter = TEX_FILTER_FLAGS.TEX_FILTER_CUBIC;
                break;

            case Filter.Rescaling.Box:
                filter = TEX_FILTER_FLAGS.TEX_FILTER_FANT;
                break;

            case Filter.Rescaling.Nearest:
                filter = TEX_FILTER_FLAGS.TEX_FILTER_POINT;
                break;

            default:
                filter = TEX_FILTER_FLAGS.TEX_FILTER_FANT;
                break;
            }

            ScratchImage scratchImage = new ScratchImage();
            HRESULT      hr           = Utilities.Resize(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, width, height, filter, scratchImage);

            if (hr != HRESULT.S_OK)
            {
                Log.Error("Rescaling failed: " + hr);
                throw new TextureToolsException("Rescaling failed: " + hr);
            }

            // Freeing Memory
            if (image.DisposingLibrary != null)
            {
                image.DisposingLibrary.Dispose(image);
            }

            // Updating image data
            image.Rescale(width, height);

            libraryData.Image      = scratchImage;
            libraryData.DxtImages  = libraryData.Image.GetImages();
            libraryData.Metadata   = libraryData.Image.metadata;
            image.DisposingLibrary = this;

            UpdateImage(image, libraryData);
        }
Example #5
0
        /// <summary>
        /// Rescales the specified image.
        /// </summary>
        /// <remarks>
        /// The MipmapCount will be reset to 1 after this operation
        /// </remarks>
        /// <param name="image">The image.</param>
        /// <param name="libraryData">The library data.</param>
        /// <param name="rescale">The rescale.</param>
        private void Rescale(TexImage image, FreeImageTextureLibraryData libraryData, RescalingRequest rescale)
        {
            int width  = rescale.ComputeWidth(image);
            int height = rescale.ComputeHeight(image);

            Log.Info("Rescaling image to " + width + "x" + height + " with " + rescale.Filter + " ...");

            FIBITMAP[] newTab;

            if (image.Dimension == TexImage.TextureDimension.Texture3D) // in case of 3D Texture, we must rescale each slice of the top mipmap level
            {
                newTab = new FIBITMAP[image.ArraySize * image.FaceCount * image.Depth];
                int curDepth;

                int nbSubImageWithMipMapPerArrayMemeber = 0; // calculating the number of sub images we have to jump to reach the next top level mipmap of the next array member
                curDepth = image.Depth;
                for (int i = 0; i < image.MipmapCount; ++i)
                {
                    nbSubImageWithMipMapPerArrayMemeber += curDepth;
                    curDepth = curDepth > 1 ? curDepth >>= 1 : curDepth;
                }

                int ct = 0;
                for (int j = 0; j < image.ArraySize; ++j)
                {
                    for (int i = 0; i < image.Depth; ++i)
                    {
                        newTab[ct] = FreeImage.Rescale(libraryData.Bitmaps[i + j * nbSubImageWithMipMapPerArrayMemeber], width, height, (FREE_IMAGE_FILTER)rescale.Filter);
                        ++ct;
                    }
                }
            }
            else
            {
                newTab = new FIBITMAP[image.ArraySize];
                int ct = 0;
                for (int i = 0; i < libraryData.Bitmaps.Length; i += image.MipmapCount)
                {
                    newTab[ct] = FreeImage.Rescale(libraryData.Bitmaps[i], width, height, (FREE_IMAGE_FILTER)rescale.Filter);
                    ++ct;
                }
            }

            for (int i = 0; i < libraryData.Bitmaps.Length; ++i)
            {
                FreeImage.Unload(libraryData.Bitmaps[i]);
            }

            libraryData.Bitmaps = newTab;
            image.Data          = FreeImage.GetBits(newTab[0]);

            // Updating image data
            image.Rescale(width, height);

            int rowPitch, slicePitch;

            Tools.ComputePitch(image.Format, width, height, out rowPitch, out slicePitch);

            image.RowPitch    = rowPitch;
            image.SlicePitch  = slicePitch;
            image.MipmapCount = 1;
            image.DataSize    = image.SlicePitch * image.ArraySize * image.FaceCount * image.Depth;
        }