From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/src/gfx/generic/generic_64.h | 207 +++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100755 Source/DirectFB/src/gfx/generic/generic_64.h (limited to 'Source/DirectFB/src/gfx/generic/generic_64.h') diff --git a/Source/DirectFB/src/gfx/generic/generic_64.h b/Source/DirectFB/src/gfx/generic/generic_64.h new file mode 100755 index 0000000..b0079ce --- /dev/null +++ b/Source/DirectFB/src/gfx/generic/generic_64.h @@ -0,0 +1,207 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + + +static void Cop_to_Aop_32_64( GenefxState *gfxs ) +{ + int w, l = gfxs->length; + u32 *D = gfxs->Aop[0]; + u32 Cop = gfxs->Cop; + u64 DCop = ((u64)Cop << 32) | Cop; + + if ((long)D & 4) { + *D++ = Cop; + l--; + } + + for (w = l >> 1; w; w--) { + *((u64*)D) = DCop; + D += 2; + } + + if (l & 1) + *D = Cop; +} + +static void Bop_rgb32_Kto_Aop_64( GenefxState *gfxs ) +{ + int w, l = gfxs->length; + u32 *D = gfxs->Aop[0]; + u32 *S = gfxs->Bop[0]; + u32 Skey = gfxs->Skey; + u64 DSkey = ((u64)Skey << 32) | Skey; + + if ((long)D & 4) { + if ((*S & 0x00ffffff) != Skey) + *D = *S; + D++; + S++; + l--; + } + + for (w = l >> 1; w; w--) { + u64 s = *((u64*)S); + + if ((s & 0x00ffffff00ffffffull) != DSkey) { + if ((s & 0x00ffffff00000000ull) != + (DSkey & 0x00ffffff00000000ull)) { + if ((s & 0x0000000000ffffffull) != + (DSkey & 0x0000000000ffffffull)) { + *((u64*)D) = s; + } + else { +#ifdef WORDS_BIGENDIAN + D[0] = (u32)(s >> 32); +#else + D[1] = (u32)(s >> 32); +#endif + } + } + else { +#ifdef WORDS_BIGENDIAN + D[1] = (u32)s; +#else + D[0] = (u32)s; +#endif + } + } + S += 2; + D += 2; + } + + if (l & 1) { /* do the last potential pixel */ + if ((*S & 0x00ffffff) != Skey) + *D = *S; + } +} + +static void Bop_rgb32_toK_Aop_64( GenefxState *gfxs ) +{ + int w, l = gfxs->length; + u32 *D = gfxs->Aop[0]; + u32 *S = gfxs->Bop[0]; + u32 Dkey = gfxs->Dkey; + u64 DDkey = ((u64)Dkey << 32) | Dkey; + + if ((long)D & 4) { + if ((*D & 0x00ffffff) == Dkey) + *D = *S; + D++; + S++; + l--; + } + + for (w = l >> 1; w; w--) { + u64 d = *((u64*)D); + + if ((d & 0x00ffffff00ffffffull) != DDkey) { + if ((d & 0x00ffffff00000000ull) == + (DDkey & 0x00ffffff00000000ull)) { + if ((d & 0x0000000000ffffffull) == + (DDkey & 0x0000000000ffffffull)) { + *((u64*)D) = *((u64*)S); + } + else { +#ifdef WORDS_BIGENDIAN + D[0] = S[0]; +#else + D[1] = S[1]; +#endif + } + } + else { +#ifdef WORDS_BIGENDIAN + D[1] = S[1]; +#else + D[0] = S[0]; +#endif + } + } + S += 2; + D += 2; + } + + if (l & 1) { /* do the last potential pixel */ + if ((*D & 0x00ffffff) == Dkey) + *D = *S; + } +} + +static void Bop_32_Sto_Aop_64( GenefxState *gfxs ) +{ + int w, l = gfxs->length; + int i = 0; + u32 *D = gfxs->Aop[0]; + u32 *S = gfxs->Bop[0]; + int SperD = gfxs->SperD; + int SperD2 = SperD << 1; + + if ((long)D & 4) { + *D++ = *S; + i += SperD; + l--; + } + + for (w = l >> 1; w; w--) { +#ifdef WORDS_BIGENDIAN + *((u64*)D) = ((u64)S[i>>16] << 32) | S[(i+SperD)>>16]; +#else + *((u64*)D) = ((u64)S[(i+SperD)>>16] << 32) | S[i>>16]; +#endif + D += 2; + i += SperD2; + } + + if (l & 1) + *D = S[i>>16]; +} + +static void Dacc_xor_64( GenefxState *gfxs ) +{ + int w = gfxs->length; + u64 *D = (u64*)gfxs->Dacc; + u64 color; + +#ifdef WORDS_BIGENDIAN + color = ((u64)gfxs->color.b << 48) | + ((u64)gfxs->color.g << 32) | + ((u64)gfxs->color.r << 16) | + ((u64)gfxs->color.a); +#else + color = ((u64)gfxs->color.a << 48) | + ((u64)gfxs->color.r << 32) | + ((u64)gfxs->color.g << 16) | + ((u64)gfxs->color.b); +#endif + + for (; w; w--) { + *D ^= color; + D++; + } +} + -- cgit