楽でいい!

漢字


フォント表示を試してみました。
アウトラインとビットマップ。アウトラインの方は、最初フォントを指定せずに試したので(恐らくデフォルトのシステムフォントが使われていた)、苦労しました。

…感想。

楽でいい!

頂点バッファがどうのこうのID3DXFontがどうのこうのTRIANGLESTRIPがどうのこうのってのが馬鹿らしくなってきます。楽でいい。OpenGLはいいものです。うん。
DirectXは行列をそのまま扱っていましたが、OpenGLは間接的にですね。そういうのも段々わかってきました。

unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
	SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
	QDialogs, QStdCtrls, Qt, Windows, OpenGL;

type
	TForm1 = class(TForm)
		procedure FormPaint(Sender: TObject);
	private
		{ Private 宣言 }
		FWindowsHandle: HWND;
		FWindowsDC: HDC;
		FRC: HGLRC;
	protected
		procedure CreateWidget; override;
		procedure DestroyWidget; override;
		procedure Draw;
	public
		{ Public 宣言 }
	end;

var
	Form1: TForm1;

implementation

const
	PixelFormat: Windows.TPixelFormatDescriptor = (
		nSize: Sizeof(Windows.TPixelFormatDescriptor);
		nVersion: 1;
		dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
		iPixelType: PFD_TYPE_RGBA;
		cColorBits: 24;
		cRedBits: 0;
		cRedShift: 0;
		cGreenBits: 0;
		cGreenShift: 0;
		cBlueBits: 0;
		cBlueShift: 0;
		cAlphaBits: 0;
		cAlphaShift: 0;
		cAccumBits: 0;
		cAccumRedBits: 0;
		cAccumGreenBits: 0;
		cAccumBlueBits: 0;
		cAccumAlphaBits: 0;
		cDepthBits: 32;
		cStencilBits: 0;
		cAuxBuffers: 0;
		iLayerType: PFD_MAIN_PLANE;
		bReserved: 0;
		dwLayerMask: 0;
		dwVisibleMask: 0;
		dwDamageMask: 0;
	);

{$R *.xfm}

{ TForm1 }

procedure TForm1.CreateWidget;
begin
	inherited;
	FWindowsHandle := QWidget_winId(Handle);
end;

procedure TForm1.DestroyWidget;
begin
	FWindowsHandle := 0;
	inherited;
end;

procedure TForm1.Draw;
var
	agmf: Windows.GLYPHMETRICSFLOAT;
begin
	glViewport(0, 0, ClientWidth, ClientHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity;
	glOrtho(0, ClientWidth, ClientHeight, 0, -1, 1);
	glMatrixMode(GL_MODELVIEW);

	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
		glColor(1.0, 0.0, 0.0); glVertex(50, 50, 0);
		glColor(0.0, 1.0, 0.0); glVertex(100, 50, 0);
		glColor(0.0, 0.0, 1.0); glVertex(50, 100, 0);
	glEnd;

	Canvas.Font.Name := 'さざなみ明朝';
	Canvas.Font.Height := 50;
	Windows.SelectObject(FWindowsDC, QFont_handle(Canvas.Font.Handle));
	//ビットマップ表示されるフォントだとwglUseFontOutlinesがエラー

	glPushMatrix;
	glColor(1.0, 1.0, 1.0);
	Win32Check(wglUseFontOutlinesW(FWindowsDC, Ord(WideString('漢')[1]), 1, 1000,
		0, 0, WGL_FONT_POLYGONS, @agmf));
	glLoadIdentity();
	glTranslate(150, 200, 0);
	glScale(50, -50, 1);
	glRotate(30, 0, 0, 1);
	glCallList(1000);
	glPopMatrix;

	glColor(1.0, 1.0, 1.0);
	wglUseFontBitmapsW(FWindowsDC, Ord(WideString('字')[1]), 1, 1001);
	glRasterPos(200, 200);
	glCallList(1001);

	glFlush;
	SwapBuffers(FWindowsDC);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
	FWindowsDC := QPainter_handle(Canvas.Handle);
	SetPixelFormat(FWindowsDC, ChoosePixelFormat(FWindowsDC, @PixelFormat), @PixelFormat);
	FRC := wglCreateContext(FWindowsDC);
	wglMakeCurrent(FWindowsDC, FRC);
	Draw;
	wglMakeCurrent(FWindowsDC, 0);
	wglDeleteContext(FRC);
end;

end.

サンプルは、CLXなのにクロスじゃない謎コードで。