/// <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])); } } } } }