예제 #1
0
    internal static bool Encode(
        ReadOnlySpan <Color8> data,
        ref TextureFormat format,
        Vector2I dimensions,
        bool hasAlpha,
        bool isPunchthroughAlpha,
        bool isMasky,
        bool hasR,
        bool hasG,
        bool hasB,
        out PinnedSpan <byte> result
        )
    {
        TextureFormat resultFormat = hasAlpha ? TextureFormat.BC3 : TextureFormat.BC1;
        var           resultBytes  = SpanExt.MakePinned <byte>(RequiredSize(dimensions, hasAlpha));

        var compressionMode = Configuration.Config.Resample.BlockCompression.Quality switch {
            CompressionQuality.Low => CompressionMode.Normal,
            CompressionQuality.Medium => CompressionMode.Dither,
            CompressionQuality.High => CompressionMode.HighQuality,
            _ => ThrowHelper.ThrowInvalidOperationException <CompressionMode>($"Unknown Quality: '{Configuration.Config.Resample.BlockCompression.Quality}'")
        };

        CompressDxt(resultBytes, data.AsBytes(), dimensions, hasAlpha, compressionMode);

        result = resultBytes;
        format = resultFormat;
        return(true);
    }
예제 #2
0
 internal static bool Encode(
     ReadOnlySpan <Color8> data,
     ref TextureFormat format,
     Vector2I dimensions,
     bool hasAlpha,
     bool isPunchthroughAlpha,
     bool isMasky,
     bool hasR,
     bool hasG,
     bool hasB,
     out PinnedSpan <byte> result
     ) =>
 Encoder.StbBlockEncoder.Encode(data, ref format, dimensions, hasAlpha, isPunchthroughAlpha, isMasky, hasR, hasG, hasB, out result);
예제 #3
0
 internal FixedSpan(PinnedSpan <T> span)
 {
     ReferenceObject = span.ReferenceObject;
     Pointer         = Unsafe.AsPointer(ref span.GetPinnableReferenceUnsafe());
     Length          = span.Length;
 }
예제 #4
0
    internal static unsafe bool Encode(
        ReadOnlySpan <Color8> data,
        ref TextureFormat format,
        Vector2I dimensions,
        bool hasAlpha,
        bool isPunchthroughAlpha,
        bool isMasky,
        bool hasR,
        bool hasG,
        bool hasB,
        out PinnedSpan <byte> result
        )
    {
        if (!BlockCompressionFunctional)
        {
            result = default;
            return(false);
        }

        var oldSpriteFormat = format;

        try {
            using var compressor             = new Compressor();
            compressor.Input.AlphaMode       = (hasAlpha) ? AlphaMode.Premultiplied : AlphaMode.None;
            compressor.Input.GenerateMipmaps = false;
            var textureFormat = BlockEncoderCommon.GetBestTextureFormat(hasAlpha, isPunchthroughAlpha, isMasky);
            compressor.Compression.Format  = textureFormat;
            compressor.Compression.Quality = Config.Resample.BlockCompression.Quality;
            compressor.Compression.SetQuantization(true, true, isPunchthroughAlpha);

            {
                compressor.Compression.GetColorWeights(out var r, out var g, out var b, out var a);
                a = hasAlpha ? (a * 20.0f) : 0.0f;
                // Relative luminance of the various channels.
                r = hasR ? (r * 0.2126f) : 0.0f;
                g = hasG ? (g * 0.7152f) : 0.0f;
                b = hasB ? (b * 0.0722f) : 0.0f;

                compressor.Compression.SetColorWeights(r, g, b, a);
            }

            compressor.Output.IsSRGBColorSpace = true;
            compressor.Output.OutputHeader     = false;

            //public MipData (int width, int height, int rowPitch, IntPtr data, bool ownData = true)
            fixed(byte *p = data.Cast <byte>())
            {
                using var mipData = new MipData(dimensions.Width, dimensions.Height, dimensions.Width * sizeof(int), (IntPtr)p, false);
                compressor.Input.SetData(mipData, false);
                var memoryBuffer = GC.AllocateUninitializedArray <byte>(((SurfaceFormat)textureFormat).SizeBytes(dimensions.Area), pinned: true);

                using var stream = memoryBuffer.Stream();
                if (compressor.Process(stream))
                {
                    format = textureFormat;
                    result = memoryBuffer;
                    return(true);
                }
                else
                {
                    Debug.Warning($"Failed to use {(CompressionFormat)textureFormat} compression: " + compressor.LastErrorString);
                    Debug.Warning($"Dimensions: [{dimensions.Width}, {dimensions.Height}]");
                }
            }
        }
        catch (Exception ex) {
            ex.PrintWarning();
            BlockCompressionFunctional = false;
        }
        format = oldSpriteFormat;

        result = default;
        return(false);
    }
 public PinnedSpanDebugView(PinnedSpan <T> .FixedSpan span) : this(span.AsSpan)
 {
 }
 public PinnedSpanDebugView(PinnedSpan <T> span)
 {
     _array = span.ToArray();
 }