#include <stdio.h>
#include <Accelerant.h>
#include <DirectWindow.h>
#include "DWindowBuffer.h"
DWindowBuffer::DWindowBuffer()
: fBits(NULL),
fWidth(0),
fHeight(0),
fBytesPerRow(0),
fFormat(B_NO_COLOR_SPACE),
fWindowClipping()
{
}
DWindowBuffer::~DWindowBuffer()
{
}
status_t
DWindowBuffer::InitCheck() const
{
if (fBits)
return B_OK;
return B_NO_INIT;
}
color_space
DWindowBuffer::ColorSpace() const
{
return fFormat;
}
void*
DWindowBuffer::Bits() const
{
return (void*)fBits;
}
uint32
DWindowBuffer::BytesPerRow() const
{
return fBytesPerRow;
}
uint32
DWindowBuffer::Width() const
{
return fWidth;
}
uint32
DWindowBuffer::Height() const
{
return fHeight;
}
void
DWindowBuffer::SetTo(direct_buffer_info* info)
{
fWindowClipping.MakeEmpty();
if (info) {
int32 xOffset = info->window_bounds.left;
int32 yOffset = info->window_bounds.top;
for (uint32 i = 0; i < info->clip_list_count; i++) {
fWindowClipping.Include(info->clip_list[i]);
}
fWindowClipping.OffsetBy(xOffset, yOffset);
fBytesPerRow = info->bytes_per_row;
fBits = (uint8*)info->bits;
fFormat = info->pixel_format;
fWidth = info->window_bounds.right - info->window_bounds.left + 1;
fHeight = info->window_bounds.bottom - info->window_bounds.top + 1;
fBits += xOffset * 4 + yOffset * fBytesPerRow;
} else {
fBits = NULL;
fWidth = 0;
fHeight = 0;
fBytesPerRow = 0;
fFormat = B_NO_COLOR_SPACE;
}
}
void
DWindowBuffer::SetTo(frame_buffer_config* config,
uint32 x, uint32 y,
uint32 width, uint32 height,
color_space format)
{
fBits = (uint8*)config->frame_buffer;
fBytesPerRow = config->bytes_per_row;
fBits += x * 4 + y * fBytesPerRow;
fWidth = width;
fHeight = height;
fFormat = format;
}