[Mono-winforms-list] swf
Peter Dennis Bartok
peter@novonyx.com
Mon, 1 Nov 2004 10:08:17 -0700
>could you please fill me in a few paragraphs how (and why) does SWF
>connects
>to libgdiplus?
Sure, I'll try.
Why:
Because we need a way to actually draw controls. There are two choices:
1) Using a native API and tieing that native API straight into SWF.
2) Using System.Drawing
Option 1 has serious drawbacks, for example, if you were to create your own
control you'd have to use the internal drawing API as well, which would
require it to be public, which would make us loose signature compatibility.
And, it'd be a large amount of code to write and maintain, and you'd have to
figure out how to make it compatible with System.Drawing, because an app
might want to draw something into the control...
How:
X11:
1) We create windows (controls)
2) We receive an expose event for the window and translate that into a
WM_PAINT for the SWF WndProc
3) Control.cs calls XplatUI.PaintEventStart to get a PaintEvent structure.
4) XplatUI.PaintEventStart calls Graphics.FromHwnd(IntPtr), which in turn
calls GdipCreateFromXDrawable_linux(). Note that we are 'using' a documented
System.Drawing API call that is marked as internal by Microsoft to pass our
X drawable to System.Drawing.
5) If not running on Win32, System.Drawing calls a cairo function to pass
the drawable and get a graphics context back.
6) We store the graphics context in the PaintEvent structure and pass it
back to the WndProc
7) Control.WndProc uses the PaintEvent structure to call OnPaint
8) The control will use the graphics context to draw itself
Win32:
1) Same as X11 1)-3)
2) XplatUI.PaintEventStart calls Win32 BeginPaint to get the DC
3) XplatUI.PaintEventStart then calls Graphics.FromHdc to get the graphics
context to draw
4) Graphics.FromHdc will get the graphics object from Microsoft's GDI+
library
5) the rest is the same as X11 6)-8)
SWF connects to libgdiplus through System.Drawing. System.Drawing is mostly
a wrapper for GDI+ calls, with a few special cases to deal with the platform
you are running on, because if you run our System.Drawing on Win32, it will
use Microsoft's native GDI+ library, not ours (which uses cairo).
Hope this helps
Peter