Reviewed by Kevin Decker.
authortomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Aug 2006 02:08:09 +0000 (02:08 +0000)
committertomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Aug 2006 02:08:09 +0000 (02:08 +0000)
        <rdar://problem/4667460> Windowless OpenGL plug-ins render incorrectly on PowerPC

        * Plugins/WebBaseNetscapePluginView.m:
        (-[WebBaseNetscapePluginView _aglOffscreenImageForDrawingInRect:]):
        Fixed color component swapping so that it works on both x86 and PPC.  See comments.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15793 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/Plugins/WebBaseNetscapePluginView.m

index bcfbc86bfe2fc1d7d932495b0899482570b767a0..aeed205c12f4eef555be68295af22f32b8c73bb1 100644 (file)
@@ -1,3 +1,13 @@
+2006-08-03  Tim Omernick  <timo@apple.com>
+
+        Reviewed by Kevin Decker.
+
+        <rdar://problem/4667460> Windowless OpenGL plug-ins render incorrectly on PowerPC
+
+        * Plugins/WebBaseNetscapePluginView.m:
+        (-[WebBaseNetscapePluginView _aglOffscreenImageForDrawingInRect:]):
+        Fixed color component swapping so that it works on both x86 and PPC.  See comments.
+
 2006-08-03  Brady Eidson  <beidson@apple.com>
 
         Reviewed by Tim Hatcher's rubber stamp
index 23b12d85aeca64798b8b0868df30a8ceb248db97..0f49d6fdc4e4446da655dad9e98da04363efc4bd 100644 (file)
@@ -2754,15 +2754,19 @@ static OSStatus TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEve
     GLsizei width, height;
     if (![self _getAGLOffscreenBuffer:&offscreenBuffer width:&width height:&height])
         return nil;
-    
+        
+#if defined(__i386__) || defined(__x86_64__)
     // Make sure drawingInRect is inside the offscreen buffer because we're about to directly modify the bits inside drawingInRect
     drawingInRect = NSIntersectionRect(drawingInRect, NSMakeRect(0, 0, width, height));
-    
-    // The offscreen buffer, being an OpenGL framebuffer, is in BGRA format.  We need to swap the blue and red channels before trying
-    // to wrap the buffer in an NSBitmapImageRep, which only understands RGBA and ARGB.
-    // This is where drawingInRect comes into play.  If only a small region of the plug-in is being redrawn, then it would be a waste
-    // to convert the entire image from BGRA to RGBA.  Since we know what region of the image will ultimately be drawn to screen, we
-    // restrict the channel swapping to just that region within the offscreen buffer.
+
+    // The offscreen buffer, being an OpenGL framebuffer, is in BGRA format on x86.  We need to swap the blue and red channels before
+    // wrapping the buffer in an NSBitmapImageRep, which only supports RGBA and ARGB.
+    // On PowerPC, the OpenGL framebuffer is in ARGB format.  Since that is a format that NSBitmapImageRep supports, all that is
+    // needed on PowerPC is to pass the NSAlphaFirstBitmapFormat flag when creating the NSBitmapImageRep.  On x86, we need to swap the
+    // framebuffer color components such that they are in ARGB order, as they are on PowerPC.
+    // If only a small region of the plug-in is being redrawn, then it would be a waste to convert the entire image from BGRA to ARGB.
+    // Since we know what region of the image will ultimately be drawn to screen (drawingInRect), we restrict the channel swapping to
+    // just that region within the offscreen buffer.
     GLsizei rowBytes = width * 4;
     GLvoid *swizzleImageBase = (unsigned char *)offscreenBuffer + (int)(NSMinY(drawingInRect) * rowBytes) + (int)(NSMinX(drawingInRect) * 4);
     vImage_Buffer vImage = {
@@ -2771,12 +2775,13 @@ static OSStatus TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEve
         width: NSWidth(drawingInRect),
         rowBytes: rowBytes
     };
-    uint8_t vImagePermuteMap[4] = { 2, 1, 0, 3 }; // Where { 0, 1, 2, 3 } would leave the channels unchanged; this map flips channels 0 and 2
+    uint8_t vImagePermuteMap[4] = { 3, 2, 1, 0 }; // Where { 0, 1, 2, 3 } would leave the channels unchanged; this map converts BGRA to ARGB
     vImage_Error vImageError = vImagePermuteChannels_ARGB8888(&vImage, &vImage, vImagePermuteMap, 0);
     if (vImageError) {
         LOG_ERROR("Could not convert BGRA image to ARGB: %d", vImageError);
         return nil;
     }
+#endif /* defined(__i386__) || defined(__x86_64__) */
     
     NSBitmapImageRep *aglBitmap = [[NSBitmapImageRep alloc]
         initWithBitmapDataPlanes:(unsigned char **)&offscreenBuffer
@@ -2787,7 +2792,7 @@ static OSStatus TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEve
                         hasAlpha:YES
                         isPlanar:NO
                   colorSpaceName:NSDeviceRGBColorSpace
-                    bitmapFormat:0
+                    bitmapFormat:NSAlphaFirstBitmapFormat
                      bytesPerRow:width * 4
                     bitsPerPixel:32];
     if (!aglBitmap) {