/// <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); }
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); } }