diff --git a/GtR/GtR/GloryToRomeImageCreator.cs b/GtR/GtR/GloryToRomeImageCreator.cs index e49fbe5..cc42fca 100644 --- a/GtR/GtR/GloryToRomeImageCreator.cs +++ b/GtR/GtR/GloryToRomeImageCreator.cs @@ -48,7 +48,7 @@ private CardImage CreateJackImage(string path, string fileName) var xOffset = 0; var yOffset = (int)(usableRectangle.Width * .15f); var brush = new SolidBrush(Color.FromArgb(208, 208, 208)); - PrintCardName("Jack", cardImage, brush, false, xOffset, usableRectangle.Width, yOffset); + PrintCardName("Jack", cardImage, brush, 0, xOffset, usableRectangle.Width, yOffset); var bottomOfImage = fullRectangle.Top + imageOffset + imageHeight; PrintCardText( "Lead or follow any role", @@ -57,7 +57,7 @@ private CardImage CreateJackImage(string path, string fileName) usableRectangle.Width, usableRectangle.Bottom - bottomOfImage, xOffset, - false, + 0, brush); return cardImage; } @@ -82,7 +82,7 @@ public CardImage CreateLeaderImage() var imageXOffset = 0; var maxTextBoxWidth = cardImage.UsableRectangle.Width; var yOffset = (int)(cardImage.UsableRectangle.Width * .05f); - PrintCardName("Leader", cardImage, GraphicsUtilities.BlackBrush, true, imageXOffset, maxTextBoxWidth, yOffset); + PrintCardName("Leader", cardImage, GraphicsUtilities.BlackBrush, 100, imageXOffset, maxTextBoxWidth, yOffset); var usableRectangle = cardImage.UsableRectangle; var textBoxWidth = cardImage.UsableRectangle.Width; @@ -90,7 +90,7 @@ public CardImage CreateLeaderImage() var textRectangleHeight = usableRectangle.Bottom - (influenceImageSide + bottomOfImage); var top = bottomOfImage; var textXOffset = 0; - PrintCardText("LEAD |a role from your hand |or |THINK |and draw new cards", cardImage, top, textBoxWidth, textRectangleHeight, textXOffset, true, GraphicsUtilities.BlackBrush); + PrintCardText("LEAD |a role from your hand |or |THINK |and draw new cards", cardImage, top, textBoxWidth, textRectangleHeight, textXOffset, 200, GraphicsUtilities.BlackBrush); return cardImage; } @@ -104,7 +104,7 @@ internal CardImage CreateMerchantBonusImage(CardSuit suit) var usableRectangle = cardImage.UsableRectangle; var xOffset = usableRectangle.Width / 5; var yOffset = (int)(usableRectangle.Width * .05f); - PrintCardName("Merchant Bonus", cardImage, GraphicsUtilities.BlackBrush, false, xOffset, 3 * usableRectangle.Width / 5, yOffset); + PrintCardName("Merchant Bonus", cardImage, GraphicsUtilities.BlackBrush, 0, xOffset, 3 * usableRectangle.Width / 5, yOffset); var costImagePaddingHeight = (int)(fullRectangle.Height * SiteResourceSectionPaddingPercentage); var costImageTopPaddingHeight = costImagePaddingHeight / 2; var costImageBottomPaddingHeight = costImagePaddingHeight / 2; @@ -131,7 +131,7 @@ internal CardImage CreateMerchantBonusImage(CardSuit suit) usableRectangle.Width, (int)(fullRectangle.Height * .25f), 0, - false, + 0, GraphicsUtilities.BlackBrush); var centerPoint = usableRectangle.X + usableRectangle.Width / 2; @@ -193,7 +193,7 @@ public CardImage CreateSiteFront(CardSuit suit) costImageRectangle.Height); var cardNameFont = new Font(boldFontFamily, orderCardHeaderFontSize, FontStyle.Bold, GraphicsUnit.Pixel); - var text = AddHairSpaces(suit.ResourceName().ToUpper()); + var text = AddFourPerEmSpaces(suit.ResourceName().ToUpper()); var maxTextBoxWidth = usableRectangle.Width; var initialRectangle = new Rectangle(usableRectangle.X, usableRectangle.Y, maxTextBoxWidth, usableRectangle.Height); var textMeasurement = graphics.MeasureString(text, cardNameFont, new SizeF(initialRectangle.Width, initialRectangle.Height), GraphicsUtilities.HorizontalCenterAlignment); @@ -236,18 +236,45 @@ public CardImage CreateSiteFront(CardSuit suit) return cardImage; } - private string AddHairSpaces(string value) + private string AddThreePerEmSpaces(string value) { - var hairSpace = (char)0x200a; + var hairSpace = (char)0x2004; + var withSpaces = string.Join(hairSpace.ToString(), value.ToCharArray()); + return $"{hairSpace}{withSpaces}{hairSpace}"; + } + + private string AddFourPerEmSpaces(string value) + { + var hairSpace = (char)0x2005; + var withSpaces = string.Join(hairSpace.ToString(), value.ToCharArray()); + return $"{withSpaces}{hairSpace}"; + } + + //Thin + private string AddFivePerEmSpaces(string value) + { + var hairSpace = (char)0x2009; var withSpaces = string.Join(hairSpace.ToString(), value.ToCharArray()); return $"{hairSpace}{withSpaces}{hairSpace}"; } - private string AddNonBreakingNarrowSpaces(string value) + //SixPerEm + private string AddSixPerEmSpaces(string value) { - return string.Join(((char)0x202f).ToString(), value.ToCharArray()); + var hairSpace = (char)0x2006; + var withSpaces = string.Join(hairSpace.ToString(), value.ToCharArray()); + return $"{hairSpace}{withSpaces}{hairSpace}"; + } + + //Hair + private string AddTwelvePerEmSpaces(string value) + { + var hairSpace = (char)0x200a; + var withSpaces = string.Join(hairSpace.ToString(), value.ToCharArray()); + return $"{hairSpace}{withSpaces}{hairSpace}"; } + public CardImage CreateSiteBack(CardSuit suit) { var name = $"{suit.ResourceName()}_SiteBack"; @@ -266,8 +293,8 @@ public CardImage CreateSiteBack(CardSuit suit) var cardNameFont = new Font(boldFontFamily, orderCardHeaderFontSize, FontStyle.Bold, GraphicsUnit.Pixel); var costFont = new Font(regularFontFamily, siteCardCostTextFontSize, FontStyle.Regular, GraphicsUnit.Pixel); - var resourceNameText = AddHairSpaces(suit.ResourceName().ToUpper()); - var outOfTownSiteText = AddHairSpaces("out of town site"); + var resourceNameText = AddFourPerEmSpaces(suit.ResourceName().ToUpper()); + var outOfTownSiteText = AddFourPerEmSpaces("out of town site"); var maxTextBoxWidth = usableRectangle.Width; var initialRectangle = new Rectangle(usableRectangle.X, usableRectangle.Y, maxTextBoxWidth, usableRectangle.Height); var resourceNameTextMeasurement = graphics.MeasureString(outOfTownSiteText, cardNameFont, new SizeF(initialRectangle.Width, initialRectangle.Height), GraphicsUtilities.HorizontalCenterAlignment); @@ -303,7 +330,7 @@ private void DrawSiteCost(CardImage cardImage, CardSuit suit) graphics.DrawLine(pen, fullRectangle.Left + xOffset - extra, fullRectangle.Bottom + extra, fullRectangle.Left + fullRectangle.Height + xOffset + extra, fullRectangle.Top - extra); graphics.Clip = oldClip; var material = suit.Cost() > 1 ? "materials" : "material"; - var costText = AddHairSpaces($"foundation +{suit.Cost()} {material}"); + var costText = AddFourPerEmSpaces($"foundation +{suit.Cost()} {material}"); var costFont = new Font(regularFontFamily, siteCardCostTextFontSize, FontStyle.Regular, GraphicsUnit.Pixel); var costTextMeasurement = graphics.MeasureString(costText, costFont, fullRectangle.Width); var costTextWidth = (int)Math.Ceiling(costTextMeasurement.Width); @@ -378,28 +405,25 @@ private void PrintOrderCardName(OrderCard orderCard, CardImage cardImage) var xOffset = RoleIconWidth(cardImage); var maxTextBoxWidth = CardNameWidth(cardImage); var yOffset = (int)(cardImage.UsableRectangle.Width * .05f); - PrintCardName(orderCard.CardName, cardImage, GraphicsUtilities.BlackBrush, true, xOffset, maxTextBoxWidth, yOffset); + PrintCardName(orderCard.CardName, cardImage, GraphicsUtilities.BlackBrush, 100, xOffset, maxTextBoxWidth, yOffset); } - private void PrintCardName(string name, CardImage cardImage, Brush brush, bool addTranslucentBackground, int xOffset, int maxTextBoxWidth, int yOffset) + private void PrintCardName(string name, CardImage cardImage, Brush brush, int translucentBackgroundOpacity, int xOffset, int maxTextBoxWidth, int yOffset) { var graphics = cardImage.Graphics; var usableRectangle = cardImage.UsableRectangle; var cardNameFont = new Font(boldFontFamily, orderCardHeaderFontSize, FontStyle.Bold, GraphicsUnit.Pixel); - var text = string.Join( - " ", - name.ToUpper() - .Split(' ') - .Select(token => AddNonBreakingNarrowSpaces(token)) - .ToList()); - var initialRectangle = new Rectangle(usableRectangle.X + xOffset, usableRectangle.Y, maxTextBoxWidth, usableRectangle.Height); - var textMeasurement = graphics.MeasureString(text, cardNameFont, new SizeF(initialRectangle.Width, initialRectangle.Height), GraphicsUtilities.HorizontalCenterAlignment); - var textHeight = (int)Math.Ceiling(textMeasurement.Height); - var textRectangle = new Rectangle(usableRectangle.X + xOffset, usableRectangle.Y + yOffset, maxTextBoxWidth, textHeight); - if (addTranslucentBackground) - graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.White)), textRectangle); - //graphics.FillRectangle(new SolidBrush(Color.Blue), textRectangle); - GraphicsUtilities.DrawString(graphics, text, cardNameFont, brush, textRectangle, GraphicsUtilities.HorizontalCenterAlignment); + var fragments = name.ToUpper().Split(" ") + .Select((word, index) => new TextFragment + { + Brush = brush, + Font = cardNameFont, + ForcesNewline = index > 0, + Text = AddThreePerEmSpaces(word) + }) + .ToList(); + var textRectangle = new Rectangle(usableRectangle.X + xOffset, usableRectangle.Y + yOffset, maxTextBoxWidth, usableRectangle.Height); + GraphicsUtilities.DrawFragmentsCentered(graphics, fragments, textRectangle, translucentBackgroundOpacity, false); } private int PrintCardImage(OrderCard orderCard, CardImage cardImage) @@ -436,7 +460,7 @@ private void PrintRoleIconAndName(OrderCard orderCard, CardImage cardImage) iconImageWidth, iconImageHeight); - var text = new string(roleName.ToUpper().ToCharArray().SelectMany(character => character == 'M' ? new[] { character } : new[] { character, (char)0x2009 }).ToArray()); + var text = new string(roleName.ToUpper().ToCharArray().SelectMany(character => character == 'I' ? new[] { character, (char)0x2009 } : new[] { character }).ToArray()); var brush = BrushesByCardSuit[suit]; var singleCharacterMeasurement = graphics.MeasureString("M", cardNameFont, new SizeF(usableRectangle.Width, usableRectangle.Height), GraphicsUtilities.HorizontalNearAlignment); var textBoxWidth = (int)singleCharacterMeasurement.Width; @@ -476,7 +500,7 @@ private void PrintResourceType(OrderCard orderCard, CardImage cardImage) var cardNameFont = new Font(boldFontFamily, orderCardHeaderFontSize, FontStyle.Bold, GraphicsUnit.Pixel); var suit = orderCard.CardSuit; var resourceName = suit.ResourceName().ToUpper(); - var text = AddHairSpaces(resourceName); + var text = AddFourPerEmSpaces(resourceName); var brush = new SolidBrush(suit.Color()); var textMeasurement = graphics.MeasureString(text, cardNameFont, new SizeF(usableRectangle.Width, usableRectangle.Height), GraphicsUtilities.HorizontalCenterAlignment); var textBoxHeight = (int)textMeasurement.Height; @@ -547,10 +571,10 @@ private void PrintOrderCardText(OrderCard orderCard, CardImage cardImage, int bo textRectangleHeight = usableRectangle.Bottom - (influenceImageSide + top); } var xOffset = RoleIconWidth(cardImage); - PrintCardText(orderCard.CardText, cardImage, top, textBoxWidth, textRectangleHeight, xOffset, true, GraphicsUtilities.BlackBrush); + PrintCardText(orderCard.CardText, cardImage, top, textBoxWidth, textRectangleHeight, xOffset, 200, GraphicsUtilities.BlackBrush); } - private void PrintCardText(string text, CardImage cardImage, int top, int textBoxWidth, int textRectangleHeight, int xOffset, bool addTranslucentBackground, Brush defaultBrush) + private void PrintCardText(string text, CardImage cardImage, int top, int textBoxWidth, int textRectangleHeight, int xOffset, int backgroundOpacity, Brush defaultBrush) { var graphics = cardImage.Graphics; var usableRectangle = cardImage.UsableRectangle; @@ -560,7 +584,7 @@ private void PrintCardText(string text, CardImage cardImage, int top, int textBo .Select(word => GetFragmentForWord(word, defaultBrush)) .ToList(); - GraphicsUtilities.DrawFragmentsCentered(graphics, fragments, rectangle, addTranslucentBackground); + GraphicsUtilities.DrawFragmentsCentered(graphics, fragments, rectangle, backgroundOpacity, true); } private TextFragment GetFragmentForWord(string word, Brush defaultBrush) @@ -577,7 +601,7 @@ private TextFragment GetFragmentForWord(string word, Brush defaultBrush) var isNonSuitKeyword = NonSuitKeywords.Any(keyword => text.Contains(keyword)); return new TextFragment { - Text = AddHairSpaces($"{text}"), + Text = AddFourPerEmSpaces($"{text}"), Font = isSuitKeyword || isNonSuitKeyword ? BoldCardTextFont : CardTextFont, Brush = isSuitKeyword ? BrushesByCardSuit[SuitsByKeyword[matchingSuitKeyword]] : defaultBrush, ForcesNewline = forcesNewline diff --git a/GtR/GtR/GraphicsUtilities.cs b/GtR/GtR/GraphicsUtilities.cs index 97a00dc..b3be9d9 100644 --- a/GtR/GtR/GraphicsUtilities.cs +++ b/GtR/GtR/GraphicsUtilities.cs @@ -156,7 +156,7 @@ public static void DrawString(Graphics graphics, string text, Font font, Brush b graphics.DrawString(text, font, brush, rectangle, stringFormat); } - public static void DrawFragmentsCentered(Graphics graphics, IList fragments, Rectangle rectangle, bool addTranslucentBackground) + public static void DrawFragmentsCentered(Graphics graphics, IList fragments, Rectangle rectangle, int backgroundOpacity, bool centerVertically) { var measuredFragments = fragments .Select(fragment => MeasureTextFragment(graphics, fragment, rectangle.Width)) @@ -165,9 +165,8 @@ public static void DrawFragmentsCentered(Graphics graphics, IList var totalHeight = fragmentsGroupedByLine.Sum(group => group.Max(measuredFragment => measuredFragment.Height)); var totalWidth = fragmentsGroupedByLine.Max(group => group.Sum(measuredFragment => measuredFragment.Width)); var minX = rectangle.X + (rectangle.Width / 2 - totalWidth / 2); - var minY = rectangle.Y + (rectangle.Height / 2 - totalHeight / 2); - if (addTranslucentBackground) - graphics.FillRectangle(new SolidBrush(Color.FromArgb(200, Color.White)), new Rectangle(minX, minY, totalWidth, totalHeight)); + var minY = rectangle.Y + (centerVertically ? (rectangle.Height / 2 - totalHeight / 2) : 0); + graphics.FillRectangle(new SolidBrush(Color.FromArgb(backgroundOpacity, Color.White)), new Rectangle(minX, minY, totalWidth, totalHeight)); var currentY = minY; foreach(var fragmentGroup in fragmentsGroupedByLine) { diff --git a/GtR/GtR/GtRConfig.json b/GtR/GtR/GtRConfig.json index f48c5f0..6419e78 100644 --- a/GtR/GtR/GtRConfig.json +++ b/GtR/GtR/GtRConfig.json @@ -3,5 +3,5 @@ "CardLongSideInInches": 3.5, "BleedSizeInInches": 0.125, // This is (1.0f / 8.0f) "BorderPaddingInInches": 0.0625, // This is (1.0f / 16.0f) - "SaveConfiguration": "Page" // Accepted values: Page or SingleImage + "SaveConfiguration": "SingleImage" // Accepted values: Page or SingleImage } diff --git a/NeuzeitGro-Bol.ttx b/NeuzeitGro-Bol.ttx index df38c12..69c28cf 100644 --- a/NeuzeitGro-Bol.ttx +++ b/NeuzeitGro-Bol.ttx @@ -338,8 +338,12 @@ - - + + + + + + @@ -1110,8 +1114,12 @@ + + + + @@ -1488,8 +1496,12 @@ + + + + @@ -2179,8 +2191,12 @@ + + + + @@ -20361,10 +20377,18 @@ + + + + + + + + @@ -21837,8 +21861,12 @@ + + + + @@ -22477,8 +22505,12 @@ + + + + diff --git a/NeuzeitGro-BolModified.ttf b/NeuzeitGro-BolModified.ttf index 7971fee..0310347 100644 Binary files a/NeuzeitGro-BolModified.ttf and b/NeuzeitGro-BolModified.ttf differ diff --git a/NeuzeitGro-Reg.ttx b/NeuzeitGro-Reg.ttx index 82e2464..fd0579e 100644 --- a/NeuzeitGro-Reg.ttx +++ b/NeuzeitGro-Reg.ttx @@ -338,8 +338,12 @@ - - + + + + + + @@ -1110,8 +1114,12 @@ + + + + @@ -1488,8 +1496,12 @@ + + + + @@ -2179,8 +2191,12 @@ + + + + @@ -20533,10 +20549,18 @@ + + + + + + + + @@ -22006,8 +22030,12 @@ + + + + @@ -22646,8 +22674,12 @@ + + + + diff --git a/NeuzeitGro-RegModified.ttf b/NeuzeitGro-RegModified.ttf index 52fa1f3..569047c 100644 Binary files a/NeuzeitGro-RegModified.ttf and b/NeuzeitGro-RegModified.ttf differ