public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) { // foreach (char ch in Value) for (int i = 0; i < Value.Length; i++) { // var character = SysFont.Font[(byte)Value[i]]; //for (int fx = 0; fx < 8; fx++) // for (int fy = 0; fy < 8; fy++) // { // bool draw = ((character >> ((fy * 8) + fx)) & 0x01) == 0x01; // frameBuffer[((fy + Y) * 640) + (fx + X) + pixelOffset + (i * 8)] = draw ? (byte)ctx.Color : (byte)EgaColor.White; // } byte[] character = ctx.State.Font[(byte)Value[i]]; const int byteSize = 8; for (int fy = 0; fy < ctx.State.Font.Height; fy++) { for (int fx = 0; fx < ctx.State.Font.Width; fx++) { var fontRow = character[(fy * ctx.State.Font.Width) / byteSize]; bool draw = ((fontRow >> (fx % byteSize)) & 0x01) == 0x01; frameBuffer[((fy + Y) * ctx.State.Width) + (fx + X) + pixelOffset + (i * ctx.State.Font.Width)] = draw ? (byte)ctx.Color : (byte)EgaColor.White; //frameBuffer[(((row * _font.Height) + fy) * Width) + (column * _font.Width) + fx + ch.ShiftX] = draw ? (byte)fg : (byte)bg; } } } }
public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) { // Draw the text first. base.Render(ctx, frameBuffer, pixelOffset); // Then, draw a border around it. for (int i = -2; i < (Value.Length * ctx.State.Font.Width) + Padding; i++) { frameBuffer[i + pixelOffset + ((Y - Padding) * ctx.State.Width) + X] = 0x00; } // Bottom for (int i = -2; i < (Value.Length * ctx.State.Font.Width) + Padding + 1; i++) { frameBuffer[i + pixelOffset + ((Y + Padding) * ctx.State.Width) + X + (ctx.State.Font.Width * ctx.State.Width)] = 0x00; } // Left for (int i = 0; i < ctx.State.Font.Width + (2 * Padding); i++) { frameBuffer[(i * ctx.State.Width) + pixelOffset + ((Y - 2) * ctx.State.Width) + X - Padding] = 0x00; } // Right for (int i = 0; i < ctx.State.Font.Width + (2 * 2); i++) { frameBuffer[(i * ctx.State.Width) + (Value.Length * ctx.State.Font.Width) + pixelOffset + ((Y - Padding) * ctx.State.Width) + X + Padding] = 0x00; } }
/// <summary> /// Renders an arrow head at the end of the line. /// </summary> /// <param name="ctx">Render ctx</param> /// <param name="frameBuffer">Framebuffer</param> /// <param name="pixelOffset">Offset in framebuffer</param> /// <param name="x1">Source X</param> /// <param name="y1">Source Y</param> /// <param name="x2">Dest X</param> /// <param name="y2">Dest Y</param> /// <param name="size">Length in pixels of the arrow heads</param> protected void RenderArrowHead(SpriteRenderContext renderContext, byte[] frameBuffer, int pixelOffset, int x1, int y1, int x2, int y2, int size = 6) { var angle = Math.Atan2(y2 - y1, x2 - x1); RenderLine(renderContext, frameBuffer, pixelOffset, x2, y2, (int)(x2 - size * Math.Cos(angle - Math.PI / 6)), (int)(y2 - size * Math.Sin(angle - Math.PI / 6)), renderContext.Color); RenderLine(renderContext, frameBuffer, pixelOffset, x2, y2, (int)(x2 - size * Math.Cos(angle + Math.PI / 6)), (int)(y2 - size * Math.Sin(angle + Math.PI / 6)), renderContext.Color); }
public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) { // First, render the line. base.Render(ctx, frameBuffer, pixelOffset); // Then, render the arrow head on top. RenderArrowHead(ctx, frameBuffer, pixelOffset, X1, Y1, X2, Y2); }
public void WriteToFrameBuffer(ViewerState state, byte[] frameBuffer, int pixelOffset) { var ctx = new SpriteRenderContext(state); foreach (var element in _spriteElements) { element.Render(ctx, frameBuffer, pixelOffset); Console.WriteLine("Rendered {0}", element); } }
public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) { //for (int y = _y + pixelOffset; y < _h + pixelOffset + _y; y++) for (int y = 0; y < _h; y++) { Array.Copy( _data, y * _w, frameBuffer, pixelOffset + (y * ctx.State.Width) + (_y * ctx.State.Width) + _x, _w); } }
public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) { ctx.Thickness = Thickness; }
protected void RenderLine(SpriteRenderContext renderContext, byte[] frameBuffer, int pixelOffset, int x1, int y1, int x2, int y2, EgaColor color = EgaColor.Black) { int w = x2 - x1; int h = y2 - y1; int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0; if (w < 0) { dx1 = -1; } else if (w > 0) { dx1 = 1; } if (h < 0) { dy1 = -1; } else if (h > 0) { dy1 = 1; } if (w < 0) { dx2 = -1; } else if (w > 0) { dx2 = 1; } int longest = Math.Abs(w); int shortest = Math.Abs(h); if (!(longest > shortest)) { longest = Math.Abs(h); shortest = Math.Abs(w); if (h < 0) { dy2 = -1; } else if (h > 0) { dy2 = 1; } dx2 = 0; } int numerator = longest >> 1; for (int i = 0; i <= longest; i++) { // putpixel(x, y, color); if ((y1 * renderContext.State.Width) + x1 + pixelOffset < 0) { continue; } frameBuffer[(y1 * renderContext.State.Width) + x1 + pixelOffset] = (byte)color; numerator += shortest; if (!(numerator < longest)) { numerator -= longest; x1 += dx1; y1 += dy1; } else { x1 += dx2; y1 += dy2; } } }
public override void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset) => RenderLine(ctx, frameBuffer, pixelOffset, X1, Y1, X2, Y2, ctx.Color);
public abstract void Render(SpriteRenderContext ctx, byte[] frameBuffer, int pixelOffset);