From 2e3af7057d4b784a10bf000ba536eb9255d2ffc6 Mon Sep 17 00:00:00 2001 From: Kagamia Date: Wed, 4 Jan 2017 01:29:16 +0800 Subject: [PATCH] Fix text renderer bug. --- WzComparerR2/CharaSimControl/GearGraphics.cs | 58 +++++++++++++++++-- .../CharaSimControl/GearTooltipRender2.cs | 6 +- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/WzComparerR2/CharaSimControl/GearGraphics.cs b/WzComparerR2/CharaSimControl/GearGraphics.cs index 4ec5af35..be58fbca 100644 --- a/WzComparerR2/CharaSimControl/GearGraphics.cs +++ b/WzComparerR2/CharaSimControl/GearGraphics.cs @@ -216,7 +216,8 @@ public static void DrawString(Graphics g, string s, Font font, int x, int x1, re using (var r = new FormattedTextRenderer()) { - r.WordWrapEnabled = false; + r.WordWrapEnabled = true; + r.UseGDIRenderer = false; r.DrawString(g, s, font, x, x1, ref y, height); } } @@ -419,6 +420,7 @@ public FormattedTextRenderer() } public bool WordWrapEnabled { get; set; } + public bool UseGDIRenderer { get; set; } const int MAX_RANGES = 32; StringFormat fmt; @@ -638,6 +640,25 @@ private void MeasureRuns(List runs) } MeasureBatch(tempRuns); + + //failed + if (runs.Where(run => !run.IsBreakLine && run.Length > 0) + .All(run => run.Width == 0)) + { + float x = 0; + foreach (var run in runs.Where(r => !r.IsBreakLine)) + { + run.X = (int)Math.Round(x); + float width = 0; + for (int i = 0; i < run.Length; i++) + { + var chr = this.sb[run.StartIndex + i]; + width += chr > 0xff ? this.font.Size : (this.font.Size / 2); + } + run.Width = (int)Math.Round(x); + x += width; + } + } } private void MeasureBatch(List runs) @@ -682,6 +703,23 @@ private Rectangle[] MeasureChars(int startIndex, int length) } } + //failed + if (rects.All(rect => rect.Width == 0)) + { + float x = 0; + for (int i = 0; i < rects.Length; i++) + { + var chr = this.sb[startIndex + i]; + var width = chr > 0xff ? this.font.Size : (this.font.Size / 2); + rects[i] = new Rectangle( + (int)Math.Round(x), + 0, + (int)Math.Round(width), + font.Height + ); + } + } + return rects; } @@ -703,7 +741,18 @@ private void DrawRuns(List runs, int x, int x1, ref int y, int lineHeight) if (hasContent()) { string content = sb.ToString(start, end - start); - TR.DrawText(g, content, font, new Point(drawX, drawY), color); + + if (this.UseGDIRenderer) + { + TR.DrawText(g, content, font, new Point(drawX, drawY), color); + } + else + { + using (var brush = new SolidBrush(color)) + { + g.DrawString(content, font, brush, drawX, drawY, fmt); + } + } } if (isNewLine) { @@ -730,7 +779,7 @@ private void DrawRuns(List runs, int x, int x1, ref int y, int lineHeight) } else { - if (run.ForeColor != color) + if (!run.IsWhiteSpace && run.ForeColor != color) { end = run.StartIndex; curX = x + run.X - xOffset; @@ -748,7 +797,7 @@ private void DrawRuns(List runs, int x, int x1, ref int y, int lineHeight) curX = x + run.X - xOffset; if (this.WordWrapEnabled ? (x1 - curX < run.Width) : (curX >= x1)) //奇怪的算法 暂定 { //宽度不够 - if (hasContent()) + if (curX > x) //(hasContent()) { //有内容 flush(true); start = run.StartIndex; @@ -774,6 +823,7 @@ private void DrawRuns(List runs, int x, int x1, ref int y, int lineHeight) { //限定至少输出一个字符 end = start + 1; flush(true); + xOffset = rects[i].Right; continue; } else diff --git a/WzComparerR2/CharaSimControl/GearTooltipRender2.cs b/WzComparerR2/CharaSimControl/GearTooltipRender2.cs index 7a383704..247a58b6 100644 --- a/WzComparerR2/CharaSimControl/GearTooltipRender2.cs +++ b/WzComparerR2/CharaSimControl/GearTooltipRender2.cs @@ -156,7 +156,8 @@ private Bitmap RenderBase(out int picH) { Bitmap bitmap = new Bitmap(261, DefaultPicHeight); Graphics g = Graphics.FromImage(bitmap); - StringFormat format = (StringFormat)StringFormat.GenericDefault.Clone(); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; + StringFormat format = (StringFormat)StringFormat.GenericTypographic.Clone(); int value; picH = 13; @@ -185,9 +186,6 @@ private Bitmap RenderBase(out int picH) g.DrawString(gearName, GearGraphics.ItemNameFont2, GearGraphics.GetGearNameBrush(Gear.diff, Gear.ScrollUp > 0), 130, picH, format); picH += 23; - format.Dispose(); - format = (StringFormat)StringFormat.GenericTypographic.Clone(); - format.Alignment = StringAlignment.Center; //装备rank string rankStr = null;