Lazarus

Free Pascal => Windows => Topic started by: vhanla on April 15, 2017, 11:19:01 pm

Title: ExtTextOut doesn't render fonts with ligatures on Windows
Post by: vhanla on April 15, 2017, 11:19:01 pm
Hello  :)
I'm having some difficulties trying to render text with ligatures (FiraCode font e.g.) on Windows using ExtTextOut and here are some details:

OSes: Windows 10 x64 Ent. Creator Update / Ubuntu 16.04 x64
Lazarus Version: 1.6.4 / FPC: 3.0.2
Units: LCLType, LCLIntf
-----------------------------------------------------------------------
On Windows:
I have tested ExtTextOut with Delphi Tokyo and Lazarus, with Delphi it renders FiraCode ligatures correctly, but with Lazarus it doesn't.

However, DrawText render text with ligatures just as expected, both on Delphi / Lazarus.

Snaphost (with first line rendered with ExtTextOut and the second one with DrawText) using the code sample below:
(https://i.imgur.com/fDORkHz.png) (attached img below)

On Linux:
No problems here, ExtTextOut renders with ligatures, as expected.


Code Sample:

Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, LCLType, LCLIntf;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     procedure FormCreate(Sender: TObject);
  16.     procedure FormPaint(Sender: TObject);
  17.   private
  18.     { private declarations }
  19.   public
  20.     { public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.lfm}
  29.  
  30. { TForm1 }
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. begin
  34.   Font.Name := 'Fira Code';
  35.   Font.Size := 12;
  36. end;
  37.  
  38. procedure TForm1.FormPaint(Sender: TObject);
  39. var
  40.   R : TRect;
  41.   msg: AnsiString;
  42. begin
  43.   R.Left := 12;
  44.   R.Top := 12;
  45.   R.Width := 400;
  46.   R.Height := 100;
  47.   msg := '    <!-- tag html -->';
  48.   ExtTextOut(Canvas.Handle,12,12,ETO_CLIPPED or ETO_OPAQUE,@R,pchar(msg),length(msg),nil);
  49.   R.Top := 42;
  50.   DrawText(Canvas.Handle, PChar(msg), Length(msg), R, DT_NOCLIP);
  51. end;
  52.  
  53. end.
  54.  

Any suggestions apart from switching to DrawText?
Title: Re: ExtTextOut doesn't render fonts with ligatures on Windows
Post by: ASerge on April 21, 2017, 08:15:55 pm
I'm having some difficulties trying to render text with ligatures (FiraCode font e.g.) on Windows using ExtTextOut and here are some details:
I have tested ExtTextOut with Delphi Tokyo and Lazarus, with Delphi it renders FiraCode ligatures correctly, but with Lazarus it doesn't.
I test Delphi 10.2 Tokyo and Delphi 7.0 - it's draw the same as Lazarus. But this code may help you:
Code: Pascal  [Select][+][-]
  1. procedure TForm1.FormPaint(Sender: TObject);
  2. var
  3.   R: TRect;
  4.   Msg: AnsiString;
  5.   CharPlaceInfo: TGCPResults;
  6.   Glyphs: array of WideChar;
  7. begin
  8.   R.Left := 12;
  9.   R.Top := 12;
  10.   R.Width := 400;
  11.   R.Bottom := 100;
  12.   Msg := '   <!-- tag html -->';
  13.   ZeroMemory(@CharPlaceInfo, SizeOf(CharPlaceInfo));
  14.   CharPlaceInfo.lStructSize := SizeOf(CharPlaceInfo);
  15.   SetLength(Glyphs, Length(Msg));
  16.   CharPlaceInfo.lpGlyphs := @Glyphs[0];
  17.   CharPlaceInfo.nGlyphs := Length(Glyphs);
  18.   if GetCharacterPlacement(Canvas.Handle, PChar(Msg), Length(Msg), 0, @CharPlaceInfo, GCP_LIGATE) <> 0 then
  19.   begin
  20.     ExtTextOut(Canvas.Handle, R.Left, R.Top, ETO_CLIPPED or ETO_OPAQUE or ETO_GLYPH_INDEX, @R, Pointer(Glyphs), Length(Glyphs), nil);
  21.   end;
  22.   R.Top := 42;
  23.   DrawText(Canvas.Handle, PChar(Msg), Length(Msg), R, DT_NOCLIP);
  24. end;
Title: Re: ExtTextOut doesn't render fonts with ligatures on Windows
Post by: vhanla on April 21, 2017, 09:53:35 pm
Awesome,  :) Thank you, now it shows ligatures.
TinyPortal © 2005-2018