Ejemplo n.º 1
0
        public static void ReadRGBA16161616F(SKImageInfo imageInfo, BinaryReader r, Span <byte> data)
        {
            var bytes = r.ReadBytes(imageInfo.Width * imageInfo.Height * 8);
            var log   = 0d;

            for (int i = 0, j = 0; i < bytes.Length; i += 8, j += 4)
            {
                var hr  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 0));
                var hg  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 2));
                var hb  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 4));
                var lum = (hr * 0.299f) + (hg * 0.587f) + (hb * 0.114f);
                log += Math.Log(0.0000000001d + lum);
            }

            log = Math.Exp(log / (imageInfo.Width * imageInfo.Height));

            for (int i = 0, j = 0; i < bytes.Length; i += 8, j += 4)
            {
                var hr = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 0));
                var hg = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 2));
                var hb = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 4));
                var ha = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes, i + 6));

                var y = (hr * 0.299f) + (hg * 0.587f) + (hb * 0.114f);
                var u = (hb - y) * 0.565f;
                var v = (hr - y) * 0.713f;

                var mul = 4.0f * y / log;
                mul  = mul / (1.0f + mul);
                mul /= y;

                hr = (float)Math.Pow((y + (1.403f * v)) * mul, 2.25f);
                hg = (float)Math.Pow((y - (0.344f * u) - (0.714f * v)) * mul, 2.25f);
                hb = (float)Math.Pow((y + (1.770f * u)) * mul, 2.25f);

                if (hr < 0)
                {
                    hr = 0;
                }
                if (hr > 1)
                {
                    hr = 1;
                }
                if (hg < 0)
                {
                    hg = 0;
                }
                if (hg > 1)
                {
                    hg = 1;
                }
                if (hb < 0)
                {
                    hb = 0;
                }
                if (hb > 1)
                {
                    hb = 1;
                }

                data[j + 0] = (byte)(hr * 255); // r
                data[j + 1] = (byte)(hg * 255); // g
                data[j + 2] = (byte)(hb * 255); // b
                data[j + 3] = (byte)(ha * 255); // a
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Read a half-precision float from a binary reader.
 /// </summary>
 /// <param name="reader">Binary ready.</param>
 /// <returns>float.</returns>
 private static float ReadHalfFloat(BinaryReader reader)
 {
     return(HalfTypeHelper.Convert(reader.ReadUInt16()));
 }
Ejemplo n.º 3
0
        public float[] ReadVertexAttribute(int offset, VertexBuffer vertexBuffer, VertexAttribute attribute)
        {
            float[] result;

            offset = (int)(offset * vertexBuffer.Size) + (int)attribute.Offset;

            // Useful reference: https://github.com/apitrace/dxsdk/blob/master/Include/d3dx_dxgiformatconvert.inl
            switch (attribute.Type)
            {
            case DXGI_FORMAT.R32G32B32_FLOAT:
            {
                result = new float[3];
                Buffer.BlockCopy(vertexBuffer.Buffer, offset, result, 0, 12);
                break;
            }

            case DXGI_FORMAT.R16G16_UNORM:
            {
                var shorts = new ushort[2];
                Buffer.BlockCopy(vertexBuffer.Buffer, offset, shorts, 0, 4);

                result = new[]
                {
                    shorts[0] / 65535f,
                    shorts[1] / 65535f,
                };
                break;
            }

            case DXGI_FORMAT.R16G16_FLOAT:
            {
                var shorts = new ushort[2];
                Buffer.BlockCopy(vertexBuffer.Buffer, offset, shorts, 0, 4);

                result = new[]
                {
                    HalfTypeHelper.Convert(shorts[0]),
                    HalfTypeHelper.Convert(shorts[1]) * -1f,
                };
                break;
            }

            case DXGI_FORMAT.R32G32_FLOAT:
            {
                result = new float[2];
                Buffer.BlockCopy(vertexBuffer.Buffer, offset, result, 0, 8);
                result[1] *= -1f;     // Flip texcoord
                break;
            }

            case DXGI_FORMAT.R8G8B8A8_UINT:
            case DXGI_FORMAT.R8G8B8A8_UNORM:
            {
                var bytes = new byte[4];
                Buffer.BlockCopy(vertexBuffer.Buffer, offset, bytes, 0, 4);

                result = new float[4];
                for (var i = 0; i < 4; i++)
                {
                    result[i] = attribute.Type == DXGI_FORMAT.R8G8B8A8_UNORM
                            ? bytes[i] / 255f
                            : bytes[i];
                }

                break;
            }

            default:
                throw new NotImplementedException($"Unsupported \"{attribute.Name}\" DXGI_FORMAT.{attribute.Type}");
            }

            return(result);
        }
        public static SKBitmap ReadRGBA16161616F(SKBitmap imageInfo, Span <byte> bytes)
        {
            var data = imageInfo.PeekPixels().GetPixelSpan <byte>();
            var log  = 0d;

            for (int i = 0, j = 0; i < bytes.Length; i += 8, j += 4)
            {
                var hr  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i, 2)));
                var hg  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i + 2, 2)));
                var hb  = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i + 4, 2)));
                var lum = (hr * 0.299f) + (hg * 0.587f) + (hb * 0.114f);
                log += Math.Log(0.0000000001d + lum);
            }

            log = Math.Exp(log / (imageInfo.Width * imageInfo.Height));

            for (int i = 0, j = 0; i < bytes.Length; i += 8, j += 4)
            {
                var hr = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i, 2)));
                var hg = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i + 2, 2)));
                var hb = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i + 4, 2)));
                var ha = HalfTypeHelper.Convert(BitConverter.ToUInt16(bytes.Slice(i + 6, 2)));

                var y = (hr * 0.299f) + (hg * 0.587f) + (hb * 0.114f);
                var u = (hb - y) * 0.565f;
                var v = (hr - y) * 0.713f;

                var mul = 4.0f * y / log;
                mul  = mul / (1.0f + mul);
                mul /= y;

                hr = (float)Math.Pow((y + (1.403f * v)) * mul, 2.25f);
                hg = (float)Math.Pow((y - (0.344f * u) - (0.714f * v)) * mul, 2.25f);
                hb = (float)Math.Pow((y + (1.770f * u)) * mul, 2.25f);

                if (hr < 0)
                {
                    hr = 0;
                }
                if (hr > 1)
                {
                    hr = 1;
                }
                if (hg < 0)
                {
                    hg = 0;
                }
                if (hg > 1)
                {
                    hg = 1;
                }
                if (hb < 0)
                {
                    hb = 0;
                }
                if (hb > 1)
                {
                    hb = 1;
                }

                data[j + 0] = (byte)(hr * 255); // r
                data[j + 1] = (byte)(hg * 255); // g
                data[j + 2] = (byte)(hb * 255); // b
                data[j + 3] = (byte)(ha * 255); // a
            }

            return(imageInfo);
        }
Ejemplo n.º 5
0
        public static float[] ReadVertexAttribute(int offset, OnDiskBufferData vertexBuffer, RenderInputLayoutField attribute)
        {
            float[] result;

            offset = (int)(offset * vertexBuffer.ElementSizeInBytes) + (int)attribute.Offset;

            // Useful reference: https://github.com/apitrace/dxsdk/blob/master/Include/d3dx_dxgiformatconvert.inl
            switch (attribute.Format)
            {
            case DXGI_FORMAT.R32G32B32_FLOAT:
            {
                result = new float[3];
                Buffer.BlockCopy(vertexBuffer.Data, offset, result, 0, 12);
                break;
            }

            case DXGI_FORMAT.R32G32B32A32_FLOAT:
            {
                result = new float[4];
                Buffer.BlockCopy(vertexBuffer.Data, offset, result, 0, 16);
                break;
            }

            case DXGI_FORMAT.R16G16_UNORM:
            {
                var shorts = new ushort[2];
                Buffer.BlockCopy(vertexBuffer.Data, offset, shorts, 0, 4);

                result = new[]
                {
                    shorts[0] / 65535f,
                    shorts[1] / 65535f,
                };
                break;
            }

            case DXGI_FORMAT.R16G16_FLOAT:
            {
                var shorts = new ushort[2];
                Buffer.BlockCopy(vertexBuffer.Data, offset, shorts, 0, 4);

                result = new[]
                {
                    HalfTypeHelper.Convert(shorts[0]),
                    HalfTypeHelper.Convert(shorts[1]),
                };
                break;
            }

            case DXGI_FORMAT.R32_FLOAT:
            {
                result = new float[1];
                Buffer.BlockCopy(vertexBuffer.Data, offset, result, 0, 4);
                break;
            }

            case DXGI_FORMAT.R32G32_FLOAT:
            {
                result = new float[2];
                Buffer.BlockCopy(vertexBuffer.Data, offset, result, 0, 8);
                break;
            }

            case DXGI_FORMAT.R16G16_SINT:
            {
                var shorts = new short[2];
                Buffer.BlockCopy(vertexBuffer.Data, offset, shorts, 0, 4);

                result = new float[2];
                for (var i = 0; i < 2; i++)
                {
                    result[i] = shorts[i];
                }

                break;
            }

            case DXGI_FORMAT.R16G16B16A16_SINT:
            {
                var shorts = new short[4];
                Buffer.BlockCopy(vertexBuffer.Data, offset, shorts, 0, 8);

                result = new float[4];
                for (var i = 0; i < 4; i++)
                {
                    result[i] = shorts[i];
                }

                break;
            }

            case DXGI_FORMAT.R8G8B8A8_UINT:
            case DXGI_FORMAT.R8G8B8A8_UNORM:
            {
                var bytes = new byte[4];
                Buffer.BlockCopy(vertexBuffer.Data, offset, bytes, 0, 4);

                result = new float[4];
                for (var i = 0; i < 4; i++)
                {
                    result[i] = attribute.Format == DXGI_FORMAT.R8G8B8A8_UNORM
                            ? bytes[i] / 255f
                            : bytes[i];
                }

                break;
            }

            default:
                throw new NotImplementedException($"Unsupported \"{attribute.SemanticName}\" DXGI_FORMAT.{attribute.Format}");
            }

            return(result);
        }