/// <summary> /// /// </summary> public void GetAbyssHighlights(out Drawer.HighlightType left, out Drawer.HighlightType right) { left = Drawer.HighlightType.Sentinel; right = Drawer.HighlightType.Sentinel; foreach (Highlight h in containers) { if (left == Drawer.HighlightType.Sentinel && h.Contains(start - 1)) { left = h.Type; } if (right == Drawer.HighlightType.Sentinel && h.Contains(end + 1)) { right = h.Type; } } if (left == Drawer.HighlightType.Sentinel) { left = Drawer.HighlightType.Normal; } if (right == Drawer.HighlightType.Sentinel) { right = Drawer.HighlightType.Normal; } }
void RenderRangeHelper(Drawer.HighlightType ht, int rstart, int bstart, int len) { if (ht != Drawer.HighlightType.Normal) { RenderRowHighlight(rstart, bstart, len, false, ht); } else { RenderRowNormal(rstart, bstart, len, false); } }
protected override void RenderRowHighlight(int i, int p, int n, bool blank, Drawer.HighlightType ht) { int rx = 0 + x; int ry = i * drawer.Height + y; long roffset = areaGroup.Offset + i * bpr + p; bool odd; Gdk.GC backEvenGC = drawer.GetBackgroundGC(Drawer.RowType.Even, Drawer.HighlightType.Normal); Gdk.GC backOddGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, Drawer.HighlightType.Normal); // odd row? odd = (((roffset / bpr) % 2) == 1); if (blank == true) { if (odd) { backPixmap.DrawRectangle(backOddGC, true, rx, ry, width, drawer.Height); } else { backPixmap.DrawRectangle(backEvenGC, true, rx, ry, width, drawer.Height); } } Drawer.RowType rowType; if (odd) { rowType = Drawer.RowType.Odd; } else { rowType = Drawer.RowType.Even; } int pos = 0; while (true) { if (pos >= p) //don't draw until we reach p { drawer.DrawHighlight(backEvenGC, backPixmap, rx, ry, areaGroup.GetCachedByte(roffset++), rowType, ht); if (--n <= 0) { break; } } rx = rx + drawer.Width; pos++; } }
protected override void RenderRowHighlight(int i, int p, int n, bool blank, Drawer.HighlightType ht) { int rx = 0 + x; int ry = i * drawer.Height + y; long roffset = areaGroup.Offset + i * bpr + p; bool odd; Gdk.GC backEvenGC = drawer.GetBackgroundGC(Drawer.RowType.Even, Drawer.HighlightType.Normal); Gdk.GC backOddGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, Drawer.HighlightType.Normal); // odd row? odd = (((roffset / bpr) % 2) == 1); if (blank == true) { if (odd) backPixmap.DrawRectangle(backOddGC, true, rx, ry, width, drawer.Height); else backPixmap.DrawRectangle(backEvenGC, true, rx, ry, width, drawer.Height); } Drawer.RowType rowType; if (odd) rowType = Drawer.RowType.Odd; else rowType = Drawer.RowType.Even; int pos = 0; // draw bytes while (true) { if (pos >= p) { //don't draw until we reach p drawer.DrawHighlight(backEvenGC, backPixmap, rx, ry, areaGroup.GetCachedByte(roffset++), rowType, ht); if (--n <= 0) break; } // space if necessary if (pos % grouping == grouping - 1) rx = rx + (dpb + 1) * drawer.Width; else rx = rx + dpb * drawer.Width; pos++; } }
/// <summary> /// Adds a highlight on a range of data. /// </summary> public void AddHighlight(long start, long end, Drawer.HighlightType ht) { highlights.Insert(new Highlight(start, end, ht)); changes |= Changes.Highlights; }
/// <summary> /// Render (a part of) a row with highlighting. /// </summary> /// <param name="i"> /// The row to render. /// </param> /// <param name="p"> /// The offset of the byte in the row to start rendering. /// </param> /// <param name="n"> /// The number of bytes to render. /// </param> /// <param name="blank"> /// Whether to blank the background before rendering. /// </param> abstract protected void RenderRowHighlight(int i, int p, int n, bool blank, Drawer.HighlightType ht);
/// <summary> /// Render the bytes in the highlight range. /// </summary> /// <param name="h"> /// A <see cref="Highlight"/> /// </param> /// <param name="merge"> /// Whether to visually merge the highlight with adjacent ones left and/or right. /// </param> /// <remarks> /// This method doesn't check whether the merge flags are correct (eg there is indeed /// a similar adjacent highlight). It just draws the highlight in such a way as /// to appear merged to any similar highlights if they exist. ///</remarks> internal protected virtual void RenderHighlight(Highlight h, Drawer.HighlightType left, Drawer.HighlightType right) { if (isAreaRealized == false) { return; } int rstart, bstart, xstart, ystart; int rend, bend, xend, yend; bool odd; Gdk.GC gc; Gdk.GC oddGC; Gdk.GC evenGC; Gdk.GC leftGC; Gdk.GC rightGC; oddGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, h.Type); evenGC = drawer.GetBackgroundGC(Drawer.RowType.Even, h.Type); GetDisplayInfoByOffset(h.Start, out rstart, out bstart, out xstart, out ystart); GetDisplayInfoByOffset(h.End, out rend, out bend, out xend, out yend); //System.Console.WriteLine("Start {0:x} {1} {2} x:{3} y:{4}", h.Start, rstart, bstart, xstart, ystart); //System.Console.WriteLine("End {0:x} {1} {2} x:{3} y:{4}", h.End, rend, bend, xend, yend); bool drawLeft = false; int dxstart = xstart; if (bstart > 0) { int digit; GetOffsetFlags gof; GetOffsetByDisplayInfo(xstart - 1, ystart, out digit, out gof); if ((gof & GetOffsetFlags.Abyss) != 0) { dxstart -= drawer.Width; drawLeft = true; } } bool drawRight = false; int dxend = xend; if (bend < bpr - 1) { int digit; GetOffsetFlags gof; GetOffsetByDisplayInfo(xend + dpb * drawer.Width, yend, out digit, out gof); if ((gof & GetOffsetFlags.Abyss) != 0) { dxend += drawer.Width; drawRight = true; } } // if the whole range is on one row if (rstart == rend) { if (areaGroup.ManualDoubleBuffer) { BeginPaint(x + dxstart, y + ystart, dxend - dxstart + dpb * drawer.Width, drawer.Height); } // odd row? odd = (((h.Start / bpr) % 2) == 1); if (odd) { gc = oddGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, right); } else { gc = evenGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Even, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Even, right); } //render if (drawLeft) { backPixmap.DrawRectangle(leftGC, true, x + dxstart, y + ystart, drawer.Width, drawer.Height); } if (drawRight) { backPixmap.DrawRectangle(rightGC, true, x + xend + dpb * drawer.Width, y + yend, drawer.Width, drawer.Height); } backPixmap.DrawRectangle(gc, true, x + xstart, y + ystart, xend - xstart + dpb * drawer.Width, drawer.Height); RenderRangeHelper(h.Type, rstart, bstart, bend - bstart + 1); } else // multi-row range { if (areaGroup.ManualDoubleBuffer) { // handle double-buffering Gdk.Region paintRegion = new Gdk.Region(); Gdk.Rectangle rectStart = new Gdk.Rectangle(x + dxstart, y + ystart, width - dxstart, drawer.Height); Gdk.Rectangle rectMiddle; if (rend > rstart + 1) { rectMiddle = new Gdk.Rectangle(x, y + ystart + drawer.Height, width, yend - ystart - drawer.Height); } else { rectMiddle = Gdk.Rectangle.Zero; } Gdk.Rectangle rectEnd = new Gdk.Rectangle(x, y + yend, dxend + dpb * drawer.Width, drawer.Height); paintRegion.UnionWithRect(rectStart); paintRegion.UnionWithRect(rectMiddle); paintRegion.UnionWithRect(rectEnd); BeginPaintRegion(paintRegion); } // render first row odd = (((h.Start / bpr) % 2) == 1); if (odd) { gc = oddGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, right); } else { gc = evenGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Even, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Even, right); } if (drawLeft) { backPixmap.DrawRectangle(leftGC, true, x + dxstart, y + ystart, drawer.Width, drawer.Height); } backPixmap.DrawRectangle(gc, true, x + xstart, y + ystart, width - xstart, drawer.Height); RenderRangeHelper(h.Type, rstart, bstart, bpr - bstart); long curOffset = h.Start + bpr - bstart; // render middle rows for (int i = rstart + 1; i < rend; i++) { odd = (((curOffset / bpr) % 2) == 1); if (odd) { gc = oddGC; } else { gc = evenGC; } backPixmap.DrawRectangle(gc, true, x, y + i * drawer.Height, width, drawer.Height); RenderRangeHelper(h.Type, i, 0, bpr); curOffset += bpr; } // render last row odd = (((h.End / bpr) % 2) == 1); if (odd) { gc = oddGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Odd, right); } else { gc = evenGC; leftGC = drawer.GetBackgroundGC(Drawer.RowType.Even, left); rightGC = drawer.GetBackgroundGC(Drawer.RowType.Even, right); } if (drawRight) { backPixmap.DrawRectangle(rightGC, true, x + xend + dpb * drawer.Width, y + yend, drawer.Width, drawer.Height); } backPixmap.DrawRectangle(gc, true, x, y + yend, xend + dpb * drawer.Width, drawer.Height); RenderRangeHelper(h.Type, rend, 0, bend + 1); } if (areaGroup.ManualDoubleBuffer) { EndPaint(); } }
protected override void RenderHighlight(Highlight h, Drawer.HighlightType left, Drawer.HighlightType right) { }
protected override void RenderRowHighlight(int i, int p, int n, bool blank, Drawer.HighlightType ht) { RenderRowNormal(i, p, n, blank); }
protected override void RenderRowHighlight(int i, int p, int n, bool blank, Drawer.HighlightType ht) { }
public Highlight(long start, long end, Drawer.HighlightType ht) : base(start, end) { type = ht; }
public Highlight(IRange r, Drawer.HighlightType ht) : base(r) { type = ht; }
public Highlight(Drawer.HighlightType ht) : base() { type = ht; }
public Highlight() : base() { type = Drawer.HighlightType.Normal; }