public void Dispose(TexImage image) { DxtTextureLibraryData libraryData = (DxtTextureLibraryData)image.LibraryData[this]; if (libraryData.Image == null && libraryData.DxtImages != null) { ScratchImage img = new ScratchImage(); img.InitializeFromImages(libraryData.DxtImages, libraryData.DxtImages.Length); img.Release(); } else { libraryData.Image.Dispose(); } }
/// <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.Info("Converting texture from {0} to {1}", ((PixelFormat)libraryData.Metadata.format), 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); }
/// <summary> /// Compresses 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="TextureToolsException">Compression failed</exception> private void Compress(TexImage image, DxtTextureLibraryData libraryData, CompressingRequest request) { Log.Info("Converting/Compressing with " + request.Format + " ..."); if(libraryData.DxtImages == null || libraryData.DxtImages.Length == 0) return; ScratchImage scratchImage = new ScratchImage(); HRESULT hr; if (request.Format.IsCompressed()) { var topImage = libraryData.DxtImages[0]; if (topImage.Width % 4 != 0 || topImage.Height % 4 != 0) throw new TextureToolsException(string.Format("The provided texture cannot be compressed into format '{0}' " + "because its top resolution ({1}-{2}) is not a multiple of 4.", request.Format, topImage.Width, topImage.Height)); hr = Utilities.Compress(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, RetrieveNativeFormat(request.Format), TEX_COMPRESS_FLAGS.TEX_COMPRESS_DEFAULT, 0.5f, scratchImage); } else { hr = Utilities.Convert(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, RetrieveNativeFormat(request.Format), TEX_FILTER_FLAGS.TEX_FILTER_DEFAULT, 0.5f, scratchImage); } if (hr != HRESULT.S_OK) { Log.Error("Compression failed: " + hr); throw new TextureToolsException("Compression failed: " + hr); } if (image.DisposingLibrary != null) image.DisposingLibrary.Dispose(image); // Updating attributes libraryData.Image = scratchImage; libraryData.DxtImages = libraryData.Image.GetImages(); libraryData.Metadata = libraryData.Image.metadata; image.DisposingLibrary = this; UpdateImage(image, libraryData); }
public static HRESULT ComputeNormalMap(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, CNMAP_FLAGS flags, float amplitude, DXGI_FORMAT format, ScratchImage normalMaps) { return HandleHRESULT(dxtComputeNormalMap(srcImages, nimages, ref metadata, flags, amplitude, format, normalMaps.ptr)); }
public static HRESULT GenerateMipMaps3D(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain) { return HandleHRESULT(dxtGenerateMipMaps3DArray(srcImages, nimages, ref metadata, filter, levels, mipChain.ptr)); }
public static HRESULT GenerateMipMaps(ref DxtImage baseImage, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain, bool allow1D = false) { return HandleHRESULT(dxtGenerateMipMaps(ref baseImage, filter, levels, mipChain.ptr, allow1D)); }
public static HRESULT Decompress(ref DxtImage cImage, DXGI_FORMAT format, ScratchImage image) { return HandleHRESULT(dxtDecompress(ref cImage, format, image.ptr)); }
public static HRESULT LoadTGAFile(String filePath, out TexMetadata metadata, ScratchImage image) { return(HandleHRESULT(dxtLoadTGAFile(filePath, out metadata, image.ptr))); }
public static HRESULT Decompress(DxtImage[] cImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, ScratchImage images) { return(HandleHRESULT(dxtDecompressArray(cImages, nimages, ref metadata, format, images.ptr))); }
public static HRESULT Decompress(ref DxtImage cImage, DXGI_FORMAT format, ScratchImage image) { return(HandleHRESULT(dxtDecompress(ref cImage, format, image.ptr))); }
public static HRESULT Compress(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, TEX_COMPRESS_FLAGS compress, float alphaRef, ScratchImage cImages) { return(HandleHRESULT(dxtCompressArray(srcImages, nimages, ref metadata, format, compress, alphaRef, cImages.ptr))); }
public static HRESULT Compress(ref DxtImage srcImage, DXGI_FORMAT format, TEX_COMPRESS_FLAGS compress, float alphaRef, ScratchImage cImage) { return(HandleHRESULT(dxtCompress(ref srcImage, format, compress, alphaRef, cImage.ptr))); }
public static HRESULT Convert(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, TEX_FILTER_FLAGS filter, float threshold, ScratchImage cImages) { return(HandleHRESULT(dxtConvertArray(srcImages, nimages, ref metadata, format, filter, threshold, cImages.ptr))); }
public static HRESULT Convert(ref DxtImage srcImage, DXGI_FORMAT format, TEX_FILTER_FLAGS filter, float threshold, ScratchImage cImage) { return(HandleHRESULT(dxtConvert(ref srcImage, format, filter, threshold, cImage.ptr))); }
public static HRESULT LoadWICFile(String filePath, WIC_FLAGS flags, out TexMetadata metadata, ScratchImage image) { return(HandleHRESULT(dxtLoadWICFile(filePath, flags, out metadata, image.ptr))); }
/// <summary> /// Generates the mip maps. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="request">The request.</param> /// <exception cref="TexLibraryException"> /// Not implemented ! /// or /// Mipmaps generation failed /// </exception> private void GenerateMipMaps(TexImage image, DxtTextureLibraryData libraryData, MipMapsGenerationRequest request) { Log.Info("Generating Mipmaps ... "); var filter = TEX_FILTER_FLAGS.TEX_FILTER_DEFAULT; switch (request.Filter) { case Filter.MipMapGeneration.Nearest: filter |= TEX_FILTER_FLAGS.TEX_FILTER_POINT; break; case Filter.MipMapGeneration.Linear: filter |= TEX_FILTER_FLAGS.TEX_FILTER_LINEAR; break; case Filter.MipMapGeneration.Cubic: filter |= TEX_FILTER_FLAGS.TEX_FILTER_CUBIC; break; case Filter.MipMapGeneration.Box: // Box filter is supported only for power of two textures filter |= image.IsPowerOfTwo() ? TEX_FILTER_FLAGS.TEX_FILTER_FANT : TEX_FILTER_FLAGS.TEX_FILTER_LINEAR; break; default: filter |= TEX_FILTER_FLAGS.TEX_FILTER_FANT; break; } // Don't use WIC if we have a Float texture as mipmaps are clamped to [0, 1] // TODO: Report bug to DirectXTex var isPowerOfTwoAndFloat = image.IsPowerOfTwo() && (image.Format == PixelFormat.R16G16_Float || image.Format == PixelFormat.R16G16B16A16_Float); if (isPowerOfTwoAndFloat) { filter = TEX_FILTER_FLAGS.TEX_FILTER_FORCE_NON_WIC; } HRESULT hr; var scratchImage = new ScratchImage(); if (libraryData.Metadata.dimension == TEX_DIMENSION.TEX_DIMENSION_TEXTURE3D) { Log.Info("Only the box and nearest(point) filters are supported for generating Mipmaps with 3D texture."); if ((filter & TEX_FILTER_FLAGS.TEX_FILTER_FANT) == 0 && (filter & TEX_FILTER_FLAGS.TEX_FILTER_POINT) == 0) { filter = (TEX_FILTER_FLAGS)((int)filter & 0xf00000); filter |= TEX_FILTER_FLAGS.TEX_FILTER_FANT; } hr = Utilities.GenerateMipMaps3D(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, filter, 0, scratchImage); } else { hr = Utilities.GenerateMipMaps(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, filter, 0, scratchImage); } if (hr != HRESULT.S_OK) { Log.Error("Mipmaps generation failed: " + hr); throw new TextureToolsException("Mipmaps generation failed: " + hr); } // Freeing Memory if (image.DisposingLibrary != null) image.DisposingLibrary.Dispose(image); libraryData.Image = scratchImage; libraryData.Metadata = libraryData.Image.metadata; libraryData.DxtImages = libraryData.Image.GetImages(); image.DisposingLibrary = this; UpdateImage(image, libraryData); }
/// <summary> /// Premultiplies the alpha. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> public void PreMultiplyAlpha(TexImage image, DxtTextureLibraryData libraryData) { Log.Info("Premultiplying alpha ... "); ScratchImage scratchImage = new ScratchImage(); HRESULT hr = Utilities.PremultiplyAlpha(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, TEX_PREMULTIPLY_ALPHA_FLAGS.TEX_PMALPHA_DEFAULT, scratchImage); if (hr != HRESULT.S_OK) { Log.Error("Failed to premultiply the alpha : " + hr); throw new TextureToolsException("Failed to premultiply the alpha : " + hr); } // Freeing Memory if (image.DisposingLibrary != null) image.DisposingLibrary.Dispose(image); libraryData.Image = scratchImage; libraryData.Metadata = libraryData.Image.metadata; libraryData.DxtImages = libraryData.Image.GetImages(); image.DisposingLibrary = this; UpdateImage(image, libraryData); }
public static HRESULT GenerateMipMaps(ref DxtImage baseImage, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain, bool allow1D = false) { return(HandleHRESULT(dxtGenerateMipMaps(ref baseImage, filter, levels, mipChain.ptr, allow1D))); }
public static HRESULT Compress(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, TEX_COMPRESS_FLAGS compress, float alphaRef, ScratchImage cImages) { return HandleHRESULT(dxtCompressArray(srcImages, nimages, ref metadata, format, compress, alphaRef, cImages.ptr)); }
public static HRESULT GenerateMipMaps3D(ref DxtImage baseImage, int depth, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain) { return(HandleHRESULT(dxtGenerateMipMaps3D(ref baseImage, depth, filter, levels, mipChain.ptr))); }
public static HRESULT Decompress(DxtImage[] cImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, ScratchImage images) { return HandleHRESULT(dxtDecompressArray(cImages, nimages, ref metadata, format, images.ptr)); }
public static HRESULT GenerateMipMaps3D(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain) { return(HandleHRESULT(dxtGenerateMipMaps3DArray(srcImages, nimages, ref metadata, filter, levels, mipChain.ptr))); }
public static HRESULT GenerateMipMaps3D(ref DxtImage baseImage, int depth, TEX_FILTER_FLAGS filter, int levels, ScratchImage mipChain) { return HandleHRESULT(dxtGenerateMipMaps3D(ref baseImage, depth, filter, levels, mipChain.ptr)); }
public static HRESULT Resize(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, int width, int height, TEX_FILTER_FLAGS filter, ScratchImage result) { return(HandleHRESULT(dxtResize(srcImages, nimages, ref metadata, width, height, filter, result.ptr))); }
public static HRESULT Resize(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, int width, int height, TEX_FILTER_FLAGS filter, ScratchImage result) { return HandleHRESULT(dxtResize(srcImages, nimages, ref metadata, width, height, filter, result.ptr)); }
public static HRESULT ComputeNormalMap(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, CNMAP_FLAGS flags, float amplitude, DXGI_FORMAT format, ScratchImage normalMaps) { return(HandleHRESULT(dxtComputeNormalMap(srcImages, nimages, ref metadata, flags, amplitude, format, normalMaps.ptr))); }
public static HRESULT PremultiplyAlpha(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, TEX_PREMULTIPLY_ALPHA_FLAGS flags, ScratchImage result) { return HandleHRESULT(dxtPremultiplyAlpha(srcImages, nimages, ref metadata, flags, result.ptr)); }
public static HRESULT PremultiplyAlpha(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, TEX_PREMULTIPLY_ALPHA_FLAGS flags, ScratchImage result) { return(HandleHRESULT(dxtPremultiplyAlpha(srcImages, nimages, ref metadata, flags, result.ptr))); }
/// <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.Info("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); }
public static HRESULT LoadDDSFile(String filePath, DDS_FLAGS flags, out TexMetadata metadata, ScratchImage image) { return HandleHRESULT(dxtLoadDDSFile(filePath, flags, out metadata, image.ptr)); }
/// <summary> /// Decompresses 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 Decompress(TexImage image, DxtTextureLibraryData libraryData, DecompressingRequest request) { Log.Info("Decompressing texture ..."); // determine the output format to avoid any sRGB/RGB conversions (only decompression, no conversion) var outputFormat = !((PixelFormat)libraryData.Metadata.format).IsSRgb() ? request.DecompressedFormat.ToNonSRgb() : request.DecompressedFormat.ToSRgb(); var scratchImage = new ScratchImage(); var hr = Utilities.Decompress(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, (DXGI_FORMAT)outputFormat, scratchImage); if (hr != HRESULT.S_OK) { Log.Error("Decompression failed: " + hr); throw new TextureToolsException("Decompression 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.DecompressedFormat); UpdateImage(image, libraryData); }
public static HRESULT Convert(ref DxtImage srcImage, DXGI_FORMAT format, TEX_FILTER_FLAGS filter, float threshold, ScratchImage cImage) { return HandleHRESULT(dxtConvert(ref srcImage, format, filter, threshold, cImage.ptr)); }
/// <summary> /// Generates the normal map. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="request">The request.</param> /// <exception cref="TexLibraryException">Failed to generate the normal map</exception> public void GenerateNormalMap(TexImage image, DxtTextureLibraryData libraryData, NormalMapGenerationRequest request) { Log.Info("Generating Normal Map ... "); ScratchImage scratchImage = new ScratchImage(); HRESULT hr = Utilities.ComputeNormalMap(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, CNMAP_FLAGS.CNMAP_CHANNEL_RED, request.Amplitude, DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM, scratchImage); if (hr != HRESULT.S_OK) { Log.Error("Failed to generate the normal map : " + hr); throw new TextureToolsException("Failed to generate the normal map : " + hr); } // Creating new TexImage with the normal map data. request.NormalMap = new TexImage(); DxtTextureLibraryData normalMapLibraryData = new DxtTextureLibraryData(); request.NormalMap.LibraryData[this] = normalMapLibraryData; normalMapLibraryData.DxtImages = scratchImage.GetImages(); normalMapLibraryData.Metadata = scratchImage.metadata; normalMapLibraryData.Image = scratchImage; UpdateImage(request.NormalMap, normalMapLibraryData); request.NormalMap.DisposingLibrary = this; }
public static HRESULT Convert(DxtImage[] srcImages, int nimages, ref TexMetadata metadata, DXGI_FORMAT format, TEX_FILTER_FLAGS filter, float threshold, ScratchImage cImages) { return HandleHRESULT(dxtConvertArray(srcImages, nimages, ref metadata, format, filter, threshold, cImages.ptr)); }
public static HRESULT Compress(ref DxtImage srcImage, DXGI_FORMAT format, TEX_COMPRESS_FLAGS compress, float alphaRef, ScratchImage cImage) { return HandleHRESULT(dxtCompress(ref srcImage, format, compress, alphaRef, cImage.ptr)); }
public static HRESULT LoadTGAFile(String filePath, out TexMetadata metadata, ScratchImage image) { return HandleHRESULT(dxtLoadTGAFile(filePath, out metadata, image.ptr)); }