//
// This code is part of Document Solutions for Imaging demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Imaging;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsImagingWeb.Demos
{
// This sample demonstrates how to use GcGraphics.PushClip/PopClip
// methods to clip drawing operations to an arbitrary region.
public class PushClip
{
public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
{
var backColor = Color.LightGray;
var foreColor = Color.DarkRed;
float cw = 400, ch = 300, pad = 40, bord = 4, textpad = 10;
var clipRc = new RectangleF(pad, pixelSize.Height - ch - pad, cw, ch);
var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
using (var g = bmp.CreateGraphics(backColor))
{
// We create a path consisting of two nested rectangles,
// outer for the whole bitmap, inner for a text box.
// We then use that path to create a clip region and
// draw an image covering the whole bitmap but excluding
// the text box:
using (var gpath = g.CreatePath())
{
gpath.BeginFigure(PointF.Empty);
gpath.AddLine(new PointF(pixelSize.Width, 0));
gpath.AddLine(new PointF(pixelSize.Width, pixelSize.Height));
gpath.AddLine(new PointF(0, pixelSize.Height));
gpath.EndFigure(FigureEnd.Closed);
gpath.BeginFigure(new PointF(clipRc.Left, clipRc.Top));
gpath.AddLine(new PointF(clipRc.Right, clipRc.Top));
gpath.AddLine(new PointF(clipRc.Right, clipRc.Bottom));
gpath.AddLine(new PointF(clipRc.Left, clipRc.Bottom));
gpath.EndFigure(FigureEnd.Closed);
using (var cliprgn = g.CreateClipRegion(gpath))
using (var img = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "clivia.jpg")))
{
g.PushClip(cliprgn);
g.DrawImage(
img,
new RectangleF(0, 0, pixelSize.Width, pixelSize.Height),
null,
ImageAlign.StretchImage);
g.PopClip(cliprgn);
}
}
// We now draw some text inside the text box,
// clipping to it (this overload of PushClip
// returns an IDisposable that removes the clipping
// when disposed):
using (g.PushClip(clipRc))
{
clipRc.Inflate(-textpad, -textpad);
g.DrawString(
Common.Util.LoremIpsum(1, 3, 4, 10, 20),
new TextFormat()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
FontSize = 16,
ForeColor = foreColor
},
clipRc
);
}
// Draw a border around the whole image,
// demonstrating that the clip has been removed:
g.DrawRectangle(
new RectangleF(bord / 2, bord / 2, pixelSize.Width - bord, pixelSize.Height - bord),
new GCDRAW.Pen(foreColor, bord));
}
return bmp;
}
}
}