#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); }