From: Ilyes Gouta <[email protected]>
---
src/gfx/generic/generic.c | 140 ++++++++++++++++++++++++++++++++
src/gfx/generic/generic_stretch_blit.c | 1 +
2 files changed, 141 insertions(+)
diff --git a/src/gfx/generic/generic.c b/src/gfx/generic/generic.c
index b4f54ec..b3ba434 100644
--- a/src/gfx/generic/generic.c
+++ b/src/gfx/generic/generic.c
@@ -533,11 +533,18 @@ static const bool is_ycbcr[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = true,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = false,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = true,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = false,
};
/********************************* Cop_to_Aop_PFI
*****************************/
+static void Cop_to_Aop_4( GenefxState *gfxs )
+{
+ u8 color = ((gfxs->Cop & 0xf) << 4) | (gfxs->Cop & 0xf);
+ memset( gfxs->Aop[0], color, gfxs->length >> 1 );
+}
+
static void Cop_to_Aop_8( GenefxState *gfxs )
{
memset( gfxs->Aop[0], gfxs->Cop, gfxs->length );
@@ -810,10 +817,33 @@ static GenefxFunc Cop_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Cop_to_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Cop_to_Aop_yv16,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Cop_to_Aop_4,
};
/********************************* Cop_toK_Aop_PFI
****************************/
+static void Cop_toK_Aop_4( GenefxState *gfxs )
+{
+ int w = (gfxs->length >> 1) + 1;
+ u8 *D = gfxs->Aop[0];
+ u32 Cop = gfxs->Cop;
+ u32 Dkey = gfxs->Dkey;
+ u8 pixel;
+
+ while (--w) {
+ pixel = *D;
+
+ if (Dkey == (*D & 0x0F))
+ pixel = Cop;
+ if (Dkey == (*D >> 4)) {
+ pixel &= 0x0F;
+ pixel |= (Cop << 4);
+ }
+
+ *D++ = pixel;
+ }
+}
+
static void Cop_toK_Aop_8( GenefxState *gfxs )
{
int w = gfxs->length+1;
@@ -960,6 +990,7 @@ static const GenefxFunc
Cop_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Cop_toK_Aop_24_24,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Cop_toK_Aop_4,
};
/********************************* Bop_PFI_to_Aop_PFI
*************************/
@@ -1059,6 +1090,7 @@ static const GenefxFunc
Bop_PFI_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_to_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_to_Aop,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_to_Aop,
};
/********************************* Bop_PFI_toR_Aop_PFI
*************************/
@@ -1259,10 +1291,17 @@ static const GenefxFunc
Bop_PFI_toR_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_toR_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_toR_Aop,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_toR_Aop,
};
/********************************* Bop_PFI_Kto_Aop_PFI
************************/
+static void Bop_lut4_Kto_Aop( GenefxState *gfxs )
+{
+ /* no color to key */
+ direct_memmove( gfxs->Aop[0], gfxs->Bop[0], gfxs->length >> 1 );
+}
+
static void Bop_a8_Kto_Aop( GenefxState *gfxs )
{
/* no color to key */
@@ -1456,6 +1495,7 @@ static GenefxFunc
Bop_PFI_Kto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_Kto_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_lut4_Kto_Aop,
};
/********************************* Bop_PFI_toK_Aop_PFI
************************/
@@ -1557,6 +1597,29 @@ static void Bop_yuv444p_toK_Aop( GenefxState *gfxs )
}
}
+static void Bop_4_toK_Aop( GenefxState *gfxs )
+{
+ int w = (gfxs->length >> 1) + 1;
+ u8 *D = gfxs->Aop[0];
+ u8 *S = gfxs->Bop[0];
+ u8 Dkey = gfxs->Dkey;
+ u8 pixel;
+
+ while (--w) {
+ pixel = *D;
+
+ if (Dkey == (*D & 0x0F))
+ pixel = *S & 0xF;
+ if (Dkey == (*D >> 4)) {
+ pixel &= 0x0F;
+ pixel |= *S & 0xF0;
+ }
+
+ *D++ = pixel;
+ S++;
+ }
+}
+
static void Bop_8_toK_Aop( GenefxState *gfxs )
{
int w = gfxs->length+1;
@@ -1613,6 +1676,7 @@ static GenefxFunc
Bop_PFI_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_toK_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_toK_Aop,
};
/********************************* Bop_PFI_KtoK_Aop_PFI
***********************/
@@ -1696,6 +1760,7 @@ static const GenefxFunc
Bop_PFI_KtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_KtoK_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Bop_PFI_Sto_Aop_PFI
************************/
@@ -2005,6 +2070,7 @@ static GenefxFunc
Bop_PFI_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_Sto_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_Sto_Aop,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Bop_PFI_SKto_Aop_PFI
***********************/
@@ -2246,6 +2312,7 @@ static const GenefxFunc
Bop_PFI_SKto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_SKto_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Bop_PFI_StoK_Aop_PFI
***********************/
@@ -2323,6 +2390,7 @@ static const GenefxFunc
Bop_PFI_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_StoK_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Bop_PFI_SKtoK_Aop_PFI
**********************/
@@ -2402,6 +2470,7 @@ static const GenefxFunc
Bop_PFI_SKtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_SKtoK_Aop,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Bop_PFI_TEX_to_Aop_PFI
************************/
@@ -2933,6 +3002,7 @@ static GenefxFunc Sop_PFI_Sto_Dacc[DFB_NUM_PIXELFORMATS]
= {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_Sto_Dacc,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sop_i420_Sto_Dacc,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Sop_PFI_SKto_Dacc
**************************/
@@ -3323,6 +3393,7 @@ static const GenefxFunc
Sop_PFI_SKto_Dacc[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_SKto_Dacc,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Sop_PFI_to_Dacc
****************************/
@@ -3453,6 +3524,33 @@ static void Sop_uyvy_to_Dacc( GenefxState *gfxs )
}
}
+static void Sop_lut4_to_Dacc( GenefxState *gfxs )
+{
+ int w = (gfxs->length >> 1) + 1;
+ GenefxAccumulator *D = gfxs->Dacc;
+ u8 *S = gfxs->Sop[0];
+
+ DFBColor *entries = gfxs->Slut->entries;
+
+ while (--w) {
+ u8 s = *S++;
+
+ D->RGB.a = entries[s & 0xF].a;
+ D->RGB.r = entries[s & 0xF].r;
+ D->RGB.g = entries[s & 0xF].g;
+ D->RGB.b = entries[s & 0xF].b;
+
+ D++;
+
+ D->RGB.a = entries[s >> 4].a;
+ D->RGB.r = entries[s >> 4].r;
+ D->RGB.g = entries[s >> 4].g;
+ D->RGB.b = entries[s >> 4].b;
+
+ D++;
+ }
+}
+
static void Sop_lut8_to_Dacc( GenefxState *gfxs )
{
int w = gfxs->length+1;
@@ -3678,6 +3776,7 @@ static GenefxFunc Sop_PFI_to_Dacc[DFB_NUM_PIXELFORMATS] =
{
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_to_Dacc,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sop_i420_to_Dacc,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Sop_lut4_to_Dacc,
};
/********************************* Sop_PFI_Kto_Dacc
***************************/
@@ -4054,6 +4153,7 @@ static const GenefxFunc
Sop_PFI_Kto_Dacc[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_Kto_Dacc,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Sacc_to_Aop_PFI
****************************/
@@ -4209,6 +4309,35 @@ static void Sacc_to_Aop_uyvy( GenefxState *gfxs )
}
}
+static void Sacc_to_Aop_lut4( GenefxState *gfxs )
+{
+ int w = (gfxs->length >> 1) + 1;
+ GenefxAccumulator *S = gfxs->Sacc;
+ u8 *D = gfxs->Aop[0];
+ u8 pixel;
+
+ while (--w) {
+ pixel = 0;
+ if (!(S->RGB.a & 0xF000)) {
+ pixel = dfb_palette_search( gfxs->Alut,
+ (S->RGB.r & 0xFF00) ? 0xFF :
S->RGB.r,
+ (S->RGB.g & 0xFF00) ? 0xFF :
S->RGB.g,
+ (S->RGB.b & 0xFF00) ? 0xFF :
S->RGB.b,
+ (S->RGB.a & 0xFF00) ? 0xFF :
S->RGB.a );
+ }
+ S++;
+ if (!(S->RGB.a & 0xF000)) {
+ pixel |= (dfb_palette_search( gfxs->Alut,
+ (S->RGB.r & 0xFF00) ? 0xFF :
S->RGB.r,
+ (S->RGB.g & 0xFF00) ? 0xFF :
S->RGB.g,
+ (S->RGB.b & 0xFF00) ? 0xFF :
S->RGB.b,
+ (S->RGB.a & 0xFF00) ? 0xFF :
S->RGB.a )) << 4;
+ }
+ *D++ = pixel;
+ S++;
+ }
+}
+
static void Sacc_to_Aop_lut8( GenefxState *gfxs )
{
int w = gfxs->length+1;
@@ -4607,6 +4736,7 @@ static GenefxFunc Sacc_to_Aop_PFI[DFB_NUM_PIXELFORMATS] =
{
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_to_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sacc_to_Aop_yv16,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Sacc_to_Aop_lut4,
};
/********************************* Sop_PFI_TEX_to_Dacc
****************************/
@@ -5320,6 +5450,7 @@ static GenefxFunc Sacc_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS]
= {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_Sto_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sacc_Sto_Aop_yv16,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Sacc_toK_Aop_PFI
***************************/
@@ -5662,6 +5793,7 @@ static const GenefxFunc
Sacc_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_toK_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/********************************* Sacc_StoK_Aop_PFI
**************************/
@@ -5797,6 +5929,7 @@ static const GenefxFunc
Sacc_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_StoK_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/************** Bop_a8_set_alphapixel_Aop_PFI
*********************************/
@@ -6518,6 +6651,7 @@ static const GenefxFunc
Bop_a8_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_a8_set_alphapixel_Aop_vyu,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/************** Bop_a1_set_alphapixel_Aop_PFI
*********************************/
@@ -6902,6 +7036,7 @@ static const GenefxFunc
Bop_a1_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/************** Bop_a1_lsb_set_alphapixel_Aop_PFI
*********************************/
@@ -7213,6 +7348,7 @@ static const GenefxFunc
Bop_a1_lsb_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS]
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/**************************** Bop_translate_to_Aop
****************************/
@@ -8071,6 +8207,7 @@ static const GenefxFunc
Bop_argb_blend_alphachannel_src_invsrc_Aop_PFI[DFB_NUM_P
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/**********************************************************************************************************************/
@@ -8234,6 +8371,7 @@ static const GenefxFunc
Bop_argb_blend_alphachannel_one_invsrc_premultiply_Aop_P
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/**********************************************************************************************************************/
@@ -8815,6 +8953,7 @@ gAcquireSetup( CardState *state, DFBAccelerationMask
accel )
gfxs->Cop = gfxs->YCop;
break;
case DSPF_LUT2:
+ case DSPF_LUT4:
case DSPF_LUT8:
gfxs->Cop = state->color_index;
gfxs->Alut = destination->palette;
@@ -8875,6 +9014,7 @@ gAcquireSetup( CardState *state, DFBAccelerationMask
accel )
if (DFB_BLITTING_FUNCTION( accel )) {
switch (gfxs->src_format) {
case DSPF_LUT2:
+ case DSPF_LUT4:
case DSPF_LUT8:
case DSPF_ALUT44:
gfxs->Blut = source->palette;
diff --git a/src/gfx/generic/generic_stretch_blit.c
b/src/gfx/generic/generic_stretch_blit.c
index e642d4c..a50b4b9 100644
--- a/src/gfx/generic/generic_stretch_blit.c
+++ b/src/gfx/generic/generic_stretch_blit.c
@@ -295,6 +295,7 @@ static const StretchFunctionTable
*stretch_tables[DFB_NUM_PIXELFORMATS] = {
[DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL,
[DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,
+ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL,
};
/**********************************************************************************************************************/
--
1.7.9.5
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev