Got rid of the drawing thread, drawing is faster using the "correct"

approach. There are still some leftovers, will be taken care in the next 
commits (not today though)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21525 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini 2007-06-29 11:48:40 +00:00
parent d342dd3f50
commit e0ba8e50cc
3 changed files with 24 additions and 143 deletions

View File

@ -189,11 +189,5 @@ const float VIEW_OFFSET = 3;
// TypeDefs
typedef unsigned short ushort;
typedef struct {
int x1;
int y1;
int x2;
int y2;
} sDrawRect;
#endif // TERMCONST_H_INCLUDED

View File

@ -95,11 +95,8 @@ TermView::TermView(BRect frame, CodeConv *inCodeConv, int fd)
fScrBufSize(gTermPref->getInt32(PREF_HISTORY_SIZE)),
fScrRegionSet(0),
fMouseTracking(false),
fViewThread(-1),
fMouseThread(-1),
fQuitting(false),
fDrawRectSem(-1),
fDrawRect_p(0),
fIMflag(false)
{
// Reset cursor
@ -114,7 +111,7 @@ TermView::TermView(BRect frame, CodeConv *inCodeConv, int fd)
SetTermFont(be_plain_font, be_plain_font);
//SetIMAware(gTermPref->getInt32(PREF_IM_AWARE));
_InitViewThread();
_InitMouseThread();
}
@ -122,9 +119,7 @@ TermView::~TermView()
{
delete fTextBuffer;
fQuitting = true;
kill_thread(fViewThread);
kill_thread(fMouseThread);
delete_sem(fDrawRectSem);
}
@ -343,7 +338,7 @@ TermView::TermDraw(const CurPos &start, const CurPos &end)
int y2 = end.y;
// Send Draw Rectangle data to Draw Engine thread.
SendDataToDrawEngine(x1, y1 + fTop / fFontHeight,
Redraw(x1, y1 + fTop / fFontHeight,
x2, y2 + fTop / fFontHeight);
return 0;
}
@ -362,16 +357,16 @@ TermView::TermDrawSelectedRegion(CurPos start, CurPos end)
}
if (start.y == end.y) {
SendDataToDrawEngine(start.x, start.y,
Redraw(start.x, start.y,
end.x, end.y);
} else {
SendDataToDrawEngine(start.x, start.y,
Redraw(start.x, start.y,
fTermColumns, start.y);
if (end.y - start.y > 0)
SendDataToDrawEngine(0, start.y + 1, fTermColumns, end.y - 1);
Redraw(0, start.y + 1, fTermColumns, end.y - 1);
SendDataToDrawEngine(0, end.y, end.x, end.y);
Redraw(0, end.y, end.x, end.y);
}
return 0;
@ -395,17 +390,17 @@ TermView::TermDrawRegion(CurPos start, CurPos end)
end.y += top;
if (start.y == end.y) {
SendDataToDrawEngine(start.x, start.y,
Redraw(start.x, start.y,
end.x, end.y);
} else {
SendDataToDrawEngine(start.x, start.y,
Redraw(start.x, start.y,
fTermColumns - 1, start.y);
if (end.y - start.y > 0) {
SendDataToDrawEngine(0, start.y + 1,
Redraw(0, start.y + 1,
fTermColumns - 1, end.y - 1);
}
SendDataToDrawEngine(0, end.y,
Redraw(0, end.y,
end.x, end.y);
}
@ -729,19 +724,9 @@ TermView::ScrollAtCursor()
}
thread_id
TermView::_InitViewThread()
status_t
TermView::_InitMouseThread()
{
// spwan Draw Engine thread.
if (fViewThread < 0) {
fViewThread = spawn_thread(ViewThread, "DrawEngine",
B_DISPLAY_PRIORITY, this);
} else
return B_BAD_THREAD_ID;
fDrawRectSem = create_sem(0, "draw_engine_sem");
resume_thread(fViewThread);
// spawn Mouse Tracking thread.
if (fMouseThread < 0) {
fMouseThread = spawn_thread(MouseTracking, "MouseTracking",
@ -749,84 +734,7 @@ TermView::_InitViewThread()
} else
return B_BAD_THREAD_ID;
resume_thread(fMouseThread);
return B_OK;
}
//! Thread of Draw Character to View.
int32
TermView::ViewThread(void *data)
{
int width, height;
sDrawRect pos;
#define INVALIDATE
#ifndef INVALIDATE
int i, j, count;
int m_flag;
ushort attr;
uchar buf[256];
BRect eraseRect;
#endif
int inDrawRect_p = 0;
TermView *theObj =(TermView *)data;
while (!theObj->fQuitting) {
// Wait semaphore
acquire_sem(theObj->fDrawRectSem);
pos = theObj->fDrawRectBuffer[inDrawRect_p];
inDrawRect_p++;
inDrawRect_p %= RECT_BUF_SIZE;
width = theObj->fFontWidth;
height = theObj->fFontHeight;
#ifdef INVALIDATE
BRect r(pos.x1 * width, pos.y1 * height,
(pos.x2 + 1) * width -1,(pos.y2 + 1) * height -1);
if (theObj->LockLooper()) {
theObj->Invalidate(r);
theObj->UnlockLooper();
}
#else
if (theObj->LockLooper()) {
for (j = pos.y1; j <= pos.y2; j++) {
for (i = pos.x1; i <= pos.x2;) {
count = theObj->fTextBuffer->GetString(j, i, pos.x2, buf, &attr);
m_flag = theObj->CheckSelectedRegion(CurPos(i, j));
if (count < 0) {
eraseRect.Set(width * i, height * j,
width *(i - count) - 1, height *(j + 1) - 1);
if (m_flag)
theObj->SetHighColor(theObj->fSelectBackColor);
else
theObj->SetHighColor(theObj->fTextBackColor);
theObj->FillRect(eraseRect);
count = -count;
} else {
theObj->DrawLines(width * i, height * j,
attr, buf, count, m_flag, false, theObj);
}
i += count;
}
}
theObj->UnlockLooper();
}
#endif
}
exit_thread(B_OK);
return 0;
return resume_thread(fMouseThread);
}
@ -2210,30 +2118,16 @@ TermView::GetSelection(BString &str)
}
// Send DrawRect data to Draw Engine thread.
inline void
TermView::SendDataToDrawEngine(int x1, int y1, int x2, int y2)
TermView::Redraw(int x1, int y1, int x2, int y2)
{
sem_info info;
for (;;) {
get_sem_info(fDrawRectSem, &info);
if ((RECT_BUF_SIZE - info.count) < 2) {
snooze(10 * 1000);
continue;
} else
break;
}
fDrawRectBuffer[fDrawRect_p].x1 = x1;
fDrawRectBuffer[fDrawRect_p].x2 = x2;
fDrawRectBuffer[fDrawRect_p].y1 = y1;
fDrawRectBuffer[fDrawRect_p].y2 = y2;
fDrawRect_p++;
fDrawRect_p %= RECT_BUF_SIZE;
release_sem(fDrawRectSem);
BRect rect(x1 * fFontWidth, y1 * fFontHeight,
(x2 + 1) * fFontWidth -1, (y2 + 1) * fFontHeight -1);
if (LockLooper()) {
Invalidate(rect);
UnlockLooper();
}
}

View File

@ -180,10 +180,9 @@ class TermView : public BView {
virtual void MessageReceived(BMessage* message);
private:
static int32 ViewThread(void *);
static int32 MouseTracking(void *);
thread_id _InitViewThread(void);
status_t _InitMouseThread(void);
void DrawLines(int , int, ushort, uchar *, int, int, int, BView *);
void DoPrint(BRect updateRect);
void ResizeScrBarRange (void);
@ -224,7 +223,7 @@ class TermView : public BView {
BPoint CurPosToBPoint(const CurPos &pos);
bool CheckSelectedRegion(const CurPos &pos);
inline void SendDataToDrawEngine(int, int, int, int);
inline void Redraw(int, int, int, int);
int fTerminalFd;
@ -311,15 +310,9 @@ class TermView : public BView {
bool fMouseTracking;
// thread ID / flags.
thread_id fViewThread;
thread_id fMouseThread;
bool fQuitting;
// DrawEngine parameter.
sem_id fDrawRectSem;
sDrawRect fDrawRectBuffer[RECT_BUF_SIZE];
int fDrawRect_p;
// Input Method parameter.
int fIMViewPtr;
CurPos fIMStartPos;