GULUS_Calendrier.c from Gulus at Krugle
Show GULUS_Calendrier.c syntax highlighted
/******************************************************************************/
/* GULUS_Calendrier v1.0 */
/******************************************************************************/
/* Par: */
/* Benoit Leblanc */
/* Copyright (C) 2001 */
/******************************************************************************/
/* This code is GPL. You may copy it, modify it or do with it as you */
/* please, but you may not claim copyright on any code wholly or partly based */
/* on this code. I accept no responsability for any consequence of using */
/* code, be they proper or otherwise. */
/******************************************************************************/
#include <X11/Xlib.h>
#include <Imlib2.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int showErrorMSG(void){
fprintf(stderr, "Le Calendrier doit reçevoir la liste suivante ");
fprintf(stderr, "d'arguments:\n GULUS_Calendrier MOIS ANNÉE ");
fprintf(stderr, "JOUR_DU_1ER_DU_MOIS [[JOUR CODE_D'ACTIVITÉ]]\n");
fprintf(stderr, "où:\n 01 = Conférence\n 02 = Réunion\n");
fprintf(stderr, " 03 = Install-Fest\n 04 = GULUS_News\n");
fprintf(stderr, " 05 = AG\n\nex:\n GULUS_Calendrier 03 2001 ");
fprintf(stderr, "4 10 01 17 03\n Donnera un calendrier: ");
fprintf(stderr, "GULUS_CAL-2001-03.png avec:\n une conférence le ");
fprintf(stderr, "10 mars\n un install-fest le 17 mars\n\n");
fprintf(stderr, "BUGS:\n Vous devez spécifier les dates d'activités ");
fprintf(stderr, "en ordre chronologique sinon le\n calendrier sera ");
fprintf(stderr, "vide...\n\nJ'espères que vous n'aurez pas trop de ");
fprintf(stderr, "troubles avec ce programme, si vous avez\n");
fprintf(stderr, "des questions, vous pouvez toujours m'écrire: ");
fprintf(stderr, "extrema@ottawa.com. \n\n");
exit(-1);
}
int main(int argc, char * argv[]) {
/* NOTE: Le Calendrier doit reçevoir la liste suivante d'arguments:
GULUS_Calendrier MOIS ANNÉE JOUR_DU_1ER_DU_MOIS [[JOUR CODE_D'ACTIVITÉ]]
où:
01 = Conférence
02 = Réunion
03 = Install-Fest
04 = GULUS_News
05 = AG
ex:
GULUS_Calendrier 03 2001 4 10 01 17 03
Donnera un calendrier: GULUS_CAL-2001-03.jpg avec:
une conférence le 10 mars
un install-fest le 17 mars
BUG:
Vous devez spécifier les dates d'activités en ordre chronologique sinon le
calendrier sera vide...
J'espères que vous n'aurez pas trop de trouble avec ce programme, si vous avez
des questions, vous pouvez toujours m'écrire: extrema@ottawa.com. */
Imlib_Image image0;
FILE *fp; /* Pour notre fichier d'output */
int largeur, hauteur;
int largeur_texte, hauteur_texte;
int annee, mois, jour_de_semaine, count_argv;
int jour, jour_activite, code_activite;
int jours_max_mois;
int i, j, xi, yi;
char jour_char[3];
char buffer[4];
Imlib_Font police;
/* Check nombre d'arguments */
if (argc < 4) showErrorMSG();
/* On initialise le cache a 2M */
imlib_set_cache_size(2048 * 1024);
/* On fait du traitement des mois/jours/année Grégorien */
mois = atoi(argv[1]);
annee = atoi(argv[2]);
if (mois < 8) jours_max_mois = mois % 2;
if (mois >= 8) jours_max_mois = (mois+1) % 2;
jours_max_mois += 30;
if ((mois == 2) && ((annee % 4) != 0)) jours_max_mois = 28;
if ((mois == 2) && ((annee % 4) == 0)) jours_max_mois = 29;
jour_de_semaine = atoi(argv[3]);
jour = 1;
count_argv = 4;
/* On choisi l'image du mois associée avec le mois demandé */
switch(mois) {
case 1: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Janvier.png");
break;
}
case 2: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Fevrier.png");
break;
}
case 3: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Mars.png");
break;
}
case 4: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Avril.png");
break;
}
case 5: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Mai.png");
break;
}
case 6: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Juin.png");
break;
}
case 7: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Juillet.png");
break;
}
case 8: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Aout.png");
break;
}
case 9: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Septembre.png");
break;
}
case 10: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Octobre.png");
break;
}
case 11: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Novembre.png");
break;
}
case 12: {
image0 = imlib_load_image("bin/pics/GULUS_Cal_Decembre.png");
break;
}
}
if (image0 == NULL) {
fprintf(stderr,
"Incapable de loader l'Image du mois pour le calendrier\n");
exit(-1);
}
/* On traite l'image du fond */
imlib_context_set_image(image0);
largeur = imlib_image_get_width();
hauteur = imlib_image_get_height();
/*On rajoute le repertoire courant a la liste des repertoires polices*/
imlib_add_path_to_font_path("bin/fonts/");
/* On écrit l'année au calendrier
police = imlib_load_font("hum521b.ttf/22");
imlib_context_set_font(police);
imlib_context_set_color(200,200,255,155);
imlib_get_text_size(argv[2], &largeur_texte, &hauteur_texte);
imlib_text_draw((largeur - largeur_texte) / 2, 28, argv[2]);
imlib_free_font();
/*
/* On crée le fichier MAP-HREF */
if ((fp = fopen("bin/calendar.map", "w+")) == NULL) {
fprintf(stderr, "Impossible d'ouvrir le fichier calendar.map\n");
return(-1);
}
fputs("<MAP NAME=\"Calendrier\">\n", fp);
/* FLECHE A GAUCHE */
switch(mois) {
case 1: { fputs("<AREA SHAPE=\"RECT\" COORDS=\"80,5,105,37\" HREF=\"index.php?mod=calendrier&mois=", fp);
break;
}
case 8: { fputs("<AREA SHAPE=\"RECT\" COORDS=\"80,5,105,37\" HREF=\"index.php?mod=calendrier&mois=", fp);
break;
}
}
sprintf(buffer, "%d", mois-1);
fputs(buffer, fp);
fputs("&annee=", fp);
sprintf(buffer, "%d", annee-1);
fputs(buffer, fp);
fputs("\">\n", fp);
/* FLECHE A DROITE */
switch(mois) {
case 1: { fputs("<AREA SHAPE=\"RECT\" COORDS=\"80,5,105,37\" HREF=\"index.php?mod=calendrier&mois=", fp);
break;
}
case 8: { fputs("<AREA SHAPE=\"RECT\" COORDS=\"190,5,215,37\" HREF=\"index.php?mod=calendrier&mois=", fp);
break;
}
}
sprintf(buffer, "%d", mois+1);
fputs(buffer, fp);
fputs("&annee=", fp);
sprintf(buffer, "%d", annee+1);
fputs(buffer, fp);
fputs("\">\n", fp);
/* On ajoute les jours au calendrier -- C'est parti mon kiki! */
police = imlib_load_font("avgardm.ttf/20");
imlib_context_set_font(police);
imlib_context_set_color(242,228,174,255);
/* On commence par la première ligne -- la plus tricky */
for (i = jour_de_semaine; i <= 7; i++) {
sprintf(jour_char, "%d", jour); /* Convertir int -> char* */
if (argc > count_argv) {
jour_activite = atoi(argv[count_argv]);
code_activite = atoi(argv[count_argv+1]);
if (jour_activite == jour) {
switch(code_activite) {
case 1: { imlib_context_set_color(255,186,188,255); /* rose */
break;
}
case 2: { imlib_context_set_color(247,219,178,255); /* beige */
break;
}
case 3: { imlib_context_set_color(109,250,255,255); /* turcoise */
break;
}
case 4: { imlib_context_set_color(148,255,109,255); /* vert */
break;
}
case 5: { imlib_context_set_color(255,109,255,255); /* mauve */
break;
}
} /* Fin de switch */
/* On écrit maintenant le HREF-MAP dans le fichier */
fputs("<AREA SHAPE=\"RECT\" COORDS=\"", fp);
sprintf(buffer, "%d", (41*i)+7);
fputs(buffer, fp);
fputs(",47,", fp);
sprintf(buffer, "%d", (41*i)+47);
fputs(buffer, fp);
fputs(",79\" HREF=\"index.php?mod=activites&date=", fp);
sprintf(buffer, "%s-%d-%d", argv[2], mois, jour);
fputs(buffer, fp);
switch(code_activite){
case 1: { fputs("\" ALT=\"Conference\">\n", fp);
break;
}
case 2: { fputs("\" ALT=\"Réunion des membres\">\n", fp);
break;
}
case 3: { fputs("\" ALT=\"Install-Fest\">\n", fp);
break;
}
case 4: { fputs("\" ALT=\"Sortie du GULUS_NEWS\">\n", fp);
break;
}
case 5: { fputs("\" ALT=\"Assemblée Générale\">\n", fp);
break;
}
}
sprintf(jour_char, "%d", jour); /* PATCH */
count_argv++;
count_argv++;
}
}
imlib_get_text_size(jour_char, &largeur_texte, &hauteur_texte);
xi = (41*i) + 27 - (largeur_texte/2);
yi = 63 - (hauteur_texte/2);
imlib_text_draw(xi, yi, jour_char);
imlib_context_set_color(242,228,174,255);
jour++;
} /* Fin de la première ligne du calendrier */
jour--; /* OOPS! Compté un de trop */
/* Compteur en Y */
for (j = 1; j < 5; j++) {
/* Compteur en X */
for (i = 0; i < 7; i++){
if (jour <= jours_max_mois) { /* On arrête à ~31 */
sprintf(jour_char, "%d", jour);
if (argc > count_argv) {
jour_activite = atoi(argv[count_argv]);
code_activite = atoi(argv[count_argv+1]);
printf("jour: %d, code: %d\n", jour_activite, code_activite);
fflush(0);
if (jour_activite == jour) {
/* Hmmm. Sentiment de DÉJÀ-VU?? Non, ne vous inquitez pas, vous n'êtes
pas dans la Matrice. Relaxe. J'ai seulement recopier le code pour
accélérer l'exécution. Je voulais tout mettre dans un pain pour qu'on
ne perde pas de temps à passer d'une fonction à l'autre -- et je ne
trust pas assez GCC pour être capable d'optimiser cette partie. Autant
le faire à bras. */
switch(code_activite) {
case 1: { imlib_context_set_color(255,186,188,255);
break;
}
case 2: { imlib_context_set_color(247,219,178,255);
break;
}
case 3: { imlib_context_set_color(109,250,255,255);
break;
}
case 4: { imlib_context_set_color(148,255,109,255);
break;
}
case 5: { imlib_context_set_color(255,109,255,255);
break;
}
} /* Fin de switch */
fputs("<AREA SHAPE=\"RECT\" COORDS=\"", fp);
sprintf(buffer, "%d", (41*i)+7);
fputs(buffer, fp); /* x */
sprintf(buffer, "%d", (33*j)+47);
fputs(",", fp);
fputs(buffer, fp); /* y */
fputs(",", fp);
sprintf(buffer, "%d", (41*i)+47);
fputs(buffer, fp);
fputs(",", fp);
sprintf(buffer, "%d", (33*j)+79);
fputs(buffer, fp);
fputs("\" HREF=\"index.php?mod=activites&date=", fp);
sprintf(buffer, "%s-%d-%d", argv[2], mois, jour);
fputs(buffer, fp);
switch(code_activite){
case 1: { fputs("\" ALT=\"Conference\">\n", fp);
break;
}
case 2: { fputs("\" ALT=\"Réunion des membres\">\n", fp);
break;
}
case 3: { fputs("\" ALT=\"Install-Fest\">\n", fp);
break;
}
case 4: { fputs("\" ALT=\"Sortie du GULUS_NEWS\">\n", fp);
break;
}
case 5: { fputs("\" ALT=\"Assemblée Générale\">\n", fp);
break;
}
}
sprintf(jour_char, "%d", jour); /* PATCH */
count_argv++;
count_argv++;
}
}
imlib_get_text_size(jour_char, &largeur_texte, &hauteur_texte);
xi = (41*i) + 27 - (largeur_texte/2);
yi = (33*j) + 63 - (hauteur_texte/2);
imlib_text_draw(xi, yi, jour_char);
imlib_context_set_color(242,228,174,255);
jour++;
}
}
}
fputs("</MAP>\n", fp);
fclose(fp);
imlib_free_font();
/* On sauvegarde l'image résultat sur disque */
imlib_image_set_format("png");
imlib_save_image("bin/test.png");
return 1;
}
/* FICHIERS OUTPUT:
-----------------
bin/test.png <-- calendrier du mois demandé
bin/calendar.map <-- HREF-MAP associé avec ce mois.
*/
See more files for this project here