예제 #1
0
        public LineSpan[] GetLineSpans(int count)
        {
            EnsureLines();
            int p = (int)position;
            int c = Math.Min(count, LineCount - p);

            if (c <= 0)
            {
                return(new LineSpan[0]);
            }
            var spans = new LineSpan[c];

            for (int i = 0; i < c; ++i)
            {
                TextSpan[] line;
                if ((p + i) < lines.Length)
                {
                    line = lines[p + i];
                }
                else
                {
                    line = new TextSpan[] { new EmptyTextSpan() }
                };
                spans[i] = new LineSpan(p + i, line);
            }
            position = p + c;
            return(spans);
        }
예제 #2
0
 public void DecorateLastLine(LineSpan line)
 {
     for (int i = 0; i < line.TextSpans.Length; ++i)
     {
         var span = line.TextSpans[i];
         if (span.Style == null)
         {
             span.Style = "lastLine";
         }
         else
         {
             span.Style = span.Style + " lastLine";
         }
     }
 }
예제 #3
0
            public void AddLayoutLine(LineSpan line, ref RectangleF rcLine /* put in state */)
            {
                float cyLine = MeasureLineHeight(line);

                rcLine.Height = cyLine;
                var spans = ComputeSpanLayouts(line.TextSpans, rcLine);
                var ll    = new LayoutLine(line.Position)
                {
                    Extent = LineExtent(rcLine, spans),
                    Spans  = spans,
                };

                this.visibleLines.Add(rcLine.Top, ll);
                rcLine.Offset(0, cyLine);
            }
예제 #4
0
            private float MeasureLineHeight(LineSpan line)
            {
                float height = 0.0F;

                foreach (var span in line.TextSpans)
                {
                    styleStack.PushStyle(span.Style);
                    var font = styleStack.GetFont(defaultFont);
                    height = Math.Max(
                        height,
                        font.Height + styleStack.GetNumber(s => s.PaddingTop) +
                        styleStack.GetNumber(s => s.PaddingBottom));
                    styleStack.PopStyle();
                }
                return(height);
            }
예제 #5
0
            public override Tuple <Address, LineSpan> GenerateSpan()
            {
                var line = new List <TextSpan>();

                line.Add(new AddressSpan(addr.ToString(), addr, UiStyles.MemoryWindow));

                var addrStart = Align(addr, BytesPerLine);
                var addrEnd   = Address.Min(addrStart + BytesPerLine, item.Address + item.Size);
                var linStart  = addrStart.ToLinear();
                var linEnd    = addrEnd.ToLinear();
                var lin       = linStart;
                var cbFiller  = addr.ToLinear() - linStart;
                var cbBytes   = linEnd - addr.ToLinear();
                var cbPadding = BytesPerLine - (cbFiller + cbBytes);

                var abCode = new List <byte>();

                // Do any filler first

                if (cbFiller > 0)
                {
                    line.Add(new MemoryTextSpan(new string(' ', 3 * (int)cbFiller), UiStyles.MemoryWindow));
                }

                var rdr = program.CreateImageReader(addr);

                while (rdr.Address.ToLinear() < linEnd)
                {
                    if (rdr.IsValid)
                    {
                        var  addr1 = rdr.Address;
                        byte b     = rdr.ReadByte();
                        line.Add(new MemoryTextSpan(addr1, string.Format(" {0:X2}", b), UiStyles.MemoryWindow));
                        //$BUG: should use platform.Encoding
                        abCode.Add(b);
                    }
                    else
                    {
                        cbPadding = linEnd - rdr.Address.ToLinear();
                        addrEnd   = rdr.Address;
                        break;
                    }
                }

                // Do any padding after.

                if (cbPadding > 0)
                {
                    line.Add(new MemoryTextSpan(new string(' ', 3 * (int)cbPadding), UiStyles.MemoryWindow));
                }

                // Now display the code bytes.
                string sBytes = RenderBytesAsText(abCode.ToArray());

                line.Add(new MemoryTextSpan(" ", UiStyles.MemoryWindow));
                line.Add(new MemoryTextSpan(sBytes, UiStyles.MemoryWindow));

                var linePos = this.addr;

                this.addr = addrEnd;
                var memLine = new LineSpan(linePos, line.ToArray());

                if (rdr.Address >= item.EndAddress)
                {
                    DecorateLastLine(memLine);
                }
                return(Tuple.Create(addrEnd, memLine));
            }
예제 #6
0
 private float MeasureLineHeight(LineSpan line)
 {
     float height = 0.0F;
     foreach (var span in line.TextSpans)
     {
         GetStyleStack().PushStyle(span.Style);
         var font = styleStack.GetFont(this);
         height = Math.Max(height, font.Height);
         styleStack.PopStyle();
     }
     return height;
 }
예제 #7
0
 public LineSpan[] GetLineSpans(int count)
 {
     int p = (int)position;
     int c = Math.Min(count, lines.Length - p);
     if (c <= 0)
         return new LineSpan[0];
     var spans = new LineSpan[c];
     for (int i = 0; i < c; ++i)
     {
         spans[i] = new LineSpan(p+i, lines[p+i]);
     }
     position = p + c;
     return spans;
 }
            public override Tuple<Address, LineSpan> GenerateSpan()
            {
                var line = new List<TextSpan>();
                line.Add(new AddressSpan(addr.ToString(), addr, UiStyles.MemoryWindow));

                var addrStart = Align(addr, BytesPerLine);
                var addrEnd = Address.Min(addrStart + BytesPerLine, item.Address + item.Size);
                var linStart = addrStart.ToLinear();
                var linEnd = addrEnd.ToLinear();
                var cbFiller = addr.ToLinear() - linStart;
                var cbBytes = linEnd - addr.ToLinear();
                var cbPadding = BytesPerLine - (cbFiller + cbBytes);

                var abCode = new List<byte>();

                // Do any filler first

                if (cbFiller > 0)
                {
                    line.Add(new MemoryTextSpan(new string(' ', 3 * (int)cbFiller), UiStyles.MemoryWindow));
                }

                var rdr = program.CreateImageReader(addr);
                while (rdr.Address.ToLinear() < linEnd)
                {
                    if (rdr.IsValid)
                    {
                        var addr1 = rdr.Address;
                        byte b = rdr.ReadByte();
                        line.Add(new MemoryTextSpan(addr1, string.Format(" {0:X2}", b), UiStyles.MemoryWindow));
                        //$BUG: should use platform.Encoding
                        abCode.Add(b);
                    }
                    else
                    {
                        cbPadding = linEnd - rdr.Address.ToLinear();
                        addrEnd = rdr.Address;
                        break;
                    }
                }

                // Do any padding after.

                if (cbPadding > 0)
                {
                    line.Add(new MemoryTextSpan(new string(' ', 3 * (int)cbPadding), UiStyles.MemoryWindow));
                }

                // Now display the code bytes.
                string sBytes = RenderBytesAsText(abCode.ToArray());
                line.Add(new MemoryTextSpan(" ", UiStyles.MemoryWindow));
                line.Add(new MemoryTextSpan(sBytes, UiStyles.MemoryWindow));

                var linePos = this.addr;
                this.addr = addrEnd;
                var memLine = new LineSpan(linePos, line.ToArray());
                if (rdr.Address >= item.EndAddress)
                {
                    DecorateLastLine(memLine);
                }
                return Tuple.Create(addrEnd, memLine);
            }
 public void DecorateLastLine(LineSpan line)
 {
     for (int i = 0; i < line.TextSpans.Length; ++i)
     {
         var span = line.TextSpans[i];
         if (span.Style == null)
             span.Style = "lastLine";
         else
             span.Style = span.Style + " lastLine";
     }
 }
예제 #10
0
 private float MeasureLineHeight(LineSpan line)
 {
     float height = 0.0F;
     foreach (var span in line.TextSpans)
     {
         styleStack.PushStyle(span.Style);
         var font = styleStack.GetFont(defaultFont);
         height = Math.Max(
             height,
             font.Height + styleStack.GetNumber(s => s.PaddingTop) +
             styleStack.GetNumber(s => s.PaddingBottom));
         styleStack.PopStyle();
     }
     return height;
 }
예제 #11
0
 public void AddLayoutLine(LineSpan line, ref RectangleF rcLine /* put in state */)
 {
     float cyLine = MeasureLineHeight(line);
     rcLine.Height = cyLine;
     var spans = ComputeSpanLayouts(line.TextSpans, rcLine);
     var ll = new LayoutLine(line.Position)
     {
         Extent = LineExtent(rcLine, spans),
         Spans = spans,
     };
     this.visibleLines.Add(rcLine.Top, ll);
     rcLine.Offset(0, cyLine);
 }