f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Copyright © 2004 Philip Blundell
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * documentation for any purpose is hereby granted without fee, provided that
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * the above copyright notice appear in all copies and that both that
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * copyright notice and this permission notice appear in supporting
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * documentation, and that the name of Philip Blundell not be used in
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * advertising or publicity pertaining to distribution of the software without
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * specific, written prior permission. Philip Blundell makes no
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * representations about the suitability of this software for any purpose. It
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * is provided "as is" without express or implied warranty.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * PHILIP BLUNDELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * EVENT SHALL PHILIP BLUNDELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * PERFORMANCE OF THIS SOFTWARE.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <X11/X.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "scrnintstr.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "windowstr.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "dixfontstr.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "mi.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "regionstr.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "globals.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "gcstruct.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "shadow.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "fb.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#if ROTATE == 270
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTEPX(stride) (stride)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTART(x,y) (((pScreen->height - 1) - y) + (x * winStride))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTEPY() -1
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#elif ROTATE == 90
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTEPX(stride) (-stride)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTEPY() 1
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define WINSTART(x,y) (((pScreen->width - 1 - x) * winStride) + y)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#else
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#error This rotation is not supported here
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#ifdef __arm__
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define PREFETCH
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncvoid
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncFUNC (ScreenPtr pScreen,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shadowBufPtr pBuf);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncvoid
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncFUNC (ScreenPtr pScreen,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shadowBufPtr pBuf)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync RegionPtr damage = shadowDamage(pBuf);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PixmapPtr pShadow = pBuf->pPixmap;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int nbox = RegionNumRects (damage);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync BoxPtr pbox = RegionRects (damage);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync FbBits *shaBits;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Data *shaBase, *shaLine, *sha;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync FbStride shaStride, winStride;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int shaBpp;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync _X_UNUSED int shaXoff, shaYoff;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int x, y, w, h;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Data *winBase, *win, *winLine;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync CARD32 winSize;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync fbGetDrawable (&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff, shaYoff);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shaBase = (Data *) shaBits;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shaStride = shaStride * sizeof (FbBits) / sizeof (Data);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync winBase = (Data *) (*pBuf->window) (pScreen, 0, 0,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync SHADOW_WINDOW_WRITE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync &winSize, pBuf->closure);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync winStride = (Data *) (*pBuf->window) (pScreen, 1, 0,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync SHADOW_WINDOW_WRITE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync &winSize, pBuf->closure) - winBase;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (nbox--)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync x = pbox->x1;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y = pbox->y1;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync w = (pbox->x2 - pbox->x1);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync h = pbox->y2 - pbox->y1;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shaLine = shaBase + (y * shaStride) + x;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#ifdef PREFETCH
f0ab104f070bc7f569404826fea1828ed985638cvboxsync __builtin_prefetch (shaLine);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif
f0ab104f070bc7f569404826fea1828ed985638cvboxsync winLine = winBase + WINSTART(x, y);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (h--)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync sha = shaLine;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win = winLine;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (sha < (shaLine + w - 16))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#ifdef PREFETCH
f0ab104f070bc7f569404826fea1828ed985638cvboxsync __builtin_prefetch (sha + shaStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (sha < (shaLine + w))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *win = *sha++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync win += WINSTEPX(winStride);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync shaLine += shaStride;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync winLine += WINSTEPY();
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync pbox++;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync } /* nbox */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}