#region PDFsharp - A .NET library for processing PDF // // Authors: // Stefan Lange // // Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany) // // http://www.pdfsharp.com // http://sourceforge.net/projects/pdfsharp // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. #endregion using System; using System.Diagnostics; using System.Collections.Generic; using System.Globalization; using PdfSharp.Drawing; namespace PdfSharp.Pdf.Advanced { /// /// Contains all used images of a document. /// internal sealed class PdfImageTable : PdfResourceTable { /// /// Initializes a new instance of this class, which is a singleton for each document. /// public PdfImageTable(PdfDocument document) : base(document) { } /// /// Gets a PdfImage from an XImage. If no PdfImage already exists, a new one is created. /// public PdfImage GetImage(XImage image) { ImageSelector selector = image._selector; if (selector == null) { selector = new ImageSelector(image); image._selector = selector; } PdfImage pdfImage; if (!_images.TryGetValue(selector, out pdfImage)) { pdfImage = new PdfImage(Owner, image); //pdfImage.Document = _document; Debug.Assert(pdfImage.Owner == Owner); _images[selector] = pdfImage; } return pdfImage; } /// /// Map from ImageSelector to PdfImage. /// readonly Dictionary _images = new Dictionary(); /// /// A collection of information that uniquely identifies a particular PdfImage. /// public class ImageSelector { /// /// Initializes a new instance of ImageSelector from an XImage. /// public ImageSelector(XImage image) { // HACK: implement a way to identify images when they are reused // TODO 4STLA Implementation that calculates MD5 hashes for images generated for the images can be found here: http://forum.pdfsharp.net/viewtopic.php?p=6959#p6959 if (image._path == null) image._path = "*" + Guid.NewGuid().ToString("B"); // HACK: just use full path to identify _path = image._path.ToLowerInvariant(); } public string Path { get { return _path; } set { _path = value; } } string _path; public override bool Equals(object obj) { ImageSelector selector = obj as ImageSelector; if (selector == null) return false; return _path == selector._path; } public override int GetHashCode() { return _path.GetHashCode(); } } } }