protected override void OnSaveT(Document input, Stream output, PropertyBasedSaveConfigToken token, Surface scratchSurface, ProgressEventHandler progressCallback)
        {
            DdsFileFormat       fileFormat       = (DdsFileFormat)token.GetProperty(PropertyNames.FileFormat).Value;
            BC7CompressionSpeed compressionSpeed = (BC7CompressionSpeed)token.GetProperty(PropertyNames.BC7CompressionSpeed).Value;
            DdsErrorMetric      errorMetric      = (DdsErrorMetric)token.GetProperty(PropertyNames.ErrorMetric).Value;
            bool cubeMap                    = token.GetProperty <BooleanProperty>(PropertyNames.CubeMap).Value;
            bool generateMipmaps            = token.GetProperty <BooleanProperty>(PropertyNames.GenerateMipMaps).Value;
            ResamplingAlgorithm mipSampling = (ResamplingAlgorithm)token.GetProperty(PropertyNames.MipMapResamplingAlgorithm).Value;

            DdsFile.Save(this.services, input, output, fileFormat, errorMetric, compressionSpeed, cubeMap, generateMipmaps, mipSampling, scratchSurface, progressCallback);
        }
Exemplo n.º 2
0
        public static void Save(
            IServiceProvider services,
            Document input,
            Stream output,
            DdsFileFormat format,
            DdsErrorMetric errorMetric,
            BC7CompressionSpeed compressionSpeed,
            bool cubeMap,
            bool generateMipmaps,
            ResamplingAlgorithm sampling,
            Surface scratchSurface,
            ProgressEventHandler progressCallback)
        {
            using (RenderArgs args = new RenderArgs(scratchSurface))
            {
                input.Render(args, true);
            }

            int  width           = scratchSurface.Width;
            int  height          = scratchSurface.Height;
            int  arraySize       = 1;
            Size?cubeMapFaceSize = null;

            if (cubeMap && IsCrossedCubeMapSize(scratchSurface))
            {
                if (width > height)
                {
                    width  /= 4;
                    height /= 3;
                }
                else
                {
                    width  /= 3;
                    height /= 4;
                }
                arraySize       = 6;
                cubeMapFaceSize = new Size(width, height);
            }

            int  mipLevels = generateMipmaps ? GetMipCount(width, height) : 1;
            bool enableHardwareAcceleration = (bool)services.GetService <ISettingsService>().GetSetting(AppSettingPaths.UI.EnableHardwareAcceleration).Value;

            using (TextureCollection textures = GetTextures(scratchSurface, cubeMapFaceSize, mipLevels, sampling))
            {
                if (format == DdsFileFormat.R8G8B8X8 || format == DdsFileFormat.B8G8R8)
                {
                    new DX9DdsWriter(width, height, arraySize, mipLevels, format).Save(textures, output, progressCallback);
                }
                else
                {
                    DdsProgressCallback ddsProgress = null;
                    if (progressCallback != null)
                    {
                        ddsProgress = (UIntPtr done, UIntPtr total) =>
                        {
                            double progress = (double)done.ToUInt64() / (double)total.ToUInt64();
                            try
                            {
                                progressCallback(null, new ProgressEventArgs(progress * 100.0, true));
                                return(true);
                            }
                            catch (OperationCanceledException)
                            {
                                return(false);
                            }
                        };
                    }

                    DDSSaveInfo info = new DDSSaveInfo
                    {
                        width                      = width,
                        height                     = height,
                        arraySize                  = arraySize,
                        mipLevels                  = mipLevels,
                        format                     = format,
                        errorMetric                = errorMetric,
                        compressionSpeed           = compressionSpeed,
                        cubeMap                    = cubeMapFaceSize.HasValue,
                        enableHardwareAcceleration = enableHardwareAcceleration
                    };

                    DdsNative.Save(info, textures, output, ddsProgress);
                }
            }
        }