From: Ilyes Gouta <ilyes.go...@st.com> --- 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 directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev