9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
b43f00592f321690997ff22fcb243059b0440091vboxsync * Copyright (C) 2011-2013 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDisp.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/RemoteDesktop/VRDEOrders.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_MAKE_OP(__c) (__c)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* vrdpGetIntersectingClipRects result */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_CLIP_OK 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_CLIP_NO_INTERSECTION 1
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VRDP_CLIP_TOO_MANY_RECTS 2
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct _VRDPBRUSH
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL fPattern;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync union {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t rgbFG;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t rgbBG;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t au8Pattern[8];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } pat;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint16_t w;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint16_t h;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t au32Bits[1];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Here bits continue. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } bitmap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } u;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VRDPBRUSH;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
07576d259dcb4e5b71c85d3c030a57de78367d13vboxsync#if 1
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define dumpPCO(a, b) do {} while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void dumpPCO(RECTL *prclTrg, CLIPOBJ *pco)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("pco = %p Trg = %d-%d %d-%d", pco, prclTrg->left, prclTrg->right, prclTrg->top, prclTrg->bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pco)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bMore;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CLIPRECTS cr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL* prclClip;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int cRects = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("pco = %d %d-%d %d-%d dc %d fc %d mode %d opt %d",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pco->iUniq,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pco->rclBounds.left, pco->rclBounds.right, pco->rclBounds.top, pco->rclBounds.bottom,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pco->iDComplexity, pco->iFComplexity, pco->iMode, pco->fjOptions));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_ANY, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bMore = CLIPOBJ_bEnum(pco, sizeof(cr), (ULONG*)&cr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (prclClip = &cr.arcl[0]; cr.c != 0; cr.c--, prclClip++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG((" %d-%d %d-%d", prclClip->left, prclClip->right, prclClip->top, prclClip->bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cRects++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (bMore);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Total %d rects", cRects));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic uint32_t vrdpColor2RGB (SURFOBJ *pso, uint32_t color)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t rgb = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pso->iBitmapFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_16BPP:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *d = (uint8_t *)&rgb;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *d++ = (BYTE)( color << 3); /* B */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *d++ = (BYTE)((color >> 5) << 2); /* G */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *d++ = (BYTE)((color >> 11) << 3); /* R */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_24BPP:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case BMF_32BPP:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rgb = color & 0xFFFFFF;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Unsupported bitmap format %d", pso->iBitmapFormat));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rgb;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpPointFX2Point(const POINTFIX *pptfx, VRDEORDERPOINT *ppt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ppt->x = (int16_t)FXTOLROUND(pptfx->x);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ppt->y = (int16_t)FXTOLROUND(pptfx->y);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpPolyPointsAdd(VRDEORDERPOLYPOINTS *pPoints, const VRDEORDERPOINT *ppt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pPoints->c < RT_ELEMENTS(pPoints->a));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPoints->a[pPoints->c] = *ppt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPoints->c++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpExtendOrderBounds(VRDEORDERBOUNDS *pBounds, const VRDEORDERPOINT *ppt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Bounds have inclusive pt1 and exclusive pt2. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBounds->pt1.x > ppt->x) /* Left. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBounds->pt1.x = ppt->x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBounds->pt1.y > ppt->y) /* Top. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBounds->pt1.y = ppt->y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBounds->pt2.x <= ppt->x) /* Right. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBounds->pt2.x = ppt->x + 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBounds->pt2.y <= ppt->y) /* Bottom. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBounds->pt2.y = ppt->y + 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpOrderRect(RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmp;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (prcl->left > prcl->right)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Inverse X coordinates"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync tmp = prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->left = prcl->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->right = tmp;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (prcl->top > prcl->bottom)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Inverse Y coordinates"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync tmp = prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->top = prcl->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->bottom = tmp;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpIsRectEmpty (const RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (prcl->left == prcl->right) || (prcl->top == prcl->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpIntersectRects(RECTL *prectResult, const RECTL *prect1, const RECTL *prect2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Calculations are easier with left, right, top, bottom. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xLeft1 = prect1->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xRight1 = prect1->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xLeft2 = prect2->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xRight2 = prect2->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yTop1 = prect1->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yBottom1 = prect1->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yTop2 = prect2->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yBottom2 = prect2->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xLeftResult = max (xLeft1, xLeft2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xRightResult = min (xRight1, xRight2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Initialize result to empty record. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset (prectResult, 0, sizeof (RECTL));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (xLeftResult < xRightResult)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* There is intersection by X. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yTopResult = max (yTop1, yTop2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yBottomResult = min (yBottom1, yBottom2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (yTopResult < yBottomResult)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* There is intersection by Y. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prectResult->left = xLeftResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prectResult->top = yTopResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prectResult->right = xRightResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prectResult->bottom = yBottomResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpAdjustRect(SURFOBJ *pso, RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int w;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int h;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("%d-%d %d-%d on %dx%d\n", prcl->left, prcl->right, prcl->top, prcl->bottom, pso->sizlBitmap.cx, pso->sizlBitmap.cy));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (prcl->left <= prcl->right)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x = prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w = prcl->right - prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Inverse X coordinates"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x = prcl->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w = prcl->left - prcl->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (prcl->top <= prcl->bottom)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y = prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync h = prcl->bottom - prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Inverse Y coordinates"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y = prcl->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync h = prcl->top - prcl->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(w >= 0 && h >= 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Correct negative x and y coordinates. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (x < 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x += w; /* Compute xRight which is also the new width. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w = (x < 0)? 0: x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (y < 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y += h; /* Compute xBottom, which is also the new height. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync h = (y < 0)? 0: y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Also check if coords are greater than the display resolution. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (x + w > pso->sizlBitmap.cx)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w = pso->sizlBitmap.cx > x? pso->sizlBitmap.cx - x: 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (y + h > pso->sizlBitmap.cy)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync h = pso->sizlBitmap.cy > y? pso->sizlBitmap.cy - y: 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->left = x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->top = y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->right = x + w;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prcl->bottom = y + h;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("result %d-%d %d-%d", prcl->left, prcl->right, prcl->top, prcl->bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vrdpGetIntersectingClipRects(VRDPCLIPRECTS *pClipRects, SURFOBJ *pso, RECTL *prcl, CLIPOBJ *pco, POINTL *pptlSrc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bTooManyRects = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("pso = %p, pptlSrc = %p", pso, pptlSrc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso = getSurfObj(pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rclDstOrig = *prcl;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rclDst = *prcl;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rects.c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpAdjustRect(pso, &pClipRects->rclDst);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pco && (pco->iDComplexity != DC_TRIVIAL))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG iDirection = CD_ANY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pptlSrc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Operation is performed on the same (screen) surface and enumeration direction
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * must take into account the position of source and target rectangles.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pptlSrc->x <= prcl->left)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pptlSrc->y <= prcl->top)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync iDirection = CD_LEFTUP;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync iDirection = CD_LEFTDOWN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pptlSrc->y <= prcl->top)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync iDirection = CD_RIGHTUP;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync iDirection = CD_RIGHTDOWN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Clip the target rect by entire clipping region. Obtain the effective target. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpIntersectRects(&pClipRects->rclDst, &pClipRects->rclDst, &pco->rclBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Enumerate rectangles. Try to get all rectangles at once and if there is not
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * enough space (too many rectangles) fail with the bTooManyRects condition.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, iDirection, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bTooManyRects = CLIPOBJ_bEnum(pco, sizeof(pClipRects->rects), &pClipRects->rects.c);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bTooManyRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclClipSrc = &pClipRects->rects.arcl[0];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclClipDst = prclClipSrc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG cRects = pClipRects->rects.c;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("%d rects", cRects));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (cRects > 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (; cRects != 0; cRects--, prclClipSrc++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpIntersectRects(prclClipDst, prclClipSrc, &pClipRects->rclDst);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vrdpIsRectEmpty(prclClipDst))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rects.c--;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclClipDst++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClipRects->rects.c == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rclDst.left = pClipRects->rclDst.right = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("%d rects remains", pClipRects->rects.c));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vrdpIsRectEmpty(&pClipRects->rclDst))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VRDP_CLIP_NO_INTERSECTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bTooManyRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pClipRects->rects.c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VRDP_CLIP_TOO_MANY_RECTS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VRDP_CLIP_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDirtyPathBounds(PVBOXDISPDEV pDev, CLIPOBJ *pco, PATHOBJ *ppo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTFX rcfxBounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclBounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PATHOBJ_vGetBounds(ppo, &rcfxBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBounds.left = FXTOLFLOOR(rcfxBounds.xLeft);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBounds.right = FXTOLCEILING(rcfxBounds.xRight);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBounds.top = FXTOLFLOOR(rcfxBounds.yTop);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBounds.bottom = FXTOLCEILING(rcfxBounds.yBottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpIntersectRects(&rclBounds, &rclBounds, &pco->rclBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRect(pDev, &rclBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDirtyPath(PVBOXDISPDEV pDev, CLIPOBJ *pco, PATHOBJ *ppo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyPathBounds(pDev, pco, ppo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDirtyClip(PVBOXDISPDEV pDev, CLIPOBJ *pco, RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRect(pDev, prcl);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (pco)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRect(pDev, &pco->rclBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDirtyRects(PVBOXDISPDEV pDev, VRDPCLIPRECTS *pClipRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Ignore rects, report entire area. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRect (pDev, &pClipRects->rclDst);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync__inline BOOL vrdpWriteHdr (PVBOXDISPDEV pDev, uint32_t u32Op)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBoxVBVAWrite(&pDev->vbvaCtx, &pDev->hgsmi.ctx, &u32Op, sizeof (u32Op));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpWriteBits (PVBOXDISPDEV pDev, uint8_t *pu8Bits, int lDelta, int32_t x, int32_t y, uint32_t cWidth, uint32_t cHeight, int bytesPerPixel)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEDATABITS bits;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.cb = cHeight * cWidth * bytesPerPixel;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.x = (int16_t)x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.y = (int16_t)y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.cWidth = (uint16_t)cWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.cHeight = (uint16_t)cHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bits.cbPixel = (uint8_t)bytesPerPixel;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = VBoxVBVAWrite(&pDev->vbvaCtx, &pDev->hgsmi.ctx, &bits, sizeof (bits));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (cHeight--)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = VBoxVBVAWrite(&pDev->vbvaCtx, &pDev->hgsmi.ctx, pu8Bits, cWidth * bytesPerPixel);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pu8Bits += lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP orders reporting.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpReportOrder(PVBOXDISPDEV pDev, const void *pOrder, unsigned cbOrder, unsigned code)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = vrdpWriteHdr(pDev, VRDP_MAKE_OP(code));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVBVAWrite(&pDev->vbvaCtx, &pDev->hgsmi.ctx, pOrder, cbOrder);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpReportBounds(PVBOXDISPDEV pDev, const RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERBOUNDS bounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt1.x = (int16_t)(prcl->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt1.y = (int16_t)(prcl->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt2.x = (int16_t)(prcl->right);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt2.y = (int16_t)(prcl->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return vrdpReportOrder(pDev, &bounds, sizeof (bounds), VRDE_ORDER_BOUNDS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpReportRepeat(PVBOXDISPDEV pDev, const CLIPRECTS *pRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pRects)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Start from index 1, because the first rect was already reported. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned i = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prcl = &pRects->arcl[1];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (; i < pRects->c; i++, prcl++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERREPEAT repeat;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync repeat.bounds.pt1.x = (int16_t)(prcl->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync repeat.bounds.pt1.y = (int16_t)(prcl->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync repeat.bounds.pt2.x = (int16_t)(prcl->right);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync repeat.bounds.pt2.y = (int16_t)(prcl->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpReportOrder(pDev, &repeat, sizeof (repeat), VRDE_ORDER_REPEAT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpReportDirtyRect(PVBOXDISPDEV pDev, RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SURFOBJ *pso = pDev->surface.psoBitmap;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* This is a Bitmap Update Fallback operation. It takes bits from VRAM
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * and inserts them in the pipeline. These bits are not cached.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8Bits;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int32_t lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int bytesPerPixel = format2BytesPerPixel(pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclCopy = *prcl;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpAdjustRect (pso, &rclCopy);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pu8Bits = (uint8_t *)pso->pvScan0 +
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso->lDelta * rclCopy.top +
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bytesPerPixel * rclCopy.left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lDelta = pso->lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cWidth = rclCopy.right - rclCopy.left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cHeight = rclCopy.bottom - rclCopy.top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (cWidth == 0 || cHeight == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bytesPerPixel > 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpWriteHdr(pDev, VRDP_MAKE_OP(VRDE_ORDER_DIRTY_RECT));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpWriteBits(pDev, pu8Bits, lDelta, rclCopy.left, rclCopy.top, cWidth, cHeight, bytesPerPixel);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("failed!!! %d,%d %dx%d, bpp = %d\n",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclCopy.left, rclCopy.top, cWidth, cHeight, bytesPerPixel));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpIntersectRectWithBounds (RECTL *prclIntersect,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prcl,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDEORDERBOUNDS *pBounds)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ( prcl->left < pBounds->pt2.x /* left < bounds_right */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && prcl->right > pBounds->pt1.x /* right < bounds_left */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && prcl->top < pBounds->pt2.y /* top < bounds_bottom */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && prcl->bottom > pBounds->pt1.y /* bottom < bounds_top */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* There is intersection. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclIntersect->left = max(prcl->left, pBounds->pt1.x);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclIntersect->right = min(prcl->right, pBounds->pt2.x);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclIntersect->top = max(prcl->top, pBounds->pt1.y);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclIntersect->bottom = min(prcl->bottom, pBounds->pt2.y);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(prclIntersect->left < prclIntersect->right);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(prclIntersect->top < prclIntersect->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* No intersection. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic BOOL vrdpGetIntersectingRects (CLIPRECTS *pRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDEORDERBOUNDS *pBounds)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL fReportOrder = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pRects->c = 0; /* Number of clipping rects. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClipRects->rects.c == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* There were no clipping for the order. Therefore do nothing
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * here and just return that order must be reported without
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * clipping (rc = TRUE, pRects->c = 0).
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Do nothing. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Find which clipping rects intersect with the bounds. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclIntersect = &pRects->arcl[0];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned i = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prcl = &pClipRects->rects.arcl[0];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (; i < pClipRects->rects.c; i++, prcl++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vrdpIntersectRectWithBounds (prclIntersect, prcl, pBounds))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync c++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclIntersect++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (c == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* No of clip rects intersect with the bounds. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync fReportOrder = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pRects->c = c;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return fReportOrder;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vrdpReportOrderGeneric (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const void *pvOrder,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned cbOrder,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned code)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClipRects && pClipRects->rects.c > 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpReportBounds (pDev, &pClipRects->rects.arcl[0]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpReportOrder (pDev, pvOrder, cbOrder, code);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClipRects && pClipRects->rects.c > 1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpReportRepeat (pDev, &pClipRects->rects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportOrderGenericBounds (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDEORDERBOUNDS *pBounds,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const void *pvOrder,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned cbOrder,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned code)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CLIPRECTS rects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vrdpGetIntersectingRects (&rects, pClipRects, pBounds))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, pvOrder, cbOrder, code);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportSolidRect (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prclTrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG rgb)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERSOLIDRECT order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prclTrg->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prclTrg->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prclTrg->right - prclTrg->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prclTrg->bottom - prclTrg->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgb = rgb;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, &order, sizeof (order), VRDE_ORDER_SOLIDRECT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportSolidBlt (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prclTrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG rgb,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t rop3)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERSOLIDBLT order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prclTrg->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prclTrg->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prclTrg->right - prclTrg->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prclTrg->bottom - prclTrg->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgb = rgb;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rop = rop3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, &order, sizeof (order), VRDE_ORDER_SOLIDBLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportPatBlt (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prclTrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBRUSH *pBrush,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync POINTL *pptlBrush,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t rop3)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERPATBLTBRUSH order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int8_t xSrc = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int8_t ySrc = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pptlBrush)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Dst %d,%d Brush origin %d,%d", prclTrg->left, prclTrg->top, pptlBrush->x, pptlBrush->y));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync /* Make sure that the coords fit in a 8 bit value.
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync * Only 8x8 pixel brushes are supported, so last 3 bits
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync * is a [0..7] coordinate of the brush, because the brush
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync * repeats after each 8 pixels.
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync */
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync xSrc = (int8_t)(pptlBrush->x & 7);
165d49d923f1440688817ee6f69533b9af9ceff0vboxsync ySrc = (int8_t)(pptlBrush->y & 7);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prclTrg->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prclTrg->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prclTrg->right - prclTrg->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prclTrg->bottom - prclTrg->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.xSrc = xSrc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ySrc = ySrc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgbFG = pBrush->u.pat.rgbFG;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgbBG = pBrush->u.pat.rgbBG;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rop = rop3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (order.pattern, pBrush->u.pat.au8Pattern, sizeof (order.pattern));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, &order, sizeof (order), VRDE_ORDER_PATBLTBRUSH);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDstBlt (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prclTrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t rop3)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERDSTBLT order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prclTrg->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prclTrg->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prclTrg->right - prclTrg->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prclTrg->bottom - prclTrg->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rop = rop3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, &order, sizeof (order), VRDE_ORDER_DSTBLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportScreenBlt (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const RECTL *prclTrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync POINTL *pptlSrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t rop3)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERSCREENBLT order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prclTrg->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prclTrg->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prclTrg->right - prclTrg->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prclTrg->bottom - prclTrg->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.xSrc = (int16_t)pptlSrc->x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ySrc = (int16_t)pptlSrc->y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rop = rop3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric (pDev, pClipRects, &order, sizeof (order), VRDE_ORDER_SCREENBLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportMemBltRect (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prcl,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xSrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int ySrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t rop3,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPBCHASH *phash)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERMEMBLT order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x = (int16_t)prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y = (int16_t)prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.w = (uint16_t)(prcl->right - prcl->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.h = (uint16_t)(prcl->bottom - prcl->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.xSrc = (int16_t)xSrc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ySrc = (int16_t)ySrc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rop = rop3;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(sizeof (*phash) == sizeof (order.hash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (order.hash, phash, sizeof (*phash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrder (pDev, &order, sizeof (order), VRDE_ORDER_MEMBLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportMemBlt (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS *pClipRects,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync POINTL *pptlSrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const uint8_t rop3,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPBCHASH *phash)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClipRects->rects.c == 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xShift = pClipRects->rclDst.left - pClipRects->rclDstOrig.left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yShift = pClipRects->rclDst.top - pClipRects->rclDstOrig.top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(xShift >= 0 && yShift >= 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportMemBltRect (pDev, &pClipRects->rclDst, pptlSrc->x + xShift, pptlSrc->y + yShift, rop3, phash);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG i;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (i = 0; i < pClipRects->rects.c; i++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xShift = pClipRects->rects.arcl[i].left - pClipRects->rclDstOrig.left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yShift = pClipRects->rects.arcl[i].top - pClipRects->rclDstOrig.top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(xShift >= 0 && yShift >= 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportMemBltRect (pDev, &pClipRects->rects.arcl[i], pptlSrc->x + xShift, pptlSrc->y + yShift, rop3, phash);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportCachedBitmap (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SURFOBJ *psoSrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPBCHASH *phash)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERCACHEDBITMAP order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(sizeof (*phash) == sizeof (order.hash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (order.hash, phash, sizeof (*phash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = vrdpReportOrder (pDev, &order, sizeof (order), VRDE_ORDER_CACHED_BITMAP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int bytesPerPixel = format2BytesPerPixel(psoSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8Bits = (uint8_t *)psoSrc->pvScan0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int32_t lDelta = psoSrc->lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cWidth = psoSrc->sizlBitmap.cx;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cHeight = psoSrc->sizlBitmap.cy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cWidth != 0 && cHeight != 0 && bytesPerPixel != 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpWriteBits (pDev, pu8Bits, lDelta, 0, 0, cWidth, cHeight, bytesPerPixel);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vrdpReportDeletedBitmap (PVBOXDISPDEV pDev,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VRDPBCHASH *phash)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERDELETEDBITMAP order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(sizeof (*phash) == sizeof (order.hash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (order.hash, phash, sizeof (*phash));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrder (pDev, &order, sizeof (order), VRDE_ORDER_DELETED_BITMAP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpReset(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("%p", pDev));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpbmpReset(&pDev->vrdpCache);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VRDP driver functions.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsyncvoid vrdpDrvLineTo(SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG x1, LONG y1, LONG x2, LONG y2, RECTL *prclBounds, MIX mix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * LineTo operation is supported by RDP_ORDER_LINE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS clipRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int clipResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclBoundsOrdered = *prclBounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpOrderRect(&rclBoundsOrdered);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync clipResult = vrdpGetIntersectingClipRects(&clipRects, pso, &rclBoundsOrdered, pco, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (clipResult == VRDP_CLIP_NO_INTERSECTION)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Do nothing. The Blt does not affect anything. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_NO_INTERSECTION!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO(&rclBoundsOrdered, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (clipResult == VRDP_CLIP_TOO_MANY_RECTS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* A very complex clip. Better to emulate it. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_TOO_MANY_RECTS!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO(&rclBoundsOrdered, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (pbo->iSolidColor == 0xFFFFFFFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Not solid brushes are not supported. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERLINE order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x1 = (int16_t)x1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y1 = (int16_t)y1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.x2 = (int16_t)x2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.y2 = (int16_t)y2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.xBounds1 = ~0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.yBounds1 = ~0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.xBounds2 = ~0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.yBounds2 = ~0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.mix = (uint8_t)(mix & 0x1F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgb = vrdpColor2RGB (pso, pbo->iSolidColor);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("LINE %d,%d to %d,%d mix %02X rgb %08X bounds %d-%d %d-%d cliprects %d.",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x1, y1, x2, y2, order.mix, order.rgb,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync prclBounds->left, prclBounds->right, prclBounds->top, prclBounds->bottom, clipRects.rects.c));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric(pDev, &clipRects, &order, sizeof (order), VRDE_ORDER_LINE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvStrokePath(SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, XFORMOBJ *pxo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BRUSHOBJ *pbo, POINTL *pptlBrushOrg, LINEATTRS *plineattrs, MIX mix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * StrokePath operation is supported by RDP_ORDER_POLYGON/POLYLINE/ELLIPSE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS clipRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int clipResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTFX rcfxBounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclBoundsOrdered;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("pso = %p, ppo = %p, pco = %p, pxo = %p, pbo = %p, pptlBrushOrg = %p, plineattrs = %p, mix = 0x%08X",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso, ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("ppo: fl = 0x%08X, cCurves = %d", ppo->fl, ppo->cCurves));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PATHOBJ_vGetBounds(ppo, &rcfxBounds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBoundsOrdered.left = FXTOLFLOOR(rcfxBounds.xLeft);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBoundsOrdered.right = FXTOLCEILING(rcfxBounds.xRight);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBoundsOrdered.top = FXTOLFLOOR(rcfxBounds.yTop);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBoundsOrdered.bottom = FXTOLCEILING(rcfxBounds.yBottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpOrderRect(&rclBoundsOrdered);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("ppo: bounds %x-%x, %x-%x, %d-%d %d-%d",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rcfxBounds.xLeft, rcfxBounds.xRight, rcfxBounds.yTop, rcfxBounds.yBottom,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rclBoundsOrdered.left, rclBoundsOrdered.right, rclBoundsOrdered.top, rclBoundsOrdered.bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync clipResult = vrdpGetIntersectingClipRects(&clipRects, pso, &rclBoundsOrdered, pco, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (clipResult == VRDP_CLIP_NO_INTERSECTION)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Do nothing. The operation does not affect anything. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_NO_INTERSECTION!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclBoundsOrdered, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (clipResult == VRDP_CLIP_TOO_MANY_RECTS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* A very complex clip. Better to emulate it. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_TOO_MANY_RECTS!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclBoundsOrdered, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (pbo->iSolidColor == 0xFFFFFFFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Not solid brushes are not supported. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (ppo->fl & PO_ELLIPSE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxVBVAOrderSupported(&pDev->vbvaCtx, VRDE_ORDER_ELLIPSE))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERELLIPSE order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.x = (int16_t)FXTOLROUND(rcfxBounds.xLeft + 4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.y = (int16_t)FXTOLROUND(rcfxBounds.yTop + 4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.x = (int16_t)FXTOLROUND(rcfxBounds.xRight - 4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.y = (int16_t)FXTOLROUND(rcfxBounds.yBottom - 4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.mix = (uint8_t)(mix & 0x1F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.fillMode = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgb = vrdpColor2RGB(pso, pbo->iSolidColor);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric(pDev, &clipRects, &order, sizeof (order), VRDE_ORDER_ELLIPSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("ELLIPSE not supported"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects (pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if ( (ppo->fl & PO_BEZIERS) == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (plineattrs->fl & LA_GEOMETRIC) == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && plineattrs->pstyle == NULL)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync unsigned i;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PATHDATA pd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bMore;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERPOLYLINE order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERPOINT ptStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERBOUNDS bounds;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.rgb = vrdpColor2RGB(pso, pbo->iSolidColor);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.mix = (uint8_t)(mix & 0x1F);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PATHOBJ_vEnumStart(ppo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.points.c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync POINTFIX *pptfx;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERPOINT pt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bMore = PATHOBJ_bEnum (ppo, &pd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("pd: flags = 0x%08X, count = %d", pd.flags, pd.count));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pptfx = &pd.pptfx[0];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pd.flags & PD_BEGINSUBPATH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Setup first point. Start a new order. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("BEGINSUBPATH"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(order.points.c == 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpPointFX2Point(pptfx, &ptStart);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ptStart = ptStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pt = ptStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt1 = bounds.pt2 = ptStart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pptfx++;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync i = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Continue order"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync i = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (; i < pd.count; i++, pptfx++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("pd: %2d: %x,%x %d,%d",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync i, pptfx->x, pptfx->y, FXTOLROUND(pptfx->x), FXTOLROUND(pptfx->y)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpPointFX2Point (pptfx, &pt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpPolyPointsAdd (&order.points, &pt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpExtendOrderBounds (&bounds, &pt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (order.points.c == RT_ELEMENTS(order.points.a))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Flush the order and start a new order. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Report order, points overflow."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGenericBounds(pDev, &clipRects, &bounds, &order, sizeof (order), VRDE_ORDER_POLYLINE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.points.c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ptStart = pt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bounds.pt1 = bounds.pt2 = pt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pd.flags & PD_CLOSEFIGURE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Encode the start point as the end point. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Report order, CLOSEFIGURE"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ( ptStart.x != pt.x
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || ptStart.y != pt.y)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(order.points.c < RT_ELEMENTS(order.points.a));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpPolyPointsAdd (&order.points, &ptStart);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpExtendOrderBounds (&bounds, &ptStart);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pd.flags & PD_ENDSUBPATH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Finish the order. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Report order, ENDSUBPATH"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (order.points.c > 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGenericBounds(pDev, &clipRects, &bounds, &order, sizeof (order), VRDE_ORDER_POLYLINE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.points.c = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (bMore);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Not supported. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("not supported: ppo->fl = %08X, plineattrs->fl = %08X, plineattrs->pstyle = %08X",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ppo->fl, plineattrs->fl, plineattrs->pstyle));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvFillPath(SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync MIX mix, FLONG flOptions)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyPath(pDev, pco, ppo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvPaint(SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, MIX mix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyClip(pDev, pco, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvTextOut(SURFOBJ *pso, STROBJ *pstro, FONTOBJ *pfo, CLIPOBJ *pco,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclExtra, RECTL *prclOpaque, BRUSHOBJ *pboFore,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BRUSHOBJ *pboOpaque, POINTL *pptlOrg, MIX mix)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * TextOut operation is supported by RDP_ORDER_TEXT2/FONTCACHE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS clipRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int clipResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclArea = prclOpaque? *prclOpaque: pstro->rclBkGround;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync clipResult = vrdpGetIntersectingClipRects(&clipRects, pso, &rclArea, pco, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (clipResult == VRDP_CLIP_NO_INTERSECTION)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Do nothing. The operation does not affect anything. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_NO_INTERSECTION!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclArea, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (clipResult == VRDP_CLIP_TOO_MANY_RECTS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* A very complex clip. Better to emulate it. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP_CLIP_TOO_MANY_RECTS!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclArea, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects (pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if ( pstro->pwszOrg == NULL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || prclExtra != NULL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (pfo->flFontType & FO_TYPE_RASTER) == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pstro->cGlyphs > VRDP_TEXT_MAX_GLYPHS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (pboOpaque && pboOpaque->iSolidColor == 0xFFFFFFFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pfo->iUniq == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Unknown/unsupported parameters. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("unsupported: pstro->pwszOrg=%p, prclExtra=%p, pfo->flFontType & FO_TYPE_RASTER = 0x%08X, "
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync "pstro->cGlyphs = %d, pboOpaque->iSolidColor %p, pfo->iUniq = %p",
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync pstro->pwszOrg, prclExtra, pfo->flFontType & FO_TYPE_RASTER, pstro->cGlyphs,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pboOpaque? pboOpaque->iSolidColor: 0, pfo->iUniq));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#if 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Testing: report a red rectangle for the text area. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportSolidRect(pDev, &clipRects, 0x0000FF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Try to report the text order. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG ulForeRGB = pboFore? vrdpColor2RGB(pso, pboFore->iSolidColor): 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG ulBackRGB = pboOpaque? vrdpColor2RGB(pso, pboOpaque->iSolidColor): 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("calling vboxReportText fg %x bg %x", ulForeRGB, ulBackRGB));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!vrdpReportText(pDev, &clipRects, pstro, pfo, prclOpaque, ulForeRGB, ulBackRGB))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvSaveScreenBits(SURFOBJ *pso, ULONG iMode, ULONG_PTR ident, RECTL *prcl)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)pso->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (iMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case SS_SAVE:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERSAVESCREEN order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.x = (int16_t)prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.y = (int16_t)prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.x = (int16_t)prcl->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.y = (int16_t)prcl->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ident = (uint8_t)ident;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.restore = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportOrderGeneric(pDev, NULL, &order, sizeof (order), VRDE_ORDER_SAVESCREEN);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case SS_RESTORE:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDEORDERSAVESCREEN order;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.x = (int16_t)prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt1.y = (int16_t)prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.x = (int16_t)prcl->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.pt2.y = (int16_t)prcl->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.ident = (uint8_t)ident;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync order.restore = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vrdpReportOrderGeneric(pDev, NULL, &order, sizeof (order), VRDE_ORDER_SAVESCREEN))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8Bits;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int32_t lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t w;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t h;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int cbPixel;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso = getSurfObj(pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbPixel = format2BytesPerPixel(pso);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pu8Bits = (uint8_t *)pso->pvScan0 +
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pso->lDelta * prcl->top +
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbPixel * prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lDelta = pso->lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w = prcl->right - prcl->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync h = prcl->bottom - prcl->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpWriteBits(pDev, pu8Bits, lDelta, prcl->left, prcl->top, w, h, cbPixel);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Invalid mode %d!!!", iMode));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Whether the ROP4 operation requires MASK. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ROP4_NEED_MASK(__rop4) ( (uint8_t)((__rop4) >> 8) != (uint8_t)(__rop4) )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Whether the ROP3 (lower byte of rop4) operation requires BRUSH. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ROP3_NEED_BRUSH(__rop3) (((((__rop3) >> 4) ^ (__rop3)) & 0x0F) != 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Whether the ROP3 (lower byte of rop4) operation requires SOURCE. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ROP3_NEED_SRC(__rop3) (((((__rop3) >> 2) ^ (__rop3)) & 0x33) != 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Whether the ROP3 (lower byte of rop4) operation requires DESTINATION. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ROP3_NEED_DST(__rop3) (((((__rop3) >> 1) ^ (__rop3)) & 0x55) != 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvBitBlt(SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL *prclTrg, POINTL *pptlSrc, POINTL *pptlMask, BRUSHOBJ *pbo, POINTL *pptlBrush,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ROP4 rop4)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)psoTrg->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * BitBlt operation is supported by following RDP orders:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_DESTBLT ROP on the screen bits (BLACKNESS, WHITENESS, DSTINVERT).
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_PATBLT ROP with screen bits and a brush.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_SCREENBLT Screen to screen with ROP.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_RECT Solid fill (SRCCOPY).
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_MEMBLT ROP with screen and cached offscreen bitmap.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * RDP_ORDER_TRIBLT ROP with screen, cached offscreen bitmap and a brush.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Actual BitBlts must be mapped to these RDP operations.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Anything that can not be mapped must be emulated with dirty rect.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPCLIPRECTS clipRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int clipResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECTL rclTrg = *prclTrg;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpOrderRect (&rclTrg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync clipResult = vrdpGetIntersectingClipRects(&clipRects, psoTrg, &rclTrg, pco,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispIsScreenSurface(psoSrc)? pptlSrc: NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (clipResult == VRDP_CLIP_NO_INTERSECTION)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Do nothing. The Blt does not affect anything. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VRDP_CLIP_NO_INTERSECTION!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclTrg, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (clipResult == VRDP_CLIP_TOO_MANY_RECTS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* A very complex clip. Better to emulate it. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VRDP_CLIP_TOO_MANY_RECTS!!!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync dumpPCO (&rclTrg, pco);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (ROP4_NEED_MASK (rop4))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Operation with mask is not supported. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("Operation with mask is not supported."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (ROP3_NEED_BRUSH(rop4))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Operation requires brush."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Operation requires brush. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (ROP3_NEED_SRC(rop4))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo Three way blt. RDP_ORDER_TRIBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("TRIBLT pbo->iSolidColor = 0x%08X.", pbo->iSolidColor));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Only brush and destination. Check if the brush is solid. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pbo->iSolidColor != 0xFFFFFFFF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Solid brush. The iSolidColor is the target surface color. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t rgb = vrdpColor2RGB(psoTrg, pbo->iSolidColor);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Mix with solid brush. RDP_ORDER_PATBLT. Or RDP_ORDER_RECT for rop4 = 0xF0F0. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Solid PATBLT color = %08X, rgb %08X.", pbo->iSolidColor, rgb));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (rop4 == 0xF0F0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportSolidRect(pDev, &rclTrg, &clipRects, rgb);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportSolidBlt(pDev, &rclTrg, &clipRects, rgb, (uint8_t)rop4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Non solid brush. RDP_ORDER_PATBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDP::vrdpBitBlt: PATBLT pbo->pvRbrush = %p.", pbo->pvRbrush));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Realize brush. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pbo->pvRbrush)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BRUSHOBJ_pvGetRbrush (pbo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pbo->pvRbrush)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Brush has been realized. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBRUSH *pBrush = (VRDPBRUSH *)pbo->pvRbrush;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBrush->fPattern)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportPatBlt(pDev, &rclTrg, &clipRects, pBrush, pptlBrush, (uint8_t)rop4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo BITMAPCACHE followed by MEMBLT? */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Unsupported brush format. Fallback to dirty rects. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Operation does not require brush. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (ROP3_NEED_SRC(rop4))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("MEMBLT or SCREENBLT."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* MEMBLT or SCREENBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxDispIsScreenSurface(psoSrc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Screen to screen transfer. SCREENBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("SCREENBLT."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportScreenBlt(pDev, &rclTrg, &clipRects, pptlSrc, (uint8_t)rop4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Offscreen bitmap to screen. MEMBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBCHASH hash;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBCHASH hashDeleted;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int cacheResult;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: bitmap %dx%d.", psoSrc->sizlBitmap.cx, psoSrc->sizlBitmap.cy));
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync if ( pDev->bBitmapCacheDisabled
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync || (psoSrc->fjBitmap & BMF_DONTCACHE) != 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || psoSrc->iUniq == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Bitmaps with hdev == 0 seems to have different RGB layout for 16BPP modes.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Just do not cache these bitmaps and report the dirty display area instead.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || ( psoSrc->hdev == 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && !(psoSrc->iBitmapFormat == BMF_24BPP || psoSrc->iBitmapFormat == BMF_32BPP)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
b43f00592f321690997ff22fcb243059b0440091vboxsync /* Do not try to cache large bitmaps. The cache should be mostly used for icons, etc.
b43f00592f321690997ff22fcb243059b0440091vboxsync * Computing a bitmap hash increases CPU load. Up to 384K pixels (~620x620)
b43f00592f321690997ff22fcb243059b0440091vboxsync */
b43f00592f321690997ff22fcb243059b0440091vboxsync || psoSrc->sizlBitmap.cx * psoSrc->sizlBitmap.cy > 384 * _1K
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("MEMBLT: non cacheable bitmap."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cacheResult = VRDPBMP_RC_NOT_CACHED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: going to cache."));
b43f00592f321690997ff22fcb243059b0440091vboxsync cacheResult = vrdpbmpCacheSurface(&pDev->vrdpCache, psoSrc, &hash, &hashDeleted, FALSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: cacheResult 0x%08X", cacheResult));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (cacheResult & VRDPBMP_RC_F_DELETED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("VRDPBMP_RC_F_DELETED"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDeletedBitmap(pDev, &hashDeleted);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cacheResult &= ~VRDPBMP_RC_F_DELETED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (cacheResult)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VRDPBMP_RC_CACHED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportCachedBitmap(pDev, psoSrc, &hash);
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: cached add %dx%d",
b43f00592f321690997ff22fcb243059b0440091vboxsync psoSrc->sizlBitmap.cx, psoSrc->sizlBitmap.cy));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Continue and report MEMBLT order. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VRDPBMP_RC_ALREADY_CACHED:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportMemBlt(pDev, &clipRects, pptlSrc, (uint8_t)rop4, &hash);
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: cached use %dx%d from %d,%d %dx%d",
b43f00592f321690997ff22fcb243059b0440091vboxsync psoSrc->sizlBitmap.cx, psoSrc->sizlBitmap.cy,
b43f00592f321690997ff22fcb243059b0440091vboxsync pptlSrc->x, pptlSrc->y,
b43f00592f321690997ff22fcb243059b0440091vboxsync rclTrg.right - rclTrg.left,
b43f00592f321690997ff22fcb243059b0440091vboxsync rclTrg.bottom - rclTrg.top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG((" %08X %08X %08X %08X",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *(uint32_t *)&((uint8_t *)&hash)[0],
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *(uint32_t *)&((uint8_t *)&hash)[4],
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *(uint32_t *)&((uint8_t *)&hash)[8],
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *(uint32_t *)&((uint8_t *)&hash)[12]
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* The surface was not cached. Fallback to dirty rects. */
b43f00592f321690997ff22fcb243059b0440091vboxsync LOG(("MEMBLT: not cached %dx%d from %d,%d %dx%d",
b43f00592f321690997ff22fcb243059b0440091vboxsync psoSrc->sizlBitmap.cx, psoSrc->sizlBitmap.cy,
b43f00592f321690997ff22fcb243059b0440091vboxsync pptlSrc->x, pptlSrc->y,
b43f00592f321690997ff22fcb243059b0440091vboxsync rclTrg.right - rclTrg.left,
b43f00592f321690997ff22fcb243059b0440091vboxsync rclTrg.bottom - rclTrg.top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispDumpPSO(psoSrc, "psoSrc");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyRects(pDev, &clipRects);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* No source and no brush, only dest affected. DESTBLT. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("DSTBLT with rop 0x%08X", rop4));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDstBlt(pDev, &rclTrg, &clipRects, (uint8_t)rop4);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvStretchBlt(SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync COLORADJUSTMENT *pca, POINTL *pptlHTOrg, RECTL *prclDest, RECTL *prclSrc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync POINTL *pptlMask, ULONG iMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV)psoDest->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpReportDirtyClip(pDev, pco, prclDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vrdpDrvCopyBits(SURFOBJ *psoDest, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDest, POINTL *pptlSrc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* The copy bits is the same as bit blt with particular set of parameters. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vrdpDrvBitBlt(psoDest, psoSrc, NULL, pco, pxlo, prclDest, pptlSrc, NULL, NULL, NULL, 0xCCCC);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL vrdpDrvRealizeBrush(BRUSHOBJ *pbo, SURFOBJ *psoTarget, SURFOBJ *psoPattern, SURFOBJ *psoMask,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync XLATEOBJ *pxlo, ULONG iHatch)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("psoMask = %p, iHatch = %d", psoMask, iHatch));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispDumpPSO(psoPattern, "psoPattern");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (psoPattern
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && psoPattern->sizlBitmap.cx == 8
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && psoPattern->sizlBitmap.cy == 8
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && psoPattern->iBitmapFormat == 1
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbBrush = sizeof (VRDPBRUSH);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBRUSH *pBrush = (VRDPBRUSH *)BRUSHOBJ_pvAllocRbrush (pbo, cbBrush);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("pattern pBrush = %p, size = %d", pBrush, cbBrush));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBrush)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int i;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8Bits = (uint8_t *)psoPattern->pvScan0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (i = 0; i < 8; i++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->u.pat.au8Pattern[i] = *pu8Bits;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pu8Bits += psoPattern->lDelta;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Obtain RGB values for the brush fore and background colors:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * "should translate color zero through the XLATEOBJ to get the foreground color for the brush."
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->u.pat.rgbFG = vrdpColor2RGB (psoTarget, pxlo->pulXlate[0]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->u.pat.rgbBG = vrdpColor2RGB (psoTarget, pxlo->pulXlate[1]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->fPattern = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#if 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if (psoPattern)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Color brushes and brushes >8x8 are cached and MEMBLT order generated. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbBrush = sizeof (VRDPBRUSH) +
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync psoTarget->sizlBitmap.cx * sizeof (uint32_t) * psoTarget->sizlBitmap.cy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ??? target
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VRDPBRUSH *pBrush = (VRDPBRUSH *)BRUSHOBJ_pvAllocRbrush (pbo, cbBrush);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("bitmap pBrush = %p, size = %d", pBrush, cbBrush));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pBrush)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Byte per pattern pixel. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cbSrcBPP = format2BytesPerPixel(psoPattern);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Source bits scanline pointer. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8BitsSrcScanLine = (uint8_t *)psoPattern->pvScan0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Target RGB pixel pointer. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t *pu32BitsDst = &pBrush->u.bitmap.au32Bits[0];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int y;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (y = 0; y < psoTarget->sizlBitmap.cy; y++, pu8BitsSrcScanLine += psoPattern->lDelta)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint8_t *pu8BitsSrc = pu8BitsSrcScanLine;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int x;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (x = 0; x < psoTarget->sizlBitmap.cx; x++, pu8BitsSrc += cbSrcBPP)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t color = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (&color, pu8BitsSrc, cbSrcBPP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pxlo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync color = XLATEOBJ_iXlate (pxlo, color);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pu32BitsDst++ = vrdpColor2RGB (psoTarget, color);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* LOG(("%08X", pu32BitsDst[-1])); */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->u.bitmap.w = (uint16_t)psoTarget->sizlBitmap.cx;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->u.bitmap.h = (uint16_t)psoTarget->sizlBitmap.cy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBrush->fPattern = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* 0 */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}