CharacterBitmap GetCharacterBitmap(char c) { CharacterBitmap bitmap; if (!bitmapCache.TryGetValue(c, out bitmap)) { lock (bitmapCache) { if (!bitmapCache.TryGetValue(c, out bitmap)) { if (char.IsWhiteSpace(c)) { bitmap = new CharacterBitmap { Bitmap = null, Width = c == '\t' ? TabWidth : SpaceWidth, Height = 0, OffsetX = 0, OffsetY = 0 }; } else { bitmap = new CharacterBitmap(); bitmap.Bitmap = Font.GetCodepointBitmap(c, Scale, Scale, out bitmap.Width, out bitmap.Height, out bitmap.OffsetX, out bitmap.OffsetY); bitmap.OffsetX = 0; // Do simple paint without overlapping or extra space bitmap.OffsetY += PixelHeight; // Counts from bottom with negative shift up if (bitmap.Width < 0) { bitmap.Width = 0; } // To prevent overlapping previous characters } bitmapCache.Add(c, bitmap); } } } return(bitmap); }
protected void PaintCharacterLeftToRight(CharacterBitmap characterBitmap, int[] imagePixels, Size imageSize, Point atPoint, Rectangle clipRect, int fontRgb = 0) { var imageX = atPoint.X + characterBitmap.OffsetX; var imageY = atPoint.Y + characterBitmap.OffsetY; var bitmapLeft = imageX < clipRect.Left ? clipRect.Left - imageX : 0; var bitmapTop = imageY < clipRect.Top ? clipRect.Top - imageY : 0; var localClipRect = new Rectangle( bitmapLeft, bitmapTop, Math.Min(clipRect.RightExclusive - imageX, characterBitmap.Width - bitmapLeft), Math.Min(clipRect.BottomExclusive - imageY, characterBitmap.Height - bitmapTop)); if (localClipRect.Height > 0 && localClipRect.Width > 0) { for (int y = localClipRect.Top, bitmapRow = localClipRect.Top * characterBitmap.Width, imageRow = (localClipRect.Top + imageY) * imageSize.Width; y < localClipRect.BottomExclusive; y++, bitmapRow += characterBitmap.Width, imageRow += imageSize.Width) { for (int x = localClipRect.Left, bitmapIndex = bitmapRow + localClipRect.Left, imageIndex = imageRow + localClipRect.Left + imageX; x < localClipRect.RightExclusive; x++, bitmapIndex++, imageIndex++) { imagePixels[imageIndex] = ColorBytes.ComposeTwoColors(imagePixels[imageIndex], fontRgb, characterBitmap.Bitmap[bitmapIndex]); } } } }
public void PutCharacter(CharacterBitmap character) { SetTile(cursorPositionY, cursorPositionX, character); //(row,column) if (cursorPositionX == 39) { CarriageReturn(); } else { cursorPositionX++; } }
void PaintCharacterRotated(CharacterBitmap characterBitmap, int[] imagePixels, Size imageSize, Point atPoint, Rectangle clipRect, TextDirection direction, int fontRgb) { int imageX, imageY, imageStepDX, imageStepDY, imageNextRowDX, imageNextRowDY; switch (direction) { case TextDirection.VerticalUpward: imageX = atPoint.X + characterBitmap.OffsetY; imageY = atPoint.Y - characterBitmap.OffsetX; imageStepDX = 0; imageStepDY = -1; imageNextRowDX = 1; imageNextRowDY = 0; break; case TextDirection.VerticalDownward: imageX = atPoint.X - characterBitmap.OffsetY; imageY = atPoint.Y + characterBitmap.OffsetX; imageStepDX = 0; imageStepDY = 1; imageNextRowDX = -1; imageNextRowDY = 0; break; case TextDirection.LeftToRight: default: PaintCharacterLeftToRight(characterBitmap, imagePixels, imageSize, atPoint, clipRect, fontRgb); return; } var imageIndexStep = imageStepDY * imageSize.Width + imageStepDX; for (int y = 0, bitmapRow = 0; y < characterBitmap.Height; y++, bitmapRow += characterBitmap.Width, imageX += imageNextRowDX, imageY += imageNextRowDY) { for (int x = 0, bitmapIndex = bitmapRow, iX = imageX, iY = imageY, imageIndex = imageY * imageSize.Width + imageX; x < characterBitmap.Width; x++, bitmapIndex++, iX += imageStepDX, iY += imageStepDY, imageIndex += imageIndexStep) { if (iX >= clipRect.Left && iX < clipRect.RightExclusive && iY >= clipRect.Top && iY < clipRect.BottomExclusive) { imagePixels[imageIndex] = ColorBytes.ComposeTwoColors(imagePixels[imageIndex], fontRgb, characterBitmap.Bitmap[bitmapIndex]); } } } }
private void ChangeColorToEnemy() { //Verweis auf aktuellen Pixel Color currPixel; //Durchlaufen der Bitmap um Rot-Anteil um 25% zu erhöhen und Blau-Anteil um 45% zu verringern for (int y = 0; y < CharacterBitmap.Height; y++) { for (int x = 0; x < CharacterBitmap.Width; x++) { currPixel = CharacterBitmap.GetPixel(x, y); if (currPixel.R * 1.25 < 255 && currPixel.B * 0.55 >= 0) { CharacterBitmap.SetPixel(x, y, Color.FromArgb((int)(currPixel.R + currPixel.R * 0.45), currPixel.G, (int)(currPixel.B - currPixel.B * 0.45))); } } } CharacterBitmap.MakeTransparent(Color.Black); }
protected void PaintCharacter(CharacterBitmap characterBitmap, int[] imagePixels, Size imageSize, Point atPoint = default(Point), Rectangle clipRect = default(Rectangle), TextDirection direction = TextDirection.LeftToRight, int fontRgb = 0) { if (characterBitmap.Width <= 0 || characterBitmap.Height <= 0) { return; } if (clipRect.Width <= 0 || clipRect.Height <= 0) { clipRect = new Rectangle(0, 0, imageSize.Width, imageSize.Height); } if (direction == TextDirection.LeftToRight) { PaintCharacterLeftToRight(characterBitmap, imagePixels, imageSize, atPoint, clipRect, fontRgb); } else { PaintCharacterRotated(characterBitmap, imagePixels, imageSize, atPoint, clipRect, direction, fontRgb); } }
int[] GetSymbolBitmap(char c, int fontRgb, int backgroundRgb) { int[] symbolBitmap; var key = new SymbolKey(c, fontRgb, backgroundRgb); if (!symbolCache.TryGetValue(key, out symbolBitmap)) { lock (symbolCache) { if (!symbolCache.TryGetValue(key, out symbolBitmap)) { symbolBitmap = new int[BoxHeight * BoxHeight]; if (backgroundRgb != 0) { for (int i = 0; i < symbolBitmap.Length; i++) { symbolBitmap[i] = backgroundRgb; } } if (!char.IsWhiteSpace(c)) { var characterBitmap = new CharacterBitmap(); characterBitmap.Bitmap = Font.GetCodepointBitmap(c, Scale, Scale, out characterBitmap.Width, out characterBitmap.Height, out characterBitmap.OffsetX, out characterBitmap.OffsetY); if (characterBitmap.Width > 0 && characterBitmap.Height > 0) { characterBitmap.OffsetX = (BoxHeight - characterBitmap.Width) / 2; characterBitmap.OffsetY = (BoxHeight - characterBitmap.Height) / 2; PaintCharacterLeftToRight(characterBitmap, symbolBitmap, new Size(BoxHeight, BoxHeight), new Point(0, 0), new Rectangle(0, 0, BoxHeight, BoxHeight), fontRgb); } } symbolCache.Add(key, symbolBitmap); } } } return(symbolBitmap); }
public void SetTile(int row, int column, CharacterBitmap character) { DisplayRows[row].Characters[column] = character; DrawScreen(); }