OEM_CHARSET, Zeichen 128-256 weg ?

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 11187
Registriert: Mo 11. Sep 2006, 19:01

Re: OEM_CHARSET, Zeichen 128-256 weg ?

Beitrag von theo »

Mathias hat geschrieben:Mit

Code: Alles auswählen

var UnicodeText : UnicodeString;
 
  UnicodeText := UTF8Decode(Text);   
gehts.

Wichtig ist, das UnicodeText als UnicodeString deklariert ist, bei nur String macht Linux Probleme.
Was soll das werden? Warum bleibst du nicht bei UTF-8?
Wie von mir schon mehrmals gesagt : Unicode und Multi-Threading eignen sich nicht für den "Versuch und Irrtum" Ansatz.
Alles was man hier nicht wirklich verstanden hat, tritt einen irgendwann grausam in den Hintern. :mrgreen:

Mathias
Beiträge: 7219
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OEM_CHARSET, Zeichen 128-256 weg ?

Beitrag von Mathias »

Warum bleibst du nicht bei UTF-8?
Gibt es eine andere Lösung ?

Ich brauche einen Zeichensatz, welcher 8Bit ist und auch Umlaute darstellen kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 11187
Registriert: Mo 11. Sep 2006, 19:01

Re: OEM_CHARSET, Zeichen 128-256 weg ?

Beitrag von theo »

UnicodeString hat aber 16bit "Zeichen".

Mathias
Beiträge: 7219
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OEM_CHARSET, Zeichen 128-256 weg ?

Beitrag von Mathias »

Komischerweise funktioniert es jetzt unter Windows und Linux.

So wie ich dich verstehe habe ich einen Murks gemacht.

Momentan lasse ich es so sein, vielleicht kommt noch eine bessere Idee.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 7219
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OEM_CHARSET, Zeichen 128-256 weg ?

Beitrag von Mathias »

Ich habe meinen Code zur Demonstration stark vereinfacht, damit sollte gut sichtbar sein, wieso ich 8Bit Zeichen brauche.
Im fertigen Code ist die BGRABitmap als Textur im VRAM.
Die for-Schleife mit x und y entfällt, die TexturPos[?] wird als Uniform dem Shader übergeben.

Code: Alles auswählen

  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    BGRABitmap: TBGRABitmap;
 
    TexturPos: array[0..256] of record
      Width, Left: integer;
    end;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormShow(Sender: TObject);
var
  BGRAGradientScanner: TBGRAGradientScanner;
  TextHeight, w, i: integer;
  c: UnicodeString;
 
begin
  BGRABitmap := TBGRABitmap.Create;
 
  with Edit1 do begin
    BGRABitmap.FontName := Font.Name;
    BGRABitmap.FontStyle := Font.Style;
    BGRABitmap.FontHeight := Font.Height;
    BGRABitmap.FontQuality := fqSystemClearType;
    BGRABitmap.FontAntialias := False;
  end;
 
  TexturPos[0].Left := 0;
 
  for i := 0 to 255 do begin
    c := UnicodeToUTF8(i);
    w := BGRABitmap.TextSize(c).cx;
    TexturPos[i].Width := w;
    TexturPos[i + 1].Left := w + TexturPos[i].Left;
  end;
 
  TextHeight := BGRABitmap.FontFullHeight;
 
  BGRABitmap.SetSize(TexturPos[256].Left, TextHeight);
 
  BGRABitmap.Fill(BGRA($00, $FF, $00, $80));
 
  for i := 0 to 255 do begin
    BGRAGradientScanner := TBGRAGradientScanner.Create(BGRA(255, 255, 0), BGRA(255, 0, 0), gtLinear, PointF(0, 0), PointF(0, TextHeight), True, True);
    BGRABitmap.TextOut(TexturPos[i].Left, 0, UnicodeToUTF8(i), BGRAGradientScanner);
    BGRAGradientScanner.Free;
  end;
  //  BGRABitmap.SaveToFile('test.bmp');
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
var
  UniText: UnicodeString;
  CharIndex, i, y, x, cur: integer;
begin
  UniText := UTF8Decode(Edit1.Text);
  cur := 0;
  for i := 0 to Length(UniText) - 1 do begin
    CharIndex := byte(UniText[i + 1]);
    for y := 0 to BGRABitmap.FontFullHeight do begin
      for x := 0 to TexturPos[CharIndex].Width do begin
        Canvas.Pixels[cur + x, y] := BGRABitmap.Canvas.Pixels[x + TexturPos[CharIndex].Left, y];
      end;
    end;
    cur := cur + TexturPos[CharIndex].Width + 10;
  end;
end;    
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten