Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 protected virtual void OnPrepareRun(Pango.LayoutRun run)
 {
     InternalPrepareRun(run);
 }
Beispiel #4
0
        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());
        }