From 90bd1bb0890f6ef08c0e456f579e1756f2ad1f6d Mon Sep 17 00:00:00 2001 From: Phyks Date: Sun, 28 Jul 2013 15:27:39 +0200 Subject: [PATCH] Initial commit --- main | Bin 0 -> 11059 bytes main.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 4 ++ 3 files changed, 212 insertions(+) create mode 100755 main create mode 100644 main.c create mode 100644 makefile diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..ed6a93b942dc222adcd07692fa578e20969a8b2b GIT binary patch literal 11059 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 +#include +#include + +#define WIDTH_CONTROL 100 + +#ifndef min + #define min(a, b) ((a < b) ? a : b) +#endif + +void setPixel(SDL_Surface *affichage, int x, int y, Uint16 coul) +{ + *((Uint16**)(affichage->pixels) + x + y * affichage->w) = coul; +} + +void echangerEntiers(int* x, int* y) +{ + int t = *x; + *x = *y; + *y = t; +} + +void DrawLine(SDL_Surface *affichage, int x1, int y1, int x2, int y2, Uint32 coul) //Draw line using Bresenham algorithm +{ + int d, dx, dy, aincr, bincr, xincr, yincr, x, y; + + if(x1 == x2 || y1 == y2) //If horizontal or vertical, use the SDL library optimized function + { + SDL_Rect r; + + r.x = min(x1, x2); + r.y = min(y1, y2); + r.w = (x1 == x2) ? 1 : abs(x1 - x2); + r.h = (y1 == y2) ? 1 : abs(y1 - y2); + + SDL_FillRect(affichage, &r, coul); + } + else if (abs(x2 - x1) < abs(y2 - y1)) //Go through vertical axis + { + if (y1 > y2) + { + echangerEntiers(&x1, &x2); + echangerEntiers(&y1, &y2); + } + + xincr = x2 > x1 ? 1 : -1; + dy = y2 - y1; + dx = abs(x2 - x1); + d = 2 * dx - dy; + aincr = 2 * (dx - dy); + bincr = 2 * dx; + x = x1; + y = y1; + + setPixel(affichage, x, y, coul); + + for (y = y1+1; y <= y2; ++y) + { + if (d >= 0) + { + x += xincr; + d += aincr; + } + else + d += bincr; + + setPixel(affichage, x, y, coul); + } + } + else //Go through horizontal axis + { + + if (x1 > x2) + { + echangerEntiers(&x1, &x2); + echangerEntiers(&y1, &y2); + } + + yincr = y2 > y1 ? 1 : -1; + dx = x2 - x1; + dy = abs(y2 - y1); + d = 2 * dy - dx; + aincr = 2 * (dy - dx); + bincr = 2 * dy; + x = x1; + y = y1; + + setPixel(affichage, x, y, coul); + + for (x = x1+1; x <= x2; ++x) + { + if (d >= 0) + { + y+= yincr; + d += aincr; + } + else + d += bincr; + setPixel(affichage, x, y, coul); + } + } +} + + +int main(int argc, char *argv[]) +{ + int continuer = 1; + int x_old = -1, y_old = -1; + int left = 0; + SDL_Event event; + SDL_Surface *ecran = NULL, *controles = NULL; + + if(-1 == SDL_Init(SDL_INIT_VIDEO)) + { + fprintf(stderr, "Erreur de chargement de la SDL : %s\n", SDL_GetError()); + exit(EXIT_FAILURE); + } + + const SDL_VideoInfo* video_info = SDL_GetVideoInfo(); + int width = video_info->current_w; + int height = video_info->current_h; + int bpp = 16; //video_info ->vfmt->BitsPerPixel; + + SDL_Rect position_controles = {width - WIDTH_CONTROL, 0}; + + ecran = SDL_SetVideoMode(width, height, bpp, SDL_HWSURFACE | SDL_FULLSCREEN); //Raspi has only a 16 bpp framebuffer + controles = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH_CONTROL, height, bpp, 0, 0, 0, 0); + + if(NULL == ecran || NULL == controles || NULL == ecran) + { + fprintf(stderr, "Erreur d'ouverture de la SDL : %s\n", SDL_GetError()); + exit(EXIT_FAILURE); + } + + SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); + SDL_FillRect(controles, NULL, SDL_MapRGB(controles->format, 100, 100, 100)); + SDL_BlitSurface(controles, NULL, ecran, &position_controles); + + SDL_Flip(ecran); + + while(continuer) + { + SDL_WaitEvent(&event); + + switch(event.type) + { + case SDL_MOUSEBUTTONDOWN: + if(event.button.x < width - WIDTH_CONTROL) + { + if(SDL_BUTTON_LEFT == event.button.button) + { + left = 1; + x_old = event.button.x; + y_old = event.button.y; + } + else if(SDL_BUTTON_RIGHT == event.button.button) + { + left = 0; + x_old = event.button.x; + y_old = event.button.y; + } + } + break; + + case SDL_MOUSEMOTION: + if(event.motion.x < width - WIDTH_CONTROL) + { + if(x_old > 0 && y_old > 0) + { + if(left) + DrawLine(ecran, x_old, y_old, event.motion.x, event.motion.y, SDL_MapRGB(ecran->format, 0, 0, 0)); + else + DrawLine(ecran, x_old, y_old, event.motion.x, event.motion.y, SDL_MapRGB(ecran->format, 255, 255, 255)); + + SDL_Flip(ecran); + x_old = event.motion.x; + y_old = event.motion.y; + } + } + else if(x_old > 0 && y_old > 0) + { + x_old = width - WIDTH_CONTROL; + y_old = event.motion.y;; + } + break; + + case SDL_MOUSEBUTTONUP: + if(SDL_BUTTON_LEFT == event.button.button || SDL_BUTTON_RIGHT == event.button.button) + { + x_old = -1; + y_old = -1; + } + break; + + case SDL_KEYDOWN: + continuer = 0; + break; + + case SDL_QUIT: + continuer = 0; + break; + } + } + + SDL_FreeSurface(controles); + SDL_Quit(); + return EXIT_SUCCESS; +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..3222e30 --- /dev/null +++ b/makefile @@ -0,0 +1,4 @@ +all : main + +main : main.c + gcc -o main main.c `sdl-config --cflags --libs`