/// <summary>
        /// Draw the picture on Surface
        /// </summary>
        /// <param name="surfaceId"></param>
        /// <param name="destRect"></param>
        public void RenderRemoteFXTile(ushort surfaceId, RDPGFX_RECT16 destRect)
        {
            if (surfaceDic.ContainsKey(surfaceId))
            {
                Surface sur = surfaceDic[surfaceId];

                byte quantIdxY  = remoteFXContext.TileSet.tiles[0].quantIdxY;
                byte quantIdxCb = remoteFXContext.TileSet.tiles[0].quantIdxCb;
                byte quantIdxCr = remoteFXContext.TileSet.tiles[0].quantIdxCr;
                RemoteFXCodecContext context = new RemoteFXCodecContext(remoteFXContext.TileSet.quantVals, quantIdxY, quantIdxCb, quantIdxCr, remoteFXContext.Entropy);
                foreach (TS_RFX_TILE tile in remoteFXContext.TileSet.tiles)
                {
                    RemoteFXDecoder.DecodeTile(context, tile.YData, tile.CbData, tile.CrData);
                    for (int i = 0; i < RgbTile.TileSize; i++)
                    {
                        for (int j = 0; j < RgbTile.TileSize; j++)
                        {
                            int x = tile.xIdx + i;
                            int y = tile.yIdx + j;
                            if (IsInRects(x, y, remoteFXContext.Region.rects))
                            {
                                if (destRect.left + x < destRect.right && destRect.top + y < destRect.bottom)
                                {
                                    sur.SetPixel(destRect.left + x, destRect.top + y, Color.FromArgb(context.RSet[i, j], context.GSet[i, j], context.BSet[i, j]));
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Draw the picture on output screen
        /// SetRemoteFXRegion and SetRemoteFXTileSet must be called before calling this method
        /// </summary>
        /// <param name="left"></param>
        /// <param name="top"></param>
        /// <param name="surfaceId"></param>
        public void RenderRemoteFXTile(ushort left, ushort top)
        {
            Bitmap image                 = baseImage;
            byte   quantIdxY             = remoteFXContext.TileSet.tiles[0].quantIdxY;
            byte   quantIdxCb            = remoteFXContext.TileSet.tiles[0].quantIdxCb;
            byte   quantIdxCr            = remoteFXContext.TileSet.tiles[0].quantIdxCr;
            RemoteFXCodecContext context = new RemoteFXCodecContext(remoteFXContext.TileSet.quantVals, quantIdxY, quantIdxCb, quantIdxCr, remoteFXContext.Entropy);

            foreach (TS_RFX_TILE tile in remoteFXContext.TileSet.tiles)
            {
                RemoteFXDecoder.DecodeTile(context, tile.YData, tile.CbData, tile.CrData);
                for (int i = 0; i < RgbTile.TileSize; i++)
                {
                    for (int j = 0; j < RgbTile.TileSize; j++)
                    {
                        int x = tile.xIdx * 64 + i;
                        int y = tile.yIdx * 64 + j;
                        if (IsInRects(x, y, remoteFXContext.Region.rects))
                        {
                            image.SetPixel(left + x, top + y, Color.FromArgb(context.RSet[i, j], context.GSet[i, j], context.BSet[i, j]));
                        }
                    }
                }
            }
        }