//// This code is part of Document Solutions for PDF .NET demos.// Copyright (c) MESCIUS inc. All rights reserved.//usingSystem;usingSystem.IO;usingSystem.Drawing;usingGrapeCity.Documents.Pdf;usingGrapeCity.Documents.Text;usingGrapeCity.Documents.Drawing;usingGCTEXT = GrapeCity.Documents.Text;usingGCDRAW = GrapeCity.Documents.Drawing; namespaceDsPdfWeb.Demos{// This sample demonstrates the effects of different blend modes// when drawing on a GcPdfGraphics. Note that the current blend mode// set on an instance of GcGraphics (including GcPdfGraphics)// affects not only images but all drawing operations.// In this sample it is demonstrated by rendering the blend mode// names on the second page.publicclassAllBlendModes {publicintCreatePDF(Stream stream) {var doc = newGcPdfDocument();var page = doc.NewPage();var g = page.Graphics; var iorchid = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "orchid.jpg"));var ispectr = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "spectrum-pastel-500x500.png")); constintmargin = 36;constintNCOLS = 4;var w = (int)((page.Size.Width - margin * 2) / NCOLS);var h = (int)((iorchid.Height * w) / iorchid.Width); // Text layout for captions:var tl = g.CreateTextLayout(); tl.DefaultFormat.Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSansMono-Regular.ttf")); tl.DefaultFormat.FontSize = 12; tl.ParagraphAlignment = ParagraphAlignment.Center; tl.TextAlignment = TextAlignment.Center; tl.MaxWidth = w; tl.MaxHeight = h; tl.MarginTop = h - g.MeasureString("QWERTY", tl.DefaultFormat).Height * 1.4f; int row = 0, col, dy;// Render all blending modes in a grid:var modes = Enum.GetValues(typeof(BlendMode));for (int i = 0; i < 2; ++i) { row = col = 0;GCDRAW.Image iback, ifore;if (i == 0) { iback = ispectr; ifore = iorchid;var trc1 = Common.Util.AddNote("Below are tiles drawn by composing two images (a spectrum and an orchid) using the " +"different blend modes supported by DsPdf. " +"First the spectrum image is drawn normally, then it is overlaid by the orchid image " +"drawn in a supported blend mode. The blend mode name is shown below each tile." +"\n" +"Tiles on the second page are composed of the same images but drawn in reverse order: " +"the orchid is drawn normally, the spectrum is blended with it using the different modes." +"\n" +"Note that the current blend mode affects not only images but any drawing on a GcGraphics. " +"The blend mode names on the 2nd page illustrate this.", page); dy = (int)trc1.Bottom; }else// i == 1 { iback = iorchid; ifore = ispectr; page = doc.Pages.Add(); g = page.Graphics; dy = 0; }foreach (var mode in modes) {var blendMode = (BlendMode)mode;if (!g.IsBlendModeSupported(blendMode))continue; int x = margin + w * col;int y = margin + h * row + dy;var r = newRectangleF(x, y, w, h); g.BlendMode = BlendMode.Normal; g.DrawImage(iback, r, null, ImageAlign.StretchImage); g.BlendMode = blendMode; g.DrawImage(ifore, r, null, ImageAlign.StretchImage); g.BlendMode = BlendMode.Normal; // Caption: tl.Clear(); tl.Append(blendMode.ToString()); tl.PerformLayout(true);var rc = tl.ContentRectangle; rc.Offset(x, y); rc.Inflate(4, 2); g.FillRectangle(rc, Color.White); g.DrawTextLayout(tl, newPointF(x, y));nextRowCol(); } }// Text blends: page = doc.Pages[1]; g = page.Graphics;var trc = Common.Util.AddNote("Below are supported blend mode names rendered into rectangles using the corresponding blend mode. " +"Each rectangle is first filled by the spectrum image using BlendMode.Normal, " +"then black and white texts are drawn using the current blend mode, " +"finally the same spectrum image is drawn using BlendMode.Difference to black out the background. " +"Names prefixed with 'B:' are drawn in black, " +"while names prefixed with 'W:' are drawn in white. " +"Most combinations yield rather colorful results, but for some the results are invisible.", page,newRectangleF(margin, margin + h * row + 12, page.Bounds.Width - margin * 2, 0)); var yoff = (int)trc.Bottom + 12; tl.DefaultFormat.FontBold = true; tl.DefaultFormat.FontSize = 16; h = (int)(g.MeasureString("QWERTY", tl.DefaultFormat).Height * 1.4f) * 2; tl.MaxWidth = w; tl.MaxHeight = h; tl.MarginTop = (h - h / 1.4f) / 2; tl.DefaultFormat.ForeColor = Color.Black;var tfWhite = newTextFormat(tl.DefaultFormat) { ForeColor = Color.White }; row = col = 0;foreach (var mode in modes) {var blendMode = (BlendMode)mode;if (!g.IsBlendModeSupported(blendMode))continue; int x = margin + w * col;int y = yoff + h * row;var r = newRectangleF(x, y, w, h); // Draw spectrum image normally: g.BlendMode = BlendMode.Normal; g.DrawImage(ispectr, r, null, ImageAlign.StretchImage);// Draw blend mode name using the current blend mode: tl.Clear(); tl.AppendLine($"B: {blendMode}"); tl.Append($"W: {blendMode}", tfWhite); tl.PerformLayout(true);var rc = tl.ContentRectangle; rc.Offset(x, y); rc.Inflate(4, 2);// Current blend mode: g.BlendMode = blendMode; g.DrawTextLayout(tl, newPointF(x, y));// Draw spectrum image again using BlendMode.Difference// to produce (mostly) colorful text on black background: g.BlendMode = BlendMode.Difference; g.DrawImage(ispectr, r, null, ImageAlign.StretchImage);// Draw a rectangle to mark the current area: g.BlendMode = BlendMode.Normal; g.DrawRectangle(r, Color.Gray);nextRowCol(); }// Done: doc.Save(stream);return doc.Pages.Count; //voidnextRowCol() {if (++col == NCOLS) { col = 0; ++row; } } } }}