7 using SiliconStudio.Core;
8 using SiliconStudio.Core.Mathematics;
15 internal sealed
class CharacterBitmap : IDisposable
17 private readonly
int width;
18 private readonly
int rows;
19 private readonly
int pitch;
20 private readonly
int grayLevels;
22 private readonly PixelMode pixelMode;
24 private readonly IntPtr buffer;
26 private bool disposed;
31 public CharacterBitmap()
45 public CharacterBitmap(IntPtr data, ref
Int2 borderSize,
int width,
int rows,
int pitch,
int grayLevels, PixelMode pixelMode)
48 width += 2 * borderSize.X;
49 rows += 2 * borderSize.Y;
51 buffer = Utilities.AllocateMemory(width * rows, 1);
53 if (pixelMode == PixelMode.Mono)
54 CopyAndAddBordersFromMono(data, buffer, ref borderSize, width, rows, pitch);
56 CopyAndAddBordersFromGrays(data, buffer, ref borderSize, width, rows);
61 this.grayLevels = grayLevels;
62 this.pixelMode = pixelMode;
65 private static unsafe
void CopyAndAddBordersFromGrays(IntPtr data, IntPtr dataBytes, ref
Int2 borderSize,
int width,
int rows)
67 var widthLessBorders = width - (borderSize.X << 1);
68 var rowsLessBorders = rows - (borderSize.Y << 1);
70 var resetBorderLineSize = width * borderSize.Y;
71 Utilities.ClearMemory(dataBytes, 0, resetBorderLineSize);
72 Utilities.ClearMemory(dataBytes + width * rows - resetBorderLineSize, 0, resetBorderLineSize);
74 var src = (byte*)data;
75 var dst = (byte*)dataBytes + resetBorderLineSize;
78 for (
int row = 0; row < rowsLessBorders; row++)
80 for (
int c = 0; c < borderSize.X; c++)
86 for (
int c = 0; c < widthLessBorders; c++)
94 for (
int c = 0; c < borderSize.X; c++)
102 private static unsafe
void CopyAndAddBordersFromMono(IntPtr data, IntPtr dataBytes, ref
Int2 borderSize,
int width,
int rows,
int srcPitch)
104 var rowsLessBorders = rows - (borderSize.Y << 1);
106 var resetBorderLineSize = width * borderSize.Y;
107 Utilities.ClearMemory(dataBytes, 0, resetBorderLineSize);
108 Utilities.ClearMemory(dataBytes + rows * width - resetBorderLineSize, 0, resetBorderLineSize);
110 var rowSrc = (byte*)data;
111 var dst = (byte*)dataBytes + resetBorderLineSize;
114 for (
int row = 0; row < rowsLessBorders; row++)
119 for (
int c = 0; c < borderSize.X; c++)
125 for (
int k = 0; k < 8; k++)
127 dst[col] = (*src & mask) != 0 ? byte.MaxValue : (byte)0;
132 if (col >= width - borderSize.X)
139 for (
int c = 0; c < borderSize.X; ++c)
150 public bool IsDisposed
166 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
180 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
201 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
216 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
226 public int GrayLevels
231 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
240 public PixelMode PixelMode
245 throw new ObjectDisposedException(
"CharacterBitmap",
"Cannot access a disposed object.");
251 public void Dispose()
256 Utilities.FreeMemory(buffer);
SharpDX.DirectWrite.Font Font
SiliconStudio.Paradox.Graphics.Buffer Buffer
Represents a three dimensional mathematical vector.