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.