نصوص عربية في أوبن جي إل (), , , OpenGL, .
, - , , , , GDI+:
private ref class ArabicTextRenderer
{
public:
ArabicTextRenderer() :
m_NativeData(0)
{
m_Bitmap = gcnew Bitmap(256, 128, PixelFormat::Format32bppRgb);
m_BitmapData = gcnew BitmapData();
m_Graphics = Graphics::FromImage(m_Bitmap);
m_Format = gcnew StringFormat();
m_Format->FormatFlags = StringFormatFlags::NoClip | StringFormatFlags::DirectionRightToLeft;
m_Format->Alignment = StringAlignment::Near;
m_Format->HotkeyPrefix = HotkeyPrefix::None;
m_Format->LineAlignment = StringAlignment::Near;
m_Format->Trimming = StringTrimming::None;
m_Stride = (m_Bitmap->Width * Bitmap::GetPixelFormatSize(m_Bitmap->PixelFormat)) / 8;
int iBytesCount = m_Bitmap->Height * m_Stride;
m_NativeData = new char[iBytesCount];
m_BitmapData->Width = m_Bitmap->Width;
m_BitmapData->Height = m_Bitmap->Height;
m_BitmapData->PixelFormat = m_Bitmap->PixelFormat;
m_BitmapData->Stride = m_Stride;
m_BitmapData->Scan0 = (IntPtr)m_NativeData;
}
~ArabicTextRenderer()
{
delete [] m_NativeData;
}
property Bitmap^ TextBitmap { Bitmap^ get(void) { return m_Bitmap; } }
property BitmapData^ TextBitmapData { BitmapData^ get(void) { return m_BitmapData; } }
property Graphics^ TextGraphics { Graphics^ get(void) { return m_Graphics; } }
property StringFormat^ TextFormat { StringFormat^ get(void) { return m_Format; } }
property int Stride { int get(void) { return m_Stride; } }
property void* NativeData { void* get(void) { return m_NativeData; } }
private:
Graphics ^m_Graphics;
Bitmap ^m_Bitmap;
BitmapData ^m_BitmapData;
StringFormat ^m_Format;
int m_Stride;
void *m_NativeData;
};
void SetText(String ^text, Font ^font, ArabicTextRenderer^ renderer, IDirect3DSurface9* D3DSurface)
{
Bitmap ^bmp = renderer->TextBitmap;
Graphics ^gfx = renderer->TextGraphics;
gfx->Clear(System::Drawing::Color::Transparent);
SizeF sizef = gfx->MeasureString(text, font, PointF(0,0), renderer->TextFormat);
short width = (short)sizef.Width;
short height = (short)sizef.Height+2;
float yo = 1;
gfx->DrawString(text, font, Brushes::White, width , yo, renderer->TextFormat);
Rectangle rc(0,0,bmp->Width,bmp->Height);
bmp->LockBits(rc,ImageLockMode::ReadOnly|ImageLockMode::UserInputBuffer,
bmp->PixelFormat,renderer->TextBitmapData);
bmp->UnlockBits(renderer->TextBitmapData);
CopyImageToD3DSurface(D3DSurface, renderer->NativeData, renderer->Stride, width, height);
}
void CopyImageToD3DSurface(IDirect3DSurface9* D3DSurface, void* sourcePixels,
int stride, int width, int height)
{
RECT srcRect = {0, 0, height, width};
RECT destRect = {0, 0, height, width};
D3DXLoadSurfaceFromMemory(
D3DSurface,
NULL,
&destRect,
sourcePixels,
D3DFMT_X8R8G8B8,
stride,
NULL,
&srcRect,
D3DX_FILTER_NONE,
0);
}
OpenGL, : 
(: agdn-online.com)
.