private void ProcessPage(System.Drawing.Graphics g, IEnumerable p)
{
// TODO: (Peter) Support can grow and can shrink
foreach (PageItem pi in p)
{
if (pi is PageTextHtml)
{ // PageTextHtml is actually a composite object (just like a page)
ProcessHtml(pi as PageTextHtml, g);
continue;
}
if (pi is PageLine)
{
PageLine pl = pi as PageLine;
DrawLine(pl.SI.BColorLeft, pl.SI.BStyleLeft, pl.SI.BWidthLeft,
g, PixelsX(pl.X + _left - _hScroll), PixelsY(pl.Y + _top - _vScroll),
PixelsX(pl.X2 + _left - _hScroll), PixelsY(pl.Y2 + _top - _vScroll));
continue;
}
RectangleF rect = new RectangleF(PixelsX(pi.X + _left - _hScroll), PixelsY(pi.Y + _top - _vScroll),
PixelsX(pi.W), PixelsY(pi.H));
if ((pi is PagePolygon) || (pi is PageCurve))
{ // intentionally empty; polygon's rectangles aren't calculated
}
if (pi.SI.BackgroundImage != null)
{ // put out any background image
PageImage i = pi.SI.BackgroundImage;
DrawImageBackground(i, pi.SI, g, rect);
}
if (pi is PageText)
{
// TODO: enable can shrink, can grow
// 2005 spec file, page 9, in the text box has
// CanGrow and CanShrink
PageText pt = pi as PageText;
DrawString(pt, g, rect);
}
else if (pi is PageImage)
{
PageImage i = pi as PageImage;
DrawImage(i, g, rect);
}
else if (pi is PageRectangle)
{
this.DrawBackground(g, rect, pi.SI);
}
else if (pi is PageEllipse)
{
PageEllipse pe = pi as PageEllipse;
DrawEllipse(pe, g, rect);
}
else if (pi is PagePie)
{
PagePie pp = pi as PagePie;
DrawPie(pp, g, rect);
}
else if (pi is PagePolygon)
{
PagePolygon ppo = pi as PagePolygon;
FillPolygon(ppo, g, rect);
}
else if (pi is PageCurve)
{
PageCurve pc = pi as PageCurve;
DrawCurve(pc.SI.BColorLeft, pc.SI.BStyleLeft, pc.SI.BWidthLeft,
g, pc.Points, pc.Offset, pc.Tension);
}
DrawBorder(pi, g, rect);
}
// TO: convert System.Drawing.Graphics to Xwt.Drawing.Context and draw it to this.g
Bitmap bm = new Bitmap(gImg.Width, gImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
g.DrawImage(bm, gImg.Width, gImg.Height);
// Xwt.Drawing.Image.FromStream does not work. It crashes with both wpf and gtk
// As a work around save the image to a temporary file and load it into xwt using the
// FromFile method.
System.IO.MemoryStream s = new System.IO.MemoryStream();
gImg.Save(s, System.Drawing.Imaging.ImageFormat.Png);
Xwt.Drawing.Image img = Xwt.Drawing.Image.FromStream(s);
xwtContext.DrawImage(img, new Xwt.Rectangle(0, 0, gImg.Width, gImg.Height), new Xwt.Rectangle(0, 0, gImg.Width, gImg.Height));
img.Dispose();
}