Hi,

it looks like there's a bug in the optimized RGB24 -> RGB16 conversion
routine for little-endian machines (on master, for a long time now): it
swaps the red and blue channels.

Attached is a patch against the df_porter example that modifies it to
show two bitmaps one under another. They should be identical, but the
top one is rendered directly from DSPF_RGB24 surface, while the bottom
one is first blitted into DSPF_RGB16 surface and then to the screen. But
the two images differ (LE machine, using SDL system). Works correctly if
I disable Bop_rgb24_to_Aop_rgb16_LE.

Sorry for not providing a patch, I'm still getting lost in this code :(
I was hoping that perhaps the fix would be obvious to somebody more
familiar with this code.

Regards,
Vaclav
diff --git a/src/df_porter.c b/src/df_porter.c
index b85a72a..5f7741c 100644
--- a/src/df_porter.c
+++ b/src/df_porter.c
@@ -41,6 +41,7 @@ static IDirectFBSurface *primary;
 
 /* the temporary surface */
 static IDirectFBSurface *tempsurf;
+static IDirectFBSurface *tempsurf2;
 
 /* provider for our images/font */
 static IDirectFBFont *font;
@@ -105,12 +106,10 @@ int main( int argc, char *argv[] )
 
 
      /* create the temporary surface */
-     sdsc.flags       = DSDESC_CAPS | DSDESC_PIXELFORMAT | DSDESC_WIDTH | 
DSDESC_HEIGHT;
-     sdsc.caps        = DSCAPS_PREMULTIPLIED;
-     sdsc.pixelformat = DSPF_ARGB;
-     sdsc.width       = screen_width;
-     sdsc.height      = screen_height;
-
+     sdsc.flags       = DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_HEIGHT;
+     sdsc.pixelformat = DSPF_RGB24;
+     sdsc.width       = screen_width/2;
+     sdsc.height      = screen_height/2;
      DFBCHECK(dfb->CreateSurface( dfb, &sdsc, &tempsurf ));
 
 
@@ -122,69 +121,22 @@ int main( int argc, char *argv[] )
      provider->RenderTo( provider, tempsurf, NULL );
      provider->Release( provider );
 
-     /* Blit background onto primary surface (dimmed). */
-     primary->SetBlittingFlags( primary, DSBLIT_COLORIZE );
-     primary->SetColor( primary, 190, 200, 180, 0 );
-     primary->Blit( primary, tempsurf, NULL, 0, 0 );
-
-
-     tempsurf->Clear( tempsurf, 0, 0, 0, 0 );
-
-
-     tempsurf->SetDrawingFlags( tempsurf, DSDRAW_SRC_PREMULTIPLY | 
DSDRAW_BLEND );
-     tempsurf->SetPorterDuff( tempsurf, DSPD_SRC );
-
-     fdsc.flags = DFDESC_HEIGHT;
-     fdsc.height = screen_width/24;
-
-     DFBCHECK(dfb->CreateFont( dfb, FONT, &fdsc, &font ));
-     DFBCHECK(tempsurf->SetFont( tempsurf, font ));
-
-     tempsurf->SetColor( tempsurf, 0xFF, 0xFF, 0xFF, 0xFF );
-     tempsurf->DrawString( tempsurf, "Porter/Duff Demo", -1, screen_width/2, 
20, DSTF_TOPCENTER );
-
-     font->Release( font );
-
-
-     fdsc.height = screen_width/32;
+    
+     /* perform RGB24 -> RGB16 conversion: */
+     sdsc.flags       = DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_HEIGHT;
+     sdsc.pixelformat = DSPF_RGB16;
+     sdsc.width       = screen_width/2;
+     sdsc.height      = screen_height/2;
+     DFBCHECK(dfb->CreateSurface( dfb, &sdsc, &tempsurf2 ));
 
-     DFBCHECK(dfb->CreateFont( dfb, FONT, &fdsc, &font ));
-     DFBCHECK(tempsurf->SetFont( tempsurf, font ));
+     tempsurf2->SetBlittingFlags( tempsurf2, DSBLIT_NOFX );
+     tempsurf2->Blit( tempsurf2, tempsurf, NULL, 0, 0 );
 
 
-     for (i=0; i<num_rules; i++) {
-          int x = (1 + i % 4) * step;
-          int y = (0 + i / 4) * 180;
-          DFBAccelerationMask mask;
-          char *str;
-
-          str = strdup( rules[i] );
-
-          tempsurf->SetPorterDuff( tempsurf, DSPD_SRC );
-          tempsurf->SetColor( tempsurf, 255, 0, 0, 140 );
-          tempsurf->FillRectangle( tempsurf, x - 50, y + 100, 80, 70 );
-
-          tempsurf->SetPorterDuff( tempsurf, i+1 );
-          tempsurf->SetColor( tempsurf, 0, 0, 255, 200 );
-          tempsurf->FillRectangle( tempsurf, x - 30, y + 130, 80, 70 );
-
-          tempsurf->GetAccelerationMask( tempsurf, NULL, &mask );
-          if (mask & DFXL_FILLRECTANGLE)
-               str[0] = '*';
-
-          tempsurf->SetPorterDuff( tempsurf, DSPD_SRC_OVER );
-          tempsurf->SetColor( tempsurf, 6*0x1F, 6*0x10+0x7f, 0xFF, 0xFF );
-          tempsurf->DrawString( tempsurf, str, -1, x, y + 210, DSTF_CENTER | 
DSTF_TOP );
-
-          free( str );
-     }
-
-     font->Release( font );
-
-
-     primary->SetBlittingFlags( primary, DSBLIT_BLEND_ALPHACHANNEL );
-     primary->SetPorterDuff( primary, DSPD_SRC_OVER );
+     primary->SetBlittingFlags( primary, DSBLIT_NOFX );
      primary->Blit( primary, tempsurf, NULL, 0, 0 );
+     primary->Blit( primary, tempsurf2, NULL, 0, screen_height/2 );
+
 
      primary->Flip( primary, NULL, DSFLIP_NONE );
 
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to