summaryrefslogtreecommitdiff
path: root/src/lx_rotate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lx_rotate.c')
-rw-r--r--src/lx_rotate.c282
1 files changed, 0 insertions, 282 deletions
diff --git a/src/lx_rotate.c b/src/lx_rotate.c
deleted file mode 100644
index bc29f26..0000000
--- a/src/lx_rotate.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* Copyrightg (c) 2007 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "xf86.h"
-#include "shadow.h"
-#include "geode.h"
-
-static void
-LXShadowSave(ScreenPtr pScreen, ExaOffscreenArea * area)
-{
- ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum];
- GeodeRec *pGeode = GEODEPTR(pScrni);
-
- if (area == pGeode->shadowArea)
- pGeode->shadowArea = NULL;
-}
-
-static void *
-LXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode,
- CARD32 * size, void *closure)
-{
- ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum];
- GeodeRec *pGeode = GEODEPTR(pScrni);
-
- *size = pGeode->displayPitch;
-
- return (pGeode->FBBase + pGeode->displayOffset) +
- row * pGeode->displayPitch + offset;
-}
-
-static void
-LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf)
-{
- RegionPtr damage = shadowDamage(pBuf);
-
- int nbox = REGION_NUM_RECTS(damage);
- BoxPtr pbox = REGION_RECTS(damage);
- int x, y, w, h, degrees = 0;
- FbStride shaStride;
- FbBits *shaBits;
- int shaBpp, dx = 0, dy = 0, dw, dh;
- int shaXoff, shaYoff;
- unsigned int srcOffset, dstOffset;
- PixmapPtr pShadow = pBuf->pPixmap;
- ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum];
- GeodeRec *pGeode = GEODEPTR(pScrni);
-
- /* shaBits isn't reliable here, because we are outside of
- * the EXA access boundaries - we'll just use the offset from
- * the pixmap and hope for the best - we stil use fbGetDrawable
- * for the other variables
- */
-
- fbGetDrawable(&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff,
- shaYoff);
-
- /* Set up the blt */
-
- gp_wait_until_idle();
- gp_declare_blt(0);
-
- gp_set_bpp(pScrni->bitsPerPixel);
-
- switch (shaBpp) {
- case 8:
- gp_set_source_format(CIMGP_SOURCE_FMT_3_3_2);
- break;
-
- case 16:
- gp_set_source_format(CIMGP_SOURCE_FMT_0_5_6_5);
- break;
-
- case 24:
- case 32:
- gp_set_source_format(CIMGP_SOURCE_FMT_8_8_8_8);
- break;
- }
-
- gp_set_raster_operation(0xCC);
- gp_write_parameters();
-
- while (nbox--) {
- x = pbox->x1;
- y = pbox->y1;
- w = (pbox->x2 - pbox->x1);
- h = pbox->y2 - pbox->y1;
-
- srcOffset = pGeode->shadowArea->offset;
- srcOffset += (y * pGeode->Pitch) + (x * (shaBpp >> 3));
-
- switch (pGeode->rotation) {
- case RR_Rotate_0:
- dx = x;
- dy = y;
- dw = w;
- dh = h;
- degrees = 0;
- break;
-
- case RR_Rotate_90:
- dx = (pScrni->pScreen->height - 1) - (y + (h - 1));
- dy = x;
- dw = h;
- dh = w;
- degrees = 90;
- break;
-
- case RR_Rotate_180:
- dx = (pScrni->pScreen->width - 1) - (x + (w - 1));
- dy = (pScrni->pScreen->height - 1) - (y + (h - 1));
- dw = w;
- dh = h;
-
- degrees = 180;
- break;
-
- case RR_Rotate_270:
- dy = (pScrni->pScreen->width - 1) - (x + (w - 1));
- dx = y;
- dw = h;
- dh = w;
-
- degrees = 270;
- break;
- }
-
- dstOffset = pGeode->displayOffset +
- (dy * pGeode->displayPitch) + (dx * (pScrni->bitsPerPixel >> 3));
-
- gp_declare_blt(CIMGP_BLTFLAGS_HAZARD);
- gp_set_strides(pGeode->displayPitch, pGeode->Pitch);
- gp_rotate_blt(dstOffset, srcOffset, w, h, degrees);
- pbox++;
- }
-}
-
-Bool
-LXSetRotatePitch(ScrnInfoPtr pScrni)
-{
- GeodeRec *pGeode = GEODEPTR(pScrni);
-
- pScrni->displayWidth = pGeode->displayWidth;
-
- if (pGeode->Compression)
- pGeode->Pitch = GeodeCalculatePitchBytes(pScrni->displayWidth,
- pScrni->bitsPerPixel);
- else
- pGeode->Pitch = (pScrni->displayWidth * (pScrni->bitsPerPixel >> 3));
- return TRUE;
-}
-
-Bool
-LXAllocShadow(ScrnInfoPtr pScrni)
-{
- GeodeRec *pGeode = GEODEPTR(pScrni);
- PixmapPtr pPixmap;
-
- int size;
-
- if (pGeode->rotation == RR_Rotate_0) {
-
- if (pGeode->shadowArea) {
- exaOffscreenFree(pScrni->pScreen, pGeode->shadowArea);
- pGeode->shadowArea = NULL;
- }
-
- pScrni->fbOffset = pGeode->displayOffset;
- } else {
- if (pGeode->rotation == RR_Rotate_90
- || pGeode->rotation == RR_Rotate_270)
- size = pGeode->displayPitch * pScrni->virtualX;
- else
- size = pGeode->displayPitch * pScrni->virtualY;
-
- if (pGeode->shadowArea) {
-
- if (pGeode->shadowArea->size < size) {
- exaOffscreenFree(pScrni->pScreen, pGeode->shadowArea);
- pGeode->shadowArea = NULL;
- }
- }
-
- if (pGeode->shadowArea == NULL) {
- pGeode->shadowArea =
- exaOffscreenAlloc(pScrni->pScreen, size, 32, TRUE,
- LXShadowSave, pGeode);
-
- if (pGeode->shadowArea == NULL)
- return FALSE;
- }
-
- pScrni->fbOffset = pGeode->shadowArea->offset;
- }
-
- pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen);
-
- pScrni->pScreen->ModifyPixmapHeader(pPixmap,
- pScrni->pScreen->width,
- pScrni->pScreen->height,
- pScrni->pScreen->rootDepth,
- pScrni->bitsPerPixel,
- PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth),
- (pointer) (pGeode->FBBase + pScrni->fbOffset));
-
- return TRUE;
-}
-
-Bool
-LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode)
-{
- GeodeRec *pGeode = GEODEPTR(pScrni);
- Rotation curr = pGeode->rotation;
- unsigned int curdw = pScrni->displayWidth;
- PixmapPtr pPixmap;
- BOOL ret;
-
- pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen);
- pGeode->rotation = LXGetRotation(pScrni->pScreen);
-
- /* Leave if we have nothing to do */
-
- if (pGeode->rotation == curr && pGeode->curMode == mode) {
- return TRUE;
- }
-
- shadowRemove(pScrni->pScreen, NULL);
-
- LXSetRotatePitch(pScrni);
-
- if (pGeode->rotation != RR_Rotate_0) {
-
- ret = shadowAdd(pScrni->pScreen, pPixmap, LXUpdateFunc,
- LXWindowLinear, pGeode->rotation, NULL);
-
- if (!ret)
- goto error;
- }
-
- if (LXAllocShadow(pScrni))
- return TRUE;
-
- error:
- /* Restore the old rotation */
- pScrni->displayWidth = curdw;
-
- if (curr & (RR_Rotate_0 | RR_Rotate_180)) {
- pScrni->pScreen->width = pScrni->virtualX;
- pScrni->pScreen->height = pScrni->virtualY;
- } else {
- pScrni->pScreen->width = pScrni->virtualY;
- pScrni->pScreen->height = pScrni->virtualX;
- }
-
- pGeode->rotation = curr;
- return FALSE;
-}