forked from enlightenment/efl
105 lines
2.8 KiB
C
105 lines
2.8 KiB
C
#include "evas_gl_private.h"
|
|
|
|
void
|
|
evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int y2)
|
|
{
|
|
RGBA_Draw_Context *dc;
|
|
int r, g, b, a;
|
|
int c, cx, cy, cw, ch;
|
|
static int offset_hack = -1;
|
|
const int OFFSET_HACK_OFF = 0;
|
|
const int OFFSET_HACK_DEFAULT = 1;
|
|
const int OFFSET_HACK_ARM = 2;
|
|
Evas_GL_Texture *mtex = NULL;
|
|
Eina_Bool mask_smooth = EINA_FALSE;
|
|
Eina_Bool mask_color = EINA_FALSE;
|
|
int mx = 0, my = 0, mw = 0, mh = 0;
|
|
Evas_GL_Image *mask;
|
|
|
|
dc = gc->dc;
|
|
if (dc->mul.use)
|
|
{
|
|
a = (dc->mul.col >> 24) & 0xff;
|
|
r = (dc->mul.col >> 16) & 0xff;
|
|
g = (dc->mul.col >> 8 ) & 0xff;
|
|
b = (dc->mul.col ) & 0xff;
|
|
}
|
|
else
|
|
{
|
|
a = (dc->col.col >> 24) & 0xff;
|
|
r = (dc->col.col >> 16) & 0xff;
|
|
g = (dc->col.col >> 8 ) & 0xff;
|
|
b = (dc->col.col ) & 0xff;
|
|
}
|
|
|
|
c = gc->dc->clip.use;
|
|
cx = gc->dc->clip.x; cy = gc->dc->clip.y;
|
|
cw = gc->dc->clip.w; ch = gc->dc->clip.h;
|
|
|
|
mask = gc->dc->clip.mask;
|
|
if (mask)
|
|
{
|
|
evas_gl_common_image_update(gc, mask);
|
|
mtex = mask->tex;
|
|
if (mtex && mtex->pt && mtex->pt->w && mtex->pt->h)
|
|
{
|
|
// canvas coords
|
|
mx = gc->dc->clip.mask_x;
|
|
my = gc->dc->clip.mask_y;
|
|
mw = mask->w;
|
|
mh = mask->h;
|
|
mask_smooth = mask->scaled.smooth;
|
|
mask_color = gc->dc->clip.mask_color;
|
|
}
|
|
else mtex = NULL;
|
|
}
|
|
|
|
//I have no idea but shift lines/clips since the gl line origin position and
|
|
//sissor area is slightly different by the gl driver.
|
|
if (offset_hack == -1)
|
|
{
|
|
if (!getenv("EVAS_GL_LINE_OFFSET_HACK_DISABLE"))
|
|
{
|
|
const char *vendor_name;
|
|
vendor_name = (char *) glGetString(GL_VENDOR);
|
|
if (vendor_name && !strcmp(vendor_name, "ARM"))
|
|
offset_hack = OFFSET_HACK_ARM;
|
|
else
|
|
offset_hack = OFFSET_HACK_DEFAULT;
|
|
}
|
|
else offset_hack = OFFSET_HACK_OFF;
|
|
}
|
|
|
|
if (offset_hack == OFFSET_HACK_DEFAULT)
|
|
{
|
|
if ((gc->rot == 0) || (gc->rot == 90))
|
|
{
|
|
x1++;
|
|
x2++;
|
|
}
|
|
if ((gc->rot == 90) || (gc->rot == 180))
|
|
{
|
|
y1++;
|
|
y2++;
|
|
}
|
|
}
|
|
else if (offset_hack == OFFSET_HACK_ARM)
|
|
{
|
|
if ((gc->rot == 90) || (gc->rot == 180))
|
|
{
|
|
cx--;
|
|
cw--;
|
|
}
|
|
if ((gc->rot == 180) || (gc->rot == 270))
|
|
{
|
|
cy--;
|
|
ch--;
|
|
}
|
|
}
|
|
|
|
evas_gl_common_context_line_push(gc, x1, y1, x2, y2,
|
|
c, cx, cy, cw, ch,
|
|
mtex, mx, my, mw, mh, mask_smooth, mask_color,
|
|
r, g, b, a);
|
|
}
|