#include <draw.h>
#include <stdio.h>
#include <stdlib.h>
/************************************************************/
/* Renvoi le numero de type qui correspond a un object draw */
uint32 draw_type(void)
{ static uint32 draw_type_num = 0;
if(draw_type_num == 0)
{
draw_type_num = object_num_new;
}
return(draw_type_num);
}
/************************************************************/
void draw_display(obj_ofs *this)
{ int i;
draw *vdraw;
/* si on veut acceder a un champ de draw */
for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw_type());i++);
/* on peut meme faire une petite verification dynamique de l'objet */
/* pour verifier si cet objet peut bien etre considere comme un "draw" */
if(this[i].obj_type == 0)
{
fprintf(stderr,"draw_display (draw.c) : invalide draw\n");
exit(2);
}
vdraw = (draw *)this[i].ofs;
/* on fait notre affichage */
printf("draw objet (%d,%d)\n",vdraw->x,vdraw->y);
}
void call_draw_display(obj_ofs *this)
{ int i;
draw *vdraw;
/* si on veut acceder a un champ de draw */
for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw_type());i++);
/* on peut meme faire une petite verification dynamique de l'objet */
/* pour verifier si cet objet peut bien etre considere comme un "draw" */
if(this[i].obj_type == 0)
{
fprintf(stderr,"display_draw (draw.c) : invalide draw\n");
exit(2);
}
vdraw = (draw *)this[i].ofs;
/* on appele la fonction correspondante */
vdraw->display(this);
}
/* ce que l'on peut voir comme le constructeur de l'objet */
void draw_init(obj_ofs *this)
{ int i;
draw *vdraw;
/* on appele les constructeurs des parents */
object_init(this);
/* si on veut acceder a un champ de draw */
for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw_type());i++);
/* on peut meme faire une petite verification dynamique de l'objet */
/* pour verifier si cet objet peut bien etre considere comme un "draw" */
if(this[i].obj_type == 0)
{
fprintf(stderr,"draw_init (draw.c) : invalide draw\n");
exit(2);
}
vdraw = (draw *)this[i].ofs;
/* on initialise les attributs et les methodes */
vdraw->x = 0;
vdraw->y = 0;
vdraw->width = 0;
vdraw->height = 0;
vdraw->display = draw_display;
}
/* la fonction qui permet de creer un nouvel objet draw */
obj_ofs *draw_new(void)
{ obj_ofs *vobj_table;
pointer mem;
/* allocation de la memoire pour l'objet */
if((mem = (pointer)malloc(sizeof(obj_ofs)*3+sizeof(object)+sizeof(draw)))
== NULL)
{ perror("malloc failed "); exit(1); }
/* table des objets */
vobj_table = (obj_ofs *)mem;
/* pour la partie uniquement object */
vobj_table[0].obj_type = object_type();
vobj_table[0].ofs = mem + sizeof(obj_ofs)*3;
/* pour la partie draw "seulement" de l'objet draw */
vobj_table[1].obj_type = draw_type();
vobj_table[1].ofs = mem + sizeof(obj_ofs)*3 + sizeof(object);
/* le dernier sert a delimiter la table des objets */
/* aucun objet n'est identifie par la clee 0 donc pas d'ambiguite */
vobj_table[2].obj_type = 0;
/* on fait appel au constructeur de l'objet draw */
draw_init(vobj_table);
/* et voila un nouvel objet */
return(vobj_table);
}