step 3, exracted code from DisplayDriver into DisplayDriverImpl, adjusted the existing implementations to derive from the new class, got rid of some "friend" stuff along the way, essentially I made room for the new Painter based DisplayDriver implementation.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@11986 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2005-03-25 17:29:20 +00:00
parent aab32edf08
commit 10612543aa
13 changed files with 3052 additions and 2973 deletions

View File

@ -47,7 +47,8 @@
\brief Sets up internal variables needed by AccelerantDriver
*/
AccelerantDriver::AccelerantDriver(void) : DisplayDriver()
AccelerantDriver::AccelerantDriver()
: DisplayDriverImpl()
{
cursor=NULL;
under_cursor=NULL;
@ -63,7 +64,7 @@ AccelerantDriver::AccelerantDriver(void) : DisplayDriver()
\brief Deletes the heap memory used by the AccelerantDriver
*/
AccelerantDriver::~AccelerantDriver(void)
AccelerantDriver::~AccelerantDriver()
{
if (cursor)
delete cursor;
@ -80,7 +81,7 @@ AccelerantDriver::~AccelerantDriver(void)
Initialize sets up the driver for display, including the initial clearing
of the screen. If things do not go as they should, false should be returned.
*/
bool AccelerantDriver::Initialize(void)
bool AccelerantDriver::Initialize()
{
int i;
char signature[1024];
@ -181,8 +182,8 @@ bool AccelerantDriver::Initialize(void)
RGBColor blue(0,0,255,0);
FillRect(BRect(0,0,1024,768),blue);
#endif
return true;
return DisplayDriver::Initialize();
}
/*!
@ -191,8 +192,10 @@ bool AccelerantDriver::Initialize(void)
Any work done by Initialize() should be undone here. Note that Shutdown() is
called even if Initialize() was unsuccessful.
*/
void AccelerantDriver::Shutdown(void)
void AccelerantDriver::Shutdown()
{
DisplayDriver::Shutdown();
#ifdef RUN_UNDER_R5
set_display_mode SetDisplayMode = (set_display_mode)accelerant_hook(B_SET_DISPLAY_MODE, NULL);
if ( SetDisplayMode )

View File

@ -29,22 +29,24 @@
#define _ACCELERANTDRIVER_H_
#include <Accelerant.h>
#include "DisplayDriver.h"
#include "PatternHandler.h"
#include "FontServer.h"
#include "LayerData.h"
#include "DisplayDriverImpl.h"
class ServerBitmap;
class ServerCursor;
class AccelerantDriver : public DisplayDriver
class AccelerantDriver : public DisplayDriverImpl
{
public:
AccelerantDriver(void);
~AccelerantDriver(void);
AccelerantDriver();
~AccelerantDriver();
bool Initialize(void);
void Shutdown(void);
bool Initialize();
void Shutdown();
virtual void InvertRect(const BRect &r);
virtual void SetMode(const int32 &mode);
@ -54,8 +56,8 @@ public:
/*
virtual status_t SetDPMSMode(const uint32 &state);
virtual uint32 DPMSMode(void) const;
virtual uint32 DPMSCapabilities(void) const;
virtual uint32 DPMSMode() const;
virtual uint32 DPMSCapabilities() const;
virtual status_t GetDeviceInfo(accelerant_device_info *info);
virtual status_t GetModeList(display_mode **mode_list, uint32 *count);
virtual status_t GetPixelClockLimits(display_mode *mode, uint32 *low, uint32 *high);

View File

@ -52,7 +52,11 @@ extern RGBColor workspace_default_color; // defined in AppServer.cpp
Subclasses should follow DisplayDriver's lead and use this function mostly
for initializing data members.
*/
BitmapDriver::BitmapDriver(void) : DisplayDriver()
BitmapDriver::BitmapDriver()
: DisplayDriverImpl(),
// NOTE: fLineThickness appeared to be never
// initialized in DisplayDriver
fLineThickness(1)
{
fTarget=NULL;
fGraphicsBuffer=NULL;
@ -64,34 +68,10 @@ BitmapDriver::BitmapDriver(void) : DisplayDriver()
Subclasses should use the destructor mostly for freeing allocated heap space.
*/
BitmapDriver::~BitmapDriver(void)
BitmapDriver::~BitmapDriver()
{
}
/*!
\brief Initializes the driver object.
\return true if successful, false if not
Initialize sets up the driver for display, including the initial clearing
of the screen. If things do not go as they should, false should be returned.
*/
bool BitmapDriver::Initialize(void)
{
// Nothing is needed because of SetTarget taking care of the work for us.
return true;
}
/*!
\brief Shuts down the driver's video subsystem
Any work done by Initialize() should be undone here. Note that Shutdown() is
called even if Initialize() was unsuccessful.
*/
void BitmapDriver::Shutdown(void)
{
// Nothing is needed here
}
void BitmapDriver::SetTarget(ServerBitmap *target)
{
Lock();
@ -669,7 +649,7 @@ bool BitmapDriver::AcquireBuffer(FBBitmap *fbmp)
return true;
}
void BitmapDriver::ReleaseBuffer(void)
void BitmapDriver::ReleaseBuffer()
{
}

View File

@ -37,11 +37,13 @@
#include <Region.h> // for clipping_rect definition
#include <Bitmap.h>
#include <OS.h>
#include "DisplayDriver.h"
#include "FontServer.h"
#include "GraphicsBuffer.h"
#include "PixelRenderer.h"
#include "DisplayDriverImpl.h"
class ServerCursor;
class ServerBitmap;
class RGBColor;
@ -60,17 +62,14 @@ class PatternHandler;
Usage: Allocate and call SetTarget on the desired ServerBitmap and start calling
graphics methods. All ServerBitmap memory belongs to the BitmapManager.
*/
class BitmapDriver : public DisplayDriver
class BitmapDriver : public DisplayDriverImpl
{
public:
BitmapDriver(void);
~BitmapDriver(void);
bool Initialize(void);
void Shutdown(void);
BitmapDriver();
~BitmapDriver();
void SetTarget(ServerBitmap *target);
ServerBitmap *GetTarget(void) const { return fTarget; }
ServerBitmap *GetTarget() const { return fTarget; }
// Settings functions
// virtual void DrawBitmap(ServerBitmap *bmp, const BRect &src, const BRect &dest, const DrawData *d);
@ -80,7 +79,7 @@ public:
virtual void InvertRect(const BRect &rect);
protected:
virtual bool AcquireBuffer(FBBitmap *bmp);
virtual void ReleaseBuffer(void);
virtual void ReleaseBuffer();
virtual void Blit(const BRect &src, const BRect &dest, const DrawData *d);
virtual void FillSolidRect(const BRect &rect, const RGBColor &color);
@ -102,6 +101,10 @@ protected:
ServerBitmap *fTarget;
GraphicsBuffer *fGraphicsBuffer;
PixelRenderer *fPixelRenderer;
// NOTE: completely outdated?
int fLineThickness;
PatternHandler fDrawPattern;
};
#endif

View File

@ -1,6 +1,8 @@
#ifndef CURSORDATA_H_
#define CURSORDATA_H_
#include <SupportDefs.h>
extern int8 default_cursor_data[];
extern int8 default_text_data[];
extern int8 default_move_data[];

View File

@ -36,6 +36,7 @@ CursorHandler::CursorHandler(DisplayDriver *driver)
fSavedData(NULL),
fCursor(NULL),
fHideLevel(0),
fDrawData(),
fDriverHidden(false),
fIsObscured(false),
fValidSaveData(false)
@ -92,28 +93,34 @@ void CursorHandler::SetCursor(ServerCursor *cursor)
This function fails if asked to move the cursor outside the screen boundaries
*/
void CursorHandler::MoveTo(const BPoint &pt)
void CursorHandler::MoveTo(BPoint pt)
{
if(pt.x<0 || pt.y<0 || (pt.x>fDriver->fDisplayMode.virtual_width-1) ||
(pt.y>fDriver->fDisplayMode.virtual_height-1))
return;
pt.x = max_c(pt.x, 0.0);
pt.y = max_c(pt.y, 0.0);
pt.x = min_c(pt.x, fDriver->DisplayMode()->virtual_width - 1);
pt.y = min_c(pt.y, fDriver->DisplayMode()->virtual_height - 1);
if (fCursorPos != pt) {
fCursorPos=pt;
if (!fSavedData)
debugger("NULL savedata\n");
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&(fDriver->fDrawData));
fPosition.OffsetTo(fCursorPos.x-fCursor->GetHotSpot().x,
fCursorPos.y-fCursor->GetHotSpot().y);
fDriver->CopyToBitmap(fSavedData,fPosition);
fDriver->fDrawData.draw_mode=B_OP_ALPHA;
fDriver->CopyBitmap(fCursor,fCursor->Bounds(),fPosition,&(fDriver->fDrawData));
fDriver->fDrawData.draw_mode=B_OP_COPY;
fDriver->Invalidate(fOldPosition);
fOldPosition=fPosition;
fDriver->Invalidate(fPosition);
fCursorPos=pt;
if (!fSavedData)
debugger("NULL savedata\n");
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&fDrawData);
fPosition.OffsetTo(fCursorPos.x-fCursor->GetHotSpot().x,
fCursorPos.y-fCursor->GetHotSpot().y);
fDriver->CopyToBitmap(fSavedData,fPosition);
fDrawData.draw_mode=B_OP_ALPHA;
fDriver->CopyBitmap(fCursor,fCursor->Bounds(),fPosition,&fDrawData);
fDrawData.draw_mode=B_OP_COPY;
fDriver->Invalidate(fOldPosition);
fOldPosition=fPosition;
fDriver->Invalidate(fPosition);
}
}
//! Shows the cursor. Unlike BView, calls are not cumulative
@ -121,31 +128,32 @@ void CursorHandler::Show(void)
{
// This call is pretty simple -- save the area underneath the cursor and draw the thing
if(fHideLevel==0)
if (fHideLevel == 0)
return;
fIsObscured=false;
fIsObscured = false;
fHideLevel--;
if(fHideLevel>0)
if (fHideLevel > 0)
return;
fOldPosition=fPosition;
fOldPosition = fPosition;
if(!fCursor)
if (!fCursor)
return;
fValidSaveData=true;
fValidSaveData = true;
if(!fSavedData)
fSavedData=new UtilityBitmap(fCursor->Bounds(),(color_space)fDriver->fDisplayMode.space,0);
if (!fSavedData)
fSavedData = new UtilityBitmap(fCursor->Bounds(),
(color_space)fDriver->DisplayMode()->space, 0);
fDriver->CopyToBitmap(fSavedData,fPosition);
fDriver->CopyToBitmap(fSavedData, fPosition);
// Draw the data to the buffer
fDriver->fDrawData.draw_mode=B_OP_ALPHA;
fDriver->CopyBitmap(fCursor,fCursor->Bounds(),fPosition,&(fDriver->fDrawData));
fDriver->fDrawData.draw_mode=B_OP_COPY;
fDrawData.draw_mode = B_OP_ALPHA;
fDriver->CopyBitmap(fCursor, fCursor->Bounds(), fPosition, &fDrawData);
fDrawData.draw_mode = B_OP_COPY;
fDriver->Invalidate(fPosition);
}
@ -172,7 +180,7 @@ void CursorHandler::Hide(void)
if(!fSavedData)
fSavedData=new UtilityBitmap(fCursor);
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&(fDriver->fDrawData));
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&fDrawData);
fDriver->Invalidate(fPosition);
}
@ -193,7 +201,7 @@ void CursorHandler::Obscure(void)
return;
}
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&(fDriver->fDrawData));
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&fDrawData);
fDriver->Invalidate(fPosition);
}
@ -210,7 +218,7 @@ void CursorHandler::DriverHide(void)
if(!fSavedData)
fSavedData=new UtilityBitmap(fCursor);
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&(fDriver->fDrawData));
fDriver->CopyBitmap(fSavedData,fSavedData->Bounds(),fOldPosition,&fDrawData);
fDriver->Invalidate(fPosition);
}
@ -229,13 +237,13 @@ void CursorHandler::DriverShow(void)
fValidSaveData=true;
if(!fSavedData)
fSavedData=new UtilityBitmap(fCursor->Bounds(),(color_space)fDriver->fDisplayMode.space,0);
fSavedData=new UtilityBitmap(fCursor->Bounds(),(color_space)fDriver->DisplayMode()->space,0);
fDriver->CopyToBitmap(fSavedData,fPosition);
// Draw the data to the buffer
fDriver->fDrawData.draw_mode=B_OP_ALPHA;
fDriver->CopyBitmap(fCursor,fCursor->Bounds(),fPosition,&(fDriver->fDrawData));
fDriver->fDrawData.draw_mode=B_OP_COPY;
fDrawData.draw_mode=B_OP_ALPHA;
fDriver->CopyBitmap(fCursor,fCursor->Bounds(),fPosition,&fDrawData);
fDrawData.draw_mode=B_OP_COPY;
fDriver->Invalidate(fPosition);
}

View File

@ -102,7 +102,8 @@ extern RGBColor workspace_default_color;
by a couple orders of magnitude
--------------------------------------------------------------------------------------- */
DirectDriver::DirectDriver(void)
DirectDriver::DirectDriver()
: DisplayDriverImpl()
{
ATRACE(("DirectDriver::DirectDriver\n"));
@ -133,7 +134,7 @@ DirectDriver::DirectDriver(void)
#endif
}
DirectDriver::~DirectDriver(void)
DirectDriver::~DirectDriver()
{
ATRACE(("DirectDriver::~DirectDriver\n"));
Lock();
@ -143,20 +144,25 @@ DirectDriver::~DirectDriver(void)
Unlock();
}
bool DirectDriver::Initialize(void)
bool DirectDriver::Initialize()
{
ATRACE(("DirectDriver::Initialize\n"));
screenwin=new DDWindow(640,480,B_RGB32,this);
while(find_thread("drawing_thread")==B_NAME_NOT_FOUND)
{
ATRACE(("\tWaiting for the drawing thread to spawn\n"));
snooze(100);
if (DisplayDriver::Initialize()) {
ATRACE(("DirectDriver::Initialize\n"));
screenwin=new DDWindow(640,480,B_RGB32,this);
while(find_thread("drawing_thread")==B_NAME_NOT_FOUND)
{
ATRACE(("\tWaiting for the drawing thread to spawn\n"));
snooze(100);
}
return true;
}
return true;
return false;
}
void DirectDriver::Shutdown(void)
void DirectDriver::Shutdown()
{
DisplayDriver::Shutdown();
ATRACE(("DirectDriver::Shutdown\n"));
screenwin->PostMessage(B_QUIT_REQUESTED);
@ -433,14 +439,14 @@ status_t DirectDriver::SetDPMSMode(const uint32 &state)
return BScreen().SetDPMS(state);
}
uint32 DirectDriver::DPMSMode(void) const
uint32 DirectDriver::DPMSMode() const
{
STRACE(("DirectDriver::DPMSMode\n"));
// This is a hack, but should do enough to be ok for our purposes
return BScreen().DPMSState();
}
uint32 DirectDriver::DPMSCapabilities(void) const
uint32 DirectDriver::DPMSCapabilities() const
{
STRACE(("DirectDriver::DPMSCapabilities\n"));
@ -1039,7 +1045,7 @@ DDWindow::DDWindow(uint16 width, uint16 height, color_space space, DirectDriver
Show();
}
DDWindow::~DDWindow(void)
DDWindow::~DDWindow()
{
int32 result;
@ -1097,7 +1103,7 @@ void DDWindow::DirectConnected(direct_buffer_info *info)
locker.Unlock();
}
bool DDWindow::QuitRequested(void)
bool DDWindow::QuitRequested()
{
port_id serverport=find_port(SERVER_PORT_NAME);
@ -1296,12 +1302,12 @@ int32 DDWindow::DrawingThread(void *data)
return 0;
}
RectPipe::RectPipe(void)
RectPipe::RectPipe()
{
list.MakeEmpty();
}
RectPipe::~RectPipe(void)
RectPipe::~RectPipe()
{
lock.Lock();
clipping_rect *rect;
@ -1357,7 +1363,7 @@ bool RectPipe::GetRect(clipping_rect *rect)
return false;
}
bool RectPipe::HasRects(void)
bool RectPipe::HasRects()
{
lock.Lock();
bool value=has_rects;

View File

@ -34,11 +34,12 @@
#include <Region.h> // for clipping_rect definition
#include <GraphicsCard.h>
#include <Message.h>
#include "DisplayDriver.h"
#include "PortLink.h"
#include <DirectWindow.h>
#include "PatternHandler.h"
#include "DisplayDriverImpl.h"
class UtilityBitmap;
class SDWindow;
class LayerData;
@ -51,14 +52,14 @@ class DirectDriver;
class RectPipe
{
public:
RectPipe(void);
~RectPipe(void);
RectPipe();
~RectPipe();
void PutRect(const BRect &rect);
void PutRect(const clipping_rect &rect);
bool GetRect(clipping_rect *rect);
bool HasRects(void);
int32 CountRects(void) const { return list.CountItems(); }
bool HasRects();
int32 CountRects() const { return list.CountItems(); }
protected:
BList list;
BLocker lock;
@ -81,9 +82,9 @@ class DDWindow : public BDirectWindow
{
public:
DDWindow(uint16 width, uint16 height, color_space space, DirectDriver *owner);
~DDWindow(void);
~DDWindow();
virtual bool QuitRequested(void);
virtual bool QuitRequested();
virtual void DirectConnected(direct_buffer_info *info);
virtual void WindowActivated(bool active);
static int32 DrawingThread(void *data);
@ -114,14 +115,14 @@ public:
the video display. An updater thread simply locks access to this bitmap, copies data to
the framebuffer, and releases access. Derived DisplayDriver functions operate on this bitmap.
*/
class DirectDriver : public DisplayDriver
class DirectDriver : public DisplayDriverImpl
{
public:
DirectDriver(void);
~DirectDriver(void);
DirectDriver();
~DirectDriver();
virtual bool Initialize(void);
virtual void Shutdown(void);
virtual bool Initialize();
virtual void Shutdown();
// void DrawBitmap(ServerBitmap *bmp, const BRect &src, const BRect &dest, const DrawData *d);
@ -134,8 +135,8 @@ public:
virtual bool DumpToFile(const char *path);
virtual status_t SetDPMSMode(const uint32 &state);
virtual uint32 DPMSMode(void) const;
virtual uint32 DPMSCapabilities(void) const;
virtual uint32 DPMSMode() const;
virtual uint32 DPMSCapabilities() const;
virtual status_t GetDeviceInfo(accelerant_device_info *info);
virtual status_t GetModeList(display_mode **mode_list, uint32 *count);
virtual status_t GetPixelClockLimits(display_mode *mode, uint32 *low, uint32 *high);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,7 @@ SharedLibrary appserver :
CursorHandler.cpp
Decorator.cpp
DisplayDriver.cpp
DisplayDriverImpl.cpp
DisplaySupport.cpp
FontFamily.cpp
GraphicsBuffer.cpp

View File

@ -110,7 +110,7 @@ VDView::VDView(BRect bounds)
oldcursorframe=cursor->Bounds();
}
VDView::~VDView(void)
VDView::~VDView()
{
delete serverlink;
delete cursor;
@ -119,7 +119,7 @@ VDView::~VDView(void)
delete viewbmp;
}
void VDView::AttachedToWindow(void)
void VDView::AttachedToWindow()
{
}
@ -243,7 +243,7 @@ VDWindow::VDWindow(BRect frame)
AddChild(view);
}
VDWindow::~VDWindow(void)
VDWindow::~VDWindow()
{
}
@ -441,7 +441,7 @@ void VDWindow::MessageReceived(BMessage *msg)
}
}
bool VDWindow::QuitRequested(void)
bool VDWindow::QuitRequested()
{
port_id serverport=find_port(SERVER_PORT_NAME);
@ -483,7 +483,8 @@ void VDWindow::WindowActivated(bool active)
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
ViewDriver::ViewDriver(void)
ViewDriver::ViewDriver()
: DisplayDriverImpl()
{
fDisplayMode.virtual_width=640;
fDisplayMode.virtual_height=480;
@ -500,7 +501,7 @@ ViewDriver::ViewDriver(void)
framebuffer->Unlock();
}
ViewDriver::~ViewDriver(void)
ViewDriver::~ViewDriver()
{
if(is_initialized)
{
@ -510,7 +511,8 @@ ViewDriver::~ViewDriver(void)
}
}
bool ViewDriver::Initialize(void)
bool
ViewDriver::Initialize()
{
Lock();
@ -531,11 +533,14 @@ bool ViewDriver::Initialize(void)
// because the window is locked until Show() is first called
screenwin->Show();
Unlock();
return true;
return DisplayDriver::Initialize();
}
void ViewDriver::Shutdown(void)
void ViewDriver::Shutdown()
{
DisplayDriver::Shutdown();
Lock();
is_initialized=false;
Unlock();
@ -916,13 +921,13 @@ status_t ViewDriver::SetDPMSMode(const uint32 &state)
return BScreen().SetDPMS(state);
}
uint32 ViewDriver::DPMSMode(void) const
uint32 ViewDriver::DPMSMode() const
{
// See note for SetDPMSMode if there are questions
return BScreen().DPMSState();
}
uint32 ViewDriver::DPMSCapabilities(void) const
uint32 ViewDriver::DPMSCapabilities() const
{
// See note for SetDPMSMode if there are questions
return BScreen().DPMSCapabilites();
@ -1205,7 +1210,7 @@ bool ViewDriver::AcquireBuffer(FBBitmap *bmp)
return true;
}
void ViewDriver::ReleaseBuffer(void)
void ViewDriver::ReleaseBuffer()
{
if(!is_initialized)
return;

View File

@ -36,9 +36,10 @@
#include <Message.h>
#include <Region.h>
#include <Font.h>
#include "DisplayDriver.h"
#include "FontServer.h"
#include "DisplayDriverImpl.h"
class BBitmap;
class BPortLink;
class VDWindow;
@ -48,8 +49,8 @@ class VDView : public BView
{
public:
VDView(BRect bounds);
~VDView(void);
void AttachedToWindow(void);
~VDView();
void AttachedToWindow();
void Draw(BRect rect);
void MouseDown(BPoint pt);
void MouseMoved(BPoint pt, uint32 transit, const BMessage *msg);
@ -70,9 +71,9 @@ class VDWindow : public BWindow
{
public:
VDWindow(BRect frame);
~VDWindow(void);
~VDWindow();
void MessageReceived(BMessage *msg);
bool QuitRequested(void);
bool QuitRequested();
void WindowActivated(bool active);
VDView *view;
@ -96,14 +97,14 @@ public:
VDWindow - does most of the work.
VDView - doesn't do all that much except display the rendered bitmap
*/
class ViewDriver : public DisplayDriver
class ViewDriver : public DisplayDriverImpl
{
public:
ViewDriver(void);
~ViewDriver(void);
ViewDriver();
~ViewDriver();
virtual bool Initialize(void); // Sets the driver
virtual void Shutdown(void); // You never know when you'll need this
virtual bool Initialize(); // Sets the driver
virtual void Shutdown(); // You never know when you'll need this
// Drawing functions
// void DrawBitmap(ServerBitmap *bmp, const BRect &src, const BRect &dest, const DrawData *d);
@ -120,8 +121,8 @@ public:
VDWindow *screenwin;
virtual status_t SetDPMSMode(const uint32 &state);
virtual uint32 DPMSMode(void) const;
virtual uint32 DPMSCapabilities(void) const;
virtual uint32 DPMSMode() const;
virtual uint32 DPMSCapabilities() const;
virtual status_t GetDeviceInfo(accelerant_device_info *info);
virtual status_t GetModeList(display_mode **mode_list, uint32 *count);
virtual status_t GetPixelClockLimits(display_mode *mode, uint32 *low, uint32 *high);
@ -146,7 +147,7 @@ protected:
virtual bool AcquireBuffer(FBBitmap *bmp);
virtual void ReleaseBuffer(void);
virtual void ReleaseBuffer();
virtual void Invalidate(const BRect &r);
// void BlitMono2RGB32(FT_Bitmap *src, BPoint pt, DrawData *d);