Advertisement
BinYamin

GraphicalEditor(mouseSupport)

Aug 31st, 2014
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.87 KB | None | 0 0
  1. /* --------------------------
  2.     //Shaha Hassan
  3.     // 31 Aug 2014
  4.     Graphical Editor (mouse support)
  5. It's basically the same program but with mouse support instead of command line type. :P
  6.  
  7. Graphical Editor(command line input, linux lovers??):
  8. http://pastebin.com/vF9JveNs
  9.  
  10. IMPORTANT: Pls save my_mouse.cpp in the same directory if you want to run it.
  11. Here's the link to my_mouse.cpp:   
  12. http://pastebin.com/jHtXgjwE
  13.                 -----------------------*/
  14.  
  15. #include<stdio.h>
  16. #include<string.h>
  17. #include<conio.h>
  18. #define PIX 219
  19. #include"my_mouse.cpp"
  20. #define RES 8
  21. #define MAX 30
  22. #define OFFSETX 2
  23. #define OFFSETY 5
  24.  
  25. void paint(int x, int y, char col, char bg);
  26. int isValid(int x, int y);
  27. void setf(char cl, int x, int y);
  28. void show();
  29. void setcolor(int pos, char &col);
  30. int tonum(char c);
  31. void getclick(int &mx, int &my, int &click);
  32. int get2pts(int &x1, int&y1, int &x2, int &y2);
  33. void init();
  34. int initc();
  35. void setstatus(char * msg);
  36. void nomsg();
  37. int trim(int&x, int&y);
  38. void showtool(char t);
  39.  
  40.  
  41. char canvas[MAX][MAX];
  42. int r,c;
  43. char col[16] = {"WWWWWWWWWBGCRMYW"};
  44. char menu[46] = {"IIILLLLLLLLVVVVVLHHHHHLKKKKKLFFFFFLCCCCCLXXXXX"};
  45.  
  46.  
  47. int main() {
  48.     int flag=1, i, j, x1, y1, x2, y2;
  49.     int mx, my, mc;
  50.     char name[10], cmd='L', color='B';
  51.     showtool(cmd);
  52.     init();
  53.     setcolor('W',color);
  54.     while(flag) {
  55.     getclick(mx, my, mc);
  56.  
  57.     if( mc ==1 ) {  //left click
  58.         if(my == 0) { //colorselect
  59.         if(mx<14) {
  60.            setcolor(mx, color);
  61.         }
  62.         } else if( my == 1) { //tool select
  63.         if(mx<47) {
  64.             cmd = menu[mx];
  65.             showtool(cmd);
  66.         }
  67.  
  68.         switch(cmd) {
  69.         case 'I':
  70.             initc();
  71.             nomsg();
  72.             break;
  73.  
  74.         case 'C':
  75.             for(i=0; i<r; i++) {
  76.             memset(canvas[i],'W',c);
  77.             }
  78.             break;
  79.         case 'L':
  80.             setstatus("LtClk: Select a point");
  81.             getclick(x1,y1, mc);
  82.             if(trim(x1,y1)==-1) break;
  83.             setf(color,x1, y1);
  84.             break;
  85.         case 'H':
  86.             mc = get2pts(x1,y1,x2,y2);
  87.             if(mc==-1) {
  88.             nomsg();
  89.             cmd = 'L';
  90.             break;
  91.             }
  92.             if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
  93.             nomsg();
  94.             break;
  95.             }
  96.             for(i=x1; i<=x2; i++) {
  97.             setf(color,i,y1);
  98.             }
  99.             break;
  100.         case 'V':
  101.             mc = get2pts(x1,y1,x2,y2);
  102.             if(mc==-1) {
  103.             nomsg();
  104.             cmd ='L';
  105.             break;
  106.             }
  107.             if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
  108.             nomsg();
  109.             break;
  110.             }
  111.             for(i=y1; i<=y2; i++) {
  112.             setf(color,x1, i);
  113.             }
  114.             break;
  115.         case 'K':   //rect
  116.             mc = get2pts(x1,y1,x2,y2);
  117.             if(mc==-1) {
  118.             nomsg();
  119.             cmd = 'L';
  120.             break;
  121.             }
  122.             if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
  123.             nomsg();
  124.             break;
  125.             }
  126.             for(i=y1; i<=y2; i++) {
  127.             for(j=x1; j<=x2; j++) {
  128.                 setf(color, j,i);
  129.             }
  130.             }
  131.             break;
  132.         case 'F':
  133.             setstatus("LtClk: select point. \t RtClk:Abort\t\t\t");
  134.             getclick(x1,y1,mc);
  135.             if(mc==2) {
  136.             nomsg();
  137.             cmd = 'L';
  138.             break;
  139.             }
  140.             if(trim(x1,y1)==-1){
  141.             nomsg();
  142.             break;
  143.             }
  144.             paint(x1,y1,color, canvas[y1][x1]);
  145.             break;
  146.         case 'X':
  147.             flag = 0;
  148.             break;
  149.         }//switch
  150.         nomsg();
  151.         show();
  152.         if(cmd=='X') break;
  153.         }
  154.     }//if left rt clk
  155.     }//while
  156.     return 0;
  157. }
  158. void showtool(char t){
  159.     gotoxy(4,3);
  160.     textcolor(WHITE);
  161.     switch(t) {
  162.     case 'I':
  163.     printf("Select size of new canvas.");
  164.     break;
  165.     case 'V':
  166.     printf("Vertical line: choose two points.");
  167.     break;
  168.     case 'H':
  169.     printf("Horinzontal line: choose two points.");
  170.     break;
  171.     case 'L':
  172.     printf("Pencil: click on canvas to color pixels");
  173.     break;
  174.     case 'K':
  175.     printf("Rectangle: choose two points");
  176.     break;
  177.     case 'F':
  178.     printf("Fill: click a point to flood fill");
  179.     break;
  180.     case 'C':
  181.     printf("Cleared all");
  182.     break;
  183.     default:
  184.     printf("                                         ");
  185.     }
  186. }
  187.  
  188. int trim(int &x, int &y) {
  189. //offset, converts monitor [oints to row col of bitmap;
  190.     x = (x-OFFSETX+1)/2;
  191.     y = y-OFFSETY+1;
  192.     if( (x<0) || (y<0) ||(x>c) ||(y>r)) {
  193.     return -1;
  194.     }
  195.     return 0;
  196. }
  197.  
  198. int get2pts(int &x1, int&y1, int &x2, int &y2){
  199.     int mc;
  200.     setstatus("Clk:Choose point1 \t RtClk:Abort\t\t.");
  201.     getclick(x1,y1,mc);
  202.     if(mc==2) {
  203.     return -1;
  204.     }
  205.     setstatus("Clk:Choose point2 \t RtClk:Abort\t\t.");
  206.     getclick(x2,y2,mc);
  207.     if(mc==2) {
  208.     return -1;
  209.     }
  210.     return 0;
  211. }
  212.  
  213. void nomsg() {
  214.     setstatus("                                            ");
  215. }
  216.  
  217. int initc(){
  218. //initialize canvas. I
  219.     int x,y,cl;
  220.     setstatus("select canvas size. RtClk:release");
  221.     c= r =1;
  222.     crsr.setpos(2,6);
  223.     do{
  224.     int x1, y1, x2, y2;
  225.     do{
  226.         x1=x2; y1=y2;
  227.         crsr.getpos(x, y, cl);
  228.         if(cl==2) break;
  229.         x2 = x; y2 = y;
  230.     }while( (x1==x2)&&(y1==y2) );
  231.     if(cl==2) break;
  232.     y = (y/RES -5);//2char width=1char hyt
  233.     x = (x/RES -1)/2;
  234.     r = y>0 ? y:1;
  235.     c = x>0 ? x:1;
  236.     r = r>MAX?MAX:r;
  237.     c = c>MAX?MAX:c;
  238.     init();
  239.     show();
  240.     }while(1);
  241.     return 0;
  242. }
  243.  
  244. void setstatus(char * s) {
  245. //puts msg
  246.     gotoxy(1,4);
  247.     textcolor(WHITE);
  248.     cprintf(s);
  249. }
  250.  
  251. void setcolor(int pos, char &color) {
  252. //sets color
  253.     color = col[pos/2+9];
  254.     textcolor(tonum(color));
  255.     gotoxy(1, 3);
  256.     cprintf("%c%c", PIX, PIX);
  257. }
  258.  
  259. void init(){
  260. //initializes display
  261.     int i;
  262.     clrscr();
  263.     for(i=9; i<16; i++) {
  264.     textcolor(i);
  265.     cprintf("%c%c", PIX, PIX);
  266.     }
  267.     textcolor(WHITE);
  268.     gotoxy(1,2);
  269.     printf("New | dot | ver | hor | rec | fil | Clr | XXX ");
  270.  
  271.     for(i=0; i<MAX; i++) {
  272.     memset(canvas[i],'W',MAX);
  273.     }
  274.     gotoxy(1,10);
  275. }
  276.  
  277. void show() {
  278. //displays canvas
  279.     int i,j;
  280.     for(i=0; i<r;i++) {
  281.     gotoxy(OFFSETX,OFFSETY+i);
  282.     for(j=0; j<c; j++) {
  283.         textcolor(tonum(canvas[i][j]));
  284.         cprintf("%c%c", PIX, PIX);
  285.     }
  286.     printf("\n");
  287.     }
  288. }
  289.  
  290. void setf(char cl, int x, int y){
  291. //sets one pixel
  292.     canvas[y][x] = cl;
  293. }
  294.  
  295. void paint(int x, int y, char col, char bg) {
  296. //fills regiion
  297.     if(canvas[y][x]==bg) {
  298.     setf(col,x,y);
  299.     if(isValid(x+1,y)) paint(x+1,y,col,bg);
  300.     if(isValid(x-1,y)) paint(x-1,y,col,bg);
  301.     if(isValid(x,y+1)) paint(x,y+1,col,bg);
  302.     if(isValid(x,y-1)) paint(x,y-1,col,bg);
  303.     }
  304. }
  305.  
  306. int isValid(int x, int y) {
  307.     if( (x<0)||(y<0)||(x>=c)||(y>=r) ) return 0;
  308.     return 1;
  309. }
  310.  
  311. int tonum(char c){
  312.     switch(c){
  313.     case 'B': return 9;
  314.     case 'G': return 10;
  315.     case 'C': return 11;
  316.     case 'R': return 12;
  317.     case 'M': return 13;
  318.     case 'Y': return 14;
  319.     case 'W': return 15;
  320.     }
  321.     return 15;
  322. }
  323.  
  324. void getclick(int &mx2,int &my2,int &mc1){
  325.  //loops untill a click
  326.  //returns lick's state
  327.   int mx1, my1, mc2;
  328.   do{
  329.     do{
  330.     crsr.getpos(mx1, my1, mc1);
  331.     }while(mc1 == 0);
  332.     mx1/=RES; my1/=RES;
  333.  
  334.     do{
  335.     crsr.getpos(mx2, my2, mc2);
  336.     }while(mc1 == mc2);
  337.     mx2 /= RES; my2 /= RES;
  338.     if( (mx1 == mx2) && (my1 == my2) ) { //clicked on the same spot
  339.     break;
  340.     }
  341.   }while(1);
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement