diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2018-12-19 12:20:10 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2018-12-19 12:20:10 +0100 |
commit | 22fea29cf0f568b95570c57a2d5a1e828c758b0d (patch) | |
tree | 30fbb9595f5df18f27d53c21322d3d9991cdbb8d /nx-X11/programs/Xserver/fb/fbblt.c | |
parent | 8d6a4a9b7bfabcf949ec80f552bd1f0707bf8c63 (diff) | |
parent | 034228d75ba1be6b035bdd387c183f14379abdc4 (diff) | |
download | nx-libs-22fea29cf0f568b95570c57a2d5a1e828c758b0d.tar.gz nx-libs-22fea29cf0f568b95570c57a2d5a1e828c758b0d.tar.bz2 nx-libs-22fea29cf0f568b95570c57a2d5a1e828c758b0d.zip |
Merge branch 'uli42-pr/fb_fastpath' into 3.6.x
Attributes GH PR #753: https://github.com/ArcticaProject/nx-libs/pull/753
Diffstat (limited to 'nx-X11/programs/Xserver/fb/fbblt.c')
-rw-r--r-- | nx-X11/programs/Xserver/fb/fbblt.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/nx-X11/programs/Xserver/fb/fbblt.c b/nx-X11/programs/Xserver/fb/fbblt.c index e820a85eb..6241af8eb 100644 --- a/nx-X11/programs/Xserver/fb/fbblt.c +++ b/nx-X11/programs/Xserver/fb/fbblt.c @@ -67,8 +67,42 @@ fbBlt (FbBits *srcLine, int n, nmiddle; Bool destInvarient; int startbyte, endbyte; + FbDeclareMergeRop (); + if (alu == GXcopy && pm == FB_ALLONES && + !(srcX & 7) && !(dstX & 7) && !(width & 7)) + { + CARD8 *src_byte = (CARD8 *) srcLine + (srcX >> 3); + CARD8 *dst_byte = (CARD8 *) dstLine + (dstX >> 3); + FbStride src_byte_stride = srcStride << (FB_SHIFT - 3); + FbStride dst_byte_stride = dstStride << (FB_SHIFT - 3); + int width_byte = (width >> 3); + + /* Make sure there's no overlap; we can't use memcpy in that + * case as it's not well defined, so fall through to the + * general code + */ + if (src_byte + width_byte <= dst_byte || + dst_byte + width_byte <= src_byte) + { + int i; + + if (!upsidedown) + for (i = 0; i < height; i++) + memcpy(dst_byte + i * dst_byte_stride, + src_byte + i * src_byte_stride, + width_byte); + else + for (i = height - 1; i >= 0; i--) + memcpy(dst_byte + i * dst_byte_stride, + src_byte + i * src_byte_stride, + width_byte); + + return; + } + } + #ifdef FB_24BIT if (bpp == 24 && !FbCheck24Pix (pm)) { @@ -78,28 +112,6 @@ fbBlt (FbBits *srcLine, } #endif - if (alu == GXcopy && pm == FB_ALLONES && !reverse && - !(srcX & 7) && !(dstX & 7) && !(width & 7)) { - int i; - CARD8 *src = (CARD8 *) srcLine; - CARD8 *dst = (CARD8 *) dstLine; - - srcStride *= sizeof(FbBits); - dstStride *= sizeof(FbBits); - width >>= 3; - src += (srcX >> 3); - dst += (dstX >> 3); - - if (!upsidedown) - for (i = 0; i < height; i++) - memcpy(dst + i * dstStride, src + i * srcStride, width); - else - for (i = height - 1; i >= 0; i--) - memcpy(dst + i * dstStride, src + i * srcStride, width); - - return; - } - FbInitializeMergeRop(alu, pm); destInvarient = FbDestInvarientMergeRop(); if (upsidedown) |