Fixed a quit bug in ViewDriver
Slightly improved ServerScreen::SupportsResolution Implemented a DPMS hack for ViewDriver and DirectDriver Moved various supporting classes from DisplayDriver.cpp to DisplaySupport.cpp Added server-side support for BWindow::SetSizeLimits git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8541 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -203,7 +203,7 @@ void DirectDriver::InvertRect(const BRect &r)
|
|||||||
index = start;
|
index = start;
|
||||||
for(int32 i=0;i<height;i++)
|
for(int32 i=0;i<height;i++)
|
||||||
{
|
{
|
||||||
// TODO: Where is the alpha bit
|
// TODO: Where is the alpha bit?
|
||||||
for(int32 j=0; j<width; j++)
|
for(int32 j=0; j<width; j++)
|
||||||
index[j]^=0xFFFF;
|
index[j]^=0xFFFF;
|
||||||
index = (uint16 *)((uint8 *)index+framebuffer->BytesPerRow());
|
index = (uint16 *)((uint8 *)index+framebuffer->BytesPerRow());
|
||||||
@@ -354,20 +354,20 @@ bool DirectDriver::DumpToFile(const char *path)
|
|||||||
|
|
||||||
status_t DirectDriver::SetDPMSMode(const uint32 &state)
|
status_t DirectDriver::SetDPMSMode(const uint32 &state)
|
||||||
{
|
{
|
||||||
// TODO: Implement software DPMS
|
// This is a hack, but should do enough to be ok for our purposes
|
||||||
return B_ERROR;
|
return BScreen().SetDPMS(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 DirectDriver::DPMSMode(void) const
|
uint32 DirectDriver::DPMSMode(void) const
|
||||||
{
|
{
|
||||||
// TODO: Implement software DPMS
|
// This is a hack, but should do enough to be ok for our purposes
|
||||||
return B_DPMS_ON;
|
return BScreen().DPMSState();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 DirectDriver::DPMSCapabilities(void) const
|
uint32 DirectDriver::DPMSCapabilities(void) const
|
||||||
{
|
{
|
||||||
// TODO: Implement software DPMS
|
// This is a hack, but should do enough to be ok for our purposes
|
||||||
return B_DPMS_ON;
|
return BScreen().DPMSCapabilites();
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t DirectDriver::GetDeviceInfo(accelerant_device_info *info)
|
status_t DirectDriver::GetDeviceInfo(accelerant_device_info *info)
|
||||||
|
|||||||
@@ -38,505 +38,8 @@
|
|||||||
// handled by the public drawing functions.
|
// handled by the public drawing functions.
|
||||||
// Add clipping and make sure public functions have Lock & Unlock.
|
// Add clipping and make sure public functions have Lock & Unlock.
|
||||||
|
|
||||||
class BezierCurve
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BezierCurve(BPoint* pts);
|
|
||||||
~BezierCurve();
|
|
||||||
BPoint* GetPointArray();
|
|
||||||
BList points;
|
|
||||||
private:
|
|
||||||
int GeneratePoints(int startPos);
|
|
||||||
BPoint* pointArray;
|
|
||||||
};
|
|
||||||
|
|
||||||
BezierCurve::BezierCurve(BPoint* pts)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
pointArray = NULL;
|
|
||||||
for (i=0; i<4; i++)
|
|
||||||
points.AddItem(new BPoint(pts[i]));
|
|
||||||
GeneratePoints(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
BezierCurve::~BezierCurve()
|
|
||||||
{
|
|
||||||
int i, numPoints;
|
|
||||||
|
|
||||||
numPoints = points.CountItems();
|
|
||||||
for (i=0; i<numPoints; i++)
|
|
||||||
delete (BPoint*)points.ItemAt(i);
|
|
||||||
if ( pointArray )
|
|
||||||
delete[] pointArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
BPoint* BezierCurve::GetPointArray()
|
|
||||||
{
|
|
||||||
int i, numPoints;
|
|
||||||
|
|
||||||
if ( !pointArray )
|
|
||||||
{
|
|
||||||
numPoints = points.CountItems();
|
|
||||||
pointArray = new BPoint[numPoints];
|
|
||||||
for (i=0; i<numPoints; i++)
|
|
||||||
pointArray[i] = *((BPoint*)points.ItemAt(i));
|
|
||||||
}
|
|
||||||
return pointArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BezierCurve::GeneratePoints(int startPos)
|
|
||||||
{
|
|
||||||
double slopeAB, slopeBC, slopeCD;
|
|
||||||
BPoint** pointList = (BPoint **)points.Items();
|
|
||||||
|
|
||||||
// TODO Check for more conditions where we can fudge the curve to a line
|
|
||||||
|
|
||||||
if ( (fabs(pointList[startPos]->x-pointList[startPos+3]->x) <= 1) &&
|
|
||||||
(fabs(pointList[startPos]->y-pointList[startPos+3]->y) <= 1) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ( (pointList[startPos]->x == pointList[startPos+1]->x) &&
|
|
||||||
(pointList[startPos+1]->x == pointList[startPos+2]->x) &&
|
|
||||||
(pointList[startPos+2]->x == pointList[startPos+3]->x) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
slopeAB = (pointList[startPos]->y-pointList[startPos+1]->y)/(pointList[startPos]->x-pointList[startPos+1]->x);
|
|
||||||
slopeBC = (pointList[startPos+1]->y-pointList[startPos+2]->y)/(pointList[startPos+1]->x-pointList[startPos+2]->x);
|
|
||||||
slopeCD = (pointList[startPos+2]->y-pointList[startPos+3]->y)/(pointList[startPos+2]->x-pointList[startPos+3]->x);
|
|
||||||
|
|
||||||
if ( (slopeAB == slopeBC) && (slopeBC == slopeCD) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
BPoint *pointAB = new BPoint();
|
|
||||||
BPoint pointBC;
|
|
||||||
BPoint *pointCD = new BPoint();
|
|
||||||
BPoint *pointABC = new BPoint();
|
|
||||||
BPoint *pointBCD = new BPoint();
|
|
||||||
BPoint *curvePoint = new BPoint();
|
|
||||||
int lengthIncrement = 3;
|
|
||||||
|
|
||||||
pointAB->x = (pointList[startPos]->x + pointList[startPos+1]->x)/2;
|
|
||||||
pointAB->y = (pointList[startPos]->y + pointList[startPos+1]->y)/2;
|
|
||||||
pointBC.x = (pointList[startPos+1]->x + pointList[startPos+2]->x)/2;
|
|
||||||
pointBC.y = (pointList[startPos+1]->y + pointList[startPos+2]->y)/2;
|
|
||||||
pointCD->x = (pointList[startPos+2]->x + pointList[startPos+3]->x)/2;
|
|
||||||
pointCD->y = (pointList[startPos+2]->y + pointList[startPos+3]->y)/2;
|
|
||||||
pointABC->x = (pointAB->x + pointBC.x)/2;
|
|
||||||
pointABC->y = (pointAB->y + pointBC.y)/2;
|
|
||||||
pointBCD->x = (pointCD->x + pointBC.x)/2;
|
|
||||||
pointBCD->y = (pointCD->y + pointBC.y)/2;
|
|
||||||
curvePoint->x = (pointABC->x + pointBCD->x)/2;
|
|
||||||
curvePoint->y = (pointABC->y + pointBCD->y)/2;
|
|
||||||
delete pointList[startPos+1];
|
|
||||||
delete pointList[startPos+2];
|
|
||||||
pointList[startPos+1] = pointAB;
|
|
||||||
pointList[startPos+2] = pointCD;
|
|
||||||
points.AddItem(pointABC,startPos+2);
|
|
||||||
points.AddItem(curvePoint,startPos+3);
|
|
||||||
points.AddItem(pointBCD,startPos+4);
|
|
||||||
lengthIncrement += GeneratePoints(startPos);
|
|
||||||
lengthIncrement += GeneratePoints(startPos + lengthIncrement);
|
|
||||||
return lengthIncrement;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct integer_rect
|
|
||||||
{
|
|
||||||
int32 x;
|
|
||||||
int32 y;
|
|
||||||
int32 w;
|
|
||||||
int32 h;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct integer_scaling_info
|
|
||||||
{
|
|
||||||
int32 k;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void BRect_to_integer_rect(BRect source_rect, integer_rect &dest_rect)
|
|
||||||
{
|
|
||||||
dest_rect.x = (int32)source_rect.left;
|
|
||||||
dest_rect.y = (int32)source_rect.top;
|
|
||||||
dest_rect.w = (int32)(source_rect.right - source_rect.left) + 1;
|
|
||||||
dest_rect.h = (int32)(source_rect.bottom - source_rect.top) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline integer_rect BRect_to_integer_rect(BRect source_rect)
|
|
||||||
{
|
|
||||||
integer_rect dest_rect;
|
|
||||||
dest_rect.x = (int32)source_rect.left;
|
|
||||||
dest_rect.y = (int32)source_rect.top;
|
|
||||||
dest_rect.w = (int32)(source_rect.right - source_rect.left) + 1;
|
|
||||||
dest_rect.h = (int32)(source_rect.bottom - source_rect.top) + 1;
|
|
||||||
return dest_rect;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Blitter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Blitter();
|
|
||||||
void draw_8_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_8_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_8_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
|
|
||||||
void draw_16_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_16_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_16_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
|
|
||||||
void draw_32_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_32_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
void draw_32_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
|
|
||||||
void draw_none(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor) {}
|
|
||||||
void Draw(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
|
|
||||||
void Select(int32 source_bits_per_pixel, int32 dest_bits_per_pixel);
|
|
||||||
|
|
||||||
drawing_mode GetDrawMode() const { return mode; }
|
|
||||||
void SetDrawMode(drawing_mode draw_mode) { mode = draw_mode; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
void (Blitter::*DrawFunc)(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor);
|
|
||||||
drawing_mode mode;
|
|
||||||
};
|
|
||||||
|
|
||||||
static Blitter blitter;
|
static Blitter blitter;
|
||||||
|
|
||||||
Blitter::Blitter()
|
|
||||||
{
|
|
||||||
DrawFunc = &Blitter::draw_none;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_8_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint8 *s = (uint8 *)src;
|
|
||||||
uint8 *d = (uint8 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_8_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint8 *s = (uint8 *)src;
|
|
||||||
uint16 *d = (uint16 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_8_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint8 *s = (uint8 *)src;
|
|
||||||
uint32 *d = (uint32 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_16_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint16 *s = (uint16 *)src;
|
|
||||||
uint8 *d = (uint8 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_16_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint16 *s = (uint16 *)src;
|
|
||||||
uint16 *d = (uint16 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_16_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint16 *s = (uint16 *)src;
|
|
||||||
uint32 *d = (uint32 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_32_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint32 *s = (uint32 *)src;
|
|
||||||
uint8 *d = (uint8 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_32_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint32 *s = (uint32 *)src;
|
|
||||||
uint16 *d = (uint16 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::draw_32_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
uint32 *s = (uint32 *)src;
|
|
||||||
uint32 *d = (uint32 *)dst;
|
|
||||||
|
|
||||||
while(width--)
|
|
||||||
{
|
|
||||||
*d++ = s[xscale_position >> 16];
|
|
||||||
xscale_position += xscale_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::Draw(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
|
||||||
{
|
|
||||||
(this->*DrawFunc)(src, dst, width, xscale_position, xscale_factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Blitter::Select(int32 source_bits_per_pixel, int32 dest_bits_per_pixel)
|
|
||||||
{
|
|
||||||
if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 8)
|
|
||||||
DrawFunc = &Blitter::draw_8_to_8;
|
|
||||||
else if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 16)
|
|
||||||
DrawFunc = &Blitter::draw_8_to_16;
|
|
||||||
else if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 32)
|
|
||||||
DrawFunc = &Blitter::draw_8_to_32;
|
|
||||||
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 16)
|
|
||||||
DrawFunc = &Blitter::draw_16_to_16;
|
|
||||||
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 8)
|
|
||||||
DrawFunc = &Blitter::draw_16_to_8;
|
|
||||||
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 32)
|
|
||||||
DrawFunc = &Blitter::draw_16_to_32;
|
|
||||||
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 32)
|
|
||||||
DrawFunc = &Blitter::draw_32_to_32;
|
|
||||||
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 16)
|
|
||||||
DrawFunc = &Blitter::draw_32_to_16;
|
|
||||||
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 8)
|
|
||||||
DrawFunc = &Blitter::draw_32_to_8;
|
|
||||||
else
|
|
||||||
DrawFunc = &Blitter::draw_none;
|
|
||||||
}
|
|
||||||
|
|
||||||
LineCalc::LineCalc()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
LineCalc::LineCalc(const BPoint &pta, const BPoint &ptb)
|
|
||||||
{
|
|
||||||
start=pta;
|
|
||||||
end=ptb;
|
|
||||||
slope=(start.y-end.y)/(start.x-end.x);
|
|
||||||
offset=start.y-(slope * start.x);
|
|
||||||
minx = MIN(start.x,end.x);
|
|
||||||
maxx = MAX(start.x,end.x);
|
|
||||||
miny = MIN(start.y,end.y);
|
|
||||||
maxy = MAX(start.y,end.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LineCalc::SetPoints(const BPoint &pta, const BPoint &ptb)
|
|
||||||
{
|
|
||||||
start=pta;
|
|
||||||
end=ptb;
|
|
||||||
slope=(start.y-end.y)/(start.x-end.x);
|
|
||||||
offset=start.y-(slope * start.x);
|
|
||||||
minx = MIN(start.x,end.x);
|
|
||||||
maxx = MAX(start.x,end.x);
|
|
||||||
miny = MIN(start.y,end.y);
|
|
||||||
maxy = MAX(start.y,end.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LineCalc::ClipToRect(const BRect& rect)
|
|
||||||
{
|
|
||||||
if ( (maxx < rect.left) || (minx > rect.right) || (miny < rect.top) || (maxy > rect.bottom) )
|
|
||||||
return false;
|
|
||||||
BPoint newStart(-1,-1);
|
|
||||||
BPoint newEnd(-1,-1);
|
|
||||||
if ( maxx == minx )
|
|
||||||
{
|
|
||||||
newStart.x = newEnd.x = minx;
|
|
||||||
if ( miny < rect.top )
|
|
||||||
newStart.y = rect.top;
|
|
||||||
else
|
|
||||||
newStart.y = miny;
|
|
||||||
if ( maxy > rect.bottom )
|
|
||||||
newEnd.y = rect.bottom;
|
|
||||||
else
|
|
||||||
newEnd.y = maxy;
|
|
||||||
}
|
|
||||||
else if ( maxy == miny )
|
|
||||||
{
|
|
||||||
newStart.y = newEnd.y = miny;
|
|
||||||
if ( minx < rect.left )
|
|
||||||
newStart.x = rect.left;
|
|
||||||
else
|
|
||||||
newStart.x = minx;
|
|
||||||
if ( maxx > rect.right )
|
|
||||||
newEnd.x = rect.right;
|
|
||||||
else
|
|
||||||
newEnd.x = maxx;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float leftInt, rightInt, topInt, bottomInt;
|
|
||||||
BPoint tempPoint;
|
|
||||||
leftInt = GetY(rect.left);
|
|
||||||
rightInt = GetY(rect.right);
|
|
||||||
topInt = GetX(rect.top);
|
|
||||||
bottomInt = GetX(rect.bottom);
|
|
||||||
if ( end.x < start.x )
|
|
||||||
{
|
|
||||||
tempPoint = start;
|
|
||||||
start = end;
|
|
||||||
end = tempPoint;
|
|
||||||
}
|
|
||||||
if ( start.x < rect.left )
|
|
||||||
{
|
|
||||||
if ( (leftInt >= rect.top) && (leftInt <= rect.bottom) )
|
|
||||||
{
|
|
||||||
newStart.x = rect.left;
|
|
||||||
newStart.y = leftInt;
|
|
||||||
}
|
|
||||||
if ( start.y < end.y )
|
|
||||||
{
|
|
||||||
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newStart.x = topInt;
|
|
||||||
newStart.y = rect.top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newStart.x = bottomInt;
|
|
||||||
newStart.y = rect.bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( start.y < rect.top )
|
|
||||||
{
|
|
||||||
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newStart.x = topInt;
|
|
||||||
newStart.y = rect.top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ( start.y > rect.bottom )
|
|
||||||
{
|
|
||||||
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newStart.x = bottomInt;
|
|
||||||
newStart.y = rect.bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
newStart = start;
|
|
||||||
}
|
|
||||||
if ( end.x > rect.right )
|
|
||||||
{
|
|
||||||
if ( (rightInt >= rect.top) && (rightInt <= rect.bottom) )
|
|
||||||
{
|
|
||||||
newEnd.x = rect.right;
|
|
||||||
newEnd.y = rightInt;
|
|
||||||
}
|
|
||||||
if ( start.y < end.y )
|
|
||||||
{
|
|
||||||
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newEnd.x = bottomInt;
|
|
||||||
newEnd.y = rect.bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newEnd.x = topInt;
|
|
||||||
newEnd.y = rect.top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( end.y < rect.top )
|
|
||||||
{
|
|
||||||
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newEnd.x = topInt;
|
|
||||||
newEnd.y = rect.top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ( end.y > rect.bottom )
|
|
||||||
{
|
|
||||||
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
|
||||||
{
|
|
||||||
newEnd.x = bottomInt;
|
|
||||||
newEnd.y = rect.bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
newEnd = end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( (newStart.x == -1) || (newStart.y == -1) || (newEnd.x == -1) || (newEnd.y == -1) )
|
|
||||||
return false;
|
|
||||||
SetPoints(newStart,newEnd);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LineCalc::Swap(LineCalc &from)
|
|
||||||
{
|
|
||||||
BPoint pta, ptb;
|
|
||||||
pta = start;
|
|
||||||
ptb = end;
|
|
||||||
SetPoints(from.start,from.end);
|
|
||||||
from.SetPoints(pta,ptb);
|
|
||||||
}
|
|
||||||
|
|
||||||
float LineCalc::GetX(float y)
|
|
||||||
{
|
|
||||||
if (start.x == end.x)
|
|
||||||
return start.x;
|
|
||||||
return ( (y-offset)/slope );
|
|
||||||
}
|
|
||||||
|
|
||||||
float LineCalc::GetY(float x)
|
|
||||||
{
|
|
||||||
if ( start.x == end.x )
|
|
||||||
return start.y;
|
|
||||||
return ( (slope * x) + offset );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets up internal variables needed by all DisplayDriver subclasses
|
\brief Sets up internal variables needed by all DisplayDriver subclasses
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,426 @@
|
|||||||
|
#include "DisplaySupport.h"
|
||||||
|
|
||||||
|
BezierCurve::BezierCurve(BPoint* pts)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
pointArray = NULL;
|
||||||
|
for (i=0; i<4; i++)
|
||||||
|
points.AddItem(new BPoint(pts[i]));
|
||||||
|
GeneratePoints(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BezierCurve::~BezierCurve()
|
||||||
|
{
|
||||||
|
int i, numPoints;
|
||||||
|
|
||||||
|
numPoints = points.CountItems();
|
||||||
|
for (i=0; i<numPoints; i++)
|
||||||
|
delete (BPoint*)points.ItemAt(i);
|
||||||
|
if ( pointArray )
|
||||||
|
delete[] pointArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
BPoint* BezierCurve::GetPointArray()
|
||||||
|
{
|
||||||
|
int i, numPoints;
|
||||||
|
|
||||||
|
if ( !pointArray )
|
||||||
|
{
|
||||||
|
numPoints = points.CountItems();
|
||||||
|
pointArray = new BPoint[numPoints];
|
||||||
|
for (i=0; i<numPoints; i++)
|
||||||
|
pointArray[i] = *((BPoint*)points.ItemAt(i));
|
||||||
|
}
|
||||||
|
return pointArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BezierCurve::GeneratePoints(int startPos)
|
||||||
|
{
|
||||||
|
double slopeAB, slopeBC, slopeCD;
|
||||||
|
BPoint** pointList = (BPoint **)points.Items();
|
||||||
|
|
||||||
|
// TODO Check for more conditions where we can fudge the curve to a line
|
||||||
|
|
||||||
|
if ( (fabs(pointList[startPos]->x-pointList[startPos+3]->x) <= 1) &&
|
||||||
|
(fabs(pointList[startPos]->y-pointList[startPos+3]->y) <= 1) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ( (pointList[startPos]->x == pointList[startPos+1]->x) &&
|
||||||
|
(pointList[startPos+1]->x == pointList[startPos+2]->x) &&
|
||||||
|
(pointList[startPos+2]->x == pointList[startPos+3]->x) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
slopeAB = (pointList[startPos]->y-pointList[startPos+1]->y)/(pointList[startPos]->x-pointList[startPos+1]->x);
|
||||||
|
slopeBC = (pointList[startPos+1]->y-pointList[startPos+2]->y)/(pointList[startPos+1]->x-pointList[startPos+2]->x);
|
||||||
|
slopeCD = (pointList[startPos+2]->y-pointList[startPos+3]->y)/(pointList[startPos+2]->x-pointList[startPos+3]->x);
|
||||||
|
|
||||||
|
if ( (slopeAB == slopeBC) && (slopeBC == slopeCD) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
BPoint *pointAB = new BPoint();
|
||||||
|
BPoint pointBC;
|
||||||
|
BPoint *pointCD = new BPoint();
|
||||||
|
BPoint *pointABC = new BPoint();
|
||||||
|
BPoint *pointBCD = new BPoint();
|
||||||
|
BPoint *curvePoint = new BPoint();
|
||||||
|
int lengthIncrement = 3;
|
||||||
|
|
||||||
|
pointAB->x = (pointList[startPos]->x + pointList[startPos+1]->x)/2;
|
||||||
|
pointAB->y = (pointList[startPos]->y + pointList[startPos+1]->y)/2;
|
||||||
|
pointBC.x = (pointList[startPos+1]->x + pointList[startPos+2]->x)/2;
|
||||||
|
pointBC.y = (pointList[startPos+1]->y + pointList[startPos+2]->y)/2;
|
||||||
|
pointCD->x = (pointList[startPos+2]->x + pointList[startPos+3]->x)/2;
|
||||||
|
pointCD->y = (pointList[startPos+2]->y + pointList[startPos+3]->y)/2;
|
||||||
|
pointABC->x = (pointAB->x + pointBC.x)/2;
|
||||||
|
pointABC->y = (pointAB->y + pointBC.y)/2;
|
||||||
|
pointBCD->x = (pointCD->x + pointBC.x)/2;
|
||||||
|
pointBCD->y = (pointCD->y + pointBC.y)/2;
|
||||||
|
curvePoint->x = (pointABC->x + pointBCD->x)/2;
|
||||||
|
curvePoint->y = (pointABC->y + pointBCD->y)/2;
|
||||||
|
delete pointList[startPos+1];
|
||||||
|
delete pointList[startPos+2];
|
||||||
|
pointList[startPos+1] = pointAB;
|
||||||
|
pointList[startPos+2] = pointCD;
|
||||||
|
points.AddItem(pointABC,startPos+2);
|
||||||
|
points.AddItem(curvePoint,startPos+3);
|
||||||
|
points.AddItem(pointBCD,startPos+4);
|
||||||
|
lengthIncrement += GeneratePoints(startPos);
|
||||||
|
lengthIncrement += GeneratePoints(startPos + lengthIncrement);
|
||||||
|
return lengthIncrement;
|
||||||
|
}
|
||||||
|
|
||||||
|
Blitter::Blitter()
|
||||||
|
{
|
||||||
|
DrawFunc = &Blitter::draw_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_8_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint8 *s = (uint8 *)src;
|
||||||
|
uint8 *d = (uint8 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_8_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint8 *s = (uint8 *)src;
|
||||||
|
uint16 *d = (uint16 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_8_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint8 *s = (uint8 *)src;
|
||||||
|
uint32 *d = (uint32 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_16_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint16 *s = (uint16 *)src;
|
||||||
|
uint8 *d = (uint8 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_16_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint16 *s = (uint16 *)src;
|
||||||
|
uint16 *d = (uint16 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_16_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint16 *s = (uint16 *)src;
|
||||||
|
uint32 *d = (uint32 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_32_to_8(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint32 *s = (uint32 *)src;
|
||||||
|
uint8 *d = (uint8 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_32_to_16(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint32 *s = (uint32 *)src;
|
||||||
|
uint16 *d = (uint16 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::draw_32_to_32(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
uint32 *s = (uint32 *)src;
|
||||||
|
uint32 *d = (uint32 *)dst;
|
||||||
|
|
||||||
|
while(width--)
|
||||||
|
{
|
||||||
|
*d++ = s[xscale_position >> 16];
|
||||||
|
xscale_position += xscale_factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::Draw(uint8 *src, uint8 *dst, int32 width, int32 xscale_position, int32 xscale_factor)
|
||||||
|
{
|
||||||
|
(this->*DrawFunc)(src, dst, width, xscale_position, xscale_factor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blitter::Select(int32 source_bits_per_pixel, int32 dest_bits_per_pixel)
|
||||||
|
{
|
||||||
|
if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 8)
|
||||||
|
DrawFunc = &Blitter::draw_8_to_8;
|
||||||
|
else if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 16)
|
||||||
|
DrawFunc = &Blitter::draw_8_to_16;
|
||||||
|
else if(source_bits_per_pixel == 8 && dest_bits_per_pixel == 32)
|
||||||
|
DrawFunc = &Blitter::draw_8_to_32;
|
||||||
|
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 16)
|
||||||
|
DrawFunc = &Blitter::draw_16_to_16;
|
||||||
|
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 8)
|
||||||
|
DrawFunc = &Blitter::draw_16_to_8;
|
||||||
|
else if(source_bits_per_pixel == 16 && dest_bits_per_pixel == 32)
|
||||||
|
DrawFunc = &Blitter::draw_16_to_32;
|
||||||
|
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 32)
|
||||||
|
DrawFunc = &Blitter::draw_32_to_32;
|
||||||
|
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 16)
|
||||||
|
DrawFunc = &Blitter::draw_32_to_16;
|
||||||
|
else if(source_bits_per_pixel == 32 && dest_bits_per_pixel == 8)
|
||||||
|
DrawFunc = &Blitter::draw_32_to_8;
|
||||||
|
else
|
||||||
|
DrawFunc = &Blitter::draw_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
LineCalc::LineCalc()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LineCalc::LineCalc(const BPoint &pta, const BPoint &ptb)
|
||||||
|
{
|
||||||
|
start=pta;
|
||||||
|
end=ptb;
|
||||||
|
slope=(start.y-end.y)/(start.x-end.x);
|
||||||
|
offset=start.y-(slope * start.x);
|
||||||
|
minx = MIN(start.x,end.x);
|
||||||
|
maxx = MAX(start.x,end.x);
|
||||||
|
miny = MIN(start.y,end.y);
|
||||||
|
maxy = MAX(start.y,end.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LineCalc::SetPoints(const BPoint &pta, const BPoint &ptb)
|
||||||
|
{
|
||||||
|
start=pta;
|
||||||
|
end=ptb;
|
||||||
|
slope=(start.y-end.y)/(start.x-end.x);
|
||||||
|
offset=start.y-(slope * start.x);
|
||||||
|
minx = MIN(start.x,end.x);
|
||||||
|
maxx = MAX(start.x,end.x);
|
||||||
|
miny = MIN(start.y,end.y);
|
||||||
|
maxy = MAX(start.y,end.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LineCalc::ClipToRect(const BRect& rect)
|
||||||
|
{
|
||||||
|
if ( (maxx < rect.left) || (minx > rect.right) || (miny < rect.top) || (maxy > rect.bottom) )
|
||||||
|
return false;
|
||||||
|
BPoint newStart(-1,-1);
|
||||||
|
BPoint newEnd(-1,-1);
|
||||||
|
if ( maxx == minx )
|
||||||
|
{
|
||||||
|
newStart.x = newEnd.x = minx;
|
||||||
|
if ( miny < rect.top )
|
||||||
|
newStart.y = rect.top;
|
||||||
|
else
|
||||||
|
newStart.y = miny;
|
||||||
|
if ( maxy > rect.bottom )
|
||||||
|
newEnd.y = rect.bottom;
|
||||||
|
else
|
||||||
|
newEnd.y = maxy;
|
||||||
|
}
|
||||||
|
else if ( maxy == miny )
|
||||||
|
{
|
||||||
|
newStart.y = newEnd.y = miny;
|
||||||
|
if ( minx < rect.left )
|
||||||
|
newStart.x = rect.left;
|
||||||
|
else
|
||||||
|
newStart.x = minx;
|
||||||
|
if ( maxx > rect.right )
|
||||||
|
newEnd.x = rect.right;
|
||||||
|
else
|
||||||
|
newEnd.x = maxx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float leftInt, rightInt, topInt, bottomInt;
|
||||||
|
BPoint tempPoint;
|
||||||
|
leftInt = GetY(rect.left);
|
||||||
|
rightInt = GetY(rect.right);
|
||||||
|
topInt = GetX(rect.top);
|
||||||
|
bottomInt = GetX(rect.bottom);
|
||||||
|
if ( end.x < start.x )
|
||||||
|
{
|
||||||
|
tempPoint = start;
|
||||||
|
start = end;
|
||||||
|
end = tempPoint;
|
||||||
|
}
|
||||||
|
if ( start.x < rect.left )
|
||||||
|
{
|
||||||
|
if ( (leftInt >= rect.top) && (leftInt <= rect.bottom) )
|
||||||
|
{
|
||||||
|
newStart.x = rect.left;
|
||||||
|
newStart.y = leftInt;
|
||||||
|
}
|
||||||
|
if ( start.y < end.y )
|
||||||
|
{
|
||||||
|
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newStart.x = topInt;
|
||||||
|
newStart.y = rect.top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newStart.x = bottomInt;
|
||||||
|
newStart.y = rect.bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( start.y < rect.top )
|
||||||
|
{
|
||||||
|
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newStart.x = topInt;
|
||||||
|
newStart.y = rect.top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( start.y > rect.bottom )
|
||||||
|
{
|
||||||
|
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newStart.x = bottomInt;
|
||||||
|
newStart.y = rect.bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newStart = start;
|
||||||
|
}
|
||||||
|
if ( end.x > rect.right )
|
||||||
|
{
|
||||||
|
if ( (rightInt >= rect.top) && (rightInt <= rect.bottom) )
|
||||||
|
{
|
||||||
|
newEnd.x = rect.right;
|
||||||
|
newEnd.y = rightInt;
|
||||||
|
}
|
||||||
|
if ( start.y < end.y )
|
||||||
|
{
|
||||||
|
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newEnd.x = bottomInt;
|
||||||
|
newEnd.y = rect.bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newEnd.x = topInt;
|
||||||
|
newEnd.y = rect.top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( end.y < rect.top )
|
||||||
|
{
|
||||||
|
if ( (topInt >= rect.left) && (topInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newEnd.x = topInt;
|
||||||
|
newEnd.y = rect.top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( end.y > rect.bottom )
|
||||||
|
{
|
||||||
|
if ( (bottomInt >= rect.left) && (bottomInt <= rect.right) )
|
||||||
|
{
|
||||||
|
newEnd.x = bottomInt;
|
||||||
|
newEnd.y = rect.bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newEnd = end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( (newStart.x == -1) || (newStart.y == -1) || (newEnd.x == -1) || (newEnd.y == -1) )
|
||||||
|
return false;
|
||||||
|
SetPoints(newStart,newEnd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LineCalc::Swap(LineCalc &from)
|
||||||
|
{
|
||||||
|
BPoint pta, ptb;
|
||||||
|
pta = start;
|
||||||
|
ptb = end;
|
||||||
|
SetPoints(from.start,from.end);
|
||||||
|
from.SetPoints(pta,ptb);
|
||||||
|
}
|
||||||
|
|
||||||
|
float LineCalc::GetX(float y)
|
||||||
|
{
|
||||||
|
if (start.x == end.x)
|
||||||
|
return start.x;
|
||||||
|
return ( (y-offset)/slope );
|
||||||
|
}
|
||||||
|
|
||||||
|
float LineCalc::GetY(float x)
|
||||||
|
{
|
||||||
|
if ( start.x == end.x )
|
||||||
|
return start.y;
|
||||||
|
return ( (slope * x) + offset );
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ SharedLibrary appserver :
|
|||||||
ColorSet.cpp
|
ColorSet.cpp
|
||||||
Decorator.cpp
|
Decorator.cpp
|
||||||
DisplayDriver.cpp
|
DisplayDriver.cpp
|
||||||
|
DisplaySupport.cpp
|
||||||
FontFamily.cpp
|
FontFamily.cpp
|
||||||
LayerData.cpp
|
LayerData.cpp
|
||||||
PatternHandler.cpp
|
PatternHandler.cpp
|
||||||
|
|||||||
@@ -46,12 +46,25 @@ Screen::~Screen(void)
|
|||||||
|
|
||||||
bool Screen::SupportsResolution(BPoint res, uint32 colorspace)
|
bool Screen::SupportsResolution(BPoint res, uint32 colorspace)
|
||||||
{
|
{
|
||||||
// TODO: remove/improve
|
// TODO: remove/improve
|
||||||
return true;
|
return true;
|
||||||
display_mode *dm = NULL;
|
display_mode *dm = NULL;
|
||||||
uint32 count;
|
uint32 count;
|
||||||
|
|
||||||
fDDriver->GetModeList(&dm, &count);
|
status_t err=fDDriver->GetModeList(&dm, &count);
|
||||||
|
|
||||||
|
if(err==B_UNSUPPORTED)
|
||||||
|
{
|
||||||
|
// We've run into quite a problem here! This is a function which is a requirement
|
||||||
|
// for a graphics module. The best thing that we can hope for is 640x480x8 without
|
||||||
|
// knowing anything else. While even this seems like insanity to assume that we
|
||||||
|
// can support this, the only lower mode supported is 640x400, but we shouldn't even
|
||||||
|
// bother with such a pathetic possibility.
|
||||||
|
if( (uint16)res.x == 640 && (uint16)res.y ==480 && colorspace==B_CMAP8)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (uint32 i=0; i < count; i++)
|
for (uint32 i=0; i < count; i++)
|
||||||
{
|
{
|
||||||
@@ -61,7 +74,7 @@ bool Screen::SupportsResolution(BPoint res, uint32 colorspace)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete dm;
|
delete [] dm;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ public:
|
|||||||
~Screen(void);
|
~Screen(void);
|
||||||
|
|
||||||
void SetID(int32 ID){ fID = ID; }
|
void SetID(int32 ID){ fID = ID; }
|
||||||
|
|
||||||
// TODO: get/set prototype methods for graphic card features
|
|
||||||
bool SupportsResolution(BPoint res, uint32 colorspace);
|
bool SupportsResolution(BPoint res, uint32 colorspace);
|
||||||
bool SetResolution(BPoint res, uint32 colorspace);
|
bool SetResolution(BPoint res, uint32 colorspace);
|
||||||
BPoint Resolution() const;
|
BPoint Resolution() const;
|
||||||
@@ -48,7 +46,6 @@ public:
|
|||||||
DisplayDriver* DDriver() const { return fDDriver; }
|
DisplayDriver* DDriver() const { return fDDriver; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// TODO: members in which we should store data.
|
|
||||||
int32 fID;
|
int32 fID;
|
||||||
DisplayDriver *fDDriver;
|
DisplayDriver *fDDriver;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -843,11 +843,13 @@ void ServerWindow::DispatchMessage(int32 code)
|
|||||||
|
|
||||||
// here we remove current layer from list.
|
// here we remove current layer from list.
|
||||||
cl->RemoveSelf();
|
cl->RemoveSelf();
|
||||||
|
|
||||||
// TODO: invalidate the region occupied by this view.
|
|
||||||
cl->PruneTree();
|
cl->PruneTree();
|
||||||
|
|
||||||
|
parent->Invalidate(cl->Frame());
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERVERWINDOW
|
||||||
parent->PrintTree();
|
parent->PrintTree();
|
||||||
|
#endif
|
||||||
STRACE(("DONE: ServerWindow %s: Message AS_DELETE_LAYER: Parent: %s Layer: %s\n", fTitle.String(), parent->fName->String(), cl->fName->String()));
|
STRACE(("DONE: ServerWindow %s: Message AS_DELETE_LAYER: Parent: %s Layer: %s\n", fTitle.String(), parent->fName->String(), cl->fName->String()));
|
||||||
|
|
||||||
delete cl;
|
delete cl;
|
||||||
@@ -876,16 +878,18 @@ void ServerWindow::DispatchMessage(int32 code)
|
|||||||
|
|
||||||
// these 4 are here because of a compiler warning. Maybe he's right... :-)
|
// these 4 are here because of a compiler warning. Maybe he's right... :-)
|
||||||
rgb_color hc, lc, vc; // high, low and view colors
|
rgb_color hc, lc, vc; // high, low and view colors
|
||||||
uint64 patt; // current pattern as a uint64
|
uint64 patt;
|
||||||
|
|
||||||
ld = cl->fLayerData; // now we write fewer characters. :-)
|
ld = cl->fLayerData; // now we write fewer characters. :-)
|
||||||
hc = ld->highcolor.GetColor32();
|
hc = ld->highcolor.GetColor32();
|
||||||
lc = ld->lowcolor.GetColor32();
|
lc = ld->lowcolor.GetColor32();
|
||||||
vc = ld->viewcolor.GetColor32();
|
vc = ld->viewcolor.GetColor32();
|
||||||
patt = ld->patt.GetInt64();
|
patt = ld->patt.GetInt64();
|
||||||
|
|
||||||
// TODO: DW implement such a method in ServerFont class!
|
// TODO: DW implement such a method in ServerFont class!
|
||||||
fSession->StartMessage(SERVER_TRUE);
|
fSession->StartMessage(SERVER_TRUE);
|
||||||
|
|
||||||
|
// Attach font state
|
||||||
fSession->Attach<uint32>(0UL /*uint32 ld->font.GetFamAndStyle()*/);
|
fSession->Attach<uint32>(0UL /*uint32 ld->font.GetFamAndStyle()*/);
|
||||||
fSession->Attach<float>(ld->font.Size());
|
fSession->Attach<float>(ld->font.Size());
|
||||||
fSession->Attach<float>(ld->font.Shear());
|
fSession->Attach<float>(ld->font.Shear());
|
||||||
@@ -895,14 +899,13 @@ void ServerWindow::DispatchMessage(int32 code)
|
|||||||
fSession->Attach<uint16>(ld->font.Face());
|
fSession->Attach<uint16>(ld->font.Face());
|
||||||
fSession->Attach<uint32>(ld->font.Flags());
|
fSession->Attach<uint32>(ld->font.Flags());
|
||||||
|
|
||||||
|
// Attach view state
|
||||||
fSession->Attach<BPoint>(ld->penlocation);
|
fSession->Attach<BPoint>(ld->penlocation);
|
||||||
fSession->Attach<float>(ld->pensize);
|
fSession->Attach<float>(ld->pensize);
|
||||||
fSession->Attach(&hc, sizeof(rgb_color));
|
fSession->Attach(&hc, sizeof(rgb_color));
|
||||||
fSession->Attach(&lc, sizeof(rgb_color));
|
fSession->Attach(&lc, sizeof(rgb_color));
|
||||||
fSession->Attach(&vc, sizeof(rgb_color));
|
fSession->Attach(&vc, sizeof(rgb_color));
|
||||||
|
fSession->Attach<uint64>(patt);
|
||||||
// TODO: fix this to use the templatized version
|
|
||||||
fSession->Attach(&patt,sizeof(pattern));
|
|
||||||
fSession->Attach<BPoint>(ld->coordOrigin);
|
fSession->Attach<BPoint>(ld->coordOrigin);
|
||||||
fSession->Attach<uint8>((uint8)(ld->draw_mode));
|
fSession->Attach<uint8>((uint8)(ld->draw_mode));
|
||||||
fSession->Attach<uint8>((uint8)(ld->lineCap));
|
fSession->Attach<uint8>((uint8)(ld->lineCap));
|
||||||
@@ -949,7 +952,7 @@ void ServerWindow::DispatchMessage(int32 code)
|
|||||||
fSession->Read<float>(&newWidth);
|
fSession->Read<float>(&newWidth);
|
||||||
fSession->Read<float>(&newHeight);
|
fSession->Read<float>(&newHeight);
|
||||||
|
|
||||||
// TODO: check for minimum alowed. WinBorder should provide such
|
// TODO: check for minimum allowed. WinBorder should provide such
|
||||||
// a method, based on its decorator.
|
// a method, based on its decorator.
|
||||||
|
|
||||||
cl->ResizeBy(newWidth, newHeight);
|
cl->ResizeBy(newWidth, newHeight);
|
||||||
@@ -1636,6 +1639,27 @@ void ServerWindow::DispatchMessage(int32 code)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case AS_SET_SIZE_LIMITS:
|
||||||
|
{
|
||||||
|
// Attached Data:
|
||||||
|
// 1) float minimum width
|
||||||
|
// 2) float maximum width
|
||||||
|
// 3) float minimum height
|
||||||
|
// 4) float maximum height
|
||||||
|
|
||||||
|
float wmin,wmax,hmin,hmax;
|
||||||
|
|
||||||
|
fSession->Read<float>(&wmin);
|
||||||
|
fSession->Read<float>(&wmax);
|
||||||
|
fSession->Read<float>(&hmin);
|
||||||
|
fSession->Read<float>(&hmax);
|
||||||
|
|
||||||
|
fWinBorder->SetSizeLimits(wmin,wmax,hmin,hmax);
|
||||||
|
|
||||||
|
fSession->StartMessage(SERVER_TRUE);
|
||||||
|
fSession->Flush();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case B_MINIMIZE:
|
case B_MINIMIZE:
|
||||||
{
|
{
|
||||||
// TODO: Implement
|
// TODO: Implement
|
||||||
@@ -1709,8 +1733,7 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
|
|||||||
|
|
||||||
if (layer)
|
if (layer)
|
||||||
{
|
{
|
||||||
// TODO: fix!
|
layerdata = layer->fLayerData;
|
||||||
//layerdata = layer->GetLayerData();
|
|
||||||
LayerClipRegion.Set(layer->Frame());
|
LayerClipRegion.Set(layer->Frame());
|
||||||
LayerClipRegion.IntersectWith(&WindowClipRegion);
|
LayerClipRegion.IntersectWith(&WindowClipRegion);
|
||||||
numRects = LayerClipRegion.CountRects();
|
numRects = LayerClipRegion.CountRects();
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// Copyright (c) 2001-2002, OpenBeOS
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
|
||||||
// to deal in the Software without restriction, including without limitation
|
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// File Name: SessionStreamReader.cpp
|
|
||||||
// Author: DarkWyrm <[email protected]>
|
|
||||||
// Description: Reader for BSession message streams
|
|
||||||
//
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "SessionStreamReader.h"
|
|
||||||
|
|
||||||
SessionMessage::SessionMessage(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
SessionMessage::SessionMessage(const int32 &code, void *buffer, size_t buffersize)
|
|
||||||
{
|
|
||||||
SetCode(code);
|
|
||||||
SetBuffer(buffer,buffersize);
|
|
||||||
}
|
|
||||||
|
|
||||||
SessionMessage::~SessionMessage(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionMessage::SetData(const int32 &code, void *buffer, size_t buffersize)
|
|
||||||
{
|
|
||||||
SetCode(code);
|
|
||||||
SetBuffer(buffer,buffersize);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SessionStreamReader::SessionStreamReader(msg_dispatcher_func *func)
|
|
||||||
{
|
|
||||||
fBuffer=NULL;
|
|
||||||
fDispatcherFunc=func;
|
|
||||||
fMsgSize=0;
|
|
||||||
fMsgCode=0;
|
|
||||||
fCurrentBufferSize=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SessionStreamReader::~SessionStreamReader(void)
|
|
||||||
{
|
|
||||||
if(fBuffer)
|
|
||||||
{
|
|
||||||
printf("DEBUG: Deleting non-empty SessionStreamReader!\n");
|
|
||||||
delete fBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionStreamReader::DispatchMessages(void *msgbuffer, size_t buffersize)
|
|
||||||
{
|
|
||||||
// This is the main functionality of the stream reader - it takes a BSession message buffer
|
|
||||||
// and reads as much as it can. The entire function centers around fBuffer. If fBuffer is
|
|
||||||
// NULL, then the stream reader is not waiting on the completion of a message.
|
|
||||||
|
|
||||||
if(!msgbuffer || buffersize==0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int8 *index=(int8*)msgbuffer;
|
|
||||||
|
|
||||||
// do we have a message waiting to be completed?
|
|
||||||
while(index<((int8*)msgbuffer+buffersize))
|
|
||||||
{
|
|
||||||
if(fBuffer)
|
|
||||||
{
|
|
||||||
// We need to see if the data we have received in this call
|
|
||||||
// will complete the message or not
|
|
||||||
if(fCurrentBufferSize+buffersize>fMsgSize)
|
|
||||||
{
|
|
||||||
// It will, so copy the data to the current location in the buffer (indicated by
|
|
||||||
// fCurrentBufferSize), call the Dispatch function, make the SSR empty, and iterate
|
|
||||||
|
|
||||||
memcpy(fBuffer+fCurrentBufferSize, msgbuffer, fMsgSize-fCurrentBufferSize);
|
|
||||||
index+=fMsgSize-fCurrentBufferSize;
|
|
||||||
|
|
||||||
fSessionMessage.SetData(fMsgCode,fBuffer,fMsgSize);
|
|
||||||
(*fDispatcherFunc)(&fSessionMessage);
|
|
||||||
|
|
||||||
delete fBuffer;
|
|
||||||
fBuffer=NULL;
|
|
||||||
fCurrentBufferSize=0;
|
|
||||||
fMsgSize=0;
|
|
||||||
fMsgCode=0;
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We will not be completing the message here, so simply copy the buffer and exit
|
|
||||||
memcpy(fBuffer+fCurrentBufferSize, msgbuffer, buffersize);
|
|
||||||
fCurrentBufferSize+=buffersize;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Get basic message data
|
|
||||||
fMsgCode=*((int32*)index); index+=sizeof(int32);
|
|
||||||
fMsgSize=*((int32*)index); index+=sizeof(int32);
|
|
||||||
|
|
||||||
// Now that we have basic stuff for the message, let's see if it is complete
|
|
||||||
if((index+fMsgSize)>((int8*)msgbuffer+buffersize))
|
|
||||||
{
|
|
||||||
// We have an incomplete message. Allocate a buffer to contain all attached
|
|
||||||
// data, copy it over, and exit
|
|
||||||
fBuffer=new int8[fMsgSize];
|
|
||||||
memcpy(fBuffer, msgbuffer, ((int8*)msgbuffer+buffersize)-index);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// This message is complete, so set the appropriate SessionMessage data and
|
|
||||||
// call the Dispatch function
|
|
||||||
|
|
||||||
fSessionMessage.SetData(fMsgCode,index,fMsgSize);
|
|
||||||
(*fDispatcherFunc)(&fSessionMessage);
|
|
||||||
index+=fMsgSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// Copyright (c) 2001-2002, OpenBeOS
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
|
||||||
// to deal in the Software without restriction, including without limitation
|
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// File Name: SessionStreamReader.h
|
|
||||||
// Author: DarkWyrm <[email protected]>
|
|
||||||
// Description: Reader for BSession message streams
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#ifndef SSREADER_H_
|
|
||||||
#define SSREADER_H_
|
|
||||||
|
|
||||||
#include <PortMessage.h>
|
|
||||||
|
|
||||||
typedef void *msg_dispatcher_func(PortMessage *msg);
|
|
||||||
|
|
||||||
class SessionMessage : public PortMessage
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SessionMessage(void);
|
|
||||||
SessionMessage(const int32 &code, void *buffer, size_t buffersize);
|
|
||||||
~SessionMessage(void);
|
|
||||||
void SetData(const int32 &code, void *buffer, size_t buffersize);
|
|
||||||
};
|
|
||||||
|
|
||||||
class SessionStreamReader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SessionStreamReader(msg_dispatcher_func *func);
|
|
||||||
~SessionStreamReader(void);
|
|
||||||
void DispatchMessages(void *msgbuffer, size_t buffersize);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int8 *fBuffer;
|
|
||||||
uint32 fMsgSize,fMsgCode, fCurrentBufferSize;
|
|
||||||
msg_dispatcher_func *fDispatcherFunc;
|
|
||||||
SessionMessage fSessionMessage;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -426,10 +426,14 @@ bool VDWindow::QuitRequested(void)
|
|||||||
{
|
{
|
||||||
port_id serverport=find_port(SERVER_PORT_NAME);
|
port_id serverport=find_port(SERVER_PORT_NAME);
|
||||||
|
|
||||||
if(serverport!=B_NAME_NOT_FOUND)
|
if(serverport>=0)
|
||||||
{
|
{
|
||||||
write_port(serverport,B_QUIT_REQUESTED,NULL,0);
|
BPortLink link(serverport);
|
||||||
|
link.StartMessage(B_QUIT_REQUESTED);
|
||||||
|
link.Flush();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
printf("ERROR: couldn't find the app_server's main port!");
|
||||||
|
|
||||||
// We actually have to perform the internal equivalent of calling Shutdown
|
// We actually have to perform the internal equivalent of calling Shutdown
|
||||||
// to eliminate a race condition. If a ServerWindow attempts to call a driver
|
// to eliminate a race condition. If a ServerWindow attempts to call a driver
|
||||||
@@ -897,20 +901,24 @@ status_t ViewDriver::SetDPMSMode(const uint32 &state)
|
|||||||
if(!is_initialized)
|
if(!is_initialized)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
// TODO: Implement software DPMS
|
// NOTE: Originally, this was a to-do item to implement software DPMS,
|
||||||
return B_ERROR;
|
// but this driver will not be the official testing driver, so implementing
|
||||||
|
// this stuff the way it was intended -- blanking the server's screen but not
|
||||||
|
// the physical monitor -- is moot, but we will support blanking the
|
||||||
|
// actual monitor if it is supported.
|
||||||
|
return BScreen().SetDPMS(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 ViewDriver::DPMSMode(void) const
|
uint32 ViewDriver::DPMSMode(void) const
|
||||||
{
|
{
|
||||||
// TODO: Implement software DPMS
|
// See note for SetDPMSMode if there are questions
|
||||||
return B_DPMS_ON;
|
return BScreen().DPMSState();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 ViewDriver::DPMSCapabilities(void) const
|
uint32 ViewDriver::DPMSCapabilities(void) const
|
||||||
{
|
{
|
||||||
// TODO: Implement software DPMS
|
// See note for SetDPMSMode if there are questions
|
||||||
return B_DPMS_ON;
|
return BScreen().DPMSCapabilites();
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t ViewDriver::GetDeviceInfo(accelerant_device_info *info)
|
status_t ViewDriver::GetDeviceInfo(accelerant_device_info *info)
|
||||||
@@ -937,9 +945,11 @@ status_t ViewDriver::GetModeList(display_mode **modes, uint32 *count)
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
screenwin->Lock();
|
screenwin->Lock();
|
||||||
|
|
||||||
// TODO: Figure out good timing values to be returned in each of the modes
|
// DEPRECATED:
|
||||||
// supported.
|
// NOTE: Originally, I was going to figure out good timing values to be
|
||||||
|
// returned in each of the modes supported, but I won't bother, being this
|
||||||
|
// won't be used much longer anyway.
|
||||||
|
|
||||||
*modes=new display_mode[13];
|
*modes=new display_mode[13];
|
||||||
*count=13;
|
*count=13;
|
||||||
@@ -1019,11 +1029,9 @@ status_t ViewDriver::ProposeMode(display_mode *candidate, const display_mode *lo
|
|||||||
if(!is_initialized)
|
if(!is_initialized)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
// TODO: Unhack
|
|
||||||
|
|
||||||
// We should be able to get away with this because we're not dealing with any
|
// We should be able to get away with this because we're not dealing with any
|
||||||
// specific hardware. This is a Good Thing(TM) because we can support any hardware
|
// specific hardware. This is a Good Thing(TM) because we can support any hardware
|
||||||
// we wish within reasbonable expectaions and programmer laziness. :P
|
// we wish within reasonable expectaions and programmer laziness. :P
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -377,21 +377,44 @@ void WinBorder::ResizeBy(float x, float y)
|
|||||||
Layer::ResizeBy(x,y);
|
Layer::ResizeBy(x,y);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WinBorder::IsHidden() const{
|
bool WinBorder::IsHidden() const
|
||||||
|
{
|
||||||
if (fServerHidden)
|
if (fServerHidden)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return Layer::IsHidden();
|
return Layer::IsHidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WinBorder::ServerHide(){
|
void WinBorder::ServerHide()
|
||||||
|
{
|
||||||
fServerHidden = true;
|
fServerHidden = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WinBorder::ServerUnhide(){
|
void WinBorder::ServerUnhide()
|
||||||
|
{
|
||||||
fServerHidden = false;
|
fServerHidden = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WinBorder::SetSizeLimits(float minwidth, float maxwidth, float minheight, float maxheight)
|
||||||
|
{
|
||||||
|
if(minwidth<0)
|
||||||
|
minwidth=0;
|
||||||
|
|
||||||
|
if(minheight<0)
|
||||||
|
minheight=0;
|
||||||
|
|
||||||
|
if(maxwidth<=minwidth)
|
||||||
|
maxwidth=minwidth+1;
|
||||||
|
|
||||||
|
if(maxheight<=minheight)
|
||||||
|
maxheight=minheight+1;
|
||||||
|
|
||||||
|
fMinWidth=minwidth;
|
||||||
|
fMaxWidth=maxwidth;
|
||||||
|
fMinHeight=minheight;
|
||||||
|
fMaxHeight=maxheight;
|
||||||
|
}
|
||||||
|
|
||||||
bool WinBorder::HasPoint(const BPoint& pt) const
|
bool WinBorder::HasPoint(const BPoint& pt) const
|
||||||
{
|
{
|
||||||
return fFullVisible.Contains(pt);
|
return fFullVisible.Contains(pt);
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public:
|
|||||||
void ServerHide();
|
void ServerHide();
|
||||||
void ServerUnhide();
|
void ServerUnhide();
|
||||||
|
|
||||||
|
void SetSizeLimits(float minwidth, float maxwidth, float minheight, float maxheight);
|
||||||
|
|
||||||
void MouseDown(PointerEvent& evt, bool sendMessage);
|
void MouseDown(PointerEvent& evt, bool sendMessage);
|
||||||
void MouseMoved(PointerEvent& evt);
|
void MouseMoved(PointerEvent& evt);
|
||||||
void MouseUp(PointerEvent& evt);
|
void MouseUp(PointerEvent& evt);
|
||||||
@@ -94,7 +96,7 @@ public:
|
|||||||
|
|
||||||
// Server "private" :-) - should not be used
|
// Server "private" :-) - should not be used
|
||||||
void SetMainWinBorder(WinBorder *newMain);
|
void SetMainWinBorder(WinBorder *newMain);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class Layer;
|
friend class Layer;
|
||||||
friend class ServerWindow;
|
friend class ServerWindow;
|
||||||
@@ -114,6 +116,9 @@ protected:
|
|||||||
bool fIsClosing;
|
bool fIsClosing;
|
||||||
bool fIsMinimizing;
|
bool fIsMinimizing;
|
||||||
bool fIsZooming;
|
bool fIsZooming;
|
||||||
|
|
||||||
|
float fMinWidth, fMaxWidth;
|
||||||
|
float fMinHeight, fMaxHeight;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user