Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* --------------------------
- //Shaha Hassan
- // 31 Aug 2014
- Graphical Editor (mouse support)
- It's basically the same program but with mouse support instead of command line type. :P
- Graphical Editor(command line input, linux lovers??):
- http://pastebin.com/vF9JveNs
- IMPORTANT: Pls save my_mouse.cpp in the same directory if you want to run it.
- Here's the link to my_mouse.cpp:
- http://pastebin.com/jHtXgjwE
- -----------------------*/
- #include<stdio.h>
- #include<string.h>
- #include<conio.h>
- #define PIX 219
- #include"my_mouse.cpp"
- #define RES 8
- #define MAX 30
- #define OFFSETX 2
- #define OFFSETY 5
- void paint(int x, int y, char col, char bg);
- int isValid(int x, int y);
- void setf(char cl, int x, int y);
- void show();
- void setcolor(int pos, char &col);
- int tonum(char c);
- void getclick(int &mx, int &my, int &click);
- int get2pts(int &x1, int&y1, int &x2, int &y2);
- void init();
- int initc();
- void setstatus(char * msg);
- void nomsg();
- int trim(int&x, int&y);
- void showtool(char t);
- char canvas[MAX][MAX];
- int r,c;
- char col[16] = {"WWWWWWWWWBGCRMYW"};
- char menu[46] = {"IIILLLLLLLLVVVVVLHHHHHLKKKKKLFFFFFLCCCCCLXXXXX"};
- int main() {
- int flag=1, i, j, x1, y1, x2, y2;
- int mx, my, mc;
- char name[10], cmd='L', color='B';
- showtool(cmd);
- init();
- setcolor('W',color);
- while(flag) {
- getclick(mx, my, mc);
- if( mc ==1 ) { //left click
- if(my == 0) { //colorselect
- if(mx<14) {
- setcolor(mx, color);
- }
- } else if( my == 1) { //tool select
- if(mx<47) {
- cmd = menu[mx];
- showtool(cmd);
- }
- switch(cmd) {
- case 'I':
- initc();
- nomsg();
- break;
- case 'C':
- for(i=0; i<r; i++) {
- memset(canvas[i],'W',c);
- }
- break;
- case 'L':
- setstatus("LtClk: Select a point");
- getclick(x1,y1, mc);
- if(trim(x1,y1)==-1) break;
- setf(color,x1, y1);
- break;
- case 'H':
- mc = get2pts(x1,y1,x2,y2);
- if(mc==-1) {
- nomsg();
- cmd = 'L';
- break;
- }
- if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
- nomsg();
- break;
- }
- for(i=x1; i<=x2; i++) {
- setf(color,i,y1);
- }
- break;
- case 'V':
- mc = get2pts(x1,y1,x2,y2);
- if(mc==-1) {
- nomsg();
- cmd ='L';
- break;
- }
- if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
- nomsg();
- break;
- }
- for(i=y1; i<=y2; i++) {
- setf(color,x1, i);
- }
- break;
- case 'K': //rect
- mc = get2pts(x1,y1,x2,y2);
- if(mc==-1) {
- nomsg();
- cmd = 'L';
- break;
- }
- if( (trim(x1,y1)==-1)||(trim(x2,y2)==-1)){
- nomsg();
- break;
- }
- for(i=y1; i<=y2; i++) {
- for(j=x1; j<=x2; j++) {
- setf(color, j,i);
- }
- }
- break;
- case 'F':
- setstatus("LtClk: select point. \t RtClk:Abort\t\t\t");
- getclick(x1,y1,mc);
- if(mc==2) {
- nomsg();
- cmd = 'L';
- break;
- }
- if(trim(x1,y1)==-1){
- nomsg();
- break;
- }
- paint(x1,y1,color, canvas[y1][x1]);
- break;
- case 'X':
- flag = 0;
- break;
- }//switch
- nomsg();
- show();
- if(cmd=='X') break;
- }
- }//if left rt clk
- }//while
- return 0;
- }
- void showtool(char t){
- gotoxy(4,3);
- textcolor(WHITE);
- switch(t) {
- case 'I':
- printf("Select size of new canvas.");
- break;
- case 'V':
- printf("Vertical line: choose two points.");
- break;
- case 'H':
- printf("Horinzontal line: choose two points.");
- break;
- case 'L':
- printf("Pencil: click on canvas to color pixels");
- break;
- case 'K':
- printf("Rectangle: choose two points");
- break;
- case 'F':
- printf("Fill: click a point to flood fill");
- break;
- case 'C':
- printf("Cleared all");
- break;
- default:
- printf(" ");
- }
- }
- int trim(int &x, int &y) {
- //offset, converts monitor [oints to row col of bitmap;
- x = (x-OFFSETX+1)/2;
- y = y-OFFSETY+1;
- if( (x<0) || (y<0) ||(x>c) ||(y>r)) {
- return -1;
- }
- return 0;
- }
- int get2pts(int &x1, int&y1, int &x2, int &y2){
- int mc;
- setstatus("Clk:Choose point1 \t RtClk:Abort\t\t.");
- getclick(x1,y1,mc);
- if(mc==2) {
- return -1;
- }
- setstatus("Clk:Choose point2 \t RtClk:Abort\t\t.");
- getclick(x2,y2,mc);
- if(mc==2) {
- return -1;
- }
- return 0;
- }
- void nomsg() {
- setstatus(" ");
- }
- int initc(){
- //initialize canvas. I
- int x,y,cl;
- setstatus("select canvas size. RtClk:release");
- c= r =1;
- crsr.setpos(2,6);
- do{
- int x1, y1, x2, y2;
- do{
- x1=x2; y1=y2;
- crsr.getpos(x, y, cl);
- if(cl==2) break;
- x2 = x; y2 = y;
- }while( (x1==x2)&&(y1==y2) );
- if(cl==2) break;
- y = (y/RES -5);//2char width=1char hyt
- x = (x/RES -1)/2;
- r = y>0 ? y:1;
- c = x>0 ? x:1;
- r = r>MAX?MAX:r;
- c = c>MAX?MAX:c;
- init();
- show();
- }while(1);
- return 0;
- }
- void setstatus(char * s) {
- //puts msg
- gotoxy(1,4);
- textcolor(WHITE);
- cprintf(s);
- }
- void setcolor(int pos, char &color) {
- //sets color
- color = col[pos/2+9];
- textcolor(tonum(color));
- gotoxy(1, 3);
- cprintf("%c%c", PIX, PIX);
- }
- void init(){
- //initializes display
- int i;
- clrscr();
- for(i=9; i<16; i++) {
- textcolor(i);
- cprintf("%c%c", PIX, PIX);
- }
- textcolor(WHITE);
- gotoxy(1,2);
- printf("New | dot | ver | hor | rec | fil | Clr | XXX ");
- for(i=0; i<MAX; i++) {
- memset(canvas[i],'W',MAX);
- }
- gotoxy(1,10);
- }
- void show() {
- //displays canvas
- int i,j;
- for(i=0; i<r;i++) {
- gotoxy(OFFSETX,OFFSETY+i);
- for(j=0; j<c; j++) {
- textcolor(tonum(canvas[i][j]));
- cprintf("%c%c", PIX, PIX);
- }
- printf("\n");
- }
- }
- void setf(char cl, int x, int y){
- //sets one pixel
- canvas[y][x] = cl;
- }
- void paint(int x, int y, char col, char bg) {
- //fills regiion
- if(canvas[y][x]==bg) {
- setf(col,x,y);
- if(isValid(x+1,y)) paint(x+1,y,col,bg);
- if(isValid(x-1,y)) paint(x-1,y,col,bg);
- if(isValid(x,y+1)) paint(x,y+1,col,bg);
- if(isValid(x,y-1)) paint(x,y-1,col,bg);
- }
- }
- int isValid(int x, int y) {
- if( (x<0)||(y<0)||(x>=c)||(y>=r) ) return 0;
- return 1;
- }
- int tonum(char c){
- switch(c){
- case 'B': return 9;
- case 'G': return 10;
- case 'C': return 11;
- case 'R': return 12;
- case 'M': return 13;
- case 'Y': return 14;
- case 'W': return 15;
- }
- return 15;
- }
- void getclick(int &mx2,int &my2,int &mc1){
- //loops untill a click
- //returns lick's state
- int mx1, my1, mc2;
- do{
- do{
- crsr.getpos(mx1, my1, mc1);
- }while(mc1 == 0);
- mx1/=RES; my1/=RES;
- do{
- crsr.getpos(mx2, my2, mc2);
- }while(mc1 == mc2);
- mx2 /= RES; my2 /= RES;
- if( (mx1 == mx2) && (my1 == my2) ) { //clicked on the same spot
- break;
- }
- }while(1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement