private void Inject(WpdArchiveListing listing, WpdEntry[] fontEntries, WflContent[] fontContent) { UiInjectionManager manager = new UiInjectionManager(); using (MemoryInjectionSource source = new MemoryInjectionSource()) { String injectionRoot = Path.Combine(source.ProvideRootDirectory(), listing.ExtractionSubpath); for (int i = 0; i < fontEntries.Length; i++) { WpdEntry entry = fontEntries[i]; WflContent content = fontContent[i]; String injectionPath = Path.Combine(injectionRoot, entry.Name); MemoryStream stream = new MemoryStream(1024); source.RegisterStream(injectionPath, stream); WflFileWriter writer = new WflFileWriter(stream); writer.Write(content); stream.SetPosition(0); } UiWpdInjector injector = new UiWpdInjector(listing, fontEntries, false, source); injector.Inject(manager); } manager.WriteListings(); }
public UiEncodingWindowSource(string displayName, DxTexture texture, WflContent info, char[] chars, ConcurrentDictionary <char, short> codes) { DisplayName = displayName; Texture = texture; Info = info; Chars = chars; Codes = codes; }
private void OnDxControlElementMouseDown(object sender, MouseEventArgs e) { if (_currentSource == null) { return; } int viewportX = _editViewport.X; int viewportY = _editViewport.Y; List <int> mainIndices = new List <int>(2); List <int> additionalIndices = new List <int>(2); WflContent info = _currentSource.Info; int height = info.Header.LineHeight; for (int i = 0; i < 256 * 2; i++) { if (i % 256 < 0x20) { continue; } int offsets = info.Offsets[i]; int sizes = info.Sizes[i]; int y = (offsets >> 16) & 0xFFFF; int oy = viewportY + e.Y - y; if (oy >= 0 && oy <= height) { int x = offsets & 0xFFFF; int width = (sizes & 0x0000FF00) >> 8; int ox = viewportX + e.X - x; if (ox >= 0 && ox <= width) { mainIndices.Add(i); _newMovable = 1; } } } int squareSize = info.Header.LineSpacing + info.Header.SquareDiff; short value = (short)(((viewportY + e.Y) / squareSize) << 8 | ((viewportX + e.X) / squareSize)); int index = Array.IndexOf(info.AdditionalTable, value); if (index >= 0) { additionalIndices.Add(index); } _charactersControl.SetCurrent(_currentSource, mainIndices, additionalIndices); if (mainIndices.Count > 0 || additionalIndices.Count > 0) { _editViewport.Refresh(); } }
private static WflContent[] ReadFontContent(Stream xgr, WpdEntry[] fontEntries) { WflContent[] result = new WflContent[fontEntries.Length]; for (int i = 0; i < result.Length; i++) { WpdEntry entry = fontEntries[i]; using (StreamSegment wflInput = new StreamSegment(xgr, entry.Offset, entry.Length, FileAccess.Read)) { WflFileReader reader = new WflFileReader(wflInput); result[i] = reader.Read(); } } return(result); }
private void OnEditViewportDrawPrimitives(Device device, RenderTarget target2D, Rectangle cliprectangle) { UiEncodingWindowSource source = _currentSource; WflContent info = source?.Info; if (info?.Header.TableType != WflHeader.LargeTable) { return; } int viewportX = _editViewport.X; int viewportY = _editViewport.Y; RectangleF rectangle = new RectangleF { Height = info.Header.LineHeight }; target2D.BeginDraw(); for (int i = 0; i < 256 * 2; i++) { if (i % 256 < 0x20) { continue; } int x, y; info.GetOffsets(i, out x, out y); x -= viewportX; y -= viewportY; byte before, width, after; info.GetSizes(i, out before, out width, out after); rectangle.X = x; rectangle.Y = y; rectangle.Width = width & 0x7F; if (_charactersControl.CurrentMainIndices.Contains(i)) { target2D.FillRectangle(rectangle, _selectedColorBrush); if (before > 0x7F) { rectangle.Width = (0xFF - before) + 1; rectangle.X = x; } else { rectangle.Width = before; rectangle.X = x - before; } target2D.FillRectangle(rectangle, _spacingColorBrush); if (after > 0x7F) { rectangle.Width = (0xFF - after) + 1; rectangle.X = x + (width & 0x7F) - rectangle.Width; } else { rectangle.Width = after; rectangle.X = x + width & 0x7F; } target2D.FillRectangle(rectangle, _spacingColorBrush); } else if (source.Chars[i % 256] == 0x00) { target2D.FillRectangle(rectangle, _notMappedColorBrush); } else { target2D.DrawRectangle(rectangle, _gridColorBrush, 1.0f); } } int squareSize = info.Header.LineSpacing + info.Header.SquareDiff; rectangle.Height = squareSize; rectangle.Width = squareSize; for (int i = 0; i < info.AdditionalTable.Length; i++) { int value = info.AdditionalTable[i]; if (value == 0) { continue; } rectangle.Y = (value >> 8) * squareSize - viewportY; rectangle.X = (value & 0xFF) * squareSize - viewportX; if (_charactersControl.CurrentAdditionalIndices.Contains(i)) { target2D.FillRectangle(rectangle, _selectedColorBrush); } else if (source.Chars[i + 256] == 0x00) { target2D.FillRectangle(rectangle, _notMappedColorBrush); } else { target2D.DrawRectangle(rectangle, _gridColorBrush, 1.0f); } } target2D.EndDraw(); }