void SetTextToSprites(List <SpriteInfo> sprites, string text, TextRenderType renderType) { var bytes = encoding.GetBytes(text); int charIndex = 0; // the length of sprites is the same than the text length for (int i = 0; i < bytes.Length; ++i) { if (bytes[i] > 32) // no sys chars nor spaces { if (renderType == TextRenderType.NewUI) { var textureAtlasOffset = UI.GuiObject.GetTextureAtlasOffset(Data.Resource.UIText, 0); textureAtlasOffset.X += (bytes[i] % Global.UIFontCharactersPerLine) * Global.UIFontCharacterWidth; textureAtlasOffset.Y += (bytes[i] / Global.UIFontCharactersPerLine) * Global.UIFontCharacterHeight; sprites[charIndex].Sprite.Layer = layerNewFont; sprites[charIndex++].Sprite.TextureAtlasOffset = textureAtlasOffset; } else { sprites[charIndex].Sprite.Layer = layerLegacy; if (renderType == TextRenderType.LegacySpecialDigits && bytes[i] >= '0' && bytes[i] <= '9') { sprites[charIndex++].Sprite.TextureAtlasOffset = UI.GuiObject.GetTextureAtlasOffset(Data.Resource.Icon, 78u + (uint)(bytes[i] - '0')); } else { sprites[charIndex++].Sprite.TextureAtlasOffset = UI.GuiObject.GetTextureAtlasOffset(Data.Resource.Font, MapCharacterToSpriteIndex(bytes[i])); } } } } }
public int CreateText(string text, byte displayLayer, TextRenderType renderType, Position position = null, int characterGapSize = 8) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var characterSprites = renderType == TextRenderType.NewUI ? characterSpritesNew : characterSpritesLegacy; // look if we have an unused render text int index = renderTexts.FindIndex(checkText => checkText == null); var spritePool = characterSprites.Where(sprite => !sprite.InUse); int numAvailableCharacters = spritePool.Count(); int lengthWithoutSpaces = text.Replace(" ", "").Length; List <SpriteInfo> sprites; if (numAvailableCharacters < lengthWithoutSpaces) { sprites = new List <SpriteInfo>(spritePool); sprites.AddRange(AddCharacterSprites(lengthWithoutSpaces - numAvailableCharacters, renderType)); } else { sprites = new List <SpriteInfo>(spritePool.Take(lengthWithoutSpaces)); } // mark all as in use foreach (var sprite in sprites) { sprite.InUse = true; } var renderText = new RenderText(text); renderText.TextRenderType = renderType; renderText.Characters = sprites; if (position != null) { renderText.Position.X = position.X; renderText.Position.Y = position.Y; } SetTextToSprites(renderText.Characters, text, renderText.TextRenderType); renderText.UpdatePositions(characterGapSize); renderText.UpdateDisplayLayer(displayLayer); if (index == -1) { index = renderTexts.Count; renderTexts.Add(renderText); } else { renderTexts[index] = renderText; } return(index); }
public ListBox(Interface interf, TextRenderType renderType = TextRenderType.NewUI) : base(interf) { background = interf.RenderView.ColoredRectFactory.Create(0, 0, colorBackground, BaseDisplayLayer); background.Layer = Layer; selectionBackground = interf.RenderView.ColoredRectFactory.Create(0, 0, colorFocus, (byte)(BaseDisplayLayer + 1)); selectionBackground.Layer = Layer; this.renderType = renderType; }
public void ChangeDisplayLayer(TextRenderType renderType, int index, byte displayLayer) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var renderText = renderTexts[index]; foreach (var character in renderText.Characters) { character.Sprite.DisplayLayer = displayLayer; } }
public bool IsVisible(TextRenderType renderType, int index) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; if (renderTexts[index] == null) { return(false); } return(renderTexts[index].Visible); }
public void DestroyText(TextRenderType renderType, int index) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var renderText = renderTexts[index]; foreach (var character in renderText.Characters) { character.Sprite.Visible = false; character.InUse = false; } renderTexts[index] = null; }
public void SetPosition(TextRenderType renderType, int index, Position position, int characterGapSize = 8) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var renderText = renderTexts[index]; if (position == renderText.Position) { return; } renderText.Position.X = position.X; renderText.Position.Y = position.Y; renderText.UpdatePositions(characterGapSize); }
public void ShowText(TextRenderType renderType, int index, bool show) { var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var renderText = renderTexts[index]; if (renderText.Visible == show) { return; // nothing to do } foreach (var character in renderText.Characters) { character.Sprite.Visible = show; } renderText.Visible = show; }
/// <summary> /// This is only used for legacy types /// </summary> /// <param name="index"></param> /// <param name="type"></param> public void SetRenderType(int index, TextRenderType type) { if (type == TextRenderType.NewUI) { throw new ExceptionFreeserf("Switching to new UI font is not supported."); } var renderText = renderTextsLegacy[index]; if (type == renderText.TextRenderType) { return; } renderText.TextRenderType = type; SetTextToSprites(renderText.Characters, renderText.Text, renderText.TextRenderType); }
List <SpriteInfo> AddCharacterSprites(int number, TextRenderType renderType) { var characterSprites = renderType == TextRenderType.NewUI ? characterSpritesNew : characterSpritesLegacy; var characterSize = renderType == TextRenderType.NewUI ? characterSizeNew : characterSizeLegacy; List <SpriteInfo> sprites = new List <SpriteInfo>(number); for (int i = 0; i < number; ++i) { var spriteInfo = new SpriteInfo() { Sprite = spriteFactory.Create(characterSize.Width, characterSize.Height, 0, 0, false, true, 0) as ILayerSprite, InUse = false }; spriteInfo.Sprite.Layer = renderType == TextRenderType.NewUI ? layerNewFont : layerLegacy; sprites.Add(spriteInfo); } characterSprites.AddRange(sprites); return(sprites); }
public static byte[] ValidCharacters(TextRenderType renderType) => renderType == TextRenderType.NewUI ? null : ValidLegcyCharacters;
public static FastString HtmlString(string text, TextRenderType textRenderType, string fontSize = "13px;") { return(HtmlString(text, textRenderType, CRLF.html, false, fontSize)); }
internal static FastString HtmlString(string text, TextRenderType textRenderType, CRLF crlf, bool excel2007) { FastString Result = new FastString(text.Length); int len = text.Length; for (int i = 0; i < len; i++) { if (crlf != CRLF.xml && crlf != CRLF.odt && text[i] == ' ' && (text.Length == 1 || (i < (len - 1) && text[i + 1] == ' ') || (i > 0 && text[i - 1] == ' ') || i == len - 1)) { Result.Append(" "); } else if (text[i] == '<' && textRenderType == TextRenderType.HtmlTags && crlf == CRLF.odt) { i += text.IndexOf('>', i) - i; } else if (i < text.Length - 1 && text[i] == '\r' && text[i + 1] == '\n') { if (crlf == CRLF.xml) { Result.Append(" "); } else if (crlf == CRLF.odt) { Result.Append("<text:line-break />"); } else { Result.Append("<p style=\"margin-top:0px;margin-bottom:0px;\">"); } i++; } else if (text[i] == '\t' && crlf == CRLF.odt) { Result.Append("<text:tab/>"); } else if (text[i] == ' ' && crlf == CRLF.odt) { int spaces = 1; while (i < text.Length - 1) { if (text[i + 1] == ' ') { i++; spaces++; } else { break; } } Result.Append("<text:s text:c=\"" + spaces + "\"/>"); } else if (text[i] == '\\') { Result.Append("\"); } else if (text[i] == '~' && !excel2007) { Result.Append("˜"); } else if (text[i] == '€' && !excel2007) { Result.Append("€"); } else if (text[i] == '‹' && !excel2007) { Result.Append("‹"); } else if (text[i] == '›' && !excel2007) { Result.Append("›"); } else if (text[i] == 'ˆ' && !excel2007) { Result.Append("ˆ"); } else if (text[i] == '&' && textRenderType == TextRenderType.Default) { Result.Append("&"); } else if (text[i] == '"' && textRenderType == TextRenderType.Default) { Result.Append("""); } else if (text[i] == '<' && textRenderType == TextRenderType.Default) { Result.Append("<"); } else if (text[i] == '>' && textRenderType == TextRenderType.Default) { Result.Append(">"); } else if (text[i] == '\t' && excel2007) { continue; } else { Result.Append(text[i]); } } return(Result); }
internal static string OdtString(string Str, TextRenderType textRenderType) { return(HtmlString(Str, textRenderType, CRLF.odt, false).ToString()); }
internal static string Excel2007String(string Str, TextRenderType textRenderType) { return(HtmlString(Str, textRenderType, CRLF.xml, true).ToString()); }
internal static FastString HtmlString(string text, TextRenderType textRenderType) { return(HtmlString(text, textRenderType, CRLF.html, false)); }
internal static FastString HtmlString(string text, TextRenderType textRenderType, CRLF crlf, bool excel2007) { FastString Result = new FastString(text.Length); int len = text.Length; for (int i = 0; i < len; i++) { if (crlf != CRLF.xml && crlf != CRLF.odt && text[i] == ' ' && (text.Length == 1 || (i < (len - 1) && text[i + 1] == ' ') || (i > 0 && text[i - 1] == ' ') || i == len - 1)) { Result.Append(" "); } else if (i < text.Length - 1 && text[i] == '\r' && text[i + 1] == '\n') { if (crlf == CRLF.xml) { Result.Append(" "); } else if (crlf == CRLF.odt) { Result.Append("<text:line-break />"); } else { Result.Append("<br />"); } i++; } else if (text[i] == '\\') { Result.Append("\"); } else if (text[i] == '~' && !excel2007) { Result.Append("˜"); } else if (text[i] == '€' && !excel2007) { Result.Append("€"); } else if (text[i] == '‹' && !excel2007) { Result.Append("‹"); } else if (text[i] == '›' && !excel2007) { Result.Append("›"); } else if (text[i] == 'ˆ' && !excel2007) { Result.Append("ˆ"); } else if (text[i] == '&' && textRenderType == TextRenderType.Default) { Result.Append("&"); } else if (text[i] == '"' && textRenderType == TextRenderType.Default) { Result.Append("""); } else if (text[i] == '<' && textRenderType == TextRenderType.Default) { Result.Append("<"); } else if (text[i] == '>' && textRenderType == TextRenderType.Default) { Result.Append(">"); } else if (text[i] == '\t' && excel2007) { continue; } else { Result.Append(text[i]); } } return(Result); }
public void ChangeText(int index, string newText, byte displayLayer, TextRenderType renderType, int characterGapSize = 8) { var characterSprites = renderType == TextRenderType.NewUI ? characterSpritesNew : characterSpritesLegacy; var renderTexts = renderType == TextRenderType.NewUI ? renderTextsNew : renderTextsLegacy; var renderText = renderTexts[index]; if (renderText.Text == newText) { return; } int newLengthWithoutSpaces = newText.Replace(" ", "").Length; if (renderText.Characters.Count < newLengthWithoutSpaces) { var spritePool = characterSprites.Where(sprite => !sprite.InUse); int numAdditionalChars = newLengthWithoutSpaces - renderText.Characters.Count; int numAvailableChars = spritePool.Count(); List <SpriteInfo> sprites; if (numAvailableChars < numAdditionalChars) { sprites = new List <SpriteInfo>(spritePool); sprites.AddRange(AddCharacterSprites(numAdditionalChars - numAvailableChars, renderType)); } else { sprites = new List <SpriteInfo>(spritePool.Take(numAdditionalChars)); } // mark all as in use foreach (var sprite in sprites) { sprite.InUse = true; } renderText.Characters.AddRange(sprites); } else if (renderText.Characters.Count > newLengthWithoutSpaces) { for (int i = newLengthWithoutSpaces; i < renderText.Characters.Count; ++i) { renderText.Characters[i].Sprite.Visible = false; renderText.Characters[i].InUse = false; } renderText.Characters.RemoveRange(newLengthWithoutSpaces, renderText.Characters.Count - newLengthWithoutSpaces); } SetTextToSprites(renderText.Characters, newText, renderText.TextRenderType); renderText.Text = newText; renderText.UpdatePositions(characterGapSize); renderText.UpdateDisplayLayer(displayLayer); // update character visibility foreach (var character in renderText.Characters) { character.Sprite.Visible = renderText.Visible; } }
internal static FastString HtmlString(string text, TextRenderType textRenderType, CRLF crlf, bool excel2007, string fontSize = "13px;") { FastString Result = new FastString(text.Length); int len = text.Length; int lineBreakCount = 0; if (textRenderType == TextRenderType.HtmlTags) { string wingdings = "<font face=\"Wingdings\">"; string webdings = "<font face=\"Webdings\">"; int ind1 = 0, ind2 = 0; if (text.Contains(wingdings)) { ind1 = text.IndexOf(wingdings) + wingdings.Length; ind2 = text.IndexOf('<', ind1); text = text.Substring(0, ind1) + WingdingsToUnicodeConverter.Convert(text.Substring(ind1, ind2 - ind1)) + text.Substring(ind2, text.Length - ind2); } else if (text.Contains(webdings)) { ind1 = text.IndexOf(webdings) + webdings.Length; ind2 = text.IndexOf('<', ind1); text = text.Substring(0, ind1) + WingdingsToUnicodeConverter.Convert(text.Substring(ind1, ind2 - ind1)) + text.Substring(ind2, text.Length - ind2); } } for (int i = 0; i < len; i++) { if (crlf != CRLF.xml && crlf != CRLF.odt && text[i] == ' ' && (text.Length == 1 || (i < (len - 1) && text[i + 1] == ' ') || (i > 0 && text[i - 1] == ' ') || i == len - 1)) { Result.Append(" "); } else if (text[i] == '<' && textRenderType == TextRenderType.HtmlTags && crlf == CRLF.odt) { i += text.IndexOf('>', i) - i; } else if (i < text.Length - 1 && text[i] == '\r' && text[i + 1] == '\n') { if (crlf == CRLF.xml) { Result.Append(" "); } else if (crlf == CRLF.odt) { Result.Append("<text:line-break />"); } else { if (lineBreakCount == 0) { Result.Append("<p style=\"margin-top:0px;margin-bottom:0px;\"></p>"); } else { Result.Append($"<p style=\"margin-top:0px;height:{fontSize}margin-bottom:0px\"></p>"); } lineBreakCount++; } i++; } else { lineBreakCount = 0; if (text[i] == '\t' && crlf == CRLF.odt) { Result.Append("<text:tab/>"); } else if (text[i] == ' ' && crlf == CRLF.odt) { int spaces = 1; while (i < text.Length - 1) { if (text[i + 1] == ' ') { i++; spaces++; } else { break; } } Result.Append("<text:s text:c=\"" + spaces + "\"/>"); } else if (text[i] == '\\') { Result.Append("\"); } else if (text[i] == '~' && !excel2007) { Result.Append("˜"); } else if (text[i] == '€' && !excel2007) { Result.Append("€"); } else if (text[i] == '‹' && !excel2007) { Result.Append("‹"); } else if (text[i] == '›' && !excel2007) { Result.Append("›"); } else if (text[i] == 'ˆ' && !excel2007) { Result.Append("ˆ"); } else if (text[i] == '&' && textRenderType == TextRenderType.Default) { Result.Append("&"); } else if (text[i] == '"' && textRenderType == TextRenderType.Default) { Result.Append("""); } else if (text[i] == '<' && textRenderType == TextRenderType.Default) { Result.Append("<"); } else if (text[i] == '>' && textRenderType == TextRenderType.Default) { Result.Append(">"); } else if (text[i] == '\t' && excel2007) { continue; } else { Result.Append(text[i]); } } } return(Result); }