mirror of https://github.com/SixLabors/ImageSharp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.2 KiB
159 lines
5.2 KiB
// Copyright (c) Six Labors and contributors.
|
|
// Licensed under the Apache License, Version 2.0.
|
|
|
|
using System.Numerics;
|
|
using SixLabors.ImageSharp.Primitives;
|
|
|
|
namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
|
|
{
|
|
/// <summary>
|
|
/// Provides methods to write ICC data types
|
|
/// </summary>
|
|
internal sealed partial class IccDataWriter
|
|
{
|
|
/// <summary>
|
|
/// Writes a two dimensional matrix
|
|
/// </summary>
|
|
/// <param name="value">The matrix to write</param>
|
|
/// <param name="isSingle">True if the values are encoded as Single; false if encoded as Fix16</param>
|
|
/// <returns>The number of bytes written</returns>
|
|
public int WriteMatrix(Matrix4x4 value, bool isSingle)
|
|
{
|
|
int count = 0;
|
|
|
|
if (isSingle)
|
|
{
|
|
count += this.WriteSingle(value.M11);
|
|
count += this.WriteSingle(value.M21);
|
|
count += this.WriteSingle(value.M31);
|
|
|
|
count += this.WriteSingle(value.M12);
|
|
count += this.WriteSingle(value.M22);
|
|
count += this.WriteSingle(value.M32);
|
|
|
|
count += this.WriteSingle(value.M13);
|
|
count += this.WriteSingle(value.M23);
|
|
count += this.WriteSingle(value.M33);
|
|
}
|
|
else
|
|
{
|
|
count += this.WriteFix16(value.M11);
|
|
count += this.WriteFix16(value.M21);
|
|
count += this.WriteFix16(value.M31);
|
|
|
|
count += this.WriteFix16(value.M12);
|
|
count += this.WriteFix16(value.M22);
|
|
count += this.WriteFix16(value.M32);
|
|
|
|
count += this.WriteFix16(value.M13);
|
|
count += this.WriteFix16(value.M23);
|
|
count += this.WriteFix16(value.M33);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a two dimensional matrix
|
|
/// </summary>
|
|
/// <param name="value">The matrix to write</param>
|
|
/// <param name="isSingle">True if the values are encoded as Single; false if encoded as Fix16</param>
|
|
/// <returns>The number of bytes written</returns>
|
|
public int WriteMatrix(in DenseMatrix<float> value, bool isSingle)
|
|
{
|
|
int count = 0;
|
|
for (int y = 0; y < value.Rows; y++)
|
|
{
|
|
for (int x = 0; x < value.Columns; x++)
|
|
{
|
|
if (isSingle)
|
|
{
|
|
count += this.WriteSingle(value[x, y]);
|
|
}
|
|
else
|
|
{
|
|
count += this.WriteFix16(value[x, y]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a two dimensional matrix
|
|
/// </summary>
|
|
/// <param name="value">The matrix to write</param>
|
|
/// <param name="isSingle">True if the values are encoded as Single; false if encoded as Fix16</param>
|
|
/// <returns>The number of bytes written</returns>
|
|
public int WriteMatrix(float[,] value, bool isSingle)
|
|
{
|
|
int count = 0;
|
|
for (int y = 0; y < value.GetLength(1); y++)
|
|
{
|
|
for (int x = 0; x < value.GetLength(0); x++)
|
|
{
|
|
if (isSingle)
|
|
{
|
|
count += this.WriteSingle(value[x, y]);
|
|
}
|
|
else
|
|
{
|
|
count += this.WriteFix16(value[x, y]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a one dimensional matrix
|
|
/// </summary>
|
|
/// <param name="value">The matrix to write</param>
|
|
/// <param name="isSingle">True if the values are encoded as Single; false if encoded as Fix16</param>
|
|
/// <returns>The number of bytes written</returns>
|
|
public int WriteMatrix(Vector3 value, bool isSingle)
|
|
{
|
|
int count = 0;
|
|
if (isSingle)
|
|
{
|
|
count += this.WriteSingle(value.X);
|
|
count += this.WriteSingle(value.Y);
|
|
count += this.WriteSingle(value.Z);
|
|
}
|
|
else
|
|
{
|
|
count += this.WriteFix16(value.X);
|
|
count += this.WriteFix16(value.Y);
|
|
count += this.WriteFix16(value.Z);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a one dimensional matrix
|
|
/// </summary>
|
|
/// <param name="value">The matrix to write</param>
|
|
/// <param name="isSingle">True if the values are encoded as Single; false if encoded as Fix16</param>
|
|
/// <returns>The number of bytes written</returns>
|
|
public int WriteMatrix(float[] value, bool isSingle)
|
|
{
|
|
int count = 0;
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
if (isSingle)
|
|
{
|
|
count += this.WriteSingle(value[i]);
|
|
}
|
|
else
|
|
{
|
|
count += this.WriteFix16(value[i]);
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
}
|
|
}
|
|
|