app_server memory management fixes: use BReference

Use BReference for more automated reference counting in app_server,
fixing some use-after-free and other problems.

Extracted from https://review.haiku-os.org/c/haiku/+/2695

Change-Id: I141bb248229405896b29feff3338447f7257b0b4
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3175
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
X512
2020-12-02 17:59:06 +00:00
committed by Adrien Destugues
parent 30ecf636e0
commit 60d3078585
34 changed files with 281 additions and 534 deletions
+3 -5
View File
@@ -197,19 +197,17 @@ BitmapManager::CloneFromClient(area_id clientArea, int32 areaOffset,
BAutolock locker(fLock);
if (!locker.IsLocked())
return NULL;
ServerBitmap* bitmap = new(std::nothrow) ServerBitmap(bounds, space, flags,
bytesPerRow);
BReference<ServerBitmap> bitmap(new(std::nothrow) ServerBitmap(bounds, space, flags,
bytesPerRow), true);
if (bitmap == NULL)
return NULL;
ClonedAreaMemory* memory = new(std::nothrow) ClonedAreaMemory;
if (memory == NULL) {
delete bitmap;
return NULL;
}
int8* buffer = (int8*)memory->Clone(clientArea, areaOffset);
if (buffer == NULL) {
delete bitmap;
delete memory;
return NULL;
}
@@ -217,7 +215,7 @@ BitmapManager::CloneFromClient(area_id clientArea, int32 areaOffset,
bitmap->fMemory = memory;
bitmap->fBuffer = memory->Address();
bitmap->fToken = gTokenSpace.NewToken(kBitmapToken, bitmap);
return bitmap;
return bitmap.Detach();
}
+6 -12
View File
@@ -237,15 +237,16 @@ Canvas::ScreenToPenTransform() const GCC_2_NRV(transform)
void
Canvas::BlendLayer(Layer* layer)
Canvas::BlendLayer(Layer* layerPtr)
{
BReference<Layer> layer(layerPtr, true);
if (layer->Opacity() == 255) {
layer->Play(this);
layer->ReleaseReference();
return;
}
UtilityBitmap* layerBitmap = layer->RenderToBitmap(this);
BReference <UtilityBitmap> layerBitmap(layer->RenderToBitmap(this), true);
if (layerBitmap == NULL)
return;
@@ -259,15 +260,11 @@ Canvas::BlendLayer(Layer* layer)
fDrawState->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_COMPOSITE);
fDrawState->SetTransformEnabled(false);
AlphaMask* mask = new(std::nothrow) UniformAlphaMask(layer->Opacity());
if (mask == NULL) {
layerBitmap->ReleaseReference();
layer->ReleaseReference();
BReference<AlphaMask> mask(new(std::nothrow) UniformAlphaMask(layer->Opacity()), true);
if (mask == NULL)
return;
}
SetAlphaMask(mask);
mask->ReleaseReference();
ResyncDrawState();
GetDrawingEngine()->DrawBitmap(layerBitmap, layerBitmap->Bounds(),
@@ -277,9 +274,6 @@ Canvas::BlendLayer(Layer* layer)
PopState();
ResyncDrawState();
layerBitmap->ReleaseReference();
layer->ReleaseReference();
}
+2 -3
View File
@@ -327,7 +327,7 @@ ClientMemory::~ClientMemory()
if (fAllocator != NULL) {
if (fBlock != NULL)
fAllocator->Free(fBlock);
fAllocator->ReleaseReference();
fAllocator.Unset();
}
}
@@ -336,8 +336,7 @@ void*
ClientMemory::Allocate(ClientMemoryAllocator* allocator, size_t size,
bool& newArea)
{
fAllocator = allocator;
fAllocator->AcquireReference();
fAllocator.SetTo(allocator, false);
return fAllocator->Allocate(size, &fBlock, newArea);
}
+2 -1
View File
@@ -83,7 +83,8 @@ public:
virtual uint32 AreaOffset();
private:
ClientMemoryAllocator* fAllocator;
BReference<ClientMemoryAllocator>
fAllocator;
block* fBlock;
};
+11 -11
View File
@@ -97,8 +97,11 @@ CursorManager::CursorManager()
//! Does all the teardown
CursorManager::~CursorManager()
{
for (int32 i = 0; i < fCursorList.CountItems(); i++)
delete (ServerCursor*)fCursorList.ItemAtFast(i);
for (int32 i = 0; i < fCursorList.CountItems(); i++) {
ServerCursor* cursor = ((ServerCursor*)fCursorList.ItemAtFast(i));
cursor->fManager = NULL;
cursor->ReleaseReference();
}
}
@@ -108,23 +111,20 @@ CursorManager::CreateCursor(team_id clientTeam, const uint8* cursorData)
if (!Lock())
return NULL;
ServerCursor* cursor = _FindCursor(clientTeam, cursorData);
ServerCursorReference cursor(_FindCursor(clientTeam, cursorData), false);
if (!cursor) {
cursor = new (std::nothrow) ServerCursor(cursorData);
cursor.SetTo(new (std::nothrow) ServerCursor(cursorData), true);
if (cursor) {
cursor->SetOwningTeam(clientTeam);
if (AddCursor(cursor) < B_OK) {
delete cursor;
if (AddCursor(cursor) < B_OK)
cursor = NULL;
}
}
} else
cursor->AcquireReference();
}
Unlock();
return cursor;
return cursor.Detach();
}
@@ -408,7 +408,7 @@ CursorManager::_LoadCursor(ServerCursor*& cursorMember, const CursorSet& set,
if (set.FindCursor(id, &cursor) == B_OK) {
int32 index = fCursorList.IndexOf(cursorMember);
if (index >= 0) {
ServerCursor* items = reinterpret_cast<ServerCursor*>(
ServerCursor** items = reinterpret_cast<ServerCursor**>(
fCursorList.Items());
items[index] = cursor;
}
+2 -4
View File
@@ -545,12 +545,10 @@ DrawState::ClipToShape(shape_data* shape, bool inverse)
if (!fCombinedTransform.IsIdentity())
fCombinedTransform.Apply(shape->ptList, shape->ptCount);
AlphaMask* const mask = ShapeAlphaMask::Create(GetAlphaMask(), *shape,
BPoint(0, 0), inverse);
BReference<AlphaMask> const mask(ShapeAlphaMask::Create(GetAlphaMask(), *shape,
BPoint(0, 0), inverse), true);
SetAlphaMask(mask);
if (mask != NULL)
mask->ReleaseReference();
}
-17
View File
@@ -247,7 +247,6 @@ EventDispatcher::EventDispatcher()
fLastButtons(0),
fLastUpdate(system_time()),
fDraggingMessage(false),
fDragBitmap(NULL),
fCursorLock("cursor loop lock"),
fHWInterface(NULL),
fDesktop(NULL)
@@ -612,21 +611,9 @@ EventDispatcher::SetDragMessage(BMessage& message,
if (fLastButtons == 0) {
// mouse buttons has already been released or was never pressed
if (bitmap != NULL)
bitmap->ReleaseReference();
return;
}
if (fDragBitmap != bitmap) {
if (fDragBitmap)
fDragBitmap->ReleaseReference();
fDragBitmap = bitmap;
if (fDragBitmap != NULL)
fDragBitmap->AcquireReference();
}
fHWInterface->SetDragBitmap(bitmap, offsetFromCursor);
fDragMessage = message;
@@ -757,10 +744,6 @@ EventDispatcher::_DeliverDragMessage()
fDraggingMessage = false;
fHWInterface->SetDragBitmap(NULL, B_ORIGIN);
if (fDragBitmap != NULL) {
fDragBitmap->ReleaseReference();
fDragBitmap = NULL;
}
}
-7
View File
@@ -150,13 +150,6 @@ class EventDispatcher : public BLocker {
BMessage fDragMessage;
bool fDraggingMessage;
BPoint fDragOffset;
ServerBitmap* fDragBitmap;
// NOTE: unfortunately, the EventDispatcher
// has to know what a ServerBitmap is...
// otherwise, linking the libs in the
// testenvironment is problematic, because
// the alternative is that HWInterface knows
// about BitmapManager
BLocker fCursorLock;
HWInterface* fHWInterface;
+17 -25
View File
@@ -23,8 +23,7 @@ public:
fDrawingEngine(drawingEngine),
fBitmapBounds(bitmapBounds)
{
delete fDrawState;
fDrawState = drawState;
fDrawState.SetTo(drawState);
}
virtual DrawingEngine* GetDrawingEngine() const
@@ -43,7 +42,7 @@ public:
virtual void ResyncDrawState()
{
fDrawingEngine->SetDrawState(fDrawState);
fDrawingEngine->SetDrawState(fDrawState.Get());
}
virtual void UpdateCurrentDrawingRegion()
@@ -104,10 +103,7 @@ Layer::PushLayer(Layer* layer)
Layer*
Layer::PopLayer()
{
Layer* const previousLayer = static_cast<Layer*>(PopPicture());
if (previousLayer != NULL)
previousLayer->ReleaseReference();
return previousLayer;
return static_cast<Layer*>(PopPicture());
}
@@ -120,16 +116,15 @@ Layer::RenderToBitmap(Canvas* canvas)
fLeftTopOffset = boundingBox.LeftTop();
UtilityBitmap* const layerBitmap = _AllocateBitmap(boundingBox);
BReference<UtilityBitmap> layerBitmap(_AllocateBitmap(boundingBox), true);
if (layerBitmap == NULL)
return NULL;
BitmapHWInterface layerInterface(layerBitmap);
DrawingEngine* const layerEngine = layerInterface.CreateDrawingEngine();
if (layerEngine == NULL) {
layerBitmap->ReleaseReference();
ObjectDeleter<DrawingEngine> const layerEngine(layerInterface.CreateDrawingEngine());
if (layerEngine.Get() == NULL)
return NULL;
}
layerEngine->SetRendererOffset(boundingBox.left, boundingBox.top);
// Drawing commands of the layer's picture use coordinates in the
// coordinate space of the underlying canvas. The coordinate origin
@@ -141,7 +136,7 @@ Layer::RenderToBitmap(Canvas* canvas)
// Painter), to prevent this origin from being further transformed by
// e.g. scaling.
LayerCanvas layerCanvas(layerEngine, canvas->CurrentState(), boundingBox);
LayerCanvas layerCanvas(layerEngine.Get(), canvas->DetachDrawState(), boundingBox);
AlphaMask* const mask = layerCanvas.GetAlphaMask();
IntPoint oldOffset;
@@ -150,8 +145,8 @@ Layer::RenderToBitmap(Canvas* canvas)
oldOffset = mask->SetCanvasGeometry(IntPoint(0, 0), boundingBox);
}
canvas->CurrentState()->SetDrawingMode(B_OP_ALPHA);
canvas->CurrentState()->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_COMPOSITE);
layerCanvas.CurrentState()->SetDrawingMode(B_OP_ALPHA);
layerCanvas.CurrentState()->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_COMPOSITE);
layerCanvas.ResyncDrawState();
// Apply state to the new drawing engine of the layer canvas
@@ -174,14 +169,12 @@ Layer::RenderToBitmap(Canvas* canvas)
layerCanvas.ResyncDrawState();
}
canvas->SetDrawState(layerCanvas.CurrentState());
canvas->SetDrawState(layerCanvas.DetachDrawState());
// Update state in canvas (the top-of-stack state could be a different
// state instance now, if the picture commands contained push/pop
// commands)
delete layerEngine;
return layerBitmap;
return layerBitmap.Detach();
}
@@ -225,15 +218,14 @@ Layer::_DetermineBoundingBox(Canvas* canvas)
UtilityBitmap*
Layer::_AllocateBitmap(const BRect& bounds)
{
UtilityBitmap* const layerBitmap = new(std::nothrow) UtilityBitmap(bounds,
B_RGBA32, 0);
BReference<UtilityBitmap> layerBitmap(new(std::nothrow) UtilityBitmap(bounds,
B_RGBA32, 0), true);
if (layerBitmap == NULL)
return NULL;
if (!layerBitmap->IsValid()) {
delete layerBitmap;
if (!layerBitmap->IsValid())
return NULL;
}
memset(layerBitmap->Bits(), 0, layerBitmap->BitsLength());
return layerBitmap;
return layerBitmap.Detach();
}
+1 -2
View File
@@ -17,14 +17,13 @@ OffscreenServerWindow::OffscreenServerWindow(const char *title, ServerApp *app,
port_id clientPort, port_id looperPort, int32 handlerID,
ServerBitmap* bitmap)
: ServerWindow(title, app, clientPort, looperPort, handlerID),
fBitmap(bitmap)
fBitmap(bitmap, true)
{
}
OffscreenServerWindow::~OffscreenServerWindow()
{
fBitmap->ReleaseReference();
}
+2 -2
View File
@@ -19,7 +19,7 @@ public:
int32 handlerID, ServerBitmap* bitmap);
virtual ~OffscreenServerWindow();
// util methods.
// util methods.
virtual void SendMessageToClient(const BMessage* msg,
int32 target = B_NULL_TOKEN,
bool usePreferred = false) const;
@@ -29,7 +29,7 @@ public:
uint32 workspace);
private:
ServerBitmap* fBitmap;
BReference<ServerBitmap> fBitmap;
};
#endif // OFFSCREEN_SERVER_WINDOW_H
+13 -9
View File
@@ -25,6 +25,7 @@
#include "View.h"
#include "Window.h"
#include <AutoDeleter.h>
#include <Bitmap.h>
#include <Debug.h>
#include <List.h>
@@ -60,25 +61,27 @@ public:
~State()
{
delete fDrawState;
}
DrawState* GetDrawState()
{
return fDrawState;
return fDrawState.Get();
}
void PushDrawState()
{
DrawState* nextState = fDrawState->PushState();
if (nextState != NULL)
fDrawState = nextState;
DrawState* previousState = fDrawState.Detach();
DrawState* newState = previousState->PushState();
if (newState == NULL)
newState = previousState;
fDrawState.SetTo(newState);
}
void PopDrawState()
{
if (fDrawState->PreviousState() != NULL)
fDrawState = fDrawState->PopState();
fDrawState.SetTo(fDrawState->PopState());
}
SimpleTransform PenToLocalTransform() const
@@ -130,7 +133,8 @@ private:
private:
DrawState* fDrawState;
ObjectDeleter<DrawState>
fDrawState;
BRect* fBoundingBox;
};
@@ -841,13 +845,13 @@ PictureBoundingBoxPlayer::Play(ServerPicture* picture,
{
State state(drawState, outBoundingBox);
BMallocIO* mallocIO = dynamic_cast<BMallocIO*>(picture->fData);
BMallocIO* mallocIO = dynamic_cast<BMallocIO*>(picture->fData.Get());
if (mallocIO == NULL)
return;
BPrivate::PicturePlayer player(mallocIO->Buffer(),
mallocIO->BufferLength(), ServerPicture::PictureList::Private(
picture->fPictures).AsBList());
picture->fPictures.Get()).AsBList());
player.Play(kPictureBoundingBoxPlayerCallbacks,
sizeof(kPictureBoundingBoxPlayerCallbacks), &state);
}
-55
View File
@@ -1,55 +0,0 @@
/*
* Copyright 2001-2005, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* DarkWyrm <bpmagic@columbus.rr.com>
* Axel Dörfler, axeld@pinc-software.de
*/
#ifndef REFERENCE_COUNTING_H
#define REFERENCE_COUNTING_H
#include <SupportDefs.h>
/*!
\class ReferenceCounting ReferenceCounting.h
\brief Base class for reference counting objects
ReferenceCounting objects track dependencies upon a particular object. In this way,
it is possible to ensure that a shared resource is not deleted if something else
needs it. How the dependency tracking is done largely depends on the child class.
*/
class ReferenceCounting {
public:
ReferenceCounting()
: fReferenceCount(1) {}
virtual ~ReferenceCounting() {}
inline void Acquire();
inline bool Release();
private:
int32 fReferenceCount;
};
inline void
ReferenceCounting::Acquire()
{
atomic_add(&fReferenceCount, 1);
}
inline bool
ReferenceCounting::Release()
{
if (atomic_add(&fReferenceCount, -1) == 1) {
delete this;
return true;
}
return false;
}
#endif /* REFERENCE_COUNTING_H */
+25 -65
View File
@@ -105,7 +105,7 @@ ServerApp::ServerApp(Desktop* desktop, port_id clientReplyPort,
fViewCursor(NULL),
fCursorHideLevel(0),
fIsActive(false),
fMemoryAllocator(new (std::nothrow) ClientMemoryAllocator(this))
fMemoryAllocator(new (std::nothrow) ClientMemoryAllocator(this), true)
{
if (fSignature == "")
fSignature = "application/no-signature";
@@ -205,8 +205,6 @@ ServerApp::~ServerApp()
fPictureMap.begin()->second->SetOwner(NULL);
fDesktop->GetCursorManager().DeleteCursors(fClientTeam);
if (fMemoryAllocator != NULL)
fMemoryAllocator->ReleaseReference();
STRACE(("ServerApp %s::~ServerApp(): Exiting\n", Signature()));
}
@@ -294,15 +292,7 @@ ServerApp::Activate(bool value)
void
ServerApp::SetCurrentCursor(ServerCursor* cursor)
{
if (fViewCursor != cursor) {
if (fViewCursor)
fViewCursor->ReleaseReference();
fViewCursor = cursor;
if (fViewCursor)
fViewCursor->AcquireReference();
}
fViewCursor.SetTo(cursor, false);
fDesktop->SetCursor(CurrentCursor());
}
@@ -417,16 +407,16 @@ ServerApp::GetBitmap(int32 token) const
ServerPicture*
ServerApp::CreatePicture(const ServerPicture* original)
{
ServerPicture* picture;
BReference<ServerPicture> picture;
if (original != NULL)
picture = new(std::nothrow) ServerPicture(*original);
picture.SetTo(new(std::nothrow) ServerPicture(*original), true);
else
picture = new(std::nothrow) ServerPicture();
picture.SetTo(new(std::nothrow) ServerPicture(), true);
if (picture != NULL && !picture->SetOwner(this))
picture->ReleaseReference();
return NULL;
return picture;
return picture.Detach();
}
@@ -457,7 +447,7 @@ ServerApp::AddPicture(ServerPicture* picture)
ASSERT(picture->Owner() == NULL);
try {
fPictureMap.insert(std::make_pair(picture->Token(), picture));
fPictureMap.insert(std::make_pair(picture->Token(), BReference<ServerPicture>(picture, false)));
} catch (std::bad_alloc& exception) {
return false;
}
@@ -475,7 +465,6 @@ ServerApp::RemovePicture(ServerPicture* picture)
ASSERT(picture->Owner() == this);
fPictureMap.erase(picture->Token());
picture->ReleaseReference();
}
@@ -750,7 +739,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
// 3) int32 area pointer offset used to calculate fBasePtr
// First, let's attempt to allocate the bitmap
ServerBitmap* bitmap = NULL;
BReference<ServerBitmap> bitmap;
uint8 allocationFlags = kAllocator;
BRect frame;
@@ -766,9 +755,9 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
if (link.Read<int32>(&screenID) == B_OK) {
// TODO: choose the right HWInterface with regards to the
// screenID
bitmap = gBitmapManager->CreateBitmap(fMemoryAllocator,
bitmap.SetTo(gBitmapManager->CreateBitmap(fMemoryAllocator,
*fDesktop->HWInterface(), frame, colorSpace, flags,
bytesPerRow, screenID, &allocationFlags);
bytesPerRow, screenID, &allocationFlags), true);
}
STRACE(("ServerApp %s: Create Bitmap (%.1fx%.1f)\n",
@@ -785,9 +774,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
if ((allocationFlags & kFramebuffer) != 0)
fLink.Attach<int32>(bitmap->BytesPerRow());
} else {
if (bitmap != NULL)
bitmap->ReleaseReference();
fLink.StartMessage(B_NO_MEMORY);
}
@@ -828,15 +814,13 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
if (link.Read<int32>(&token) != B_OK)
break;
ServerBitmap* bitmap = GetBitmap(token);
BReference<ServerBitmap> bitmap(GetBitmap(token), true);
if (bitmap != NULL) {
STRACE(("ServerApp %s: Get overlay restrictions for bitmap "
"%" B_PRId32 "\n", Signature(), token));
status = fDesktop->HWInterface()->GetOverlayRestrictions(
bitmap->Overlay(), &restrictions);
bitmap->ReleaseReference();
}
fLink.StartMessage(status);
@@ -866,7 +850,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
case AS_RECONNECT_BITMAP:
{
// First, let's attempt to allocate the bitmap
ServerBitmap* bitmap = NULL;
BReference<ServerBitmap> bitmap;
BRect frame;
color_space colorSpace;
@@ -885,8 +869,8 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
if (link.Read<int32>(&areaOffset) == B_OK) {
// TODO: choose the right HWInterface with regards to the
// screenID
bitmap = gBitmapManager->CloneFromClient(clientArea, areaOffset,
frame, colorSpace, flags, bytesPerRow);
bitmap.SetTo(gBitmapManager->CloneFromClient(clientArea, areaOffset,
frame, colorSpace, flags, bytesPerRow), true);
}
if (bitmap != NULL && _AddBitmap(bitmap)) {
@@ -896,9 +880,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
fLink.Attach<area_id>(bitmap->Area());
} else {
if (bitmap != NULL)
bitmap->ReleaseReference();
fLink.StartMessage(B_NO_MEMORY);
}
@@ -914,7 +895,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
STRACE(("ServerApp %s: Create Picture\n", Signature()));
status_t status = B_NO_MEMORY;
ServerPicture* picture = CreatePicture();
BReference<ServerPicture> picture(CreatePicture());
if (picture != NULL) {
int32 subPicturesCount = 0;
link.Read<int32>(&subPicturesCount);
@@ -956,19 +937,17 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
{
STRACE(("ServerApp %s: Clone Picture\n", Signature()));
int32 token;
ServerPicture* original = NULL;
BReference<ServerPicture> original;
if (link.Read<int32>(&token) == B_OK)
original = GetPicture(token);
original.SetTo(GetPicture(token), true);
if (original != NULL) {
ServerPicture* cloned = CreatePicture(original);
BReference<ServerPicture> cloned(CreatePicture(original), true);
if (cloned != NULL) {
fLink.StartMessage(B_OK);
fLink.Attach<int32>(cloned->Token());
} else
fLink.StartMessage(B_NO_MEMORY);
original->ReleaseReference();
} else
fLink.StartMessage(B_BAD_VALUE);
@@ -981,11 +960,10 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
STRACE(("ServerApp %s: Download Picture\n", Signature()));
int32 token;
link.Read<int32>(&token);
ServerPicture* picture = GetPicture(token);
BReference<ServerPicture> picture(GetPicture(token), true);
if (picture != NULL) {
picture->ExportData(fLink);
// ExportData() calls StartMessage() already
picture->ReleaseReference();
} else
fLink.StartMessage(B_ERROR);
@@ -1110,17 +1088,11 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
if (!fDesktop->GetCursorManager().Lock())
break;
ServerCursor* oldCursor = fAppCursor;
fAppCursor = fDesktop->GetCursorManager().FindCursor(token);
if (fAppCursor != NULL)
fAppCursor->AcquireReference();
fAppCursor.SetTo(fDesktop->GetCursorManager().FindCursor(token), false);
if (_HasWindowUnderMouse())
fDesktop->SetCursor(CurrentCursor());
if (oldCursor != NULL)
oldCursor->ReleaseReference();
fDesktop->GetCursorManager().Unlock();
if (sync) {
@@ -1140,13 +1112,8 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
break;
if (fDesktop->GetCursorManager().Lock()) {
ServerCursor* cursor = fDesktop->GetCursorManager().FindCursor(
info.cursorToken);
// If we found a cursor, make sure it doesn't go away. If we
// get a NULL cursor, it probably means we are supposed to use
// the system default cursor.
if (cursor != NULL)
cursor->AcquireReference();
BReference<ServerCursor> cursor(fDesktop->GetCursorManager().FindCursor(
info.cursorToken), false);
fDesktop->GetCursorManager().Unlock();
@@ -1174,10 +1141,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
}
fDesktop->UnlockAllWindows();
// Release the temporary reference.
if (cursor != NULL)
cursor->ReleaseReference();
}
if (info.sync) {
@@ -3190,14 +3153,13 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
bool success = false;
ServerBitmap* bitmap = GetBitmap(token);
BReference<ServerBitmap> bitmap(GetBitmap(token), true);
if (bitmap != NULL) {
if (fDesktop->GetDrawingEngine()->LockExclusiveAccess()) {
success = fDesktop->GetDrawingEngine()->ReadBitmap(bitmap,
drawCursor, bounds) == B_OK;
fDesktop->GetDrawingEngine()->UnlockExclusiveAccess();
}
bitmap->ReleaseReference();
}
if (success)
@@ -3552,7 +3514,7 @@ ServerApp::_AddBitmap(ServerBitmap* bitmap)
BAutolock _(fMapLocker);
try {
fBitmapMap.insert(std::make_pair(bitmap->Token(), bitmap));
fBitmapMap.insert(std::make_pair(bitmap->Token(), BReference<ServerBitmap>(bitmap, false)));
} catch (std::bad_alloc& exception) {
return false;
}
@@ -3569,8 +3531,6 @@ ServerApp::_DeleteBitmap(ServerBitmap* bitmap)
gBitmapManager->BitmapRemoved(bitmap);
fBitmapMap.erase(bitmap->Token());
bitmap->ReleaseReference();
}
+7 -5
View File
@@ -115,8 +115,8 @@ private:
ServerPicture* _FindPicture(int32 token) const;
private:
typedef std::map<int32, ServerBitmap*> BitmapMap;
typedef std::map<int32, ServerPicture*> PictureMap;
typedef std::map<int32, BReference<ServerBitmap> > BitmapMap;
typedef std::map<int32, BReference<ServerPicture> > PictureMap;
port_id fMessagePort;
port_id fClientReplyPort;
@@ -150,14 +150,16 @@ private:
BitmapMap fBitmapMap;
PictureMap fPictureMap;
ServerCursor* fAppCursor;
ServerCursor* fViewCursor;
BReference<ServerCursor>
fAppCursor;
BReference<ServerCursor>
fViewCursor;
int32 fCursorHideLevel;
// 0 = cursor visible
bool fIsActive;
ClientMemoryAllocator* fMemoryAllocator;
BReference<ClientMemoryAllocator> fMemoryAllocator;
};
+1 -1
View File
@@ -195,7 +195,7 @@ ServerCursor::AttachedToManager(CursorManager* manager)
void
ServerCursor::LastReferenceReleased()
{
if (fManager != NULL && fManager->RemoveCursor(this))
if (fManager == NULL || fManager->RemoveCursor(this))
delete this;
}
+8 -22
View File
@@ -130,7 +130,7 @@ is_white_space(uint32 charCode)
ServerFont::ServerFont(FontStyle& style, float size, float rotation,
float shear, float falseBoldWidth, uint16 flags, uint8 spacing)
:
fStyle(&style),
fStyle(&style, false),
fSize(size),
fRotation(rotation),
fShear(shear),
@@ -142,7 +142,6 @@ ServerFont::ServerFont(FontStyle& style, float size, float rotation,
fFace(style.Face()),
fEncoding(B_UNICODE_UTF8)
{
fStyle->Acquire();
}
@@ -171,7 +170,6 @@ ServerFont::ServerFont(const ServerFont &font)
*/
ServerFont::~ServerFont()
{
fStyle->Release();
}
@@ -252,14 +250,7 @@ void
ServerFont::SetStyle(FontStyle* style)
{
if (style && style != fStyle) {
// detach from old style
if (fStyle != NULL)
fStyle->Release();
// attach to new style
fStyle = style;
fStyle->Acquire();
fStyle.SetTo(style, false);
fFace = fStyle->Face();
fDirection = fStyle->Direction();
@@ -278,12 +269,10 @@ ServerFont::SetStyle(FontStyle* style)
status_t
ServerFont::SetFamilyAndStyle(uint16 familyID, uint16 styleID)
{
FontStyle* style = NULL;
BReference<FontStyle> style;
if (gFontManager->Lock()) {
style = gFontManager->GetStyle(familyID, styleID);
if (style != NULL)
style->Acquire();
style.SetTo(gFontManager->GetStyle(familyID, styleID), false);
gFontManager->Unlock();
}
@@ -292,7 +281,6 @@ ServerFont::SetFamilyAndStyle(uint16 familyID, uint16 styleID)
return B_ERROR;
SetStyle(style);
style->Release();
return B_OK;
}
@@ -323,18 +311,17 @@ ServerFont::SetFace(uint16 face)
// FontStyle class takes care of mapping the font style name to the Be
// API face flags in FontStyle::_TranslateStyleToFace().
FontStyle* style = NULL;
BReference <FontStyle> style;
uint16 familyID = FamilyID();
if (gFontManager->Lock()) {
int32 count = gFontManager->CountStyles(familyID);
for (int32 i = 0; i < count; i++) {
style = gFontManager->GetStyleByIndex(familyID, i);
style.SetTo(gFontManager->GetStyleByIndex(familyID, i), false);
if (style == NULL)
break;
if (style->Face() == face) {
style->Acquire();
if (style->Face() == face)
break;
} else
else
style = NULL;
}
@@ -345,7 +332,6 @@ ServerFont::SetFace(uint16 face)
return B_ERROR;
SetStyle(style);
style->Release();
return B_OK;
}
+2 -1
View File
@@ -173,7 +173,8 @@ protected:
bool shear) const;
void PutTransformedFace(FT_Face face) const;
FontStyle* fStyle;
BReference<FontStyle>
fStyle;
float fSize;
float fRotation;
float fShear;
+24 -44
View File
@@ -590,7 +590,7 @@ draw_picture(void* _canvas, const BPoint& where, int32 token)
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
ServerPicture* picture = canvas->GetPicture(token);
BReference<ServerPicture> picture(canvas->GetPicture(token), true);
if (picture != NULL) {
canvas->PushState();
canvas->SetDrawingOrigin(where);
@@ -600,7 +600,6 @@ draw_picture(void* _canvas, const BPoint& where, int32 token)
canvas->PopState();
canvas->PopState();
picture->ReleaseReference();
}
}
@@ -630,19 +629,15 @@ clip_to_picture(void* _canvas, int32 pictureToken, const BPoint& where,
{
Canvas* const canvas = reinterpret_cast<Canvas*>(_canvas);
ServerPicture* picture = canvas->GetPicture(pictureToken);
BReference<ServerPicture> picture(canvas->GetPicture(pictureToken), true);
if (picture == NULL)
return;
AlphaMask* mask = new(std::nothrow) PictureAlphaMask(canvas->GetAlphaMask(),
picture, *canvas->CurrentState(), where, clipToInverse);
BReference<AlphaMask> mask(new(std::nothrow) PictureAlphaMask(canvas->GetAlphaMask(),
picture, *canvas->CurrentState(), where, clipToInverse), true);
canvas->SetAlphaMask(mask);
canvas->CurrentState()->GetAlphaMask()->SetCanvasGeometry(BPoint(0, 0),
canvas->Bounds());
canvas->ResyncDrawState();
if (mask != NULL)
mask->ReleaseReference();
picture->ReleaseReference();
}
@@ -1082,14 +1077,12 @@ static const BPrivate::picture_player_callbacks kPicturePlayerCallbacks = {
ServerPicture::ServerPicture()
:
fFile(NULL),
fPictures(NULL),
fPushed(NULL),
fOwner(NULL)
{
fToken = gTokenSpace.NewToken(kPictureToken, this);
fData = new(std::nothrow) BMallocIO();
fData.SetTo(new(std::nothrow) BMallocIO());
PictureDataWriter::SetTo(fData);
PictureDataWriter::SetTo(fData.Get());
}
@@ -1097,8 +1090,6 @@ ServerPicture::ServerPicture(const ServerPicture& picture)
:
fFile(NULL),
fData(NULL),
fPictures(NULL),
fPushed(NULL),
fOwner(NULL)
{
fToken = gTokenSpace.NewToken(kPictureToken, this);
@@ -1107,7 +1098,7 @@ ServerPicture::ServerPicture(const ServerPicture& picture)
if (mallocIO == NULL)
return;
fData = mallocIO;
fData.SetTo(mallocIO);
const off_t size = picture.DataLength();
if (mallocIO->SetSize(size) < B_OK)
@@ -1116,7 +1107,7 @@ ServerPicture::ServerPicture(const ServerPicture& picture)
picture.fData->ReadAt(0, const_cast<void*>(mallocIO->Buffer()),
size);
PictureDataWriter::SetTo(fData);
PictureDataWriter::SetTo(fData.Get());
}
@@ -1124,26 +1115,24 @@ ServerPicture::ServerPicture(const char* fileName, int32 offset)
:
fFile(NULL),
fData(NULL),
fPictures(NULL),
fPushed(NULL),
fOwner(NULL)
{
fToken = gTokenSpace.NewToken(kPictureToken, this);
fFile = new(std::nothrow) BFile(fileName, B_READ_WRITE);
if (fFile == NULL)
fFile.SetTo(new(std::nothrow) BFile(fileName, B_READ_WRITE));
if (fFile.Get() == NULL)
return;
BPrivate::Storage::OffsetFile* offsetFile
= new(std::nothrow) BPrivate::Storage::OffsetFile(fFile, offset);
= new(std::nothrow) BPrivate::Storage::OffsetFile(fFile.Get(), offset);
if (offsetFile == NULL || offsetFile->InitCheck() != B_OK) {
delete offsetFile;
return;
}
fData = offsetFile;
fData.SetTo(offsetFile);
PictureDataWriter::SetTo(fData);
PictureDataWriter::SetTo(fData.Get());
}
@@ -1151,24 +1140,18 @@ ServerPicture::~ServerPicture()
{
ASSERT(fOwner == NULL);
delete fData;
delete fFile;
gTokenSpace.RemoveToken(fToken);
if (fPictures != NULL) {
if (fPictures.Get() != NULL) {
for (int32 i = fPictures->CountItems(); i-- > 0;) {
ServerPicture* picture = fPictures->ItemAt(i);
picture->SetOwner(NULL);
picture->ReleaseReference();
}
delete fPictures;
}
if (fPushed != NULL) {
if (fPushed != NULL)
fPushed->SetOwner(NULL);
fPushed->ReleaseReference();
}
}
@@ -1288,12 +1271,12 @@ ServerPicture::Play(Canvas* target)
{
// TODO: for now: then change PicturePlayer
// to accept a BPositionIO object
BMallocIO* mallocIO = dynamic_cast<BMallocIO*>(fData);
BMallocIO* mallocIO = dynamic_cast<BMallocIO*>(fData.Get());
if (mallocIO == NULL)
return;
BPrivate::PicturePlayer player(mallocIO->Buffer(),
mallocIO->BufferLength(), PictureList::Private(fPictures).AsBList());
mallocIO->BufferLength(), PictureList::Private(fPictures.Get()).AsBList());
player.Play(kPicturePlayerCallbacks, sizeof(kPicturePlayerCallbacks),
target);
}
@@ -1307,8 +1290,7 @@ ServerPicture::PushPicture(ServerPicture* picture)
if (fPushed != NULL)
debugger("already pushed a picture");
fPushed = picture;
fPushed->AcquireReference();
fPushed.SetTo(picture, false);
}
@@ -1317,9 +1299,7 @@ ServerPicture::PushPicture(ServerPicture* picture)
ServerPicture*
ServerPicture::PopPicture()
{
ServerPicture* old = fPushed;
fPushed = NULL;
return old;
return fPushed.Detach();
}
@@ -1334,10 +1314,10 @@ ServerPicture::AppendPicture(ServerPicture* picture)
bool
ServerPicture::NestPicture(ServerPicture* picture)
{
if (fPictures == NULL)
fPictures = new(std::nothrow) PictureList;
if (fPictures.Get() == NULL)
fPictures.SetTo(new(std::nothrow) PictureList);
if (fPictures == NULL || !fPictures->AddItem(picture))
if (fPictures.Get() == NULL || !fPictures->AddItem(picture))
return false;
picture->AcquireReference();
@@ -1348,7 +1328,7 @@ ServerPicture::NestPicture(ServerPicture* picture)
off_t
ServerPicture::DataLength() const
{
if (fData == NULL)
if (fData.Get() == NULL)
return 0;
off_t size;
fData->GetSize(&size);
@@ -1389,7 +1369,7 @@ ServerPicture::ExportData(BPrivate::PortLink& link)
fData->Seek(0, SEEK_SET);
int32 subPicturesCount = 0;
if (fPictures != NULL)
if (fPictures.Get() != NULL)
subPicturesCount = fPictures->CountItems();
link.Attach<int32>(subPicturesCount);
if (subPicturesCount > 0) {
+9 -4
View File
@@ -14,6 +14,7 @@
#include <DataIO.h>
#include <AutoDeleter.h>
#include <ObjectList.h>
#include <PictureDataWriter.h>
#include <Referenceable.h>
@@ -72,10 +73,14 @@ private:
typedef BObjectList<ServerPicture> PictureList;
int32 fToken;
BFile* fFile;
BPositionIO* fData;
PictureList* fPictures;
ServerPicture* fPushed;
ObjectDeleter<BFile>
fFile;
ObjectDeleter<BPositionIO>
fData;
ObjectDeleter<PictureList>
fPictures;
BReference<ServerPicture>
fPushed;
ServerApp* fOwner;
};
+19 -43
View File
@@ -2021,7 +2021,7 @@ fDesktop->LockSingleWindow();
rgb_color colorKey = {0};
if (status == B_OK) {
ServerBitmap* bitmap = fServerApp->GetBitmap(bitmapToken);
BReference<ServerBitmap> bitmap(fServerApp->GetBitmap(bitmapToken), true);
if (bitmapToken == -1 || bitmap != NULL) {
bool wasOverlay = fCurrentView->ViewBitmap() != NULL
&& fCurrentView->ViewBitmap()->Overlay() != NULL;
@@ -2045,9 +2045,6 @@ fDesktop->LockSingleWindow();
bitmap->Overlay()->SetFlags(options);
colorKey = bitmap->Overlay()->Color();
}
if (bitmap != NULL)
bitmap->ReleaseReference();
} else
status = B_BAD_VALUE;
}
@@ -2093,20 +2090,16 @@ fDesktop->LockSingleWindow();
if (link.Read<bool>(&inverse) != B_OK)
break;
ServerPicture* picture = fServerApp->GetPicture(pictureToken);
BReference<ServerPicture> picture(fServerApp->GetPicture(pictureToken), true);
if (picture == NULL)
break;
AlphaMask* const mask = new(std::nothrow) PictureAlphaMask(
BReference<AlphaMask> const mask(new(std::nothrow) PictureAlphaMask(
fCurrentView->GetAlphaMask(), picture,
*fCurrentView->CurrentState(), where, inverse);
*fCurrentView->CurrentState(), where, inverse), true);
fCurrentView->SetAlphaMask(mask);
if (mask != NULL)
mask->ReleaseReference();
_UpdateDrawState(fCurrentView);
picture->ReleaseReference();
break;
}
@@ -2306,15 +2299,13 @@ fDesktop->LockSingleWindow();
BMessage dragMessage;
if (link.Read(buffer, bufferSize) == B_OK
&& dragMessage.Unflatten(buffer) == B_OK) {
ServerBitmap* bitmap
= fServerApp->GetBitmap(bitmapToken);
BReference<ServerBitmap> bitmap(
fServerApp->GetBitmap(bitmapToken), true);
// TODO: possible deadlock
fDesktop->UnlockSingleWindow();
fDesktop->EventDispatcher().SetDragMessage(dragMessage,
bitmap, offset);
fDesktop->LockSingleWindow();
if (bitmap != NULL)
bitmap->ReleaseReference();
}
delete[] buffer;
}
@@ -2380,7 +2371,7 @@ fDesktop->LockSingleWindow();
{
DTRACE(("ServerWindow %s: Message AS_VIEW_BEGIN_PICTURE\n",
Title()));
ServerPicture* picture = App()->CreatePicture();
BReference<ServerPicture> picture(App()->CreatePicture(), true);
if (picture != NULL) {
picture->SyncState(fCurrentView);
fCurrentView->SetPicture(picture);
@@ -2396,14 +2387,12 @@ fDesktop->LockSingleWindow();
int32 token;
link.Read<int32>(&token);
ServerPicture* picture = App()->GetPicture(token);
BReference<ServerPicture> picture(App()->GetPicture(token), true);
if (picture != NULL)
picture->SyncState(fCurrentView);
fCurrentView->SetPicture(picture);
if (picture != NULL)
picture->ReleaseReference();
break;
}
@@ -2630,7 +2619,7 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code,
info.options |= B_FILTER_BITMAP_BILINEAR;
#endif
ServerBitmap* bitmap = fServerApp->GetBitmap(info.bitmapToken);
BReference<ServerBitmap> bitmap(fServerApp->GetBitmap(info.bitmapToken), true);
if (bitmap != NULL) {
DTRACE(("ServerWindow %s: Message AS_VIEW_DRAW_BITMAP: "
"View: %s, bitmap: %" B_PRId32 " (size %" B_PRId32 " x "
@@ -2651,8 +2640,6 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code,
drawingEngine->DrawBitmap(bitmap, info.bitmapRect,
info.viewRect, info.options);
bitmap->ReleaseReference();
}
break;
}
@@ -3162,7 +3149,7 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code,
BPoint where;
if (link.Read<BPoint>(&where) == B_OK) {
ServerPicture* picture = App()->GetPicture(token);
BReference<ServerPicture> picture(App()->GetPicture(token), true);
if (picture != NULL) {
// Setting the drawing origin outside of the
// state makes sure that everything the picture
@@ -3175,8 +3162,6 @@ ServerWindow::_DispatchViewDrawingMessage(int32 code,
fCurrentView->PopState();
fCurrentView->PopState();
picture->ReleaseReference();
}
}
break;
@@ -3902,7 +3887,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
ViewDrawBitmapInfo info;
link.Read<ViewDrawBitmapInfo>(&info);
ServerBitmap* bitmap = App()->GetBitmap(info.bitmapToken);
BReference<ServerBitmap> bitmap(App()->GetBitmap(info.bitmapToken), true);
if (bitmap == NULL)
break;
@@ -3911,7 +3896,6 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
bitmap->ColorSpace(), info.options, bitmap->Bits(),
bitmap->BitsLength());
bitmap->ReleaseReference();
break;
}
@@ -3922,15 +3906,13 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
BPoint where;
if (link.Read<BPoint>(&where) == B_OK) {
ServerPicture* pictureToDraw = App()->GetPicture(token);
BReference<ServerPicture> pictureToDraw(App()->GetPicture(token), true);
if (pictureToDraw != NULL) {
// We need to make a copy of the picture, since it can
// change after it has been drawn
ServerPicture* copy = App()->CreatePicture(pictureToDraw);
BReference<ServerPicture> copy(App()->CreatePicture(pictureToDraw), true);
picture->NestPicture(copy);
picture->WriteDrawPicture(where, copy->Token());
pictureToDraw->ReleaseReference();
}
}
break;
@@ -3975,15 +3957,13 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
if (link.Read<bool>(&inverse) != B_OK)
break;
ServerPicture* pictureToClip = fServerApp->GetPicture(pictureToken);
BReference<ServerPicture> pictureToClip(fServerApp->GetPicture(pictureToken), true);
if (pictureToClip != NULL) {
// We need to make a copy of the picture, since it can
// change after it has been drawn
ServerPicture* copy = App()->CreatePicture(pictureToClip);
BReference<ServerPicture> copy(App()->CreatePicture(pictureToClip), true);
picture->NestPicture(copy);
picture->WriteClipToPicture(copy->Token(), where, inverse);
pictureToClip->ReleaseReference();
}
break;
}
@@ -4024,7 +4004,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
case AS_VIEW_BEGIN_PICTURE:
{
ServerPicture* newPicture = App()->CreatePicture();
BReference <ServerPicture> newPicture(App()->CreatePicture(), true);
if (newPicture != NULL) {
newPicture->PushPicture(picture);
newPicture->SyncState(fCurrentView);
@@ -4038,7 +4018,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
int32 token;
link.Read<int32>(&token);
ServerPicture* appendPicture = App()->GetPicture(token);
BReference<ServerPicture> appendPicture(App()->GetPicture(token), true);
if (appendPicture != NULL) {
//picture->SyncState(fCurrentView);
appendPicture->AppendPicture(picture);
@@ -4046,17 +4026,13 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
fCurrentView->SetPicture(appendPicture);
if (appendPicture != NULL)
appendPicture->ReleaseReference();
break;
}
case AS_VIEW_END_PICTURE:
{
ServerPicture* poppedPicture = picture->PopPicture();
BReference<ServerPicture> poppedPicture(picture->PopPicture(), true);
fCurrentView->SetPicture(poppedPicture);
if (poppedPicture != NULL)
poppedPicture->ReleaseReference();
fLink.StartMessage(B_OK);
fLink.Attach<int32>(picture->Token());
@@ -4095,7 +4071,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
if (layer == NULL)
break;
Layer* previousLayer = layer->PopLayer();
BReference<Layer> previousLayer(layer->PopLayer(), true);
if (previousLayer == NULL) {
// End last layer
return false;
+34 -67
View File
@@ -126,26 +126,13 @@ View::View(IntRect frame, IntPoint scrollingOffset, const char* name,
fUserClipping(NULL),
fScreenAndUserClipping(NULL)
{
if (fDrawState)
if (fDrawState.Get() != NULL)
fDrawState->SetSubPixelPrecise(fFlags & B_SUBPIXEL_PRECISE);
}
View::~View()
{
if (fViewBitmap != NULL)
fViewBitmap->ReleaseReference();
delete fScreenAndUserClipping;
delete fUserClipping;
delete fDrawState;
// if (fWindow && this == fWindow->TopView())
// fWindow->SetTopView(NULL);
if (fCursor)
fCursor->ReleaseReference();
// iterate over children and delete each one
View* view = fFirstChild;
while (view) {
@@ -517,15 +504,9 @@ View::SetViewBitmap(ServerBitmap* bitmap, IntRect sourceRect,
newOverlay->TakeOverToken(overlay);
} else if (overlay != NULL)
overlay->Hide();
fViewBitmap->ReleaseReference();
}
// the caller is allowed to delete the bitmap after setting the background
if (bitmap != NULL)
bitmap->AcquireReference();
fViewBitmap = bitmap;
fViewBitmap.SetTo(bitmap, false);
fBitmapSource = sourceRect;
fBitmapDestination = destRect;
fBitmapResizingMode = resizingMode;
@@ -985,15 +966,17 @@ View::ViewUIColor(float* tint)
void
View::PushState()
{
DrawState* newState = fDrawState->PushState();
if (newState) {
fDrawState = newState;
// In BeAPI, B_SUBPIXEL_PRECISE is a view flag, and not affected by the
// view state. Our implementation moves it to the draw state, but let's
// be compatible with the API here and make it survive accross state
// changes.
fDrawState->SetSubPixelPrecise(fFlags & B_SUBPIXEL_PRECISE);
}
DrawState* previousState = fDrawState.Detach();
DrawState* newState = previousState->PushState();
if (newState == NULL)
newState = previousState;
fDrawState.SetTo(newState);
// In BeAPI, B_SUBPIXEL_PRECISE is a view flag, and not affected by the
// view state. Our implementation moves it to the draw state, but let's
// be compatible with the API here and make it survive accross state
// changes.
fDrawState->SetSubPixelPrecise(fFlags & B_SUBPIXEL_PRECISE);
}
@@ -1008,7 +991,7 @@ View::PopState()
bool rebuildClipping = fDrawState->HasAdditionalClipping();
fDrawState = fDrawState->PopState();
fDrawState.SetTo(fDrawState->PopState());
fDrawState->SetSubPixelPrecise(fFlags & B_SUBPIXEL_PRECISE);
// rebuild clipping
@@ -1035,13 +1018,7 @@ View::SetCursor(ServerCursor* cursor)
if (cursor == fCursor)
return;
if (fCursor)
fCursor->ReleaseReference();
fCursor = cursor;
if (fCursor)
fCursor->AcquireReference();
fCursor.SetTo(cursor, false);
}
@@ -1051,13 +1028,7 @@ View::SetPicture(ServerPicture* picture)
if (picture == fPicture)
return;
if (fPicture != NULL)
fPicture->ReleaseReference();
fPicture = picture;
if (fPicture != NULL)
fPicture->AcquireReference();
fPicture.SetTo(picture, false);
}
@@ -1066,7 +1037,7 @@ View::BlendAllLayers()
{
if (fPicture == NULL)
return;
Layer* layer = dynamic_cast<Layer*>(fPicture);
Layer* layer = dynamic_cast<Layer*>(fPicture.Get());
if (layer == NULL)
return;
BlendLayer(layer);
@@ -1378,13 +1349,13 @@ View::PrintToStream() const
printf(" valid: %d\n", fScreenClippingValid);
printf(" fUserClipping:\n");
if (fUserClipping != NULL)
if (fUserClipping.Get() != NULL)
fUserClipping->PrintToStream();
else
printf(" none\n");
printf(" fScreenAndUserClipping:\n");
if (fScreenAndUserClipping != NULL)
if (fScreenAndUserClipping.Get() != NULL)
fScreenAndUserClipping->PrintToStream();
else
printf(" invalid\n");
@@ -1438,20 +1409,18 @@ View::RebuildClipping(bool deep)
// hand, views for which this feature is actually used will
// probably not have any children, so it is not that expensive
// after all
if (fUserClipping == NULL) {
fUserClipping = new (nothrow) BRegion;
if (fUserClipping == NULL)
if (fUserClipping.Get() == NULL) {
fUserClipping.SetTo(new (nothrow) BRegion);
if (fUserClipping.Get() == NULL)
return;
}
fDrawState->GetCombinedClippingRegion(fUserClipping);
fDrawState->GetCombinedClippingRegion(fUserClipping.Get());
} else {
delete fUserClipping;
fUserClipping = NULL;
fUserClipping.SetTo(NULL);
}
delete fScreenAndUserClipping;
fScreenAndUserClipping = NULL;
fScreenAndUserClipping.SetTo(NULL);
fScreenClippingValid = false;
}
@@ -1460,22 +1429,22 @@ BRegion&
View::ScreenAndUserClipping(BRegion* windowContentClipping, bool force) const
{
// no user clipping - return screen clipping directly
if (fUserClipping == NULL)
if (fUserClipping.Get() == NULL)
return _ScreenClipping(windowContentClipping, force);
// combined screen and user clipping already valid
if (fScreenAndUserClipping != NULL)
return *fScreenAndUserClipping;
if (fScreenAndUserClipping.Get() != NULL)
return *fScreenAndUserClipping.Get();
// build a new combined user and screen clipping
fScreenAndUserClipping = new (nothrow) BRegion(*fUserClipping);
if (fScreenAndUserClipping == NULL)
fScreenAndUserClipping.SetTo(new (nothrow) BRegion(*fUserClipping.Get()));
if (fScreenAndUserClipping.Get() == NULL)
return fScreenClipping;
LocalToScreenTransform().Apply(fScreenAndUserClipping);
LocalToScreenTransform().Apply(fScreenAndUserClipping.Get());
fScreenAndUserClipping->IntersectWith(
&_ScreenClipping(windowContentClipping, force));
return *fScreenAndUserClipping;
return *fScreenAndUserClipping.Get();
}
@@ -1498,8 +1467,7 @@ View::InvalidateScreenClipping()
// if (!fScreenClippingValid)
// return;
delete fScreenAndUserClipping;
fScreenAndUserClipping = NULL;
fScreenAndUserClipping.SetTo(NULL);
fScreenClippingValid = false;
// invalidate the childrens screen clipping as well
for (View* child = FirstChild(); child; child = child->NextSibling()) {
@@ -1539,8 +1507,7 @@ View::_MoveScreenClipping(int32 x, int32 y, bool deep)
{
if (fScreenClippingValid) {
fScreenClipping.OffsetBy(x, y);
delete fScreenAndUserClipping;
fScreenAndUserClipping = NULL;
fScreenAndUserClipping.SetTo(NULL);
}
if (deep) {
+15 -8
View File
@@ -19,10 +19,12 @@
#include "Canvas.h"
#include "IntRect.h"
#include <AutoDeleter.h>
#include <GraphicsDefs.h>
#include <InterfaceDefs.h>
#include <ObjectList.h>
#include <Region.h>
#include <Referenceable.h>
#include <String.h>
class BList;
@@ -208,9 +210,9 @@ public:
inline bool IsScreenClippingValid() const
{
return fScreenClippingValid
&& (fUserClipping == NULL
|| (fUserClipping != NULL
&& fScreenAndUserClipping != NULL));
&& (fUserClipping.Get() == NULL
|| (fUserClipping.Get() != NULL
&& fScreenAndUserClipping.Get() != NULL));
}
// debugging
@@ -243,7 +245,8 @@ protected:
rgb_color fViewColor;
color_which fWhichViewColor;
float fWhichViewColorTint;
ServerBitmap* fViewBitmap;
BReference<ServerBitmap>
fViewBitmap;
IntRect fBitmapSource;
IntRect fBitmapDestination;
int32 fBitmapResizingMode;
@@ -267,8 +270,10 @@ protected:
View* fNextSibling;
View* fLastChild;
ServerCursor* fCursor;
ServerPicture* fPicture;
BReference<ServerCursor>
fCursor;
BReference<ServerPicture>
fPicture;
// clipping
BRegion fLocalClipping;
@@ -276,8 +281,10 @@ protected:
mutable BRegion fScreenClipping;
mutable bool fScreenClippingValid;
BRegion* fUserClipping;
mutable BRegion* fScreenAndUserClipping;
ObjectDeleter<BRegion>
fUserClipping;
mutable ObjectDeleter<BRegion>
fScreenAndUserClipping;
};
#endif // VIEW_H
+3 -4
View File
@@ -338,13 +338,13 @@ VectorAlphaMask<VectorMaskType>::_RenderSource(const IntRect& canvasBounds)
// Render the picture to the bitmap
BitmapHWInterface interface(bitmap);
DrawingEngine* engine = interface.CreateDrawingEngine();
if (engine == NULL)
ObjectDeleter<DrawingEngine> engine(interface.CreateDrawingEngine());
if (engine.Get() == NULL)
return NULL;
engine->SetRendererOffset(fBounds.left, fBounds.top);
OffscreenCanvas canvas(engine,
OffscreenCanvas canvas(engine.Get(),
static_cast<VectorMaskType*>(this)->GetDrawState(), fBounds);
DrawState* const drawState = canvas.CurrentState();
@@ -364,7 +364,6 @@ VectorAlphaMask<VectorMaskType>::_RenderSource(const IntRect& canvasBounds)
}
canvas.PopState();
delete engine;
return bitmap.Detach();
}
@@ -48,29 +48,23 @@ BitmapDrawingEngine::SetSize(int32 newWidth, int32 newHeight)
}
SetHWInterface(NULL);
if (fHWInterface != NULL) {
if (fHWInterface.Get() != NULL) {
fHWInterface->LockExclusiveAccess();
fHWInterface->Shutdown();
fHWInterface->UnlockExclusiveAccess();
delete fHWInterface;
fHWInterface = NULL;
}
if (fBitmap != NULL) {
fBitmap->ReleaseReference();
fBitmap = NULL;
fHWInterface.Unset();
}
if (newWidth <= 0 || newHeight <= 0)
return B_OK;
fBitmap = new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1,
newHeight - 1), fColorSpace, 0);
if (fBitmap == NULL)
fBitmap.SetTo(new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1,
newHeight - 1), fColorSpace, 0));
if (fBitmap.Get() == NULL)
return B_NO_MEMORY;
fHWInterface = new(std::nothrow) BitmapHWInterface(fBitmap);
if (fHWInterface == NULL)
fHWInterface.SetTo(new(std::nothrow) BitmapHWInterface(fBitmap));
if (fHWInterface.Get() == NULL)
return B_NO_MEMORY;
status_t result = fHWInterface->Initialize();
@@ -80,7 +74,7 @@ BitmapDrawingEngine::SetSize(int32 newWidth, int32 newHeight)
// we have to set a valid clipping first
fClipping.Set(fBitmap->Bounds());
ConstrainClippingRegion(&fClipping);
SetHWInterface(fHWInterface);
SetHWInterface(fHWInterface.Get());
return B_OK;
}
@@ -2,6 +2,9 @@
#define BITMAP_DRAWING_ENGINE_H
#include "DrawingEngine.h"
#include <AutoDeleter.h>
#include <Referenceable.h>
#include <Region.h>
class BitmapHWInterface;
@@ -24,8 +27,10 @@ virtual ~BitmapDrawingEngine();
private:
color_space fColorSpace;
BitmapHWInterface* fHWInterface;
UtilityBitmap* fBitmap;
ObjectDeleter<BitmapHWInterface>
fHWInterface;
BReference<UtilityBitmap>
fBitmap;
BRegion fClipping;
};
+37 -76
View File
@@ -43,7 +43,6 @@ HWInterfaceListener::~HWInterfaceListener()
HWInterface::HWInterface(bool doubleBuffered, bool enableUpdateQueue)
:
MultiLocker("hw interface lock"),
fCursorAreaBackup(NULL),
fFloatingOverlaysLock("floating overlays lock"),
fCursor(NULL),
fDragBitmap(NULL),
@@ -65,12 +64,6 @@ HWInterface::HWInterface(bool doubleBuffered, bool enableUpdateQueue)
HWInterface::~HWInterface()
{
SetAsyncDoubleBuffered(false);
delete fCursorAreaBackup;
// The standard cursor doesn't belong us - the drag bitmap might
if (fCursor != fCursorAndDragBitmap)
delete fCursorAndDragBitmap;
}
@@ -132,25 +125,14 @@ HWInterface::SetCursor(ServerCursor* cursor)
if (!fFloatingOverlaysLock.Lock())
return;
if (fCursor != cursor) {
if (fCursor.Get() != cursor) {
BRect oldFrame = _CursorFrame();
if (fCursorAndDragBitmap == fCursor) {
// make sure _AdoptDragBitmap doesn't delete a real cursor
fCursorAndDragBitmap = NULL;
}
if (fCursor)
fCursor->ReleaseReference();
fCursor = cursor;
if (fCursor)
fCursor->AcquireReference();
fCursor.SetTo(cursor);
Invalidate(oldFrame);
_AdoptDragBitmap(fDragBitmap, fDragBitmapOffset);
_AdoptDragBitmap();
Invalidate(_CursorFrame());
}
fFloatingOverlaysLock.Unlock();
@@ -163,9 +145,8 @@ HWInterface::Cursor() const
if (!fFloatingOverlaysLock.Lock())
return ServerCursorReference(NULL);
ServerCursorReference reference(fCursor);
fFloatingOverlaysLock.Unlock();
return reference;
return fCursor;
}
@@ -175,9 +156,8 @@ HWInterface::CursorAndDragBitmap() const
if (!fFloatingOverlaysLock.Lock())
return ServerCursorReference(NULL);
ServerCursorReference reference(fCursorAndDragBitmap);
fFloatingOverlaysLock.Unlock();
return reference;
return fCursorAndDragBitmap;
}
@@ -255,7 +235,7 @@ HWInterface::MoveCursorTo(float x, float y)
// anything if the cursor is hidden
// (invalid cursor frame), but explicitly
// testing for it here saves us some cycles
if (fCursorAreaBackup) {
if (fCursorAreaBackup.Get() != NULL) {
// means we have a software cursor which we need to draw
_RestoreCursorArea();
_DrawCursor(_CursorFrame());
@@ -290,7 +270,9 @@ HWInterface::SetDragBitmap(const ServerBitmap* bitmap,
const BPoint& offsetFromCursor)
{
if (fFloatingOverlaysLock.Lock()) {
_AdoptDragBitmap(bitmap, offsetFromCursor);
fDragBitmap.SetTo((ServerBitmap*)bitmap, false);
fDragBitmapOffset = offsetFromCursor;
_AdoptDragBitmap();
fFloatingOverlaysLock.Unlock();
}
}
@@ -312,16 +294,15 @@ void
HWInterface::SetAsyncDoubleBuffered(bool doubleBuffered)
{
if (doubleBuffered) {
if (fUpdateExecutor != NULL)
if (fUpdateExecutor.Get() != NULL)
return;
fUpdateExecutor = new (nothrow) UpdateQueue(this);
AddListener(fUpdateExecutor);
fUpdateExecutor.SetTo(new (nothrow) UpdateQueue(this));
AddListener(fUpdateExecutor.Get());
} else {
if (fUpdateExecutor == NULL)
if (fUpdateExecutor.Get() == NULL)
return;
RemoveListener(fUpdateExecutor);
delete fUpdateExecutor;
fUpdateExecutor = NULL;
RemoveListener(fUpdateExecutor.Get());
fUpdateExecutor.Unset();
}
}
@@ -499,7 +480,7 @@ HWInterface::HideFloatingOverlays(const BRect& area)
return false;
if (!fFloatingOverlaysLock.Lock())
return false;
if (fCursorAreaBackup && !fCursorAreaBackup->cursor_hidden) {
if (fCursorAreaBackup.Get() != NULL && !fCursorAreaBackup->cursor_hidden) {
BRect backupArea(fCursorAreaBackup->left, fCursorAreaBackup->top,
fCursorAreaBackup->right, fCursorAreaBackup->bottom);
if (area.Intersects(backupArea)) {
@@ -529,7 +510,7 @@ HWInterface::HideFloatingOverlays()
void
HWInterface::ShowFloatingOverlays()
{
if (fCursorAreaBackup && fCursorAreaBackup->cursor_hidden)
if (fCursorAreaBackup.Get() != NULL && fCursorAreaBackup->cursor_hidden)
_DrawCursor(_CursorFrame());
fFloatingOverlaysLock.Unlock();
@@ -607,7 +588,7 @@ HWInterface::_DrawCursor(IntRect area) const
uint8* dst = buffer;
if (fCursorAreaBackup && fCursorAreaBackup->buffer
if (fCursorAreaBackup.Get() != NULL && fCursorAreaBackup->buffer
&& fFloatingOverlaysLock.Lock()) {
fCursorAreaBackup->cursor_hidden = false;
// remember which area the backup contains
@@ -904,7 +885,7 @@ HWInterface::_CursorFrame() const
void
HWInterface::_RestoreCursorArea() const
{
if (fCursorAreaBackup && !fCursorAreaBackup->cursor_hidden) {
if (fCursorAreaBackup.Get() != NULL && !fCursorAreaBackup->cursor_hidden) {
_CopyToFront(fCursorAreaBackup->buffer, fCursorAreaBackup->bpr,
fCursorAreaBackup->left, fCursorAreaBackup->top,
fCursorAreaBackup->right, fCursorAreaBackup->bottom);
@@ -915,11 +896,11 @@ HWInterface::_RestoreCursorArea() const
void
HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
HWInterface::_AdoptDragBitmap()
{
// TODO: support other colorspaces/convert bitmap
if (bitmap && !(bitmap->ColorSpace() == B_RGB32
|| bitmap->ColorSpace() == B_RGBA32)) {
if (fDragBitmap && !(fDragBitmap->ColorSpace() == B_RGB32
|| fDragBitmap->ColorSpace() == B_RGBA32)) {
fprintf(stderr, "HWInterface::_AdoptDragBitmap() - bitmap has yet "
"unsupported colorspace\n");
return;
@@ -928,17 +909,12 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
_RestoreCursorArea();
BRect oldCursorFrame = _CursorFrame();
if (fCursorAndDragBitmap && fCursorAndDragBitmap != fCursor) {
delete fCursorAndDragBitmap;
fCursorAndDragBitmap = NULL;
}
if (bitmap != NULL && bitmap->Bounds().Width() > 0 && bitmap->Bounds().Height() > 0) {
BRect bitmapFrame = bitmap->Bounds();
if (fDragBitmap != NULL && fDragBitmap->Bounds().Width() > 0 && fDragBitmap->Bounds().Height() > 0) {
BRect bitmapFrame = fDragBitmap->Bounds();
if (fCursor) {
// put bitmap frame and cursor frame into the same
// coordinate space (the cursor location is the origin)
bitmapFrame.OffsetTo(BPoint(-offset.x, -offset.y));
bitmapFrame.OffsetTo(BPoint(-fDragBitmapOffset.x, -fDragBitmapOffset.y));
BRect cursorFrame(fCursor->Bounds());
BPoint hotspot(fCursor->GetHotSpot());
@@ -955,14 +931,13 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
cursorFrame.OffsetBy(shift);
bitmapFrame.OffsetBy(shift);
fCursorAndDragBitmap = new(std::nothrow) ServerCursor(combindedBounds,
bitmap->ColorSpace(), 0, shift);
fCursorAndDragBitmap.SetTo(new(std::nothrow) ServerCursor(combindedBounds,
fDragBitmap->ColorSpace(), 0, shift), true);
uint8* dst = fCursorAndDragBitmap ? (uint8*)fCursorAndDragBitmap->Bits() : NULL;
if (dst == NULL) {
// Oops, we could not allocate memory for the drag bitmap.
// Let's show the cursor only.
delete fCursorAndDragBitmap;
fCursorAndDragBitmap = fCursor;
} else {
// clear the combined buffer
@@ -971,8 +946,8 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
memset(dst, 0, fCursorAndDragBitmap->BitsLength());
// put drag bitmap into combined buffer
uint8* src = (uint8*)bitmap->Bits();
uint32 srcBPR = bitmap->BytesPerRow();
uint8* src = (uint8*)fDragBitmap->Bits();
uint32 srcBPR = fDragBitmap->BytesPerRow();
dst += (int32)bitmapFrame.top * dstBPR
+ (int32)bitmapFrame.left * 4;
@@ -1055,10 +1030,10 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
}
}
} else {
fCursorAndDragBitmap = new ServerCursor(bitmap->Bits(),
fCursorAndDragBitmap.SetTo(new ServerCursor(fDragBitmap->Bits(),
bitmapFrame.IntegerWidth() + 1, bitmapFrame.IntegerHeight() + 1,
bitmap->ColorSpace());
fCursorAndDragBitmap->SetHotSpot(BPoint(-offset.x, -offset.y));
fDragBitmap->ColorSpace()), true);
fCursorAndDragBitmap->SetHotSpot(BPoint(-fDragBitmapOffset.x, -fDragBitmapOffset.y));
}
} else {
fCursorAndDragBitmap = fCursor;
@@ -1066,31 +1041,17 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset)
Invalidate(oldCursorFrame);
// NOTE: the EventDispatcher does the reference counting stuff for us
// TODO: You can not simply call Release() on a ServerBitmap like you
// can for a ServerCursor... it could be changed, but there are linking
// troubles with the test environment that need to be solved than.
// if (fDragBitmap)
// fDragBitmap->Release();
fDragBitmap = bitmap;
fDragBitmapOffset = offset;
// if (fDragBitmap)
// fDragBitmap->Acquire();
delete fCursorAreaBackup;
fCursorAreaBackup = NULL;
fCursorAreaBackup.Unset();
if (!fCursorAndDragBitmap)
return;
if (fCursorAndDragBitmap && !IsDoubleBuffered()) {
BRect cursorBounds = fCursorAndDragBitmap->Bounds();
fCursorAreaBackup = new buffer_clip(cursorBounds.IntegerWidth() + 1,
cursorBounds.IntegerHeight() + 1);
if (fCursorAreaBackup->buffer == NULL) {
delete fCursorAreaBackup;
fCursorAreaBackup = NULL;
}
fCursorAreaBackup.SetTo(new buffer_clip(cursorBounds.IntegerWidth() + 1,
cursorBounds.IntegerHeight() + 1));
if (fCursorAreaBackup->buffer == NULL)
fCursorAreaBackup.Unset();
}
_DrawCursor(_CursorFrame());
}
+12 -7
View File
@@ -9,6 +9,7 @@
#define HW_INTERFACE_H
#include <AutoDeleter.h>
#include <Accelerant.h>
#include <GraphicsCard.h>
#include <List.h>
@@ -209,8 +210,7 @@ protected:
IntRect _CursorFrame() const;
void _RestoreCursorArea() const;
void _AdoptDragBitmap(const ServerBitmap* bitmap,
const BPoint& offset);
void _AdoptDragBitmap();
void _NotifyFrameBufferChanged();
void _NotifyScreenChanged();
@@ -250,13 +250,17 @@ protected:
bool cursor_hidden;
};
buffer_clip* fCursorAreaBackup;
ObjectDeleter<buffer_clip>
fCursorAreaBackup;
mutable BLocker fFloatingOverlaysLock;
ServerCursor* fCursor;
const ServerBitmap* fDragBitmap;
ServerCursorReference
fCursor;
BReference<ServerBitmap>
fDragBitmap;
BPoint fDragBitmapOffset;
ServerCursor* fCursorAndDragBitmap;
ServerCursorReference
fCursorAndDragBitmap;
bool fCursorVisible;
bool fCursorObscured;
bool fHardwareCursorEnabled;
@@ -268,7 +272,8 @@ protected:
int fVGADevice;
private:
UpdateQueue* fUpdateExecutor;
ObjectDeleter<UpdateQueue>
fUpdateExecutor;
BList fListeners;
};
+5 -12
View File
@@ -36,9 +36,6 @@ FontCache::FontCache()
// destructor
FontCache::~FontCache()
{
FontMap::Iterator iterator = fFontCacheEntries.GetIterator();
while (iterator.HasNext())
iterator.Next().value->ReleaseReference();
}
// Default
@@ -59,13 +56,12 @@ FontCache::FontCacheEntryFor(const ServerFont& font, bool forceVector)
AutoReadLocker readLocker(this);
FontCacheEntry* entry = fFontCacheEntries.Get(signature);
BReference<FontCacheEntry> entry = fFontCacheEntries.Get(signature);
if (entry) {
// the entry was already there
entry->AcquireReference();
//printf("FontCacheEntryFor(%ld): %p\n", font.GetFamilyAndStyle(), entry);
return entry;
return entry.Detach();
}
readLocker.Unlock();
@@ -85,19 +81,17 @@ FontCache::FontCacheEntryFor(const ServerFont& font, bool forceVector)
if (!entry) {
// remove old entries, keep entries below certain count
_ConstrainEntryCount();
entry = new (nothrow) FontCacheEntry();
entry.SetTo(new (nothrow) FontCacheEntry(), true);
if (!entry || !entry->Init(font, forceVector)
|| fFontCacheEntries.Put(signature, entry) < B_OK) {
fprintf(stderr, "FontCache::FontCacheEntryFor() - "
"out of memory or no font file\n");
delete entry;
return NULL;
}
}
//printf("FontCacheEntryFor(%ld): %p (insert)\n", font.GetFamilyAndStyle(), entry);
entry->AcquireReference();
return entry;
return entry.Detach();
}
// Recycle
@@ -153,9 +147,8 @@ FontCache::_ConstrainEntryCount()
iterator = fFontCacheEntries.GetIterator();
while (iterator.HasNext()) {
if (iterator.Next().value == leastUsedEntry) {
if (iterator.Next().value.Get() == leastUsedEntry) {
fFontCacheEntries.Remove(iterator);
leastUsedEntry->ReleaseReference();
break;
}
}
+1 -1
View File
@@ -33,7 +33,7 @@ class FontCache : public MultiLocker {
static FontCache sDefaultInstance;
typedef HashMap<HashString, FontCacheEntry*> FontMap;
typedef HashMap<HashString, BReference<FontCacheEntry> > FontMap;
FontMap fFontCacheEntries;
};
-1
View File
@@ -78,7 +78,6 @@ FontFamily::~FontFamily()
// we remove us before deleting the style, so that the font manager
// is not contacted to remove the style from us
style->_SetFontFamily(NULL, -1);
delete style;
}
}
+1 -1
View File
@@ -408,7 +408,7 @@ FontManager::_RemoveStyle(font_directory& directory, FontStyle* style)
fStyleHashTable.Remove(FontKey(style->Family()->ID(), style->ID()));
style->Release();
style->ReleaseReference();
}
+2 -1
View File
@@ -13,6 +13,7 @@
#include <HashMap.h>
#include <Looper.h>
#include <ObjectList.h>
#include <Referenceable.h>
#include <ft2build.h>
#include FT_FREETYPE_H
@@ -140,7 +141,7 @@ private:
MappingList fMappings;
FamilyList fFamilies;
HashMap<FontKey, FontStyle*> fStyleHashTable;
HashMap<FontKey, BReference<FontStyle> > fStyleHashTable;
ServerFont* fDefaultPlainFont;
ServerFont* fDefaultBoldFont;
+2 -2
View File
@@ -16,11 +16,11 @@
#include <ObjectList.h>
#include <Path.h>
#include <Rect.h>
#include <Referenceable.h>
#include <String.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include "ReferenceCounting.h"
struct node_ref;
@@ -35,7 +35,7 @@ class ServerFont;
FontStyle objects help abstract a lot of the font engine details while
still offering plenty of information the style in question.
*/
class FontStyle : public ReferenceCounting {
class FontStyle : public BReferenceable {
public:
FontStyle(node_ref& nodeRef, const char* path,
FT_Face face);