diff options
author | Eric Anholt <anholt@freebsd.org> | 2003-12-28 09:56:54 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2003-12-28 09:56:54 +0000 |
commit | c7ab03d382ddddcbab09470044fc16079d76952e (patch) | |
tree | ffcd76cb6bc7acc409870bb1f17715d1ab58d0fb | |
parent | e13c9f809ad0326a5965bd60836441bd28ce57d2 (diff) |
Move the kaaComposite function and debug to kaapict.c. It is expected to
grow significantly in the near future.
-rw-r--r-- | hw/kdrive/src/Makefile.am | 2 | ||||
-rw-r--r-- | hw/kdrive/src/kaa.c | 242 | ||||
-rw-r--r-- | hw/kdrive/src/kaa.h | 95 | ||||
-rw-r--r-- | hw/kdrive/src/kaapict.c | 237 |
4 files changed, 343 insertions, 233 deletions
diff --git a/hw/kdrive/src/Makefile.am b/hw/kdrive/src/Makefile.am index 103ec4ef2..5ef155ae0 100644 --- a/hw/kdrive/src/Makefile.am +++ b/hw/kdrive/src/Makefile.am @@ -6,6 +6,8 @@ noinst_LIBRARIES = libkdrive.a libkdrive_a_SOURCES = \ kaa.c \ + kaa.h \ + kaapict.c \ kasync.c \ kcmap.c \ kcurscol.c \ diff --git a/hw/kdrive/src/kaa.c b/hw/kdrive/src/kaa.c index 9de189c52..a13e258aa 100644 --- a/hw/kdrive/src/kaa.c +++ b/hw/kdrive/src/kaa.c @@ -28,8 +28,9 @@ #include <config.h> #endif #include "kdrive.h" -#include "fontstruct.h" -#include "dixfontstr.h" +#include "kaa.h" +#include "fontstruct.h" +#include "dixfontstr.h" #define DEBUG_MIGRATE 0 #define DEBUG_PIXMAP 0 @@ -48,30 +49,11 @@ int kaaGeneration; int kaaScreenPrivateIndex; int kaaPixmapPrivateIndex; -typedef struct { - KaaScreenInfoPtr info; -} KaaScreenPrivRec, *KaaScreenPrivPtr; - -typedef struct { - KdOffscreenArea *area; - int score; - int devKind; - DevUnion devPrivate; -} KaaPixmapPrivRec, *KaaPixmapPrivPtr; - #define KAA_PIXMAP_SCORE_MOVE_IN 10 #define KAA_PIXMAP_SCORE_MAX 20 #define KAA_PIXMAP_SCORE_MOVE_OUT -10 #define KAA_PIXMAP_SCORE_MIN -20 -#define KaaGetScreenPriv(s) ((KaaScreenPrivPtr)(s)->devPrivates[kaaScreenPrivateIndex].ptr) -#define KaaScreenPriv(s) KaaScreenPrivPtr pKaaScr = KaaGetScreenPriv(s) - -#define KaaGetPixmapPriv(p) ((KaaPixmapPrivPtr)(p)->devPrivates[kaaPixmapPrivateIndex].ptr) -#define KaaSetPixmapPriv(p,a) ((p)->devPrivates[kaaPixmapPrivateIndex].ptr = (pointer) (a)) -#define KaaPixmapPriv(p) KaaPixmapPrivPtr pKaaPixmap = KaaGetPixmapPriv(p) -#define KaaPixmapPitch(pitch) (((pitch) + (pKaaScr->info->offscreenPitch - 1)) & ~(pKaaScr->info->offscreenPitch - 1)) - #define MIN_OFFPIX_SIZE (4096) static void @@ -200,7 +182,7 @@ kaaMoveOutPixmap (PixmapPtr pPixmap) } } -static void +void kaaPixmapUseScreen (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); @@ -214,7 +196,7 @@ kaaPixmapUseScreen (PixmapPtr pPixmap) } } -static void +void kaaPixmapUseMemory (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); @@ -283,7 +265,7 @@ kaaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth) return pPixmap; } -static Bool +Bool kaaPixmapIsOffscreen(PixmapPtr p) { ScreenPtr pScreen = p->drawable.pScreen; @@ -294,7 +276,7 @@ kaaPixmapIsOffscreen(PixmapPtr p) pScreenPriv->screen->memory_size); } -static PixmapPtr +PixmapPtr kaaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp) { PixmapPtr pPixmap; @@ -325,7 +307,7 @@ kaaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp) return NULL; } -static Bool +Bool kaaDrawableIsOffscreen (DrawablePtr pDrawable) { PixmapPtr pPixmap; @@ -420,7 +402,7 @@ kaaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n, KdMarkSync(pDrawable->pScreen); } -static void +void kaaCopyNtoN (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, @@ -935,212 +917,6 @@ kaaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what) KdCheckPaintWindow (pWin, pRegion, what); } -#ifdef RENDER -#include "mipict.h" - -#define KAA_DEBUG_FALLBACKS 0 - -#if KAA_DEBUG_FALLBACKS -static void -kaaPrintCompositeFallback(CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst) -{ - char sop[20], ssfmt[20], smfmt[20], sdfmt[20]; - char sloc, mloc, dloc; - int temp; - - switch(op) - { - case PictOpSrc: - sprintf(sop, "Src"); - break; - case PictOpOver: - sprintf(sop, "Over"); - break; - default: - sprintf(sop, "0x%x", (int)op); - break; - } - switch(pSrc->format) - { - case PICT_a8r8g8b8: - sprintf(ssfmt, "ARGB8888"); - break; - default: - sprintf(ssfmt, "0x%x", (int)pSrc->format); - break; - } - sprintf(smfmt, "(none)"); - if (pMask) { - switch(pMask->format) - { - case PICT_a8: - sprintf(smfmt, "A8"); - break; - default: - sprintf(smfmt, "0x%x", (int)pMask->format); - break; - } - } - switch(pDst->format) - { - case PICT_r5g6b5: - sprintf(sdfmt, "RGB565"); - break; - default: - sprintf(sdfmt, "0x%x", (int)pDst->format); - break; - } - strcpy (smfmt, ("None")); - pMask = 0x0; - - sloc = kaaGetOffscreenPixmap(pSrc->pDrawable, &temp, &temp) ? 's' : 'm'; - mloc = (pMask && kaaGetOffscreenPixmap(pMask->pDrawable, &temp, &temp)) ? - 's' : 'm'; - dloc = kaaGetOffscreenPixmap(pDst->pDrawable, &temp, &temp) ? 's' : 'm'; - - ErrorF("Composite fallback: op %s, src 0x%x (%c), mask 0x%x (%c), " - "dst 0x%x (%c)\n" - " srcfmt %s, maskfmt %s, dstfmt %s\n", - sop, pSrc, sloc, pMask, mloc, pDst, dloc, ssfmt, smfmt, sdfmt); -} -#endif - -static void -kaaComposite(CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, - INT16 yDst, - CARD16 width, - CARD16 height) -{ - KdScreenPriv (pDst->pDrawable->pScreen); - KaaScreenPriv (pDst->pDrawable->pScreen); - - if (!pMask) - { - if (op == PictOpSrc) - { - /* - * Check for two special cases -- solid fill and copy area - */ - if (pSrc->pDrawable->width == 1 && pSrc->pDrawable->height == 1 && - pSrc->repeat) - { - ; - } - else if (!pSrc->repeat && pSrc->format == pDst->format) - { - RegionRec region; - - xDst += pDst->pDrawable->x; - yDst += pDst->pDrawable->y; - xSrc += pSrc->pDrawable->x; - ySrc += pSrc->pDrawable->y; - - if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, - xSrc, ySrc, xMask, yMask, xDst, yDst, - width, height)) - return; - - - kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0, - REGION_RECTS(®ion), REGION_NUM_RECTS(®ion), - xSrc - xDst, ySrc - yDst, - FALSE, FALSE, 0, 0); - return; - } - } - - if (pScreenPriv->enabled && pKaaScr->info->PrepareBlend) - { - RegionRec region; - BoxPtr pbox; - int nbox; - int src_off_x, src_off_y; - int dst_off_x, dst_off_y; - PixmapPtr pSrcPix, pDstPix; - - xDst += pDst->pDrawable->x; - yDst += pDst->pDrawable->y; - - xSrc += pSrc->pDrawable->x; - ySrc += pSrc->pDrawable->y; - - if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, - xSrc, ySrc, xMask, yMask, xDst, yDst, - width, height)) - return; - - - /* Migrate pixmaps to same place as destination */ - if (pSrc->pDrawable->type == DRAWABLE_PIXMAP) - kaaPixmapUseScreen ((PixmapPtr) pSrc->pDrawable); - if (pDst->pDrawable->type == DRAWABLE_PIXMAP) - kaaPixmapUseScreen ((PixmapPtr) pDst->pDrawable); - - pSrcPix = kaaGetOffscreenPixmap (pSrc->pDrawable, &src_off_x, - &src_off_y); - pDstPix = kaaGetOffscreenPixmap (pDst->pDrawable, &dst_off_x, - &dst_off_y); - if (!pSrcPix || !pDstPix || - !(*pKaaScr->info->PrepareBlend) (op, pSrc, pDst, pSrcPix, - pDstPix)) - { - goto software; - } - - nbox = REGION_NUM_RECTS(®ion); - pbox = REGION_RECTS(®ion); - - xSrc -= xDst; - ySrc -= yDst; - - while (nbox--) - { - (*pKaaScr->info->Blend) (pbox->x1 + xSrc + src_off_x, - pbox->y1 + ySrc + src_off_y, - pbox->x1 + dst_off_x, - pbox->y1 + dst_off_y, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); - pbox++; - } - - (*pKaaScr->info->DoneBlend) (); - KdMarkSync(pDst->pDrawable->pScreen); - - return; - } - } - -software: -#if KAA_DEBUG_FALLBACKS - kaaPrintCompositeFallback (op, pSrc, pMask, pDst); -#endif - - if (pSrc->pDrawable->type == DRAWABLE_PIXMAP) - kaaPixmapUseMemory ((PixmapPtr) pSrc->pDrawable); - if (pMask && pMask->pDrawable->type == DRAWABLE_PIXMAP) - kaaPixmapUseMemory ((PixmapPtr) pMask->pDrawable); -#if 0 - if (pDst->pDrawable->type == DRAWABLE_PIXMAP) - kaaPixmapUseMemory ((PixmapPtr) pDst->pDrawable); -#endif - - KdCheckComposite (op, pSrc, pMask, pDst, xSrc, ySrc, - xMask, yMask, xDst, yDst, width, height); -} -#endif - Bool kaaDrawInit (ScreenPtr pScreen, KaaScreenInfoPtr pScreenInfo) diff --git a/hw/kdrive/src/kaa.h b/hw/kdrive/src/kaa.h new file mode 100644 index 000000000..5e4d1a315 --- /dev/null +++ b/hw/kdrive/src/kaa.h @@ -0,0 +1,95 @@ +/* + * $RCSId$ + * + * Copyright © 2001 Keith Packard + * + * Partly based on code that is Copyright © The XFree86 Project Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _KAA_H_ +#define _KAA_H_ + +#define KaaGetScreenPriv(s) ((KaaScreenPrivPtr)(s)->devPrivates[kaaScreenPrivateIndex].ptr) +#define KaaScreenPriv(s) KaaScreenPrivPtr pKaaScr = KaaGetScreenPriv(s) + +#define KaaGetPixmapPriv(p) ((KaaPixmapPrivPtr)(p)->devPrivates[kaaPixmapPrivateIndex].ptr) +#define KaaSetPixmapPriv(p,a) ((p)->devPrivates[kaaPixmapPrivateIndex].ptr = (pointer) (a)) +#define KaaPixmapPriv(p) KaaPixmapPrivPtr pKaaPixmap = KaaGetPixmapPriv(p) +#define KaaPixmapPitch(pitch) (((pitch) + (pKaaScr->info->offscreenPitch - 1)) & ~(pKaaScr->info->offscreenPitch - 1)) + +typedef struct { + KaaScreenInfoPtr info; +} KaaScreenPrivRec, *KaaScreenPrivPtr; + +typedef struct { + KdOffscreenArea *area; + int score; + int devKind; + DevUnion devPrivate; +} KaaPixmapPrivRec, *KaaPixmapPrivPtr; + +extern int kaaScreenPrivateIndex; +extern int kaaPixmapPrivateIndex; + + +void +kaaPixmapUseScreen (PixmapPtr pPixmap); + +void +kaaPixmapUseMemory (PixmapPtr pPixmap); + +Bool +kaaDrawableIsOffscreen (DrawablePtr pDrawable); + +Bool +kaaPixmapIsOffscreen(PixmapPtr p); + +PixmapPtr +kaaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp); + +void +kaaCopyNtoN (DrawablePtr pSrcDrawable, + DrawablePtr pDstDrawable, + GCPtr pGC, + BoxPtr pbox, + int nbox, + int dx, + int dy, + Bool reverse, + Bool upsidedown, + Pixel bitplane, + void *closure); + +void +kaaComposite(CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height); + +#endif /* _KAA_H_ */ diff --git a/hw/kdrive/src/kaapict.c b/hw/kdrive/src/kaapict.c new file mode 100644 index 000000000..cb8c9bd51 --- /dev/null +++ b/hw/kdrive/src/kaapict.c @@ -0,0 +1,237 @@ +/* + * $RCSId$ + * + * Copyright © 2001 Keith Packard + * + * Partly based on code that is Copyright © The XFree86 Project Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "kdrive.h" +#include "kaa.h" + +#ifdef RENDER +#include "mipict.h" + +#define KAA_DEBUG_FALLBACKS 0 + +#if KAA_DEBUG_FALLBACKS +static void +kaaPrintCompositeFallback(CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst) +{ + char sop[20], ssfmt[20], smfmt[20], sdfmt[20]; + char sloc, mloc, dloc; + int temp; + + switch(op) + { + case PictOpSrc: + sprintf(sop, "Src"); + break; + case PictOpOver: + sprintf(sop, "Over"); + break; + default: + sprintf(sop, "0x%x", (int)op); + break; + } + switch(pSrc->format) + { + case PICT_a8r8g8b8: + sprintf(ssfmt, "ARGB8888"); + break; + default: + sprintf(ssfmt, "0x%x", (int)pSrc->format); + break; + } + sprintf(smfmt, "(none)"); + if (pMask) { + switch(pMask->format) + { + case PICT_a8: + sprintf(smfmt, "A8"); + break; + default: + sprintf(smfmt, "0x%x", (int)pMask->format); + break; + } + } + switch(pDst->format) + { + case PICT_r5g6b5: + sprintf(sdfmt, "RGB565"); + break; + default: + sprintf(sdfmt, "0x%x", (int)pDst->format); + break; + } + strcpy (smfmt, ("None")); + pMask = 0x0; + + sloc = kaaGetOffscreenPixmap(pSrc->pDrawable, &temp, &temp) ? 's' : 'm'; + mloc = (pMask && kaaGetOffscreenPixmap(pMask->pDrawable, &temp, &temp)) ? + 's' : 'm'; + dloc = kaaGetOffscreenPixmap(pDst->pDrawable, &temp, &temp) ? 's' : 'm'; + + ErrorF("Composite fallback: op %s, src 0x%x (%c), mask 0x%x (%c), " + "dst 0x%x (%c)\n" + " srcfmt %s, maskfmt %s, dstfmt %s\n", + sop, pSrc, sloc, pMask, mloc, pDst, dloc, ssfmt, smfmt, sdfmt); +} +#endif + +void +kaaComposite(CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height) +{ + KdScreenPriv (pDst->pDrawable->pScreen); + KaaScreenPriv (pDst->pDrawable->pScreen); + + if (!pMask) + { + if (op == PictOpSrc) + { + /* + * Check for two special cases -- solid fill and copy area + */ + if (pSrc->pDrawable->width == 1 && pSrc->pDrawable->height == 1 && + pSrc->repeat) + { + ; + } + else if (!pSrc->repeat && pSrc->format == pDst->format) + { + RegionRec region; + + xDst += pDst->pDrawable->x; + yDst += pDst->pDrawable->y; + xSrc += pSrc->pDrawable->x; + ySrc += pSrc->pDrawable->y; + + if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height)) + return; + + + kaaCopyNtoN (pSrc->pDrawable, pDst->pDrawable, 0, + REGION_RECTS(®ion), REGION_NUM_RECTS(®ion), + xSrc - xDst, ySrc - yDst, + FALSE, FALSE, 0, 0); + return; + } + } + + if (pScreenPriv->enabled && pKaaScr->info->PrepareBlend) + { + RegionRec region; + BoxPtr pbox; + int nbox; + int src_off_x, src_off_y; + int dst_off_x, dst_off_y; + PixmapPtr pSrcPix, pDstPix; + + xDst += pDst->pDrawable->x; + yDst += pDst->pDrawable->y; + + xSrc += pSrc->pDrawable->x; + ySrc += pSrc->pDrawable->y; + + if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height)) + return; + + + /* Migrate pixmaps to same place as destination */ + if (pSrc->pDrawable->type == DRAWABLE_PIXMAP) + kaaPixmapUseScreen ((PixmapPtr) pSrc->pDrawable); + if (pDst->pDrawable->type == DRAWABLE_PIXMAP) + kaaPixmapUseScreen ((PixmapPtr) pDst->pDrawable); + + pSrcPix = kaaGetOffscreenPixmap (pSrc->pDrawable, &src_off_x, + &src_off_y); + pDstPix = kaaGetOffscreenPixmap (pDst->pDrawable, &dst_off_x, + &dst_off_y); + if (!pSrcPix || !pDstPix || + !(*pKaaScr->info->PrepareBlend) (op, pSrc, pDst, pSrcPix, + pDstPix)) + { + goto software; + } + + nbox = REGION_NUM_RECTS(®ion); + pbox = REGION_RECTS(®ion); + + xSrc -= xDst; + ySrc -= yDst; + + while (nbox--) + { + (*pKaaScr->info->Blend) (pbox->x1 + xSrc + src_off_x, + pbox->y1 + ySrc + src_off_y, + pbox->x1 + dst_off_x, + pbox->y1 + dst_off_y, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + pbox++; + } + + (*pKaaScr->info->DoneBlend) (); + KdMarkSync(pDst->pDrawable->pScreen); + + return; + } + } + +software: +#if KAA_DEBUG_FALLBACKS + kaaPrintCompositeFallback (op, pSrc, pMask, pDst); +#endif + + if (pSrc->pDrawable->type == DRAWABLE_PIXMAP) + kaaPixmapUseMemory ((PixmapPtr) pSrc->pDrawable); + if (pMask && pMask->pDrawable->type == DRAWABLE_PIXMAP) + kaaPixmapUseMemory ((PixmapPtr) pMask->pDrawable); +#if 0 + if (pDst->pDrawable->type == DRAWABLE_PIXMAP) + kaaPixmapUseMemory ((PixmapPtr) pDst->pDrawable); +#endif + + KdCheckComposite (op, pSrc, pMask, pDst, xSrc, ySrc, + xMask, yMask, xDst, yDst, width, height); +} +#endif |