DXFont GetFontForTextElement(TextElement element) { DXFont result = null; string fontKey = String.Format("{0}{1}{2}", element.Font.Name, element.Font.Size, element.Font.Style, element.AntiAliased); if (!_fontCache.TryGetValue(fontKey, out result)) { result = Collect(new DXFont(_device, _deviceContext)); result.Initialize(element.Font.Name, element.Font.Size, element.Font.Style, element.AntiAliased); _fontCache[fontKey] = result; } return(result); }
/// <summary> /// Draw the overlay(s) /// </summary> public void Draw() { if (!_initialised) { return; } Begin(); lock (_hook._overlayLock) foreach (var overlay in Overlays) { foreach (var element in overlay.Elements) { if (element.Hidden) { continue; } var textElement = element as TextElement; var imageElement = element as ImageElement; if (textElement != null) { DXFont font = GetFontForTextElement(textElement); if (font != null && !String.IsNullOrEmpty(textElement.Text)) { _spriteEngine.DrawString(textElement.Location.X, textElement.Location.Y, textElement.Text, textElement.Color, font); } } else if (imageElement != null) { lock (_imageCache) { DXImage image = GetImageForImageElement(imageElement); if (image != null) { _spriteEngine.DrawImage(imageElement.Location.X, imageElement.Location.Y, imageElement.Scale, imageElement.Angle, imageElement.Tint, image); } } } } } End(); }
public void DrawString(int X, int Y, string text, System.Drawing.Color color, DXFont F) { SharpDX.Mathematics.Interop.RawColor4 blendFactor = new Color4(1.0f); SharpDX.Mathematics.Interop.RawColor4 backupBlendFactor; int backupMask; using (var backupBlendState = _deviceContext.OutputMerger.GetBlendState(out backupBlendFactor, out backupMask)) { _deviceContext.OutputMerger.SetBlendState(_transparentBS, blendFactor); BeginBatch(F.GetFontSheetSRV()); int length = text.Length; int posX = X; int posY = Y; Color4 color4 = ToColor4(color); for (int i = 0; i < length; ++i) { char character = text[i]; if (character == ' ') { posX += F.GetSpaceWidth(); } else if (character == '\n') { posX = X; posY += F.GetCharHeight(); } else { Rectangle charRect = F.GetCharRect(character); int width = charRect.Right - charRect.Left; int height = charRect.Bottom - charRect.Top; Draw(new Rectangle(posX, posY, width, height), charRect, color4); posX += width + 1; } } EndBatch(); _deviceContext.OutputMerger.SetBlendState(backupBlendState, backupBlendFactor, backupMask); } }