184 lines
4.5 KiB
C
184 lines
4.5 KiB
C
#include "evas_gl_private.h"
|
|
|
|
|
|
void
|
|
evas_gl_common_filter_draw(void *data, Evas_Engine_GL_Context *gc,
|
|
void *image, Evas_Filter_Info *filter)
|
|
{
|
|
Evas_GL_Image *im = image;
|
|
RGBA_Draw_Context *dc;
|
|
GLuint prog;
|
|
int r,g,b,a;
|
|
int nomul, bgra;
|
|
|
|
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
|
|
{
|
|
r = g = b = a = 255;
|
|
}
|
|
|
|
nomul = (a == 255 && r == 255 && g == 255 && b == 255) ? 1 : 0;
|
|
bgra = (gc->shared->info.bgra) ? 1 : 0;
|
|
|
|
/* FIXME: This should so be a table */
|
|
#if 0
|
|
if (filter->filter == EVAS_FILTER_BLUR)
|
|
{
|
|
if (bgra)
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_blur_bgra_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_blur_bgra.prog;
|
|
}
|
|
else
|
|
{
|
|
if (a == 255 && r == 255 && g == 255 && b == 255)
|
|
prog = gc->shared->shader.filter_blur_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_blur.prog;
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
if (filter->filter == EVAS_FILTER_INVERT)
|
|
{
|
|
if (bgra)
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_invert_bgra_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_invert_bgra.prog;
|
|
}
|
|
else
|
|
{
|
|
if (a == 255 && r == 255 && g == 255 && b == 255)
|
|
prog = gc->shared->shader.filter_invert_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_invert.prog;
|
|
}
|
|
}
|
|
else if (filter->filter == EVAS_FILTER_SEPIA)
|
|
{
|
|
if (bgra)
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_sepia_bgra_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_sepia_bgra.prog;
|
|
}
|
|
else
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_sepia_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_sepia.prog;
|
|
}
|
|
|
|
}
|
|
else /*if (filter->filter == EVAS_FILTER_GREYSCALE)*/
|
|
{
|
|
printf("BGRA: %s Nomul: %s\n",bgra?"true":"false",nomul?"nomul":"mul");
|
|
if (bgra)
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_greyscale_bgra_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_greyscale_bgra.prog;
|
|
}
|
|
else
|
|
{
|
|
if (nomul)
|
|
prog = gc->shared->shader.filter_greyscale_nomul.prog;
|
|
else
|
|
prog = gc->shared->shader.filter_greyscale.prog;
|
|
}
|
|
|
|
}
|
|
|
|
printf("Prog: %d %d %d\n",prog,im->w,im->h);
|
|
gc->filter_prog = prog;
|
|
evas_gl_common_image_update(gc, im);
|
|
evas_gl_common_context_image_push(gc, im->tex, 0, 0, im->w, im->h,
|
|
0, 0, im->w, im->h,
|
|
r,g,b,a,
|
|
1, im->tex_only);
|
|
gc->filter_prog = 0;
|
|
}
|
|
|
|
|
|
Filtered_Image *
|
|
evas_gl_common_image_filtered_get(Evas_GL_Image *im, uint8_t *key, size_t len)
|
|
{
|
|
Filtered_Image *fi;
|
|
Eina_List *l;
|
|
|
|
for (l = im->filtered ; l ; l = l->next)
|
|
{
|
|
fi = l->data;
|
|
if (fi->keylen != len) continue;
|
|
if (memcmp(key, fi->key, len) != 0) continue;
|
|
fi->ref ++;
|
|
return fi;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
Filtered_Image *
|
|
evas_gl_common_image_filtered_save(Evas_GL_Image *im, Evas_GL_Image *fimage,
|
|
uint8_t *key, size_t keylen)
|
|
{
|
|
Filtered_Image *fi;
|
|
Eina_List *l;
|
|
|
|
for (l = im->filtered ; l ; l = l->next)
|
|
{
|
|
fi = l->data;
|
|
if (fi->keylen != keylen) continue;
|
|
if (memcmp(key, fi->key, keylen) != 0) continue;
|
|
|
|
fi->image = (void *)fimage;
|
|
fi->ref ++;
|
|
return fi;
|
|
}
|
|
|
|
fi = calloc(1,sizeof(Filtered_Image));
|
|
if (!fi) return NULL;
|
|
|
|
fi->keylen = keylen;
|
|
fi->key = malloc(keylen);
|
|
memcpy(fi->key, key, keylen);
|
|
fi->image = (void *)fimage;
|
|
fi->ref = 1;
|
|
|
|
im->filtered = eina_list_prepend(im->filtered, fi);
|
|
|
|
return fi;
|
|
}
|
|
|
|
void
|
|
evas_gl_common_image_filtered_free(Evas_GL_Image *image, Filtered_Image *fi)
|
|
{
|
|
fi->ref --;
|
|
if (fi->ref) return;
|
|
|
|
free(fi->key);
|
|
evas_gl_common_image_free((void *)fi->image);
|
|
fi->image = NULL;
|
|
|
|
image->filtered = eina_list_remove(image->filtered, fi);
|
|
}
|
|
|
|
|
|
|
|
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
|