Some groundwork for overlay support. If someone wants to finish this, feel

free to continue (it would be nice to be notified before, though, in case
I get to it again in the next weeks).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16561 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-03-01 21:20:57 +00:00
parent 5891e232e2
commit f19839c230
10 changed files with 104 additions and 40 deletions

View File

@ -22,6 +22,9 @@
# define SERVER_INPUT_PORT "OBinputport"
#endif
#define AS_REQUEST_COLOR_KEY 0x00010000
// additional option for AS_LAYER_SET_VIEW_BITMAP
enum {
// Used for quick replies from the app_server
SERVER_TRUE = B_OK,
@ -53,6 +56,7 @@ enum {
AS_DELETE_WINDOW,
AS_CREATE_BITMAP,
AS_DELETE_BITMAP,
AS_GET_BITMAP_OVERLAY_RESTRICTIONS,
AS_ACQUIRE_SERVERMEM,
AS_RELEASE_SERVERMEM,

View File

@ -1998,17 +1998,28 @@ BBitmap::ImportBits(const BBitmap *bitmap)
return error;
}
// GetOverlayRestrictions
/*! \brief ???
/*! \brief Returns the overlay_restrictions structure for this bitmap
*/
status_t
BBitmap::GetOverlayRestrictions(overlay_restrictions *restrictions) const
{
// TODO: Implement
return B_ERROR;
if ((fFlags & B_BITMAP_WILL_OVERLAY) == 0)
return B_BAD_TYPE;
BPrivate::AppServerLink link;
link.StartMessage(AS_GET_BITMAP_OVERLAY_RESTRICTIONS);
link.Attach<int32>(fServerToken);
status_t status;
if (link.FlushWithReply(status) < B_OK)
return B_ERROR;
return status;
}
// AddChild
/*! \brief Adds a BView to the bitmap's view hierarchy.
The bitmap must accept views and the supplied view must not be child of

View File

@ -3085,15 +3085,17 @@ status_t
BView::SetViewOverlay(const BBitmap *overlay, BRect srcRect, BRect dstRect,
rgb_color *colorKey, uint32 followFlags, uint32 options)
{
status_t err = _SetViewBitmap(overlay, srcRect, dstRect, followFlags,
options | 0x4);
if ((overlay->fFlags & B_BITMAP_WILL_OVERLAY) == 0)
return B_BAD_VALUE;
// TODO: Incomplete?
status_t status = _SetViewBitmap(overlay, srcRect, dstRect, followFlags,
options | AS_REQUEST_COLOR_KEY);
if (status == B_OK) {
// read the color that will be treated as transparent
fOwner->fLink->Read<rgb_color>(colorKey);
}
// read the color that will be treated as transparent
fOwner->fLink->Read<rgb_color>(colorKey);
return err;
return status;
}
@ -3102,20 +3104,12 @@ BView::SetViewOverlay(const BBitmap *overlay, rgb_color *colorKey,
uint32 followFlags, uint32 options)
{
BRect rect;
if (overlay)
if (overlay != NULL) {
rect = overlay->Bounds();
rect.OffsetTo(B_ORIGIN);
}
rect.OffsetTo(0, 0);
status_t err = _SetViewBitmap(overlay, rect, rect, followFlags,
options | 0x4);
// TODO: Incomplete?
// read the color that will be treated as transparent
fOwner->fLink->Read<rgb_color>(colorKey);
return err;
return SetViewOverlay(overlay, rect, rect, colorKey, followFlags, options);
}

View File

@ -3,7 +3,7 @@ SubDir HAIKU_TOP src servers app ;
AddResources app_server : app_server.rdef ;
UseLibraryHeaders png zlib ;
UsePrivateHeaders app input interface shared [ FDirName servers app ] ;
UsePrivateHeaders app graphics input interface shared [ FDirName servers app ] ;
UseHeaders [ FDirName $(HAIKU_TOP) src servers app drawing ] ;
UseFreeTypeHeaders ;

View File

@ -715,14 +715,13 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
STRACE(("ServerApp %s: Create Bitmap (%.1fx%.1f)\n",
Signature(), frame.Width(), frame.Height()));
if (bitmap && fBitmapList.AddItem((void*)bitmap)) {
if (bitmap != NULL && fBitmapList.AddItem(bitmap)) {
fLink.StartMessage(B_OK);
fLink.Attach<int32>(bitmap->Token());
fLink.Attach<area_id>(bitmap->Area());
fLink.Attach<int32>(bitmap->AreaOffset());
} else {
} else
fLink.StartMessage(B_NO_MEMORY);
}
fLink.Flush();
break;
@ -734,17 +733,41 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
// Attached Data:
// 1) int32 token
int32 id;
link.Read<int32>(&id);
int32 token;
link.Read<int32>(&token);
ServerBitmap *bitmap = FindBitmap(id);
if (bitmap && fBitmapList.RemoveItem((void*)bitmap)) {
STRACE(("ServerApp %s: Deleting Bitmap %ld\n", Signature(), id));
ServerBitmap *bitmap = FindBitmap(token);
if (bitmap && fBitmapList.RemoveItem(bitmap)) {
STRACE(("ServerApp %s: Deleting Bitmap %ld\n", Signature(), token));
gBitmapManager->DeleteBitmap(bitmap);
}
break;
}
case AS_GET_BITMAP_OVERLAY_RESTRICTIONS:
{
overlay_restrictions overlayRestrictions;
status_t status = B_ERROR;
int32 token;
if (link.Read<int32>(&token) != B_OK)
break;
ServerBitmap *bitmap = FindBitmap(token);
if (bitmap != NULL) {
STRACE(("ServerApp %s: Get overlay restrictions for bitmap %ld\n",
Signature(), token));
// TODO: fill overlay restrictions
}
fLink.StartMessage(status);
if (status == B_OK)
fLink.Attach(&overlayRestrictions, sizeof(overlay_restrictions));
fLink.Flush();
break;
}
case AS_CREATE_PICTURE:
{

View File

@ -1484,6 +1484,13 @@ ServerWindow::_DispatchViewMessage(int32 code,
}
fLink.StartMessage(status);
if (status == B_OK && (options & AS_REQUEST_COLOR_KEY) != 0) {
// Attach color key for the overlay bitmap
// TODO: get color key from the accelerant
rgb_color colorKey = {40, 40, 40, 255};
fLink.Attach<rgb_color>(colorKey);
}
fLink.Flush();
break;
}

View File

@ -309,6 +309,17 @@ AccelerantHWInterface::_SetupDefaultHooks()
fAccDPMSMode = (dpms_mode)fAccelerantHook(B_DPMS_MODE, NULL);
fAccSetDPMSMode = (set_dpms_mode)fAccelerantHook(B_SET_DPMS_MODE, NULL);
// overlay
fAccOverlayCount = (overlay_count)fAccelerantHook(B_OVERLAY_COUNT, NULL);
fAccOverlaySupportedSpaces = (overlay_supported_spaces)fAccelerantHook(B_OVERLAY_SUPPORTED_SPACES, NULL);
fAccOverlaySupportedFeatures = (overlay_supported_features)fAccelerantHook(B_OVERLAY_SUPPORTED_FEATURES, NULL);
fAccAllocateOverlayBuffer = (allocate_overlay_buffer)fAccelerantHook(B_ALLOCATE_OVERLAY_BUFFER, NULL);
fAccReleaseOverlayBuffer = (release_overlay_buffer)fAccelerantHook(B_RELEASE_OVERLAY_BUFFER, NULL);
fAccGetOverlayConstraints = (get_overlay_constraints)fAccelerantHook(B_GET_OVERLAY_CONSTRAINTS, NULL);
fAccAllocateOverlay = (allocate_overlay)fAccelerantHook(B_ALLOCATE_OVERLAY, NULL);
fReleaseOverlay = (release_overlay)fAccelerantHook(B_RELEASE_OVERLAY, NULL);
fConfigureOverlay = (configure_overlay)fAccelerantHook(B_CONFIGURE_OVERLAY, NULL);
return B_OK;
}
@ -508,6 +519,7 @@ AccelerantHWInterface::GetModeList(display_mode** modes, uint32 *count)
return ret;
}
status_t
AccelerantHWInterface::GetPixelClockLimits(display_mode *mode, uint32 *low, uint32 *high)
{
@ -519,6 +531,7 @@ AccelerantHWInterface::GetPixelClockLimits(display_mode *mode, uint32 *low, uint
return fAccGetPixelClockLimits(mode, low, high);
}
status_t
AccelerantHWInterface::GetTimingConstraints(display_timing_constraints *dtc)
{
@ -533,6 +546,7 @@ AccelerantHWInterface::GetTimingConstraints(display_timing_constraints *dtc)
return B_UNSUPPORTED;
}
status_t
AccelerantHWInterface::ProposeMode(display_mode *candidate, const display_mode *low, const display_mode *high)
{
@ -552,7 +566,7 @@ AccelerantHWInterface::ProposeMode(display_mode *candidate, const display_mode *
return fAccProposeDisplayMode(candidate, &this_low, &this_high);
}
// RetraceSemaphore
sem_id
AccelerantHWInterface::RetraceSemaphore()
{
@ -563,7 +577,7 @@ AccelerantHWInterface::RetraceSemaphore()
return AccelerantRetraceSemaphore();
}
// WaitForRetrace
status_t
AccelerantHWInterface::WaitForRetrace(bigtime_t timeout)
{
@ -580,7 +594,7 @@ AccelerantHWInterface::WaitForRetrace(bigtime_t timeout)
return acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, timeout);
}
// SetDPMSMode
status_t
AccelerantHWInterface::SetDPMSMode(const uint32 &state)
{

View File

@ -11,7 +11,9 @@
#include "HWInterface.h"
#include <image.h>
#include <video_overlay.h>
class MallocBuffer;
class AccelerantBuffer;
@ -117,15 +119,24 @@ private:
dpms_mode fAccDPMSMode;
set_dpms_mode fAccSetDPMSMode;
// overlay hooks
overlay_count fAccOverlayCount;
overlay_supported_spaces fAccOverlaySupportedSpaces;
overlay_supported_features fAccOverlaySupportedFeatures;
allocate_overlay_buffer fAccAllocateOverlayBuffer;
release_overlay_buffer fAccReleaseOverlayBuffer;
get_overlay_constraints fAccGetOverlayConstraints;
allocate_overlay fAccAllocateOverlay;
release_overlay fReleaseOverlay;
configure_overlay fConfigureOverlay;
frame_buffer_config fFrameBufferConfig;
int fModeCount;
display_mode *fModeList;
MallocBuffer *fBackBuffer;
AccelerantBuffer *fFrontBuffer;
display_mode fDisplayMode;
};

View File

@ -1,7 +1,7 @@
SubDir HAIKU_TOP src servers app drawing ;
UseLibraryHeaders agg ;
UsePrivateHeaders app interface shared [ FDirName servers app ] ;
UsePrivateHeaders app graphics interface shared [ FDirName servers app ] ;
UseHeaders [ FDirName $(HAIKU_TOP) src servers app ] ;
UseHeaders [ FDirName $(HAIKU_TOP) src servers app drawing Painter ] ;

View File

@ -6,7 +6,7 @@ SetSubDirSupportedPlatforms libbe_test ;
if $(TARGET_PLATFORM) = libbe_test {
UseLibraryHeaders agg png zlib ;
UsePrivateHeaders app input interface shared [ FDirName servers app ] ;
UsePrivateHeaders app graphics input interface shared [ FDirName servers app ] ;
local appServerDir = [ FDirName $(HAIKU_TOP) src servers app ] ;