private void RenderCell(IFastGridCell cell, IntRect rect, Color?selectedTextColor, Color bgColor, FastGridCellAddress cellAddr)
        {
            var isHoverCell = !cellAddr.IsEmpty && cellAddr == _mouseOverCell;

            if (isHoverCell)
            {
                _mouseOverCellIsTrimmed = false;
                CurrentCellActiveRegions.Clear();
                CurrentHoverRegion = null;
            }

            if (cell == null)
            {
                return;
            }
            var rectContent = GetContentRect(rect);

            _drawBuffer.DrawRectangle(rect, GridLineColor);
            _drawBuffer.FillRectangle(rect.GrowSymmetrical(-1, -1), bgColor);

            var count      = cell.BlockCount;
            var rightCount = cell.RightAlignBlockCount;
            var leftCount  = count - rightCount;
            var leftPos    = rectContent.Left;
            var rightPos   = rectContent.Right;

            for (var i = count - 1; i >= count - rightCount; i--)
            {
                var block = cell.GetBlock(i);
                if (block == null)
                {
                    continue;
                }
                if (i < count - 1)
                {
                    rightPos -= BlockPadding;
                }
                var blockWi = RenderBlock(leftPos, rightPos, selectedTextColor, bgColor, rectContent, block, cellAddr, false, isHoverCell);
                rightPos -= blockWi;
            }

            for (var i = 0; i < leftCount && leftPos < rightPos; i++)
            {
                var block = cell.GetBlock(i);
                if (block == null)
                {
                    continue;
                }
                if (i > 0)
                {
                    leftPos += BlockPadding;
                }
                var blockWi = RenderBlock(leftPos, rightPos, selectedTextColor, bgColor, rectContent, block, cellAddr, true, isHoverCell);
                leftPos += blockWi;
            }
            switch (cell.Decoration)
            {
            case CellDecoration.StrikeOutHorizontal:
                _drawBuffer.DrawLine(rect.Left, rect.Top + rect.Height / 2, rect.Right, rect.Top + rect.Height / 2, cell.DecorationColor ?? Colors.Black);
                break;
            }
            if (isHoverCell)
            {
                _mouseOverCellIsTrimmed = leftPos > rightPos;
            }
        }
        private int RenderBlock(int leftPos, int rightPos, Color?selectedTextColor, Color bgColor, IntRect rectContent, IFastGridCellBlock block, FastGridCellAddress cellAddr, bool leftAlign, bool isHoverCell)
        {
            var renderBlock = true;

            if (block.MouseHoverBehaviour == MouseHoverBehaviours.HideWhenMouseOut && !isHoverCell)
            {
                renderBlock = false;
            }

            int width = 0, top = 0, height = 0;

            switch (block.BlockType)
            {
            case FastGridBlockType.Text:
                var font       = GetFont(block.IsBold, block.IsItalic);
                var textHeight = font.GetTextHeight(block.TextData);
                width  = font.GetTextWidth(block.TextData, _columnSizes.MaxSize);
                height = textHeight;
                top    = rectContent.Top + (int)Math.Round(rectContent.Height / 2.0 - textHeight / 2.0);
                break;

            case FastGridBlockType.Image:
                top    = rectContent.Top + (int)Math.Round(rectContent.Height / 2.0 - block.ImageHeight / 2.0);
                height = block.ImageHeight;
                width  = block.ImageWidth;
                break;
            }

            if (renderBlock && block.CommandParameter != null)
            {
                var activeRect = new IntRect(new IntPoint(leftAlign ? leftPos : rightPos - width, top), new IntSize(width, height)).GrowSymmetrical(1, 1);
                var region     = new ActiveRegion
                {
                    CommandParameter = block.CommandParameter,
                    Rect             = activeRect,
                    Tooltip          = block.ToolTip,
                };
                CurrentCellActiveRegions.Add(region);
                if (_mouseCursorPoint.HasValue && activeRect.Contains(_mouseCursorPoint.Value))
                {
                    _drawBuffer.FillRectangle(activeRect, ActiveRegionHoverFillColor);
                    CurrentHoverRegion = region;
                }

                var renderRectangle = true;
                if (block.MouseHoverBehaviour == MouseHoverBehaviours.HideButtonWhenMouseOut && !isHoverCell)
                {
                    renderRectangle = false;
                }

                if (renderRectangle)
                {
                    _drawBuffer.DrawRectangle(activeRect, ActiveRegionFrameColor);
                }
            }

            switch (block.BlockType)
            {
            case FastGridBlockType.Text:
                if (renderBlock)
                {
                    var textOrigin = new IntPoint(leftAlign ? leftPos : rightPos - width, top);
                    var font       = GetFont(block.IsBold, block.IsItalic);
                    _drawBuffer.DrawString(textOrigin.X, textOrigin.Y, rectContent, selectedTextColor ?? block.FontColor ?? CellFontColor, UseClearType ? bgColor : (Color?)null,
                                           font,
                                           block.TextData);
                }
                break;

            case FastGridBlockType.Image:
                if (renderBlock)
                {
                    var imgOrigin = new IntPoint(leftAlign ? leftPos : rightPos - block.ImageWidth, top);
                    var image     = GetImage(block.ImageSource);
                    _drawBuffer.Blit(new Point(imgOrigin.X, imgOrigin.Y), image.Bitmap, new Rect(0, 0, block.ImageWidth, block.ImageHeight),
                                     image.KeyColor, image.BlendMode);
                }
                break;
            }

            return(width);
        }