/// <summary> /// Loads the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>An instance of the class <see cref="TexImage"/> containing your loaded image</returns> /// <exception cref="TextureToolsException">No available library could perform the task : LoadingRequest</exception> private TexImage Load(LoadingRequest request) { var texImage = new TexImage(); texImage.Name = request.FilePath == null ? "" : Path.GetFileName(request.FilePath); foreach (ITexLibrary library in textureLibraries) { if (library.CanHandleRequest(texImage, request)) { library.Execute(texImage, request); texImage.CurrentLibrary = library; return texImage; } } Log.Error("No available library could load your texture : " + request.Type); throw new TextureToolsException("No available library could perform the task : " + request.Type); }
/// <summary> /// Loads the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="loader">The loader.</param> /// <exception cref="TextureToolsException">Loading dds file failed</exception> private void Load(TexImage image, DxtTextureLibraryData libraryData, LoadingRequest loader) { Log.Info("Loading " + loader.FilePath + " ..."); libraryData = new DxtTextureLibraryData(); image.LibraryData[this] = libraryData; libraryData.Image = new ScratchImage(); libraryData.Metadata = new TexMetadata(); var extension = Path.GetExtension(loader.FilePath); HRESULT hr = 0; if (extension.EndsWith(".dds", StringComparison.InvariantCultureIgnoreCase)) { hr = Utilities.LoadDDSFile(loader.FilePath, DDS_FLAGS.DDS_FLAGS_NONE, out libraryData.Metadata, libraryData.Image); } else if (extension.EndsWith(".tga", StringComparison.InvariantCultureIgnoreCase)) { hr = Utilities.LoadTGAFile(loader.FilePath, out libraryData.Metadata, libraryData.Image); } else { hr = Utilities.LoadWICFile(loader.FilePath, WIC_FLAGS.WIC_FLAGS_NONE, out libraryData.Metadata, libraryData.Image); } if (hr != HRESULT.S_OK) { Log.Error("Loading dds file " + loader.FilePath + " failed: " + hr); throw new TextureToolsException("Loading dds file " + loader.FilePath + " failed: " + hr); } libraryData.DxtImages = libraryData.Image.GetImages(); // adapt the image format based on whether input image is sRGB or not var format = (PixelFormat)libraryData.Metadata.format; ChangeDxtImageType(libraryData, (DXGI_FORMAT)(loader.LoadAsSRgb ? format.ToSRgb() : format.ToNonSRgb())); image.DisposingLibrary = this; if (libraryData.Metadata.miscFlags == TEX_MISC_FLAG.TEX_MISC_TEXTURECUBE) { image.Dimension = TexImage.TextureDimension.TextureCube; } else { switch (libraryData.Metadata.dimension) { case TEX_DIMENSION.TEX_DIMENSION_TEXTURE1D: image.Dimension = TexImage.TextureDimension.Texture1D; break; case TEX_DIMENSION.TEX_DIMENSION_TEXTURE2D: image.Dimension = TexImage.TextureDimension.Texture2D; break; case TEX_DIMENSION.TEX_DIMENSION_TEXTURE3D: image.Dimension = TexImage.TextureDimension.Texture3D; break; } } UpdateImage(image, libraryData); var alphaSize = DDSHeader.GetAlphaDepth(loader.FilePath); image.OriginalAlphaDepth = alphaSize != -1 ? alphaSize : image.Format.AlphaSizeInBits(); }
/// <summary> /// Loads the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="loader">The loader.</param> /// <exception cref="TextureToolsException">If loading failed : mostly not supported format or path error (FileNotFound).</exception> private void Load(TexImage image, FreeImageTextureLibraryData libraryData, LoadingRequest loader) { Log.Info("Loading " + loader.FilePath + " ..."); FIBITMAP temp; try { temp = FreeImage.LoadEx(loader.FilePath); FreeImage.FlipVertical(temp); if (temp.IsNull) throw new Exception("FreeImage's image data is null"); } catch (Exception e) { Log.Error("Loading file " + loader.FilePath + " failed: " + e.Message); throw new TextureToolsException("Loading file " + loader.FilePath + " failed: " + e.Message); } // Converting the image into BGRA_8888 format libraryData = new FreeImageTextureLibraryData { Bitmaps = new [] { FreeImage.ConvertTo32Bits(temp) } }; image.LibraryData[this] = libraryData; FreeImage.Unload(temp); image.Data = FreeImage.GetBits(libraryData.Bitmaps[0]); image.Width = (int)FreeImage.GetWidth(libraryData.Bitmaps[0]); image.Height = (int)FreeImage.GetHeight(libraryData.Bitmaps[0]); image.Depth = 1; image.Dimension = image.Height == 1 ? TexImage.TextureDimension.Texture1D : TexImage.TextureDimension.Texture2D; image.Format = loader.LoadAsSRgb? PixelFormat.B8G8R8A8_UNorm_SRgb : PixelFormat.B8G8R8A8_UNorm; int rowPitch, slicePitch; Tools.ComputePitch(image.Format, image.Width, image.Height, out rowPitch, out slicePitch); image.RowPitch = rowPitch; image.SlicePitch = slicePitch; //Only one image in the SubImageArray, FreeImage is only used to load images, not textures. image.SubImageArray[0].Data = image.Data; image.SubImageArray[0].DataSize = image.DataSize; image.SubImageArray[0].Width = image.Width; image.SubImageArray[0].Height = image.Height; image.SubImageArray[0].RowPitch = rowPitch; image.SubImageArray[0].SlicePitch = slicePitch; image.DataSize = (int) (FreeImage.GetDIBSize(libraryData.Bitmaps[0]) - GetHeaderSize()); // header size of a bitmap is included in their size calculus libraryData.Data = IntPtr.Zero; image.DisposingLibrary = this; }
/// <summary> /// Loads the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="request">The request.</param> private void Load(TexImage image, LoadingRequest request) { Log.Debug("Loading Xenko Image ..."); var libraryData = new XenkoTextureLibraryData(); image.LibraryData[this] = libraryData; Image inputImage; if (request.Mode == LoadingRequest.LoadingMode.XkImage) { inputImage = request.XkImage; } else if (request.Mode == LoadingRequest.LoadingMode.FilePath) { using (var fileStream = new FileStream(request.FilePath, FileMode.Open, FileAccess.Read)) inputImage = Image.Load(fileStream); libraryData.XkImage = inputImage; // the image need to be disposed by the xenko text library } else { throw new NotImplementedException(); } var inputFormat = inputImage.Description.Format; image.Data = inputImage.DataPointer; image.DataSize = 0; image.Width = inputImage.Description.Width; image.Height = inputImage.Description.Height; image.Depth = inputImage.Description.Depth; image.Format = request.LoadAsSRgb ? inputFormat.ToSRgb() : inputFormat.ToNonSRgb(); image.MipmapCount = request.KeepMipMap ? inputImage.Description.MipLevels : 1; image.ArraySize = inputImage.Description.ArraySize; int rowPitch, slicePitch; Tools.ComputePitch(image.Format, image.Width, image.Height, out rowPitch, out slicePitch); image.RowPitch = rowPitch; image.SlicePitch = slicePitch; var bufferStepFactor = request.KeepMipMap ? 1 : inputImage.Description.MipLevels; int imageCount = inputImage.PixelBuffer.Count / bufferStepFactor; image.SubImageArray = new TexImage.SubImage[imageCount]; for (int i = 0; i < imageCount; ++i) { image.SubImageArray[i] = new TexImage.SubImage(); image.SubImageArray[i].Data = inputImage.PixelBuffer[i * bufferStepFactor].DataPointer; image.SubImageArray[i].DataSize = inputImage.PixelBuffer[i * bufferStepFactor].BufferStride; image.SubImageArray[i].Width = inputImage.PixelBuffer[i * bufferStepFactor].Width; image.SubImageArray[i].Height = inputImage.PixelBuffer[i * bufferStepFactor].Height; image.SubImageArray[i].RowPitch = inputImage.PixelBuffer[i * bufferStepFactor].RowStride; image.SubImageArray[i].SlicePitch = inputImage.PixelBuffer[i * bufferStepFactor].BufferStride; image.DataSize += image.SubImageArray[i].DataSize; } switch (inputImage.Description.Dimension) { case TextureDimension.Texture1D: image.Dimension = TexImage.TextureDimension.Texture1D; break; case TextureDimension.Texture2D: image.Dimension = TexImage.TextureDimension.Texture2D; break; case TextureDimension.Texture3D: image.Dimension = TexImage.TextureDimension.Texture3D; break; case TextureDimension.TextureCube: image.Dimension = TexImage.TextureDimension.TextureCube; break; } image.DisposingLibrary = this; }
/// <summary> /// Loads the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="request">The request.</param> private void Load(TexImage image, LoadingRequest request) { Log.Info("Loading " + request.FilePath + " ..."); var libraryData = new PvrTextureLibraryData(); image.LibraryData[this] = libraryData; libraryData.Texture = new PVRTexture(request.FilePath); libraryData.Header = libraryData.Texture.GetHeader(); image.Width = (int)libraryData.Header.GetWidth(); image.Height = (int)libraryData.Header.GetHeight(); image.Depth = (int)libraryData.Header.GetDepth(); var format = RetrieveFormatFromNativeData(libraryData.Header); image.Format = request.LoadAsSRgb? format.ToSRgb(): format.ToNonSRgb(); image.OriginalAlphaDepth = libraryData.Header.GetAlphaDepth(); int pitch, slice; Tools.ComputePitch(image.Format, image.Width, image.Height, out pitch, out slice); image.RowPitch = pitch; image.SlicePitch = slice; image.DisposingLibrary = this; UpdateImage(image, libraryData); if (image.FaceCount > 1 && image.FaceCount % 6 == 0) image.Dimension = TexImage.TextureDimension.TextureCube; else if(image.Depth > 1) image.Dimension = TexImage.TextureDimension.Texture3D; else if (image.Height > 0) image.Dimension = TexImage.TextureDimension.Texture2D; else image.Dimension = TexImage.TextureDimension.Texture1D; }
/// <summary> /// Loads the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="loader">The loader.</param> /// <exception cref="TextureToolsException">Loading dds file failed</exception> private void Load(TexImage image, DxtTextureLibraryData libraryData, LoadingRequest loader) { Log.Info("Loading " + loader.FilePath + " ..."); libraryData = new DxtTextureLibraryData(); image.LibraryData[this] = libraryData; libraryData.Image = new ScratchImage(); libraryData.Metadata = new TexMetadata(); HRESULT hr = Utilities.LoadDDSFile(loader.FilePath, DDS_FLAGS.DDS_FLAGS_NONE, out libraryData.Metadata, libraryData.Image); if (hr != HRESULT.S_OK) { Log.Error("Loading dds file " + loader.FilePath + " failed: " + hr); throw new TextureToolsException("Loading dds file " + loader.FilePath + " failed: " + hr); } libraryData.DxtImages = libraryData.Image.GetImages(); // adapt the image format based on whether input image is sRGB or not var format = (PixelFormat)libraryData.Metadata.format; ChangeDxtImageType(libraryData, (DXGI_FORMAT)(loader.LoadAsSRgb ? format.ToSRgb() : format.ToNonSRgb())); image.DisposingLibrary = this; if (libraryData.Metadata.miscFlags == TEX_MISC_FLAG.TEX_MISC_TEXTURECUBE) { image.Dimension = TexImage.TextureDimension.TextureCube; } else { switch (libraryData.Metadata.dimension) { case TEX_DIMENSION.TEX_DIMENSION_TEXTURE1D: image.Dimension = TexImage.TextureDimension.Texture1D; break; case TEX_DIMENSION.TEX_DIMENSION_TEXTURE2D: image.Dimension = TexImage.TextureDimension.Texture2D; break; case TEX_DIMENSION.TEX_DIMENSION_TEXTURE3D: image.Dimension = TexImage.TextureDimension.Texture3D; break; } } UpdateImage(image, libraryData); }