diff options
author | Martin-Éric Racine <q-funk@iki.fi> | 2010-08-09 10:48:16 +0300 |
---|---|---|
committer | Martin-Éric Racine <q-funk@iki.fi> | 2010-08-09 10:48:16 +0300 |
commit | 1f96e74919fe9442062804de785c6e1008d75bf2 (patch) | |
tree | 189dc1d900feb5952fa20340df7a0efb08ff0d71 | |
parent | 7a523acf985771b2bd45f5d2823c217cd9075b1e (diff) |
Revert "Improve the glyph rendering performance"
This reverts commit ebe43da32226eb7bc3ef758c43eff85ac8b8baef as Frank
pointed out that I mistakenly committed an outdated version of this.
-rw-r--r-- | src/lx_exa.c | 85 |
1 files changed, 11 insertions, 74 deletions
diff --git a/src/lx_exa.c b/src/lx_exa.c index 7c9e8a2..83187fb 100644 --- a/src/lx_exa.c +++ b/src/lx_exa.c @@ -65,8 +65,7 @@ static const struct exa_format_t PICT_b5g6r5, 16, CIMGP_SOURCE_FMT_16BPP_BGR, 0}, { PICT_x1r5g5b5, 16, CIMGP_SOURCE_FMT_1_5_5_5, 0}, { PICT_x1b5g5r5, 16, CIMGP_SOURCE_FMT_15BPP_BGR, 0}, { - PICT_r3g3b2, 8, CIMGP_SOURCE_FMT_3_3_2, 0}, { - PICT_a8, 32, CIMGP_SOURCE_FMT_8_8_8_8, 8} + PICT_r3g3b2, 8, CIMGP_SOURCE_FMT_3_3_2, 0} }; /* This is a chunk of memory we use for scratch space */ @@ -458,9 +457,16 @@ lx_get_format(PicturePtr p) int i; unsigned int format = p->format; - for (i = 0; i < ARRAY_SIZE(lx_exa_formats); i++) + for (i = 0; i < ARRAY_SIZE(lx_exa_formats); i++) { + + if (lx_exa_formats[i].bpp < PICT_FORMAT_BPP(format)) + break; + else if (lx_exa_formats[i].bpp != PICT_FORMAT_BPP(format)) + continue; + if (lx_exa_formats[i].exa == format) return (&lx_exa_formats[i]); + } return NULL; } @@ -537,16 +543,6 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst) if (op > PictOpAdd) return FALSE; - /* These two workaround conditions are dued to Xserver bug that leads to - * PICT_a8r8g8b8 pSrc or pDst for PictOpAdd glyph rendering*/ - if (op == PictOpAdd && pSrc->format == PICT_a8r8g8b8 && - pDst->format == PICT_a8 && !pMsk) - return TRUE; - - if (op == PictOpAdd && pSrc->format == PICT_r5g6b5 && - pDst->format == PICT_a8 && !pMsk) - return TRUE; - /* We need the off-screen buffer to do the multipass work */ if (usesPasses(op)) { @@ -590,8 +586,7 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst) /* XXX - I don't understand PICT_a8 enough - so I'm punting */ - if ((op != PictOpAdd) && (pSrc->format == PICT_a8 || - pDst->format == PICT_a8)) + if (pSrc->format == PICT_a8 || pDst->format == PICT_a8) return FALSE; if (pMsk && op != PictOpClear) { @@ -800,60 +795,6 @@ get_op_type(struct exa_format_t *src, struct exa_format_t *dst, int type) ((_x) * exaScratch.srcBpp)) static void -lx_composite_onepass_pict_a8(PixmapPtr pxDst, unsigned long dstOffset, - unsigned long srcOffset, int width, int height, int opX, int opY, - int srcX, int srcY) -{ - struct blend_ops_t *opPtr; - int apply, type; - int optempX, optempY; - int i, j; - unsigned long pixmapOffset, pixmapPitch, calBitsPixel; - - pixmapOffset = exaGetPixmapOffset(pxDst); - pixmapPitch = exaGetPixmapPitch(pxDst); - calBitsPixel = (pxDst->drawable.bitsPerPixel + 7) / 8; - gp_wait_until_idle(); - - if (opX % 4 == 0) { - /* HW acceleration */ - opPtr = &lx_alpha_ops[exaScratch.op * 2]; - apply = CIMGP_APPLY_BLEND_TO_ALL; - gp_declare_blt(0); - gp_set_bpp(32); - gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch); - gp_set_source_format(8); - type = opPtr->type; - gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0); - gp_screen_to_screen_convert(dstOffset, srcOffset, width / 4, height, 0); - /* Calculate the pixels in the tail of each line */ - for (j = srcY; j < srcY + height; j++) - for (i = srcX + (width / 4) * 4; i < srcX + width; i++) { - srcOffset = GetSrcOffset(i, j); - optempX = opX + i - srcX; - optempY = opY + j - srcY; - dstOffset = pixmapOffset + pixmapPitch * optempY + - calBitsPixel * optempX; - *(cim_fb_ptr + dstOffset) = (*(cim_fb_ptr + srcOffset) - + *(cim_fb_ptr + dstOffset) <= 0xff) ? - *(cim_fb_ptr + srcOffset) + *(cim_fb_ptr + dstOffset) : 0xff; - } - } else { - for (j = srcY; j < srcY + height; j++) - for (i = srcX; i < srcX + width; i++) { - srcOffset = GetSrcOffset(i, j); - optempX = opX + i - srcX; - optempY = opY + j - srcY; - dstOffset = pixmapOffset + pixmapPitch * optempY + - calBitsPixel * optempX; - *(cim_fb_ptr + dstOffset) = (*(cim_fb_ptr + srcOffset) + - *(cim_fb_ptr + dstOffset) <= 0xff) ? - *(cim_fb_ptr + srcOffset) + *(cim_fb_ptr + dstOffset) : 0xff; - } - } -} - -static void lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long srcOffset, int width, int height) { @@ -1358,11 +1299,7 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, lx_composite_onepass_special(pxDst, opWidth, opHeight, opX, opY, srcX, srcY); return ; - } else if ((exaScratch.op == PictOpAdd) && (exaScratch.srcFormat->exa - == PICT_a8) && (exaScratch.dstFormat->exa == PICT_a8)) - lx_composite_onepass_pict_a8(pxDst, dstOffset, srcOffset, - opWidth, opHeight, opX, opY, srcX, srcY); - else + } else lx_composite_onepass(pxDst, dstOffset, srcOffset, opWidth, opHeight); break; |