//
// 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 System.Numerics;
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 the use of BitmapRenderer.BackgroundBitmap
// when drawing on a bitmap.
//
// When drawing semi-transparent graphic objects, usually the resulting color
// of a pixel is a combination of the target bitmap pixel's color and the color
// of the graphic object's pixel. But if the BackgroundBitmap is set on the
// BitmapRenderer, pixels of that bitmap will be used instead of the target
// bitmap's pixels when determining the resulting color. Background bitmaps
// are used to support Isolated and Knockout transparency groups (as defined
// in the PDF specification 1.7 sections 7.3.4 and 7.3.5) when rendering PDFs
// to images.
public class BackgroundBitmap
{
public GcBitmap GenerateImage(Size pixelSize, float dpi, bool _, string[] _1 = null)
{
var hx = pixelSize.Width / 2;
var hy = pixelSize.Height / 2;
// The spectrum image used for the backdrop:
using var bmp0 = new GcBitmap(Path.Combine("Resources", "ImagesBis", "spectrum-pastel-500x500.png"));
using var bmp1 = bmp0.Resize(hx, hy, InterpolationMode.Cubic);
using var bmpBackdrop = new GcBitmap(hx, hy, false, dpi, dpi);
using var bmpInitial = new GcBitmap(hx, hy, false, dpi, dpi);
using var gB = bmpBackdrop.CreateGraphics();
using var gI = bmpInitial.CreateGraphics();
gB.Renderer.Aliased = true;
gB.Renderer.BlendMode = BlendMode.Multiply;
gI.Renderer.Aliased = true;
gI.Renderer.BlendMode = BlendMode.Multiply;
// The target bitmap will contain 4 demo quadrants:
var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, false, dpi, dpi);
// Isolated, Knockout:
bmpBackdrop.BitBlt(bmp1, 0, 0);
bmpInitial.Clear(Color.Transparent);
gB.Renderer.BackgroundBitmap = bmpInitial;
FillCircles(gB, hx, hy);
bmp.BitBlt(bmpBackdrop, 0, 0);
// Isolated, Non-knockout:
FillCircles(gI, hx, hy);
bmpBackdrop.BitBlt(bmp1, 0, 0);
bmpBackdrop.AlphaBlend(bmpInitial, 0, 0);
bmp.BitBlt(bmpBackdrop, hx, 0);
// Non-isolated, Knockout:
bmpBackdrop.BitBlt(bmp1, 0, 0);
bmpInitial.BitBlt(bmp1, 0, 0);
FillCircles(gB, hx, hy);
bmp.BitBlt(bmpBackdrop, 0, hy);
// Non-isolated, Non-knockout:
bmpBackdrop.BitBlt(bmp1, 0, 0);
gB.Renderer.BackgroundBitmap = null;
FillCircles(gB, hx, hy);
bmp.BitBlt(bmpBackdrop, hx, hy);
// Adornments:
using var g = bmp.CreateGraphics();
g.DrawLine(0, hy, bmp.PixelWidth, hy, new GCDRAW.Pen(Color.Black));
g.DrawLine(hx, 0, hx, bmp.PixelHeight, new GCDRAW.Pen(Color.Black));
var tf = new TextFormat()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "courbd.ttf")),
FontSize = 16,
};
var d = 40;
g.DrawString("Isolated, Knockout", tf, new RectangleF(0, hy - d, hx, d),
TextAlignment.Center, ParagraphAlignment.Center, false);
g.DrawString("Isolated, Non-knockout", tf, new RectangleF(hx, hy - d, hx, d),
TextAlignment.Center, ParagraphAlignment.Center, false);
g.DrawString("Non-isolated, Knockout", tf, new RectangleF(0, hy * 2 - d, hx, d),
TextAlignment.Center, ParagraphAlignment.Center, false);
g.DrawString("Non-isolated, Non-knockout", tf, new RectangleF(hx, hy * 2 - d, hx, d),
TextAlignment.Center, ParagraphAlignment.Center, false);
// Done:
return bmp;
}
void FillCircles(GcBitmapGraphics g, float hx, float hy)
{
var dx = hx / 10;
var dy = hy / 10;
var qx = hx / 2;
var qy = hy / 2;
g.FillEllipse(new RectangleF(dx, dy, qx, qy), Color.LightGray);
g.FillEllipse(new RectangleF(qx - dx, dy, qx, qy), Color.LightGray);
g.FillEllipse(new RectangleF(dx, qy - dy, qx, qy), Color.LightGray);
g.FillEllipse(new RectangleF(qx - dx, qy - dy, qx, qy), Color.LightGray);
}
}
}