text objects work! dude! like totally! :)

SVN revision: 3112
This commit is contained in:
Carsten Haitzler 2000-08-14 03:23:46 +00:00
parent 331b113f4d
commit c64671e765
8 changed files with 500 additions and 17 deletions

View File

@ -165,6 +165,11 @@ struct _Evas_Object_Text
struct _Evas_Object_Any object;
struct {
char *text;
char *font;
int size;
struct {
int w, h;
} string;
int r, g, b, a;
} current, previous;
};
@ -236,10 +241,20 @@ void evas_set_image_file(Evas e, Evas_Object o, char *file);
void evas_set_image_data(Evas e, Evas_Object o, void *data, Evas_Image_Format format, int w, int h);
void evas_set_image_fill(Evas e, Evas_Object o, double x, double y, double w, double h);
void evas_set_color(Evas e, Evas_Object o, int r, int g, int b, int a);
void evas_set_text(Evas e, Evas_Object o, char *text);
void evas_set_font(Evas e, Evas_Object o, char *font, int size);
void evas_set_gradient(Evas e, Evas_Object o, Evas_Gradient grad);
void evas_set_angle(Evas e, Evas_Object o, double angle);
void evas_set_zoom_scale(Evas e, Evas_Object o, int scale);
void evas_set_line_xy(Evas e, Evas_Object o, double x1, double y1, double x2, double y2);
void evas_set_font_cache(Evas e, int size);
int evas_get_font_cache(Evas e);
void evas_flush_font_cache(Evas e);
void evas_set_image_cache(Evas e, int size);
int evas_get_image_cache(Evas e);
void evas_flush_image_cache(Evas e);
void evas_font_add_path(Evas e, char *path);
void evas_font_del_path(Evas e, char *path);
/* layer stacking for object */
void evas_set_layer(Evas e, Evas_Object o, int l);

View File

@ -769,7 +769,7 @@ __evas_gl_text_paste(Evas_GL_Font *f, char *text,
TT_Glyph_Metrics metrics;
float rr, gg, bb, aa;
GLuint last_tex;
j = text[0];
TT_Get_Glyph_Metrics(f->glyphs[j], &metrics);
x_offset = (-metrics.bearingX) / 64;

View File

@ -58,17 +58,17 @@ evas_add_image_from_file(Evas e, char *file)
imlib_context_set_image(im);
oo->current.image.w = imlib_image_get_width();
oo->current.image.h = imlib_image_get_height();
o->current.x = 0;
o->current.y = 0;
o->current.w = (double)oo->current.image.w;
o->current.h = (double)oo->current.image.h;
oo->current.fill.x = 0;
oo->current.fill.y = 0;
oo->current.fill.w = (double)oo->current.image.w;
oo->current.fill.h = (double)oo->current.image.h;
imlib_free_image();
}
}
oo->current.fill.x = 0;
oo->current.fill.y = 0;
oo->current.fill.w = (double)oo->current.image.w;
oo->current.fill.h = (double)oo->current.image.h;
o->current.x = 0;
o->current.y = 0;
o->current.w = (double)oo->current.image.w;
o->current.h = (double)oo->current.image.h;
for (l = e->layers; l; l = l->next)
{

View File

@ -3,6 +3,8 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "evas_gl_routines.h"
#include "evas_imlib_routines.h"
Evas
evas_new(void)
@ -85,6 +87,141 @@ evas_set_color(Evas e, Evas_Object o, int r, int g, int b, int a)
}
}
void
evas_set_text(Evas e, Evas_Object o, char *text)
{
switch (o->type)
{
case OBJECT_TEXT:
{
Evas_Object_Text oo;
oo = (Evas_Object_Text)o;
if (oo->current.text) free(oo->current.text);
oo->current.text = strdup(text);
oo->previous.text = NULL;
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
{
Evas_Imlib_Font *fn;
fn = __evas_imlib_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_imlib_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_imlib_text_font_free(fn);
}
}
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
{
Evas_GL_Font *fn;
fn = __evas_gl_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_gl_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_gl_text_font_free(fn);
}
}
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
break;
}
}
o->current.w = (double)oo->current.string.w;
o->current.h = (double)oo->current.string.h;
}
o->changed = 1;
e->changed = 1;
break;
default:
break;
}
}
void
evas_set_font(Evas e, Evas_Object o, char *font, int size)
{
switch (o->type)
{
case OBJECT_TEXT:
{
Evas_Object_Text oo;
oo = (Evas_Object_Text)o;
if (oo->current.font) free(oo->current.font);
oo->current.font = strdup(font);
oo->previous.font = NULL;
oo->current.size = size;
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
{
Evas_Imlib_Font *fn;
fn = __evas_imlib_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_imlib_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_imlib_text_font_free(fn);
}
}
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
{
Evas_GL_Font *fn;
fn = __evas_gl_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_gl_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_gl_text_font_free(fn);
}
}
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
break;
}
}
o->current.w = (double)oo->current.string.w;
o->current.h = (double)oo->current.string.h;
}
o->changed = 1;
e->changed = 1;
break;
default:
break;
}
}
void
evas_set_angle(Evas e, Evas_Object o, double angle)
{
@ -112,3 +249,172 @@ evas_set_zoom_scale(Evas e, Evas_Object o, int scale)
o->changed = 1;
e->changed = 1;
}
void
evas_set_font_cache(Evas e, int size)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_text_cache_set_size(e->current.display, size);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_text_cache_set_size(e->current.display, size);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
int
evas_get_font_cache(Evas e)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
return __evas_imlib_text_cache_get_size(e->current.display);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
return __evas_gl_text_cache_get_size(e->current.display);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
void
evas_flush_font_cache(Evas e)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_text_cache_empty(e->current.display);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_text_cache_empty(e->current.display);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
void
evas_set_image_cache(Evas e, int size)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_image_cache_set_size(e->current.display, size);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_image_cache_set_size(e->current.display, size);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
int
evas_get_image_cache(Evas e)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
return __evas_imlib_image_cache_get_size(e->current.display);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
return __evas_gl_image_cache_get_size(e->current.display);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
void
evas_flush_image_cache(Evas e)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_image_cache_empty(e->current.display);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_image_cache_empty(e->current.display);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
void
evas_font_add_path(Evas e, char *path)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_text_font_add_path(path);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_text_font_add_path(path);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}
void
evas_font_del_path(Evas e, char *path)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
__evas_imlib_text_font_del_path(path);
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
__evas_gl_text_font_del_path(path);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return;
break;
}
}

View File

@ -206,10 +206,13 @@ evas_move(Evas e, Evas_Object o, double x, double y)
void
evas_resize(Evas e, Evas_Object o, double w, double h)
{
o->current.w = w;
o->current.h = h;
o->changed = 1;
e->changed = 1;
if (o->type != OBJECT_TEXT)
{
o->current.w = w;
o->current.h = h;
o->changed = 1;
e->changed = 1;
}
}
void

View File

@ -85,6 +85,9 @@ evas_render(Evas e)
void (*func_init) (Display *disp, Window w);
int (*func_image_get_width) (void *im);
int (*func_image_get_height) (void *im);
void * (*func_text_font_new) (Display *disp, char *font, int size);
void (*func_text_font_free) (Evas_GL_Font *fn);
void (*func_text_draw) (Evas_GL_Font *fn, Display *disp, Window win, int win_w, int win_h, int x, int y, char *text, int r, int g, int b, int a);
if ((!e->changed) ||
(!e->current.display) ||
@ -106,6 +109,9 @@ evas_render(Evas e)
func_init = __evas_imlib_init;
func_image_get_width = __evas_imlib_image_get_width;
func_image_get_height = __evas_imlib_image_get_height;
func_text_font_new = __evas_imlib_text_font_new;
func_text_font_free = __evas_imlib_text_font_free;
func_text_draw = __evas_imlib_text_draw;
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
@ -118,6 +124,9 @@ evas_render(Evas e)
func_init = __evas_gl_init;
func_image_get_width = __evas_gl_image_get_width;
func_image_get_height = __evas_gl_image_get_height;
func_text_font_new = __evas_gl_text_font_new;
func_text_font_free = __evas_gl_text_font_free;
func_text_draw = __evas_gl_text_draw;
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
@ -190,7 +199,14 @@ evas_render(Evas e)
Evas_Object_Text oo;
oo = o;
if (1)
if (((oo->current.text) && (!oo->previous.text)) ||
((oo->current.font) && (!oo->previous.font)) ||
(oo->current.size != oo->previous.size) ||
(oo->current.r != oo->previous.r) ||
(oo->current.g != oo->previous.g) ||
(oo->current.b != oo->previous.b) ||
(oo->current.a != oo->previous.a)
)
real_change = 1;
oo->previous = oo->current;
}
@ -451,8 +467,26 @@ evas_render(Evas e)
case OBJECT_TEXT:
{
Evas_Object_Text oo;
void *fn;
oo = o;
fn = func_text_font_new(e->current.display, oo->current.font, oo->current.size);
if (fn)
{
func_text_draw(fn,
e->current.display,
e->current.drawable,
e->current.drawable_width,
e->current.drawable_height,
o->current.x,
o->current.y,
oo->current.text,
oo->current.r,
oo->current.g,
oo->current.b,
oo->current.a);
func_text_font_free(fn);
}
}
break;
case OBJECT_RECTANGLE:
@ -609,7 +643,7 @@ evas_set_scale_smoothness(Evas e, int smooth)
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
return 0;
return;
break;
}
}

View File

@ -3,8 +3,119 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "evas_gl_routines.h"
#include "evas_imlib_routines.h"
static void
_evas_free_text(Evas_Object o)
{
Evas_Object_Text oo;
oo = o;
if (o->callbacks) evas_list_free(o->callbacks);
if (oo->current.text) free(oo->current.text);
free(o);
}
static void
_evas_free_text_renderer_data(Evas e, Evas_Object o)
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
break;
}
}
Evas_Object
evas_add_text(Evas e, char *font, int size, char *text)
{
Evas_Object_Text oo;
Evas_Object_Any o;
Evas_List l;
Evas_Layer layer;
o = oo = malloc(sizeof(struct _Evas_Object_Text));
memset(o, 0, sizeof(struct _Evas_Object_Text));
o->type = OBJECT_TEXT;
o->object_free = _evas_free_text;
o->object_renderer_data_free = _evas_free_text_renderer_data;
oo->current.text = strdup(text);
oo->current.font = strdup(font);
oo->current.size = size;
{
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
{
Evas_Imlib_Font *fn;
fn = __evas_imlib_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_imlib_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_imlib_text_font_free(fn);
}
}
break;
case RENDER_METHOD_BASIC_HARDWARE:
break;
case RENDER_METHOD_3D_HARDWARE:
{
Evas_GL_Font *fn;
fn = __evas_gl_text_font_new (e->current.display,
oo->current.font,
oo->current.size);
if (fn)
{
__evas_gl_text_get_size(fn, oo->current.text,
&oo->current.string.w,
&oo->current.string.h);
__evas_gl_text_font_free(fn);
}
}
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
default:
break;
}
}
o->current.x = 0;
o->current.y = 0;
o->current.w = (double)oo->current.string.w;
o->current.h = (double)oo->current.string.h;
for (l = e->layers; l; l = l->next)
{
layer = l->data;
if (layer->layer == o->current.layer)
{
layer->objects = evas_list_append(layer->objects, o);
return o;
}
}
layer = malloc(sizeof(struct _Evas_Layer));
memset(layer, 0, sizeof(struct _Evas_Layer));
e->layers = evas_list_append(e->layers, layer);
layer->objects = evas_list_append(layer->objects, o);
return o;
}

View File

@ -1,5 +1,7 @@
#include <Evas.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int
@ -63,6 +65,7 @@ main(int argc, char **argv)
XMapWindow(d, win);
XSync(d, False);
}
evas_font_add_path(e, "./fnt");
evas_set_output(e, d, win, vis, cmap);
evas_set_output_size(e, win_w, win_h);
evas_set_output_viewport(e, 0, 0, win_w, win_h);
@ -75,10 +78,18 @@ main(int argc, char **argv)
h /= 2;
evas_show(e, o[1]);
for (i = 2 ; i < 128; i++)
for (i = 2 ; i < 100; i++)
{
o[i] = evas_add_image_from_file(e, "img/mush.png");
evas_show(e, o[i]);
evas_set_layer(e, o[i], 100);
}
for (i = 100; i < 128; i++)
{
o[i] = evas_add_text(e, "notepad", 20, imgs[i & 0x7]);
evas_set_color(e, o[i], rand()&0xff, rand()&0xff, rand()&0xff, 255);
evas_show(e, o[i]);
evas_set_layer(e, o[i], 100);
}
evas_raise(e, o[1]);
@ -107,6 +118,7 @@ main(int argc, char **argv)
mouse_x = ev.xbutton.x;
mouse_y = ev.xbutton.y;
evas_move(e, o[1], mouse_x - w, mouse_y - h);
evas_set_layer(e, o[1], 200);
}
break;
case ButtonRelease:
@ -118,6 +130,7 @@ main(int argc, char **argv)
mouse_x = ev.xbutton.x;
mouse_y = ev.xbutton.y;
evas_move(e, o[1], mouse_x - w, mouse_y - h);
evas_set_layer(e, o[1], 1);
}
break;
case MotionNotify:
@ -148,7 +161,8 @@ main(int argc, char **argv)
k = (i * -60) - (i * 2);
x = (win_w + (cos((double)(a + j) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2;
y = (win_h + (sin((double)(a + k) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2;
evas_set_image_file(e, o[i], imgs[(i) & 0x7]);
if (i < 100)
evas_set_image_file(e, o[i], imgs[(i) & 0x7]);
evas_move(e, o[i], x, y);
}
evas_render(e);