In alpha release 3 several missing bits and pieces from the HTML5 standard was added to Smart Mobile Studio. One of the key methods that were missing from our canvas implementation was toDataUrl – a function which has it’s opposite in TW3ControlBackground and TW3Image fromURL and LoadFromUrl methods.
So in effect, it is now very simple to transport off-screen graphics (graphics you have created on a canvas) and use it as either a background or as the content of a normal image.
Here is an quick example of how to create a picture dynamically and display it in a TW3Image control. Also notice that you can actually assign the image to the background of any TW3CustomControl descendant.
To run the example create a new visual project and replace the code in Form1 with the following:
[sourcecode language=”delphi”]
 unit Form1;
interface
uses w3system, w3ctrls, w3forms, w3graphics,w3application;
type
TForm1=class(TW3form)
 private
 { Private methods }
 FImage:  TW3Image;
 FGraph:  TW3GraphicContext;
 FButton: TW3Button;
 procedure  HandleButtonClicked(Sender:TObject);
 protected
 { Protected methods }
 Procedure InitializeObject;override;
 Procedure FinalizeObject;override;
 Procedure StyleTagObject;override;
 procedure resize;Override;
 end;
Implementation
//############################################################################
 // TForm1
 //############################################################################
Procedure TForm1.InitializeObject;
 Begin
 inherited;
 FImage:=TW3Image.Create(self);
 FImage.Background.fromColor(clWhite);
 FButton:=TW3Button.Create(self);
 FButton.OnClick:=HandleButtonClicked;
 FButton.Caption:=’Click to generate’;
 FGraph:=TW3GraphicContext.Create(NIL);
 End;
Procedure TForm1.FinalizeObject;
 Begin
 FImage.free;
 FButton.free;
 FGraph.free;
 inherited;
 End;
procedure TForm1.HandleButtonClicked(Sender:TObject);
 var
 FCanvas:  TW3Canvas;
 aFrom:  String;
 aTo:  String;
 Begin
 FGraph.Allocate(FImage.Width,FImage.Height);
 FCanvas:=TW3Canvas.Create(FGraph);
 try
 // Clear background
 FCanvas.fillstyle:=’rgb(0,0,99)’;
 FCanvas.fillrectF(0,0,FGraph.Width,FGraph.Height);
 // Draw some text on the canvas
 FCanvas.font:=’10pt verdana’;
 FCanvas.FillStyle:=’rgb(255,255,255)’;
 FCanvas.FillTextF(‘This was generated on a canvas!’,10,20,MAXINT);
 //You can load it in as a picture
 FImage.LoadFromUrl(FCanvas.toDataUrl(”));
 //.. or load it as a background to a picture (or control)
 //FImage.background.fromUrl(FCanvas.toDataUrl(”));
 finally
 FCanvas.free
 end;
 FGraph.release;
 end;
procedure TForm1.resize;
 var
 hd: Integer;
 dy: Integer;
 Begin
 FImage.setBounds(5,5,width-10,(height div 2) + (height div 3) );
 hd:=height – (FImage.top + FImage.Height + 5);
 dy:=(hd div 2) – (FButton.height div 2);
 FButton.setBounds(5,dy + FImage.Top + FImage.height,width-10,FButton.height);
 end;
Procedure TForm1.StyleTagObject;
 Begin
 inherited;
 StyleClass:=’TW3CustomForm’;
 End;
end.
[/sourcecode]

