#include <draw1.h>
#include <stdio.h>
#include <stdlib.h>

/*************************************************************/
/* Renvoi le numero de type qui correspond a un object draw1 */
uint32 draw1_type(void)
{ static uint32 draw1_type_num = 0;

  if(draw1_type_num == 0)
  {
    draw1_type_num = object_num_new;
  }
  return(draw1_type_num);
}
/*************************************************************/

void draw1_display(obj_ofs *this)
{ int i;
  draw  *vdraw;
  draw1 *vdraw1;

  /* 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,"draw1_display (draw1.c) : invalide draw\n");
    exit(2);
  }
  vdraw = (draw *)this[i].ofs;

  /* si on veut acceder a un champ de draw1 */
  for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw1_type());i++);

  /* on peut meme faire une petite verification dynamique de l'objet      */
  /* pour verifier si cet objet peut bien etre considere comme un "draw1" */
  if(this[i].obj_type == 0)
  {
    fprintf(stderr,"draw1_display (draw1.c) : invalide draw1\n");
    exit(2);
  }
  vdraw1 = (draw1 *)this[i].ofs;

  /* on fait notre affichage */
  printf("draw1 objet (%d,%d) diago = %d\n",vdraw->x,vdraw->y,
    vdraw1->diagonale);
}

void draw1_fun1(obj_ofs *this)
{
  /* on utilise aucun attributs, methodes de l'objet => pas de recherche. */
  printf("fun1\n");
}

void call_draw1_fun1(obj_ofs *this)
{ int i;
  draw1 *vdraw1;

  /* si on veut acceder a un champ de draw1 */
  for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw1_type());i++);

  /* on peut meme faire une petite verification dynamique de l'objet      */
  /* pour verifier si cet objet peut bien etre considere comme un "draw1" */
  if(this[i].obj_type == 0)
  {
    fprintf(stderr,"call_draw1_fun1 (draw1.c) : invalide draw1\n");
    exit(2);
  }
  vdraw1 = (draw1 *)this[i].ofs;
  /* on appele la fonction correspondante */
  vdraw1->fun1(this);
}

/* ce que l'on peut voir comme le constructeur de l'objet */
void draw1_init(obj_ofs *this)
{ int i;
  draw  *vdraw;
  draw1 *vdraw1;
  
  /* on appele les constructeurs des parents. */
  /* l'ordre est tres important.              */
  object_init(this);
  draw_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,"draw1_init (draw1.c) : invalide draw\n");
    exit(2);
  }
  vdraw = (draw *)this[i].ofs;

  /* si on veut acceder a un champ de draw1 */
  for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw1_type());i++);

  /* on peut meme faire une petite verification dynamique de l'objet      */
  /* pour verifier si cet objet peut bien etre considere comme un "draw1" */
  if(this[i].obj_type == 0)
  {
    fprintf(stderr,"draw1_init (draw1.c) : invalide draw1\n");
    exit(2);
  }
  vdraw1 = (draw1 *)this[i].ofs;

  /* on initialise les attributs et les methodes */
  vdraw->width  = 20; /* on change la valeur par defaut si c'est un draw1 */
  vdraw->height = 10;
  vdraw->display = draw1_display; /* on fait une surcharge de display     */

  vdraw1->diagonale = 66;
  vdraw1->fun1 = draw1_fun1;
}

/* la fonction qui permet de creer un nouvel objet draw1 */
obj_ofs *draw1_new(void)
{ obj_ofs *vobj_table;
  pointer mem;

  /* allocation de la memoire pour l'objet */
  if((mem = (pointer)malloc(sizeof(obj_ofs)*4+sizeof(object)+
                            sizeof(draw)+sizeof(draw1))) == 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)*4;

  /* pour la partie draw "seulement" de l'objet draw1 */
  vobj_table[1].obj_type = draw_type();
  vobj_table[1].ofs      = mem + sizeof(obj_ofs)*4 + sizeof(object);

  /* pour la partie draw1 "seulement" de l'objet draw1 */
  vobj_table[2].obj_type = draw1_type();
  vobj_table[2].ofs      = mem + sizeof(obj_ofs)*4 + sizeof(object) +
                           sizeof(draw);

  /* le dernier sert a delimiter la table des objets                */
  /* aucun objet n'est identifie par la clee 0 donc pas d'ambiguite */
  vobj_table[3].obj_type = 0;

  /* on fait appel au constructeur de l'objet draw1 */
  draw1_init(vobj_table);

  /* et voila un nouvel objet */
  return(vobj_table);
}