206 lines
3.4 KiB
C++
206 lines
3.4 KiB
C++
#include "GLView.h"
|
|
#include <stdio.h>
|
|
#include <interface/Bitmap.h>
|
|
|
|
BLocker BGLView::locker;
|
|
|
|
BGLView::BGLView(BRect rect, char *name,
|
|
ulong resizingMode, ulong mode,
|
|
ulong options)
|
|
: BView(rect, name, resizingMode, mode|B_FRAME_EVENTS|B_WILL_DRAW)
|
|
{
|
|
#ifdef __INTEL__
|
|
color_space cs = B_RGB16_LITTLE;
|
|
#else
|
|
color_space cs = B_RGB16_BIG;
|
|
#endif
|
|
this->bitmaps[0] = new BBitmap(rect, cs, false, true);
|
|
this->bitmaps[1] = new BBitmap(rect, cs, false, true);
|
|
|
|
this->currBitmap = 0;
|
|
int w = this->bitmaps[0]->BytesPerRow() / 2;
|
|
int h = rect.Height() + 1;
|
|
void *buffers[2];
|
|
buffers[0] = this->bitmaps[0]->Bits();
|
|
buffers[1] = this->bitmaps[1]->Bits();
|
|
this->context = ostgl_create_context(w, h, 16, buffers, 2);
|
|
ostgl_make_current(this->context, 0);
|
|
}
|
|
|
|
BGLView::~BGLView()
|
|
{
|
|
ostgl_delete_context(this->context);
|
|
delete this->bitmaps[0];
|
|
delete this->bitmaps[1];
|
|
}
|
|
|
|
void
|
|
BGLView::LockGL()
|
|
{
|
|
BGLView::locker.Lock();
|
|
ostgl_make_current(this->context, this->currBitmap);
|
|
}
|
|
|
|
void
|
|
BGLView::UnlockGL()
|
|
{
|
|
BGLView::locker.Unlock();
|
|
}
|
|
|
|
void
|
|
BGLView::SwapBuffers()
|
|
{
|
|
if (Window()->Lock()) {
|
|
DrawBitmap(this->bitmaps[this->currBitmap]);
|
|
Window()->Unlock();
|
|
this->currBitmap ^= 1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
BView *
|
|
BGLView::EmbeddedView()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
status_t
|
|
BGLView::CopyPixelsOut(BPoint source, BBitmap *dest)
|
|
{
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
|
|
status_t
|
|
BGLView::CopyPixelsIn(BBitmap *source, BPoint dest)
|
|
{
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
*/
|
|
|
|
void
|
|
BGLView::ErrorCallback(GLenum /*errorCode*/)
|
|
{
|
|
}
|
|
|
|
void
|
|
BGLView::Draw(BRect rect)
|
|
{
|
|
//fprintf(stderr, "GLView::Draw()");
|
|
DrawBitmap(this->bitmaps[this->currBitmap^1], rect, rect);
|
|
}
|
|
|
|
void
|
|
BGLView::AttachedToWindow()
|
|
{
|
|
}
|
|
|
|
void
|
|
BGLView::AllAttached()
|
|
{
|
|
}
|
|
|
|
void
|
|
BGLView::DetachedFromWindow()
|
|
{
|
|
}
|
|
|
|
void
|
|
BGLView::AllDetached()
|
|
{
|
|
}
|
|
|
|
void
|
|
BGLView::FrameResized(float w, float h)
|
|
{
|
|
delete this->bitmaps[0];
|
|
delete this->bitmaps[1];
|
|
#ifdef __INTEL__
|
|
color_space cs = B_RGB16_LITTLE;
|
|
#else
|
|
color_space cs = B_RGB16_BIG;
|
|
#endif
|
|
this->bitmaps[0] = new BBitmap(BRect(0,0, w-1, h-1),
|
|
cs, false, true);
|
|
this->bitmaps[1] = new BBitmap(BRect(0,0, w-1, h-1),
|
|
cs, false, true);
|
|
int w2 = this->bitmaps[0]->BytesPerRow() / 2;
|
|
void *buffers[2];
|
|
buffers[0] = this->bitmaps[0]->Bits();
|
|
buffers[1] = this->bitmaps[1]->Bits();
|
|
ostgl_resize(this->context, w2, h, buffers);
|
|
}
|
|
|
|
/*
|
|
status_t
|
|
BGLView::Perform(perform_code d, void *arg)
|
|
{
|
|
|
|
}
|
|
*/
|
|
|
|
//
|
|
// the rest are pass-through functions
|
|
//
|
|
|
|
status_t
|
|
BGLView::Archive(BMessage *data, bool deep) const
|
|
{
|
|
return BView::Archive(data, deep);
|
|
}
|
|
|
|
void
|
|
BGLView::MessageReceived(BMessage *msg)
|
|
{
|
|
BView::MessageReceived(msg);
|
|
}
|
|
|
|
void
|
|
BGLView::SetResizingMode(uint32 mode)
|
|
{
|
|
BView::SetResizingMode(mode);
|
|
}
|
|
|
|
void
|
|
BGLView::Show()
|
|
{
|
|
BView::Show();
|
|
}
|
|
|
|
void
|
|
BGLView::Hide()
|
|
{
|
|
BView::Hide();
|
|
}
|
|
|
|
BHandler *
|
|
BGLView::ResolveSpecifier(BMessage *msg, int32 index,
|
|
BMessage *specifier, int32 form,
|
|
const char *property)
|
|
{
|
|
return BView::ResolveSpecifier(msg, index, specifier, form, property);
|
|
}
|
|
|
|
status_t
|
|
BGLView::GetSupportedSuites(BMessage *data)
|
|
{
|
|
return BView::GetSupportedSuites(data);
|
|
}
|
|
|
|
/*
|
|
void
|
|
BGLView::DirectConnected( direct_buffer_info *info )
|
|
{
|
|
BView::DirectConnected(info);
|
|
}
|
|
*/
|
|
|
|
/*
|
|
void
|
|
BGLView::EnableDirectMode( bool enabled )
|
|
{
|
|
BView::EnableDirectMode(enabled);
|
|
}
|
|
*/
|