123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- namespace PaintDotNet
- {
- public sealed class SurfaceBoxGridRenderer
- : SurfaceBoxRenderer
- {
- public override void OnDestinationSizeChanged()
- {
- if (this.Visible)
- {
- this.OwnerList.InvalidateLookups();
- }
- base.OnDestinationSizeChanged();
- }
- public override void OnSourceSizeChanged()
- {
- if (this.Visible)
- {
- this.OwnerList.InvalidateLookups();
- }
- base.OnSourceSizeChanged();
- }
- protected override void OnVisibleChanged()
- {
- if (this.Visible)
- {
- this.OwnerList.InvalidateLookups();
- }
- Invalidate();
- }
- public unsafe override void Render(Surface dst, System.Drawing.Point offset)
- {
- if (OwnerList.ScaleFactor < new ScaleFactor(2, 1))
- {
- return;
- }
- int[] d2SLookupX = OwnerList.Dst2SrcLookupX;
- int[] d2SLookupY = OwnerList.Dst2SrcLookupY;
- int[] s2DLookupX = OwnerList.Src2DstLookupX;
- int[] s2DLookupY = OwnerList.Src2DstLookupY;
- ColorBgra[] blackAndWhite = new ColorBgra[2] { ColorBgra.White, ColorBgra.Black };
- // draw horizontal lines
- int sTop = d2SLookupY[offset.Y];
- int sBottom = d2SLookupY[offset.Y + dst.Height];
- for (int srcY = sTop; srcY <= sBottom; ++srcY)
- {
- int dstY = s2DLookupY[srcY];
- int dstRow = dstY - offset.Y;
- if (dst.IsRowVisible(dstRow))
- {
- ColorBgra* dstRowPtr = dst.GetRowAddress(dstRow);
- ColorBgra* dstRowEndPtr = dstRowPtr + dst.Width;
- dstRowPtr += offset.X & 1;
- while (dstRowPtr < dstRowEndPtr)
- {
- *dstRowPtr = ColorBgra.Black;
- dstRowPtr += 2;
- }
- }
- }
- // draw vertical lines
- int sLeft = d2SLookupX[offset.X];
- int sRight = d2SLookupX[offset.X + dst.Width];
- for (int srcX = sLeft; srcX <= sRight; ++srcX)
- {
- int dstX = s2DLookupX[srcX];
- int dstCol = dstX - offset.X;
- if (dst.IsColumnVisible(dstX - offset.X))
- {
- byte* dstColPtr = (byte*)dst.GetPointAddress(dstCol, 0);
- byte* dstColEndPtr = dstColPtr + dst.Stride * dst.Height;
- dstColPtr += (offset.Y & 1) * dst.Stride;
- while (dstColPtr < dstColEndPtr)
- {
- *((ColorBgra*)dstColPtr) = ColorBgra.Black;
- dstColPtr += 2 * dst.Stride;
- }
- }
- }
- }
- public SurfaceBoxGridRenderer(SurfaceBoxRendererList ownerList)
- : base(ownerList)
- {
- }
- }
- }
|