private void InternalPrepareRun(Pango.LayoutRun run) { PrepareRunNativeDelegate unmanaged = class_abi.BaseOverride <PrepareRunNativeDelegate>(this.LookupGType(), "prepare_run"); if (unmanaged == null) { return; } IntPtr native_run = GLib.Marshaller.StructureToPtrAlloc(run); unmanaged(this.Handle, native_run); Marshal.FreeHGlobal(native_run); }
private void InternalPrepareRun(Pango.LayoutRun run) { PrepareRunNativeDelegate unmanaged = null; unsafe { IntPtr *raw_ptr = (IntPtr *)(((long)this.LookupGType().GetThresholdType().GetClassPtr()) + (long)class_abi.GetFieldOffset("prepare_run")); unmanaged = (PrepareRunNativeDelegate)Marshal.GetDelegateForFunctionPointer(*raw_ptr, typeof(PrepareRunNativeDelegate)); } if (unmanaged == null) { return; } IntPtr native_run = GLib.Marshaller.StructureToPtrAlloc(run); unmanaged(this.Handle, native_run); Marshal.FreeHGlobal(native_run); }
protected virtual void OnPrepareRun(Pango.LayoutRun run) { InternalPrepareRun(run); }
IEnumerable <Line> Analyselayout(Pango.Layout pl) { var text = pl.Text; var iter = pl.Iter; var lli = 0; var ll = 0; var li = 0; var iRun = 0; var numGlyph = 0; Pango.LayoutLine line = iter.Line; Pango.LayoutRun run = iter.Run; var scale = Pango.Scale.PangoScale; Func <Line> render = () => { if (numGlyph == 0) { return(default(Line)); } ll = numGlyph; var newline = line != null && line.StartIndex != li; if (newline) { li = line.StartIndex; } if (iter.Line.StartIndex != line.StartIndex && iter.Line.IsParagraphStart) { ll--; } var llrect = new Pango.Rectangle(); var rect = new Pango.Rectangle(); line.GetExtents(ref rect, ref llrect); var lline = new Line { Pos = lli, Len = Math.Min(ll, text.Length - lli), Width = run.Glyphs.Width, Height = llrect.Height / scale }; if (iter.Line.IsParagraphStart) { ll++; } lli += ll; return(lline); }; do { var newRun = iter.Run.Glyphs != null && iter.Run.Item.Offset != iRun; if (newRun) { iRun = iter.Run.Item.Offset; yield return(render()); numGlyph = 0; line = null; } if (line == null) { line = iter.Line; run = iter.Run; } numGlyph++; } while(iter.NextChar()); yield return(render()); }