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

Reply via email to