FMX Seatle

GlobalUseDX et GlobalUseDirect2D par défaut : c'est Max 8192 x 8192, sinon le Create ou le SetSize déclenche une exception EBitmapSizeTooBig
GlobalUseDX et GlobalUseDirect2D à False : c'est Max 65535 x 65535, même règle ci-dessus

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TBitmap;
begin
  Image := TBitmap.Create();
  try
    with Image.CanvasClass do
      ShowMessage(Format('%d x %d',[GetAttribute(TCanvasAttribute.MaxBitmapSize), GetAttribute(TCanvasAttribute.MaxBitmapSize)]));
  finally
    Image.Free();
  end;
end;
le TBitmap.SaveToFile passe par FMX.Canvas.D2D.TBitmapCodecWIC pour un fichier PNG et c'est IWICFormatConverter.Initialize qui retourne 80070057 E_INVALIDARG
Dommage le code de TBitmapCodecWIC.SaveToStream ne gère aucun HRESULT retourné, ça manque de soin tout ça !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TBitmap;
begin
  Image := TBitmap.Create();
  try
    Image.SetSize(32768, 16384);
    Image.Canvas.DrawLine(Point(0, 0), PointF(32767, 16383), 1);
    Image.SaveToFile('Big.PNG'); // Fichier vide
  finally
    Image.Free();
  end;
end;

GDI+ ne semble pas vouloir non plus dessiné même une simple ligne
Encore une fois, l'encapsulation n'exploite pas les valeurs retournées

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TBitmap;
begin
  Image := TBitmap.Create();
  try
    Image.SetSize(32768, 16384); // 16383 ça passe
    Image.Canvas.Stroke.Color := TAlphaColorRec.Red;
    Image.Canvas.DrawLine(Point(0, 0), PointF(Image.Width - 1, Image.Height - 1), 0.75); // GdipDrawLine retourne InvalidParameter
    Image.Canvas.DrawLine(Point(Image.Width - 1, 0), PointF(0, Image.Height - 1), 0.75);
    ImageViewer1.Bitmap.Assign(Image);
 
  finally
    Image.Free();
  end;
 
end;