| 1 | /* |
| 2 | * Copyright © 2004 Philip Blundell |
| 3 | * |
| 4 | * Permission to use, copy, modify, distribute, and sell this software and its |
| 5 | * documentation for any purpose is hereby granted without fee, provided that |
| 6 | * the above copyright notice appear in all copies and that both that |
| 7 | * copyright notice and this permission notice appear in supporting |
| 8 | * documentation, and that the name of Philip Blundell not be used in |
| 9 | * advertising or publicity pertaining to distribution of the software without |
| 10 | * specific, written prior permission. Philip Blundell makes no |
| 11 | * representations about the suitability of this software for any purpose. It |
| 12 | * is provided "as is" without express or implied warranty. |
| 13 | * |
| 14 | * PHILIP BLUNDELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| 15 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| 16 | * EVENT SHALL PHILIP BLUNDELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| 17 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
| 18 | * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| 19 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| 20 | * PERFORMANCE OF THIS SOFTWARE. |
| 21 | */ |
| 22 | |
| 23 | #include <X11/X.h> |
| 24 | #include "scrnintstr.h" |
| 25 | #include "windowstr.h" |
| 26 | #include "dixfontstr.h" |
| 27 | #include "mi.h" |
| 28 | #include "regionstr.h" |
| 29 | #include "globals.h" |
| 30 | #include "gcstruct.h" |
| 31 | #include "shadow.h" |
| 32 | #include "fb.h" |
| 33 | |
| 34 | #if ROTATE == 270 |
| 35 | |
| 36 | #define WINSTEPX(stride) (stride) |
| 37 | #define WINSTART(x,y) (((pScreen->height - 1) - y) + (x * winStride)) |
| 38 | #define WINSTEPY() -1 |
| 39 | |
| 40 | #elif ROTATE == 90 |
| 41 | |
| 42 | #define WINSTEPX(stride) (-stride) |
| 43 | #define WINSTEPY() 1 |
| 44 | #define WINSTART(x,y) (((pScreen->width - 1 - x) * winStride) + y) |
| 45 | |
| 46 | #else |
| 47 | |
| 48 | #error This rotation is not supported here |
| 49 | |
| 50 | #endif |
| 51 | |
| 52 | #ifdef __arm__ |
| 53 | #define PREFETCH |
| 54 | #endif |
| 55 | |
| 56 | void |
| 57 | FUNC(ScreenPtr pScreen, shadowBufPtr pBuf) |
| 58 | { |
| 59 | RegionPtr damage = shadowDamage(pBuf); |
| 60 | PixmapPtr pShadow = pBuf->pPixmap; |
| 61 | int nbox = RegionNumRects(damage); |
| 62 | BoxPtr pbox = RegionRects(damage); |
| 63 | FbBits *shaBits; |
| 64 | Data *shaBase, *shaLine, *sha; |
| 65 | FbStride shaStride, winStride; |
| 66 | int shaBpp; |
| 67 | _X_UNUSED int shaXoff, shaYoff; |
| 68 | int x, y, w, h; |
| 69 | Data *winBase, *win, *winLine; |
| 70 | CARD32 winSize; |
| 71 | |
| 72 | fbGetDrawable(&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff, |
| 73 | shaYoff); |
| 74 | shaBase = (Data *) shaBits; |
| 75 | shaStride = shaStride * sizeof(FbBits) / sizeof(Data); |
| 76 | |
| 77 | winBase = (Data *) (*pBuf->window) (pScreen, 0, 0, |
| 78 | SHADOW_WINDOW_WRITE, |
| 79 | &winSize, pBuf->closure); |
| 80 | winStride = (Data *) (*pBuf->window) (pScreen, 1, 0, |
| 81 | SHADOW_WINDOW_WRITE, |
| 82 | &winSize, pBuf->closure) - winBase; |
| 83 | |
| 84 | while (nbox--) { |
| 85 | x = pbox->x1; |
| 86 | y = pbox->y1; |
| 87 | w = (pbox->x2 - pbox->x1); |
| 88 | h = pbox->y2 - pbox->y1; |
| 89 | |
| 90 | shaLine = shaBase + (y * shaStride) + x; |
| 91 | #ifdef PREFETCH |
| 92 | __builtin_prefetch(shaLine); |
| 93 | #endif |
| 94 | winLine = winBase + WINSTART(x, y); |
| 95 | |
| 96 | while (h--) { |
| 97 | sha = shaLine; |
| 98 | win = winLine; |
| 99 | |
| 100 | while (sha < (shaLine + w - 16)) { |
| 101 | #ifdef PREFETCH |
| 102 | __builtin_prefetch(sha + shaStride); |
| 103 | #endif |
| 104 | *win = *sha++; |
| 105 | win += WINSTEPX(winStride); |
| 106 | *win = *sha++; |
| 107 | win += WINSTEPX(winStride); |
| 108 | *win = *sha++; |
| 109 | win += WINSTEPX(winStride); |
| 110 | *win = *sha++; |
| 111 | win += WINSTEPX(winStride); |
| 112 | |
| 113 | *win = *sha++; |
| 114 | win += WINSTEPX(winStride); |
| 115 | *win = *sha++; |
| 116 | win += WINSTEPX(winStride); |
| 117 | *win = *sha++; |
| 118 | win += WINSTEPX(winStride); |
| 119 | *win = *sha++; |
| 120 | win += WINSTEPX(winStride); |
| 121 | |
| 122 | *win = *sha++; |
| 123 | win += WINSTEPX(winStride); |
| 124 | *win = *sha++; |
| 125 | win += WINSTEPX(winStride); |
| 126 | *win = *sha++; |
| 127 | win += WINSTEPX(winStride); |
| 128 | *win = *sha++; |
| 129 | win += WINSTEPX(winStride); |
| 130 | |
| 131 | *win = *sha++; |
| 132 | win += WINSTEPX(winStride); |
| 133 | *win = *sha++; |
| 134 | win += WINSTEPX(winStride); |
| 135 | *win = *sha++; |
| 136 | win += WINSTEPX(winStride); |
| 137 | *win = *sha++; |
| 138 | win += WINSTEPX(winStride); |
| 139 | } |
| 140 | |
| 141 | while (sha < (shaLine + w)) { |
| 142 | *win = *sha++; |
| 143 | win += WINSTEPX(winStride); |
| 144 | } |
| 145 | |
| 146 | y++; |
| 147 | shaLine += shaStride; |
| 148 | winLine += WINSTEPY(); |
| 149 | } |
| 150 | pbox++; |
| 151 | } /* nbox */ |
| 152 | } |