/base/Drivers/S3Trio64/BitmapInfoHeader.cs
C# | 88 lines | 67 code | 11 blank | 10 comment | 11 complexity | fdf8734816f4e8777d8d591993b26764 MD5 | raw file
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Microsoft Research Singularity
- //
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //
- // File: BitmapInfoHeader.cs
- //
- // Note:
- //
-
- using System;
- using System.Runtime.InteropServices;
-
- using Microsoft.SingSharp;
- using Microsoft.Singularity;
- using Microsoft.Singularity.Channels;
-
- namespace Microsoft.Singularity.Io
- {
- [CLSCompliant(false)]
- [StructLayout(LayoutKind.Explicit)]
- public pointerfree struct BITMAPINFOHEADER {
- [FieldOffset( 0)] public uint biSize;
- [FieldOffset( 4)] public int biWidth;
- [FieldOffset( 8)] public int biHeight;
- [FieldOffset(12)] public ushort biPlanes;
- [FieldOffset(14)] public ushort biBitCount;
- [FieldOffset(16)] public uint biCompression;
- [FieldOffset(20)] public uint biSizeImage;
- [FieldOffset(24)] public int biXPelsPerMeter;
- [FieldOffset(28)] public int biYPelsPerMeter;
- [FieldOffset(30)] public uint biClrUsed;
- [FieldOffset(32)] public uint biClrImportant;
-
- public static BITMAPINFOHEADER Read(byte[]! in ExHeap buffer,
- int offset, out int used)
- {
- if (buffer == null || offset < 0 ||
- offset + sizeof(BITMAPINFOHEADER) > buffer.Length) {
- unchecked {
- Tracing.Log(Tracing.Error,
- "BITMAPINFOHEADER Read(offset={0}, length={1})",
- (UIntPtr)(uint)offset,
- (UIntPtr)(uint)buffer.Length);
- }
- throw new OverflowException("Read source invalid.");
- }
-
- used = offset + sizeof(BITMAPINFOHEADER);
-
- ref BITMAPINFOHEADER bmih = ref buffer[offset];
- return bmih;
- }
-
- public RGB[] ReadPalette(byte[]! in ExHeap buffer, int offset, out int used)
- {
- if (biClrUsed == 0 && biBitCount >= 24) {
- used = offset;
- return null;
- }
-
- int count = (biClrUsed != 0) ? (int)biClrUsed : (1 << biBitCount);
-
- if (buffer == null || offset < 0 ||
- offset + count * sizeof(uint) > buffer.Length) {
- unchecked {
- Tracing.Log(Tracing.Error,
- "RGB Read(offset={0}, count={1}, length={2}",
- (UIntPtr)(uint)offset,
- (UIntPtr)(uint)count,
- (UIntPtr)(uint)buffer.Length);
- }
- throw new OverflowException("Read source invalid.");
- }
-
- RGB[] values = new RGB [count];
- used = offset;
- offset += sizeof(uint);
-
- for (int i = 0; i < count; i++) {
- values[i] = new RGB(buffer[2+offset], buffer[1+offset], buffer[0+offset]);
- offset += sizeof(uint);
- }
- return values;
- }
- }
- } // namespace Microsoft.Singularity.Io