diff src/video/bwindow/SDL_sysyuv.cc @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents 51038e80ae59
children 99210400e8b9
line wrap: on
line diff
--- a/src/video/bwindow/SDL_sysyuv.cc	Thu Jul 06 18:01:37 2006 +0000
+++ b/src/video/bwindow/SDL_sysyuv.cc	Mon Jul 10 21:04:37 2006 +0000
@@ -27,288 +27,296 @@
 #include "SDL_sysyuv.h"
 #include "../SDL_yuvfuncs.h"
 
-extern "C" {
+extern "C"
+{
 
 /* The functions used to manipulate software video overlays */
-static struct private_yuvhwfuncs be_yuvfuncs =
-{
-    BE_LockYUVOverlay,
-    BE_UnlockYUVOverlay,
-    BE_DisplayYUVOverlay,
-    BE_FreeYUVOverlay
-};
+    static struct private_yuvhwfuncs be_yuvfuncs = {
+        BE_LockYUVOverlay,
+        BE_UnlockYUVOverlay,
+        BE_DisplayYUVOverlay,
+        BE_FreeYUVOverlay
+    };
 
-BBitmap * BE_GetOverlayBitmap(BRect bounds, color_space cs) {
-	BBitmap *bbitmap;
-	bbitmap = new BBitmap(bounds,B_BITMAP_WILL_OVERLAY,cs);
-	if (!bbitmap || bbitmap->InitCheck() != B_OK) {
-		delete bbitmap;
-		return 0;
-	}
-	overlay_restrictions r;
-	bbitmap->GetOverlayRestrictions(&r);
-	uint32 width = bounds.IntegerWidth() + 1;
-	uint32 height = bounds.IntegerHeight() + 1;
-	uint32 width_padding = 0;
-	uint32 height_padding = 0;
-	if ((r.source.horizontal_alignment != 0) ||
-	    (r.source.vertical_alignment != 0)) {
-		delete bbitmap;
-		return 0;
-	}
-	if (r.source.width_alignment != 0) {
-		uint32 aligned_width = r.source.width_alignment + 1;
-		if (width % aligned_width > 0) {
-			width_padding = aligned_width - width % aligned_width;
-		}
-	}
-	if (r.source.height_alignment != 0) {
-		uint32 aligned_height = r.source.height_alignment + 1;
-		if (height % aligned_height > 0) {
-			fprintf(stderr,"GetOverlayBitmap failed height alignment\n");
-			fprintf(stderr,"- height = %lu, aligned_height = %lu\n",height,aligned_height);
-			delete bbitmap;
-			return 0;
-		}
-	}
-	if ((r.source.min_width > width) ||
-	    (r.source.min_height > height) ||
-	    (r.source.max_width < width) ||
-	    (r.source.max_height < height)) {
-		fprintf(stderr,"GetOverlayBitmap failed bounds tests\n");
-	    delete bbitmap;
-	    return 0;
-	}
-	if ((width_padding != 0) || (height_padding != 0)) {
-		delete bbitmap;
-		bounds.Set(bounds.left,bounds.top,bounds.right+width_padding,bounds.bottom+height_padding);
-		bbitmap = new BBitmap(bounds,B_BITMAP_WILL_OVERLAY,cs);
-		if (!bbitmap || bbitmap->InitCheck() != B_OK) {
-			fprintf(stderr,"GetOverlayBitmap failed late\n");
-			delete bbitmap;
-			return 0;
-		}
-	}		
-	return bbitmap;	    
-}
+    BBitmap *BE_GetOverlayBitmap(BRect bounds, color_space cs)
+    {
+        BBitmap *bbitmap;
+        bbitmap = new BBitmap(bounds, B_BITMAP_WILL_OVERLAY, cs);
+        if (!bbitmap || bbitmap->InitCheck() != B_OK) {
+            delete bbitmap;
+            return 0;
+        }
+        overlay_restrictions r;
+        bbitmap->GetOverlayRestrictions(&r);
+        uint32 width = bounds.IntegerWidth() + 1;
+        uint32 height = bounds.IntegerHeight() + 1;
+        uint32 width_padding = 0;
+        uint32 height_padding = 0;
+        if ((r.source.horizontal_alignment != 0) ||
+            (r.source.vertical_alignment != 0)) {
+            delete bbitmap;
+            return 0;
+        }
+        if (r.source.width_alignment != 0) {
+            uint32 aligned_width = r.source.width_alignment + 1;
+            if (width % aligned_width > 0) {
+                width_padding = aligned_width - width % aligned_width;
+            }
+        }
+        if (r.source.height_alignment != 0) {
+            uint32 aligned_height = r.source.height_alignment + 1;
+            if (height % aligned_height > 0) {
+                fprintf(stderr, "GetOverlayBitmap failed height alignment\n");
+                fprintf(stderr, "- height = %lu, aligned_height = %lu\n",
+                        height, aligned_height);
+                delete bbitmap;
+                return 0;
+            }
+        }
+        if ((r.source.min_width > width) ||
+            (r.source.min_height > height) ||
+            (r.source.max_width < width) || (r.source.max_height < height)) {
+            fprintf(stderr, "GetOverlayBitmap failed bounds tests\n");
+            delete bbitmap;
+            return 0;
+        }
+        if ((width_padding != 0) || (height_padding != 0)) {
+            delete bbitmap;
+            bounds.Set(bounds.left, bounds.top,
+                       bounds.right + width_padding,
+                       bounds.bottom + height_padding);
+            bbitmap = new BBitmap(bounds, B_BITMAP_WILL_OVERLAY, cs);
+            if (!bbitmap || bbitmap->InitCheck() != B_OK) {
+                fprintf(stderr, "GetOverlayBitmap failed late\n");
+                delete bbitmap;
+                return 0;
+            }
+        }
+        return bbitmap;
+    }
 
 // See <GraphicsDefs.h> [btw: Cb=U, Cr=V]
 // See also http://www.fourcc.org/indexyuv.htm
-enum color_space convert_color_space(Uint32 format) {
-	switch (format) {
-	case SDL_YV12_OVERLAY:
-		return B_YUV9;
-	case SDL_IYUV_OVERLAY:
-		return B_YUV12;
-	case SDL_YUY2_OVERLAY:
-		return B_YCbCr422;
-	case SDL_UYVY_OVERLAY:
-		return B_YUV422;
-	case SDL_YVYU_OVERLAY: // not supported on beos?
-		return B_NO_COLOR_SPACE;
-	default:
-		return B_NO_COLOR_SPACE;
-	}
-}
+    enum color_space convert_color_space(Uint32 format)
+    {
+        switch (format) {
+        case SDL_YV12_OVERLAY:
+            return B_YUV9;
+        case SDL_IYUV_OVERLAY:
+            return B_YUV12;
+        case SDL_YUY2_OVERLAY:
+            return B_YCbCr422;
+        case SDL_UYVY_OVERLAY:
+            return B_YUV422;
+        case SDL_YVYU_OVERLAY: // not supported on beos?
+            return B_NO_COLOR_SPACE;
+        default:
+            return B_NO_COLOR_SPACE;
+        }
+    }
 
 // See SDL_video.h
-int count_planes(Uint32 format) {
-	switch (format) {
-	case SDL_YV12_OVERLAY:
-	case SDL_IYUV_OVERLAY:
-		return 3;
-	case SDL_YUY2_OVERLAY:
-	case SDL_UYVY_OVERLAY:
-	case SDL_YVYU_OVERLAY:
-		return 1;
-	default:
-		return 0;
-	}
-}		
-
-SDL_Overlay *BE_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) {
-	SDL_Overlay* overlay;
-	struct private_yuvhwdata* hwdata;
-	BBitmap *bbitmap;
-	int planes;
-	BRect bounds;
-	color_space cs;
-	
-	/* find the appropriate BeOS colorspace descriptor */
-	cs = convert_color_space(format);
-	if (cs == B_NO_COLOR_SPACE)
-	{
-		return NULL;
-	}
-	
-	/* count planes */
-	planes = count_planes(format);
-	if (planes == 0)
-	{
-		return NULL;
-	}
-	/* TODO: figure out planar modes, if anyone cares */
-	if (planes == 3)
-	{
-		return NULL;
-	}
-
-    /* Create the overlay structure */
-    overlay = (SDL_Overlay*)SDL_calloc(1, sizeof(SDL_Overlay));
-
-    if (overlay == NULL)
+    int count_planes(Uint32 format)
     {
-        SDL_OutOfMemory();
-        return NULL;
+        switch (format) {
+        case SDL_YV12_OVERLAY:
+        case SDL_IYUV_OVERLAY:
+            return 3;
+        case SDL_YUY2_OVERLAY:
+        case SDL_UYVY_OVERLAY:
+        case SDL_YVYU_OVERLAY:
+            return 1;
+        default:
+            return 0;
+        }
     }
 
-    /* Fill in the basic members */
-    overlay->format = format;
-    overlay->w = width;
-    overlay->h = height;
-    overlay->hwdata = NULL;
-	
-    /* Set up the YUV surface function structure */
-    overlay->hwfuncs = &be_yuvfuncs;
+    SDL_Overlay *BE_CreateYUVOverlay(_THIS, int width, int height,
+                                     Uint32 format, SDL_Surface * display)
+    {
+        SDL_Overlay *overlay;
+        struct private_yuvhwdata *hwdata;
+        BBitmap *bbitmap;
+        int planes;
+        BRect bounds;
+        color_space cs;
+
+        /* find the appropriate BeOS colorspace descriptor */
+        cs = convert_color_space(format);
+        if (cs == B_NO_COLOR_SPACE) {
+            return NULL;
+        }
+
+        /* count planes */
+        planes = count_planes(format);
+        if (planes == 0) {
+            return NULL;
+        }
+        /* TODO: figure out planar modes, if anyone cares */
+        if (planes == 3) {
+            return NULL;
+        }
+
+        /* Create the overlay structure */
+        overlay = (SDL_Overlay *) SDL_calloc(1, sizeof(SDL_Overlay));
+
+        if (overlay == NULL) {
+            SDL_OutOfMemory();
+            return NULL;
+        }
+
+        /* Fill in the basic members */
+        overlay->format = format;
+        overlay->w = width;
+        overlay->h = height;
+        overlay->hwdata = NULL;
+
+        /* Set up the YUV surface function structure */
+        overlay->hwfuncs = &be_yuvfuncs;
+
+        /* Create the pixel data and lookup tables */
+        hwdata =
+            (struct private_yuvhwdata *) SDL_calloc(1,
+                                                    sizeof(struct
+                                                           private_yuvhwdata));
+
+        if (hwdata == NULL) {
+            SDL_OutOfMemory();
+            SDL_FreeYUVOverlay(overlay);
+            return NULL;
+        }
 
-    /* Create the pixel data and lookup tables */
-    hwdata = (struct private_yuvhwdata*)SDL_calloc(1, sizeof(struct private_yuvhwdata));
+        overlay->hwdata = hwdata;
+        overlay->hwdata->display = display;
+        overlay->hwdata->bview = NULL;
+        overlay->hwdata->bbitmap = NULL;
+        overlay->hwdata->locked = 0;
+
+        /* Create the BBitmap framebuffer */
+        bounds.top = 0;
+        bounds.left = 0;
+        bounds.right = width - 1;
+        bounds.bottom = height - 1;
+
+        BView *bview =
+            new BView(bounds, "overlay", B_FOLLOW_NONE, B_WILL_DRAW);
+        if (!bview) {
+            SDL_OutOfMemory();
+            SDL_FreeYUVOverlay(overlay);
+            return NULL;
+        }
+        overlay->hwdata->bview = bview;
+        overlay->hwdata->first_display = true;
+        bview->Hide();
+
+        bbitmap = BE_GetOverlayBitmap(bounds, cs);
+        if (!bbitmap) {
+            overlay->hwdata->bbitmap = NULL;
+            SDL_FreeYUVOverlay(overlay);
+            return NULL;
+        }
+        overlay->hwdata->bbitmap = bbitmap;
 
-    if (hwdata == NULL)
-    {
-        SDL_OutOfMemory();
-        SDL_FreeYUVOverlay(overlay);
-        return NULL;
+        overlay->planes = planes;
+        overlay->pitches =
+            (Uint16 *) SDL_calloc(overlay->planes, sizeof(Uint16));
+        overlay->pixels =
+            (Uint8 **) SDL_calloc(overlay->planes, sizeof(Uint8 *));
+        if (!overlay->pitches || !overlay->pixels) {
+            SDL_OutOfMemory();
+            SDL_FreeYUVOverlay(overlay);
+            return (NULL);
+        }
+
+        overlay->pitches[0] = bbitmap->BytesPerRow();
+        overlay->pixels[0] = (Uint8 *) bbitmap->Bits();
+        overlay->hw_overlay = 1;
+
+        if (SDL_Win->LockWithTimeout(1000000) != B_OK) {
+            SDL_FreeYUVOverlay(overlay);
+            return (NULL);
+        }
+        BView *view = SDL_Win->View();
+        view->AddChild(bview);
+        rgb_color key;
+        bview->SetViewOverlay(bbitmap, bounds, bview->Bounds(), &key,
+                              B_FOLLOW_ALL,
+                              B_OVERLAY_FILTER_HORIZONTAL |
+                              B_OVERLAY_FILTER_VERTICAL);
+        bview->SetViewColor(key);
+        bview->Flush();
+        SDL_Win->Unlock();
+
+        current_overlay = overlay;
+
+        return overlay;
     }
 
-    overlay->hwdata = hwdata;
-	overlay->hwdata->display = display;
-	overlay->hwdata->bview = NULL;
-	overlay->hwdata->bbitmap = NULL;
-	overlay->hwdata->locked = 0;
+    int BE_LockYUVOverlay(_THIS, SDL_Overlay * overlay)
+    {
+        if (overlay == NULL) {
+            return 0;
+        }
 
-	/* Create the BBitmap framebuffer */
-	bounds.top = 0;	bounds.left = 0;
-	bounds.right = width-1;
-	bounds.bottom = height-1;
-	
-	BView * bview = new BView(bounds,"overlay",B_FOLLOW_NONE,B_WILL_DRAW); 
-	if (!bview) {
-		SDL_OutOfMemory();
-        SDL_FreeYUVOverlay(overlay);
-        return NULL;
-	}
-	overlay->hwdata->bview = bview;
-	overlay->hwdata->first_display = true;
-	bview->Hide();
-	
-	bbitmap = BE_GetOverlayBitmap(bounds,cs);
-	if (!bbitmap) {
-		overlay->hwdata->bbitmap = NULL;
-		SDL_FreeYUVOverlay(overlay);
-		return NULL;
-	}
-	overlay->hwdata->bbitmap = bbitmap;
-	
-	overlay->planes = planes;
-	overlay->pitches = (Uint16*)SDL_calloc(overlay->planes, sizeof(Uint16));
-	overlay->pixels  = (Uint8**)SDL_calloc(overlay->planes, sizeof(Uint8*));
-	if (!overlay->pitches || !overlay->pixels)
-	{
-        SDL_OutOfMemory();
-        SDL_FreeYUVOverlay(overlay);
-        return(NULL);
-    }
-
-   	overlay->pitches[0] = bbitmap->BytesPerRow();
-   	overlay->pixels[0]  = (Uint8 *)bbitmap->Bits();
-	overlay->hw_overlay = 1;
-	
-	if (SDL_Win->LockWithTimeout(1000000) != B_OK) {
-        SDL_FreeYUVOverlay(overlay);
-        return(NULL);
-    }
-	BView * view = SDL_Win->View();
-    view->AddChild(bview);
-    rgb_color key;
-    bview->SetViewOverlay(bbitmap,bounds,bview->Bounds(),&key,B_FOLLOW_ALL,
-                         B_OVERLAY_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL);
-    bview->SetViewColor(key);
-    bview->Flush();
-	SDL_Win->Unlock();
-	
-	current_overlay=overlay;
-        
-	return overlay;
-}
-
-int BE_LockYUVOverlay(_THIS, SDL_Overlay* overlay)
-{
-    if (overlay == NULL)
-    {
+        overlay->hwdata->locked = 1;
         return 0;
     }
 
-    overlay->hwdata->locked = 1;
-    return 0;
-}
+    void BE_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay)
+    {
+        if (overlay == NULL) {
+            return;
+        }
 
-void BE_UnlockYUVOverlay(_THIS, SDL_Overlay* overlay)
-{
-    if (overlay == NULL)
-    {
-         return;
+        overlay->hwdata->locked = 0;
     }
 
-    overlay->hwdata->locked = 0;
-}
+    int BE_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src,
+                             SDL_Rect * dst)
+    {
+        if ((overlay == NULL) || (overlay->hwdata == NULL)
+            || (overlay->hwdata->bview == NULL) || (SDL_Win->View() == NULL)) {
+            return -1;
+        }
+        if (SDL_Win->LockWithTimeout(50000) != B_OK) {
+            return 0;
+        }
+        BView *bview = overlay->hwdata->bview;
+        if (SDL_Win->IsFullScreen()) {
+            int left, top;
+            SDL_Win->GetXYOffset(left, top);
+            bview->MoveTo(left + dst->x, top + dst->y);
+        } else {
+            bview->MoveTo(dst->x, dst->y);
+        }
+        bview->ResizeTo(dst->w, dst->h);
+        bview->Flush();
+        if (overlay->hwdata->first_display) {
+            bview->Show();
+            overlay->hwdata->first_display = false;
+        }
+        SDL_Win->Unlock();
 
-int BE_DisplayYUVOverlay(_THIS, SDL_Overlay* overlay, SDL_Rect* src, SDL_Rect *dst)
-{
-    if ((overlay == NULL) || (overlay->hwdata==NULL)
-        || (overlay->hwdata->bview==NULL) || (SDL_Win->View() == NULL))
-    {
-        return -1;
-    }
-    if (SDL_Win->LockWithTimeout(50000) != B_OK) {
         return 0;
     }
-    BView * bview = overlay->hwdata->bview;
-    if (SDL_Win->IsFullScreen()) {
-    	int left,top;
-    	SDL_Win->GetXYOffset(left,top);
-	    bview->MoveTo(left+dst->x,top+dst->y);
-    } else {
-	    bview->MoveTo(dst->x,dst->y);
-    }
-    bview->ResizeTo(dst->w,dst->h);
-    bview->Flush();
-	if (overlay->hwdata->first_display) {
-		bview->Show();
-		overlay->hwdata->first_display = false;
-	}
-    SDL_Win->Unlock();
-    
-	return 0;
-}
+
+    void BE_FreeYUVOverlay(_THIS, SDL_Overlay * overlay)
+    {
+        if (overlay == NULL) {
+            return;
+        }
 
-void BE_FreeYUVOverlay(_THIS, SDL_Overlay *overlay)
-{
-    if (overlay == NULL)
-    {
-        return;
+        if (overlay->hwdata == NULL) {
+            return;
+        }
+
+        current_overlay = NULL;
+
+        delete overlay->hwdata->bbitmap;
+
+        SDL_free(overlay->hwdata);
     }
 
-    if (overlay->hwdata == NULL)
-    {
-        return;
-    }
-
-    current_overlay=NULL;
+};                              // extern "C"
 
-	delete overlay->hwdata->bbitmap;
-
-    SDL_free(overlay->hwdata);
-}
-
-}; // extern "C"
+/* vi: set ts=4 sw=4 expandtab: */