예제 #1
0
파일: DxtTexLib.cs 프로젝트: thuskey/xenko
        /// <summary>
        /// Convert the specified image.
        /// </summary>
        /// <param name="image">The image.</param>
        /// <param name="libraryData">The library data.</param>
        /// <param name="request">The decompression request</param>
        /// <exception cref="TextureToolsException">Decompression failed</exception>
        private void Convert(TexImage image, DxtTextureLibraryData libraryData, ConvertingRequest request)
        {
            // TODO: temp if request format is SRGB we force it to non-srgb to perform the conversion. Will not work if texture input is SRGB
            var outputFormat = request.Format.IsSRgb() ? request.Format.ToNonSRgb() : request.Format;

            Log.Debug($"Converting texture from {(PixelFormat)libraryData.Metadata.format} to {outputFormat}");

            var scratchImage = new ScratchImage();
            var hr           = Utilities.Convert(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, (DXGI_FORMAT)outputFormat, TEX_FILTER_FLAGS.TEX_FILTER_BOX, 0.0f, scratchImage);

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

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

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

            // adapt the image format based on desired output format
            ChangeDxtImageType(libraryData, (DXGI_FORMAT)request.Format);

            UpdateImage(image, libraryData);
        }
예제 #2
0
파일: DxtTexLib.cs 프로젝트: tiomke/paradox
        public bool CanHandleRequest(TexImage image, IRequest request)
        {
            switch (request.Type)
            {
            case RequestType.Loading:
                LoadingRequest loader = (LoadingRequest)request;
                return(loader.Mode == LoadingRequest.LoadingMode.FilePath && SupportedExtensions.Contains(Path.GetExtension(loader.FilePath)));

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

            case RequestType.Converting:
                ConvertingRequest converting = (ConvertingRequest)request;
                return(SupportFormat(converting.Format) && SupportFormat(converting.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);
            }
        }