Пример #1
0
        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);
        }
Пример #2
0
        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]);
                    }
                }
            }
        }
Пример #3
0
 public void PutCharacter(CharacterBitmap character)
 {
     SetTile(cursorPositionY, cursorPositionX, character); //(row,column)
     if (cursorPositionX == 39)
     {
         CarriageReturn();
     }
     else
     {
         cursorPositionX++;
     }
 }
Пример #4
0
        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]);
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
 public void SetTile(int row, int column, CharacterBitmap character)
 {
     DisplayRows[row].Characters[column] = character;
     DrawScreen();
 }