Added extra pixel setting routines
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1945 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
a27f9ebd60
commit
8f3cf68703
@ -601,6 +601,87 @@ r.PrintToStream();
|
|||||||
Unlock();
|
Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScreenDriver::SetThickPixel(int x, int y, int thick, RGBColor col)
|
||||||
|
{
|
||||||
|
switch(fbuffer->gcinfo.bits_per_pixel)
|
||||||
|
{
|
||||||
|
case 32:
|
||||||
|
case 24:
|
||||||
|
SetThickPixel32(x,y,thick,col.GetColor32());
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
case 15:
|
||||||
|
SetThickPixel16(x,y,thick,col.GetColor16());
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
SetThickPixel8(x,y,thick,col.GetColor8());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Unknown pixel depth %d in SetThickPixel\n",fbuffer->gcinfo.bits_per_pixel);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenDriver::SetThickPixel32(int x, int y, int thick, rgb_color col)
|
||||||
|
{
|
||||||
|
// Code courtesy of YNOP's SecondDriver
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint8 bytes[4];
|
||||||
|
uint32 word;
|
||||||
|
}c1;
|
||||||
|
|
||||||
|
c1.bytes[0]=col.blue;
|
||||||
|
c1.bytes[1]=col.green;
|
||||||
|
c1.bytes[2]=col.red;
|
||||||
|
c1.bytes[3]=col.alpha;
|
||||||
|
|
||||||
|
/*
|
||||||
|
uint32 *bits=(uint32*)fbuffer->gcinfo.frame_buffer;
|
||||||
|
*(bits + x + (y*fbuffer->gcinfo.width))=c1.word;
|
||||||
|
*/
|
||||||
|
uint32 *bits=(uint32*)fbuffer->gcinfo.frame_buffer+(x-thick/2)+(y-thick/2)*fbuffer->gcinfo.width;
|
||||||
|
int i,j;
|
||||||
|
for (i=0; i<thick; i++)
|
||||||
|
{
|
||||||
|
for (j=0; j<thick; j++)
|
||||||
|
{
|
||||||
|
*(bits+j)=c1.word;
|
||||||
|
}
|
||||||
|
bits += fbuffer->gcinfo.width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenDriver::SetThickPixel16(int x, int y, int thick, uint16 col)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef DEBUG_DRIVER
|
||||||
|
printf("SetPixel16 unimplemented\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenDriver::SetThickPixel8(int x, int y, int thick, uint8 col)
|
||||||
|
{
|
||||||
|
// When the DisplayDriver API changes, we'll use the uint8 highcolor. Until then,
|
||||||
|
// we'll use *pattern
|
||||||
|
/*
|
||||||
|
uint8 *bits=(uint8*)fbuffer->gcinfo.frame_buffer;
|
||||||
|
*(bits + x + (y*fbuffer->gcinfo.bytes_per_row))=col;
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8 *bits=(uint8*)fbuffer->gcinfo.frame_buffer+(x-thick/2)+(y-thick/2)*fbuffer->gcinfo.bytes_per_row;
|
||||||
|
int i,j;
|
||||||
|
for (i=0; i<thick; i++)
|
||||||
|
{
|
||||||
|
for (j=0; j<thick; j++)
|
||||||
|
{
|
||||||
|
*(bits+j)=col;
|
||||||
|
}
|
||||||
|
bits += fbuffer->gcinfo.bytes_per_row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScreenDriver::SetPixel(int x, int y, RGBColor col)
|
void ScreenDriver::SetPixel(int x, int y, RGBColor col)
|
||||||
{
|
{
|
||||||
switch(fbuffer->gcinfo.bits_per_pixel)
|
switch(fbuffer->gcinfo.bits_per_pixel)
|
||||||
@ -684,7 +765,7 @@ printf("ScreenDriver::SetScreen(%lu}\n",space);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Currently only supports line thickness 1 and no pattern
|
// Currently does not support pattern
|
||||||
void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int8 *pat)
|
void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int8 *pat)
|
||||||
{
|
{
|
||||||
float xc = (r.left+r.right)/2;
|
float xc = (r.left+r.right)/2;
|
||||||
@ -704,6 +785,7 @@ void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int
|
|||||||
int startQuad, endQuad;
|
int startQuad, endQuad;
|
||||||
bool useQuad1, useQuad2, useQuad3, useQuad4;
|
bool useQuad1, useQuad2, useQuad3, useQuad4;
|
||||||
bool shortspan = false;
|
bool shortspan = false;
|
||||||
|
int thick = d->pensize;
|
||||||
|
|
||||||
// Watch out for bozos giving us whacko spans
|
// Watch out for bozos giving us whacko spans
|
||||||
if ( (span >= 360) || (span <= -360) )
|
if ( (span >= 360) || (span <= -360) )
|
||||||
@ -756,19 +838,19 @@ void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int
|
|||||||
if ( useQuad1 ||
|
if ( useQuad1 ||
|
||||||
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
||||||
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
||||||
SetPixel(xc+x,yc+y,d->highcolor);
|
SetThickPixel(xc+x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad2 ||
|
if ( useQuad2 ||
|
||||||
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
||||||
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
||||||
SetPixel(xc-x,yc+y,d->highcolor);
|
SetThickPixel(xc-x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad3 ||
|
if ( useQuad3 ||
|
||||||
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
||||||
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
||||||
SetPixel(xc-x,yc-y,d->highcolor);
|
SetThickPixel(xc-x,yc-y,thick,d->highcolor);
|
||||||
if ( useQuad4 ||
|
if ( useQuad4 ||
|
||||||
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
||||||
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
||||||
SetPixel(xc+x,yc-y,d->highcolor);
|
SetThickPixel(xc+x,yc-y,thick,d->highcolor);
|
||||||
|
|
||||||
p = ROUND (Ry2 - (Rx2 * ry) + (.25 * Rx2));
|
p = ROUND (Ry2 - (Rx2 * ry) + (.25 * Rx2));
|
||||||
while (px < py)
|
while (px < py)
|
||||||
@ -787,19 +869,19 @@ void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int
|
|||||||
if ( useQuad1 ||
|
if ( useQuad1 ||
|
||||||
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
||||||
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
||||||
SetPixel(xc+x,yc+y,d->highcolor);
|
SetThickPixel(xc+x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad2 ||
|
if ( useQuad2 ||
|
||||||
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
||||||
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
||||||
SetPixel(xc-x,yc+y,d->highcolor);
|
SetThickPixel(xc-x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad3 ||
|
if ( useQuad3 ||
|
||||||
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
||||||
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
||||||
SetPixel(xc-x,yc-y,d->highcolor);
|
SetThickPixel(xc-x,yc-y,thick,d->highcolor);
|
||||||
if ( useQuad4 ||
|
if ( useQuad4 ||
|
||||||
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
||||||
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
||||||
SetPixel(xc+x,yc-y,d->highcolor);
|
SetThickPixel(xc+x,yc-y,thick,d->highcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
p = ROUND(Ry2*(x+.5)*(x+.5) + Rx2*(y-1)*(y-1) - Rx2*Ry2);
|
p = ROUND(Ry2*(x+.5)*(x+.5) + Rx2*(y-1)*(y-1) - Rx2*Ry2);
|
||||||
@ -819,23 +901,23 @@ void ScreenDriver::StrokeArc(BRect r, float angle, float span, LayerData *d, int
|
|||||||
if ( useQuad1 ||
|
if ( useQuad1 ||
|
||||||
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
(!shortspan && ((startQuad == 1) && (x <= startx)) || ((endQuad == 1) && (x >= endx))) ||
|
||||||
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
(shortspan && (startQuad == 1) && (x <= startx) && (x >= endx)) )
|
||||||
SetPixel(xc+x,yc+y,d->highcolor);
|
SetThickPixel(xc+x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad2 ||
|
if ( useQuad2 ||
|
||||||
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
(!shortspan && ((startQuad == 2) && (-x <= startx)) || ((endQuad == 2) && (-x >= endx))) ||
|
||||||
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
(shortspan && (startQuad == 2) && (-x <= startx) && (-x >= endx)) )
|
||||||
SetPixel(xc-x,yc+y,d->highcolor);
|
SetThickPixel(xc-x,yc+y,thick,d->highcolor);
|
||||||
if ( useQuad3 ||
|
if ( useQuad3 ||
|
||||||
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
(!shortspan && ((startQuad == 3) && (-x >= startx)) || ((endQuad == 3) && (-x <= endx))) ||
|
||||||
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
(shortspan && (startQuad == 3) && (-x >= startx) && (-x <= endx)) )
|
||||||
SetPixel(xc-x,yc-y,d->highcolor);
|
SetThickPixel(xc-x,yc-y,thick,d->highcolor);
|
||||||
if ( useQuad4 ||
|
if ( useQuad4 ||
|
||||||
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
(!shortspan && ((startQuad == 4) && (x >= startx)) || ((endQuad == 4) && (x <= endx))) ||
|
||||||
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
(shortspan && (startQuad == 4) && (x >= startx) && (x <= endx)) )
|
||||||
SetPixel(xc+x,yc-y,d->highcolor);
|
SetThickPixel(xc+x,yc-y,thick,d->highcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently only supports line thickness 1 and no pattern
|
// Currently does not support pattern
|
||||||
void ScreenDriver::StrokeBezier(BPoint *pts, LayerData *d, int8 *pat)
|
void ScreenDriver::StrokeBezier(BPoint *pts, LayerData *d, int8 *pat)
|
||||||
{
|
{
|
||||||
double Ax, Bx, Cx, Dx;
|
double Ax, Bx, Cx, Dx;
|
||||||
@ -876,7 +958,7 @@ void ScreenDriver::StrokeBezier(BPoint *pts, LayerData *d, int8 *pat)
|
|||||||
x = ROUND(X);
|
x = ROUND(X);
|
||||||
y = ROUND(Y);
|
y = ROUND(Y);
|
||||||
if ( (x!=lastx) || (y!=lasty) )
|
if ( (x!=lastx) || (y!=lasty) )
|
||||||
SetPixel(x,y,d->highcolor);
|
SetThickPixel(x,y,d->pensize,d->highcolor);
|
||||||
lastx = x;
|
lastx = x;
|
||||||
lasty = y;
|
lasty = y;
|
||||||
|
|
||||||
@ -1575,10 +1657,16 @@ void ScreenDriver::DrawString(const char *string, int32 length, BPoint pt, Layer
|
|||||||
// if we do any transformation, we do a call to FT_Set_Transform() here
|
// if we do any transformation, we do a call to FT_Set_Transform() here
|
||||||
|
|
||||||
// First, rotate
|
// First, rotate
|
||||||
|
/*
|
||||||
rmatrix.xx = (FT_Fixed)( rotation.Cosine()*0x10000);
|
rmatrix.xx = (FT_Fixed)( rotation.Cosine()*0x10000);
|
||||||
rmatrix.xy = (FT_Fixed)(-rotation.Sine()*0x10000);
|
rmatrix.xy = (FT_Fixed)(-rotation.Sine()*0x10000);
|
||||||
rmatrix.yx = (FT_Fixed)( rotation.Sine()*0x10000);
|
rmatrix.yx = (FT_Fixed)( rotation.Sine()*0x10000);
|
||||||
rmatrix.yy = (FT_Fixed)( rotation.Cosine()*0x10000);
|
rmatrix.yy = (FT_Fixed)( rotation.Cosine()*0x10000);
|
||||||
|
*/
|
||||||
|
rmatrix.xx = (FT_Fixed)( rotation.Cosine()*0x10000);
|
||||||
|
rmatrix.xy = (FT_Fixed)( rotation.Sine()*0x10000);
|
||||||
|
rmatrix.yx = (FT_Fixed)(-rotation.Sine()*0x10000);
|
||||||
|
rmatrix.yy = (FT_Fixed)( rotation.Cosine()*0x10000);
|
||||||
|
|
||||||
// Next, shear
|
// Next, shear
|
||||||
smatrix.xx = (FT_Fixed)(0x10000);
|
smatrix.xx = (FT_Fixed)(0x10000);
|
||||||
@ -1586,7 +1674,8 @@ void ScreenDriver::DrawString(const char *string, int32 length, BPoint pt, Layer
|
|||||||
smatrix.yx = (FT_Fixed)(0);
|
smatrix.yx = (FT_Fixed)(0);
|
||||||
smatrix.yy = (FT_Fixed)(0x10000);
|
smatrix.yy = (FT_Fixed)(0x10000);
|
||||||
|
|
||||||
FT_Matrix_Multiply(&rmatrix,&smatrix);
|
//FT_Matrix_Multiply(&rmatrix,&smatrix);
|
||||||
|
FT_Matrix_Multiply(&smatrix,&rmatrix);
|
||||||
|
|
||||||
// Set up the increment value for escapement padding
|
// Set up the increment value for escapement padding
|
||||||
space.x=int32(d->edelta.space * rotation.Cosine()*64);
|
space.x=int32(d->edelta.space * rotation.Cosine()*64);
|
||||||
@ -1607,7 +1696,8 @@ void ScreenDriver::DrawString(const char *string, int32 length, BPoint pt, Layer
|
|||||||
|
|
||||||
for(i=0;i<strlength;i++)
|
for(i=0;i<strlength;i++)
|
||||||
{
|
{
|
||||||
FT_Set_Transform(face,&smatrix,&pen);
|
//FT_Set_Transform(face,&smatrix,&pen);
|
||||||
|
FT_Set_Transform(face,&rmatrix,&pen);
|
||||||
|
|
||||||
// Handle escapement padding option
|
// Handle escapement padding option
|
||||||
if((uint8)string[i]<=0x20)
|
if((uint8)string[i]<=0x20)
|
||||||
|
@ -96,6 +96,10 @@ protected:
|
|||||||
void SetPixel32(int x, int y, rgb_color col);
|
void SetPixel32(int x, int y, rgb_color col);
|
||||||
void SetPixel16(int x, int y, uint16 col);
|
void SetPixel16(int x, int y, uint16 col);
|
||||||
void SetPixel8(int x, int y, uint8 col);
|
void SetPixel8(int x, int y, uint8 col);
|
||||||
|
void SetThickPixel(int x, int y, int thick, RGBColor col);
|
||||||
|
void SetThickPixel32(int x, int y, int thick, rgb_color col);
|
||||||
|
void SetThickPixel16(int x, int y, int thick, uint16 col);
|
||||||
|
void SetThickPixel8(int x, int y, int thick, uint8 col);
|
||||||
FrameBuffer *fbuffer;
|
FrameBuffer *fbuffer;
|
||||||
int hide_cursor;
|
int hide_cursor;
|
||||||
ServerBitmap *cursor, *under_cursor;
|
ServerBitmap *cursor, *under_cursor;
|
||||||
|
Loading…
Reference in New Issue
Block a user