|
- unit ultsRenderer;
-
- {$mode objfpc}{$H+}
-
- interface
-
- uses
- Classes, SysUtils,
- ultsTypes,
- utsTextSuite, utsUtils;
-
- function ltsRendererCreate (const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
- function ltsRendererBeginBlock (const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
- function ltsRendererEndBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
- function ltsRendererAbortBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
- function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
- function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
- function ltsRendererDestroy (const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
-
- implementation
-
- uses
- ultsUtils;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TltsRendererOpenGL = class(TtsRendererOpenGL)
- public
- procedure DelSlave(const aSlave: TtsRefManager); override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TltsRendererOpenGLES = class(TtsRendererOpenGLES)
- public
- procedure DelSlave(const aSlave: TtsRefManager); override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TltsRendererOpenGL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TltsRendererOpenGL.DelSlave(const aSlave: TtsRefManager);
- begin
- DelReference(aSlave);
- inherited DelSlave(aSlave);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TltsRendererOpenGLES//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TltsRendererOpenGLES.DelSlave(const aSlave: TtsRefManager);
- begin
- DelReference(aSlave);
- inherited DelSlave(aSlave);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Renderer//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererCreate(const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
- var
- c: TtsContext;
- r: TtsRenderer;
- begin
- try
- result := nil;
- if not CheckContextHandle(aHandle, c) then
- exit;
-
- if not ValidateFormat(aFormat) then begin
- SetLastError(ltsErrInvalidEnum, Format('%d is not a valid format', [aFormat]));
- exit;
- end;
-
- case aType of
- ltsRendererOpenGL: r := TltsRendererOpenGL.Create(c, aFormat);
- ltsRendererOpenGLES: r := TltsRendererOpenGLES.Create(c, aFormat);
- // TODO ltsRendererCustom: r := TltsRendererCustom.Create(c, aFormat);
- else
- SetLastError(ltsErrInvalidEnum, Format('%d is not a valid renderer type', [aType]));
- exit;
- end;
- AddReference(ltsObjTypeRenderer, r);
- result := r;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := nil;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererBeginBlock(const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
- var
- r: TtsRenderer;
- b: TtsTextBlock;
- begin
- try
- result := nil;
- if CheckRendererHandle(aHandle, r) then begin
- b := r.BeginBlock(aTop, aLeft, aWidth, aHeight, aFlags);
- AddReference(ltsObjTypeTextBlock, b);
- result := b;
- end;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := nil;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererEndBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
- var
- r: TtsRenderer;
- b: TtsTextBlock;
- begin
- try
- result := ltsErrNone;
- if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
- DelReference(ltsObjTypeTextBlock, b);
- r.EndBlock(b);
- end else
- result := LastErrorCode;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := LastErrorCode;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererAbortBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
- var
- r: TtsRenderer;
- b: TtsTextBlock;
- begin
- try
- result := ltsErrNone;
- if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
- DelReference(ltsObjTypeTextBlock, b);
- r.AbortBlock(b);
- end else
- result := LastErrorCode;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := LastErrorCode;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
- var
- r: TtsRenderer;
- f: TtsFont;
- begin
- try
- if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
- then result := r.GetTextWidthA(f, aText)
- else result := -1;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := -1;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
- var
- r: TtsRenderer;
- f: TtsFont;
- begin
- try
- if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
- then result := r.GetTextWidthW(f, aText)
- else result := -1;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := -1;
- end;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function ltsRendererDestroy(const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
- var
- r: TtsRenderer;
- begin
- try
- result := ltsErrNone;
- if CheckRendererHandle(aHandle, r) then begin
- DelReference(ltsObjTypeRenderer, r);
- FreeAndNil(r);
- end else
- result := LastErrorCode;
- except
- on ex: Exception do begin
- SetLastError(ex);
- result := LastErrorCode;
- end;
- end;
- end;
-
- end.
|