/// <summary>Adds a spine text.</summary>
		/// <param name="graphics">The graphics object to draw to.</param>
		/// <param name="dpi">The DPI of the cover.</param>
		/// <param name="rectSafe">The spine safe rectangle.</param>
		private static void AddSpineText(Graphics graphics, int dpi, RectangleF rectSafe)
		{
			Contract.Requires<ArgumentNullException>(graphics != null);

			Font fontTitleSpine = null;
			Font fontAuthorSpine = null;

			try
			{
				string fontTypeface = Settings.Default.FontTypeface;
				string bookTitle = Settings.Default.BookTitle;
				string bookAuthor = Settings.Default.BookAuthor;
				float marginText = Settings.Default.MarginTextInches * dpi;

				fontTitleSpine = new Font(fontTypeface, Settings.Default.FontTitleSpineSize);
				fontAuthorSpine = new Font(fontTypeface, Settings.Default.FontAuthorSpineSize);

				SizeF sizeTextTitleSpine = graphics.MeasureString(bookTitle, fontTitleSpine);
				SizeF sizeTextAuthorSpine = graphics.MeasureString(bookAuthor, fontAuthorSpine);

				using (StringFormat stringFormat = new StringFormat(StringFormatFlags.DirectionVertical))
				{
					RectangleF rectTitleSpine = new RectangleF(
						rectSafe.X + ((rectSafe.Width - sizeTextTitleSpine.Height) / 2),
						rectSafe.Y + marginText,
						sizeTextTitleSpine.Height,
						sizeTextTitleSpine.Width);
					graphics.DrawStringEmbossed(bookTitle, fontTitleSpine, Brushes.White, rectTitleSpine, stringFormat);

					RectangleF rectAuthorSpine = new RectangleF(
						rectSafe.X + ((rectSafe.Width - sizeTextAuthorSpine.Height) / 2),
						rectSafe.Bottom - marginText - sizeTextAuthorSpine.Width,
						sizeTextAuthorSpine.Height,
						sizeTextAuthorSpine.Width);
					graphics.DrawStringEmbossed(bookAuthor, fontAuthorSpine, Brushes.White, rectAuthorSpine, stringFormat);
				}
			}
			finally
			{
				fontTitleSpine?.Dispose();
				fontAuthorSpine?.Dispose();
			}
		}
		/// <summary>Adds a back cover text.</summary>
		/// <param name="graphics">The graphics object to draw to.</param>
		/// <param name="dpi">The DPI of the cover.</param>
		/// <param name="rectSafe">The back cover safe rectangle.</param>
		private static void AddBackCoverText(Graphics graphics, int dpi, RectangleF rectSafe)
		{
			Contract.Requires<ArgumentNullException>(graphics != null);

			Font fontBlurb = null;

			try
			{
				float marginText = Settings.Default.MarginTextInches * dpi;
				string directoryImages = Settings.Default.DirectoryImages;
				Contract.Assume(directoryImages != null);

				// Draw the blurb
				string bookBlurb = Settings.Default.BookBlurb;
				PointF pointBlurb = new PointF(rectSafe.X + marginText, rectSafe.Y + marginText);
				fontBlurb = new Font(Settings.Default.FontTypeface, Settings.Default.FontBlurbSize);
				SizeF sizeTextBlurb = graphics.MeasureString(bookBlurb, fontBlurb, (int)Math.Ceiling(rectSafe.Width - (2 * marginText)));
				graphics.DrawStringEmbossed(bookBlurb, fontBlurb, Brushes.White, pointBlurb, sizeTextBlurb);

				// Draw the logo
				string logoFileNameFull = string.Format(CultureInfo.InvariantCulture, Settings.Default.FileNameLogo, dpi);
				Contract.Assume(logoFileNameFull != null);
				string logoPathName = Path.Combine(directoryImages, logoFileNameFull);
				if (File.Exists(logoPathName))
				{
					using (Bitmap bitmapLogo = new Bitmap(logoPathName))
					{
						graphics.DrawImage(bitmapLogo, rectSafe.X + marginText, rectSafe.Bottom - marginText - bitmapLogo.Height);
					}
				}

				// Draw the ISBN
				SizeF sizeIsbnBlockInches = Settings.Default.SizeIsbnBlockInches;
				SizeF sizeIsbnBlock = new SizeF(sizeIsbnBlockInches.Width * dpi, sizeIsbnBlockInches.Height * dpi);
				RectangleF rectIsbn = new RectangleF(
					rectSafe.Right - marginText - sizeIsbnBlock.Width,
					rectSafe.Bottom - marginText - sizeIsbnBlock.Height,
					sizeIsbnBlock.Width,
					sizeIsbnBlock.Height);

				graphics.FillRectangle(Brushes.White, rectIsbn);

				if (Settings.Default.ShowIsbn)
				{
					// Get the isbn graphic and draw it on the back. If not done, CoverSpace will automatically add an ISBN barcode to the
					// white block.
					string isbnFileNameFull = string.Format(CultureInfo.InvariantCulture, Settings.Default.FileNameIsbn, dpi);
					Contract.Assume(isbnFileNameFull != null);
					string isbnPathName = Path.Combine(directoryImages, isbnFileNameFull);
					if (File.Exists(isbnPathName))
					{
						using (Bitmap bitmapIsbn = new Bitmap(isbnPathName))
						{
							graphics.DrawImage(bitmapIsbn, rectIsbn.Left, rectIsbn.Top, rectIsbn.Width, rectIsbn.Height);
						}
					}
				}
			}
			finally
			{
				fontBlurb?.Dispose();
			}
		}
		/// <summary>Adds a front cover text.</summary>
		/// <param name="graphics">The graphics object to draw to.</param>
		/// <param name="dpi">The DPI of the cover.</param>
		/// <param name="rectSafe">The front cover safe rectangle.</param>
		private static void AddFrontCoverText(Graphics graphics, int dpi, RectangleF rectSafe)
		{
			Contract.Requires<ArgumentNullException>(graphics != null);

			Font fontTitle = null;
			Font fontAuthor = null;
			Font fontSubtitle = null;
			Font fontDraft = null;

			try
			{
				string fontTypeface = Settings.Default.FontTypeface;
				string bookTitle = Settings.Default.BookTitle;
				string bookAuthor = Settings.Default.BookAuthor;
				string bookSubtitle = Settings.Default.BookSubtitle;
				string bookDraftText = Settings.Default.BookDraftText;
				float spacingTitle = Settings.Default.SpacingTitleInches * dpi;
				float spacingAuthor = Settings.Default.SpacingAuthorInches * dpi;
				float spacingSubtitle = Settings.Default.SpacingSubtitleInches * dpi;
				float spacingDraft = Settings.Default.SpacingDraftInches * dpi;

				fontAuthor = new Font(fontTypeface, Settings.Default.FontAuthorSize);
				fontDraft = new Font(fontTypeface, Settings.Default.FontDraftSize);
				fontSubtitle = new Font(fontTypeface, Settings.Default.FontSubtitleSize, FontStyle.Italic);
				fontTitle = new Font(fontTypeface, Settings.Default.FontTitleSize, FontStyle.Bold);

				SizeF sizeTextAuthor = graphics.MeasureString(bookAuthor, fontAuthor);
				SizeF sizeTextDraft = graphics.MeasureString(bookDraftText, fontDraft);
				SizeF sizeTextSubtitle = graphics.MeasureString(bookSubtitle, fontSubtitle);
				SizeF sizeTextTitle = graphics.MeasureString(bookTitle, fontTitle);

				PointF pointTextTitle = new PointF(rectSafe.X + ((rectSafe.Width - sizeTextTitle.Width) / 2), rectSafe.Top + spacingTitle);
				PointF pointTextAuthor = new PointF(
					rectSafe.X + ((rectSafe.Width - sizeTextAuthor.Width) / 2),
					pointTextTitle.Y + spacingAuthor);
				PointF pointTextSubtitle = new PointF(
					rectSafe.X + ((rectSafe.Width - sizeTextSubtitle.Width) / 2),
					pointTextAuthor.Y + spacingSubtitle);
				PointF pointTextDraft = new PointF(
					rectSafe.X + ((rectSafe.Width - sizeTextDraft.Width) / 2),
					pointTextSubtitle.Y + spacingDraft);

				// Draw the text on the Front Cover
				graphics.DrawStringEmbossed(bookTitle, fontTitle, Brushes.White, pointTextTitle, sizeTextTitle);
				graphics.DrawStringEmbossed(bookAuthor, fontAuthor, Brushes.White, pointTextAuthor, sizeTextAuthor);
				graphics.DrawStringEmbossed(bookSubtitle, fontSubtitle, Brushes.White, pointTextSubtitle, sizeTextSubtitle);
				if (Settings.Default.ShowDraft)
				{
					// Puts the draft text on the front cover
					graphics.DrawStringEmbossed(bookDraftText, fontDraft, Brushes.Black, pointTextDraft, sizeTextDraft);
				}
			}
			finally
			{
				fontTitle?.Dispose();
				fontAuthor?.Dispose();
				fontSubtitle?.Dispose();
				fontDraft?.Dispose();
			}
		}