Index: apps/plugins/rockpaint.c =================================================================== --- apps/plugins/rockpaint.c (revision 22450) +++ apps/plugins/rockpaint.c (working copy) @@ -319,6 +319,8 @@ static int drawcolor=0; /* Current color (in palette) */ static int bgdrawcolor=9; /* Current background color (in palette) */ +static int img_height=ROWS; +static int img_width=COLS; bool isbg = false; /* gruik ugly hack alert */ static int preview=false; /* Is preview mode on ? */ @@ -528,6 +637,7 @@ /* Main menu */ MAIN_MENU_RESUME, MAIN_MENU_NEW, MAIN_MENU_LOAD, MAIN_MENU_SAVE, + MAIN_MENU_SET_WIDTH, MAIN_MENU_SET_HEIGHT, MAIN_MENU_BRUSH_SIZE, MAIN_MENU_BRUSH_SPEED, MAIN_MENU_COLOR, MAIN_MENU_GRID_SIZE, MAIN_MENU_PLAYBACK_CONTROL, @@ -548,6 +658,7 @@ MENUITEM_STRINGLIST(main_menu, "RockPaint", NULL, "Resume", "New", "Load", "Save", + "Set Width", "Set Height", "Brush Size", "Brush Speed", "Choose Color", "Grid Size", "Playback Control", "Exit"); @@ -1184,7 +1295,8 @@ { if( !preview ) { - if( x < 0 || x >= COLS || y < 0 || y >= ROWS ) return; + if( x < 0 || x >= img_width || y < 0 || y >= img_height ) + return; if( isbg ) { save_buffer[ x+y*COLS ] = rp_colors[bgdrawcolor]; @@ -1465,13 +1577,13 @@ if( gridsize > 0 ) { rb->lcd_set_drawmode(DRMODE_COMPLEMENT); - for( i = gridsize; i < COLS; i+= gridsize ) + for( i = gridsize; i < img_width; i+= gridsize ) { - rb->lcd_vline( i, 0, ROWS-1 ); + rb->lcd_vline( i, 0, img_height-1 ); } - for( i = gridsize; i < ROWS; i+= gridsize ) + for( i = gridsize; i < img_height; i+= gridsize ) { - rb->lcd_hline( 0, COLS-1, i ); + rb->lcd_hline( 0, img_width-1, i ); } rb->lcd_set_drawmode(DRMODE_SOLID); if( update ) rb->lcd_update(); @@ -1514,25 +1626,25 @@ case ROCKPAINT_LEFT: case ROCKPAINT_LEFT | BUTTON_REPEAT: x-=bspeed * ( button & BUTTON_REPEAT ? 4 : 1 ); - if (x<0) x=COLS-1; + if (x<0) x=img_width-1; break; case ROCKPAINT_RIGHT: case ROCKPAINT_RIGHT | BUTTON_REPEAT: x+=bspeed * ( button & BUTTON_REPEAT ? 4 : 1 ); - if (x>=COLS) x=0; + if (x>=img_width) x=0; break; case ROCKPAINT_UP: case ROCKPAINT_UP | BUTTON_REPEAT: y-=bspeed * ( button & BUTTON_REPEAT ? 4 : 1 ); - if (y<0) y=ROWS-1; + if (y<0) y=img_height-1; break; case ROCKPAINT_DOWN: case ROCKPAINT_DOWN | BUTTON_REPEAT: y+=bspeed * ( button & BUTTON_REPEAT ? 4 : 1 ); - if (y>=ROWS-1) y=0; + if (y>=img_height-1) y=0; break; case ROCKPAINT_DRAW: @@ -1927,7 +2039,7 @@ { PUSH( x-1, y ); } - if( x < COLS-1 && save_buffer[x+1+y*COLS] == prev_color ) + if( x < img_width-1 && save_buffer[x+1+y*COLS] == prev_color ) { PUSH( x+1, y ); } @@ -1935,7 +2047,7 @@ { PUSH( x, y-1 ); } - if( y < ROWS - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) + if( y < img_height - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) { PUSH( x, y+1 ); } @@ -2141,7 +2253,7 @@ { PUSH( x-1, y ); } - if( x < COLS-1 && save_buffer[x+1+y*COLS] == prev_color ) + if( x < img_width-1 && save_buffer[x+1+y*COLS] == prev_color ) { PUSH( x+1, y ); } @@ -2149,7 +2261,7 @@ { PUSH( x, y-1 ); } - if( y < ROWS - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) + if( y < img_height - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) { PUSH( x, y+1 ); } @@ -2232,7 +2344,7 @@ { PUSH( x-1, y ); } - if( x < COLS-1 && save_buffer[x+1+y*COLS] == prev_color ) + if( x < img_width-1 && save_buffer[x+1+y*COLS] == prev_color ) { PUSH( x+1, y ); } @@ -2240,7 +2352,7 @@ { PUSH( x, y-1 ); } - if( y < ROWS - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) + if( y < img_height - 1 && save_buffer[x+(y+1)*COLS] == prev_color ) { PUSH( x, y+1 ); } @@ -2453,11 +2565,17 @@ static void restore_screen(void) { rb->lcd_bitmap( save_buffer, 0, 0, COLS, ROWS ); + rb->lcd_set_drawmode(DRMODE_COMPLEMENT); + rb->lcd_vline( img_width, 0, ROWS ); + rb->lcd_hline( 0, COLS, img_height ); + rb->lcd_set_drawmode(DRMODE_SOLID); } static void clear_drawing(void) { init_buffer(); + img_height = ROWS; + img_width = COLS; rb->lcd_set_foreground( rp_colors[ bgdrawcolor ] ); rb->lcd_fillrect( 0, 0, COLS, ROWS ); rb->lcd_update(); @@ -2508,6 +2626,14 @@ } break; + case MAIN_MENU_SET_WIDTH: + rb->set_int( "Set Width", "px", UNIT_INT, &img_width, + NULL, 1, 1, COLS, NULL ); + break; + case MAIN_MENU_SET_HEIGHT: + rb->set_int( "Set Height", "px", UNIT_INT, &img_height, + NULL, 1, 1, ROWS, NULL ); + break; case MAIN_MENU_BRUSH_SIZE: for(multi = 0; multi<4; multi++) if(bsize == times_list[multi]) break; @@ -2797,7 +2923,7 @@ case ROCKPAINT_LEFT | BUTTON_REPEAT: inv_cursor(false); x-=bspeed * accelaration; - if (x<0) x=COLS-1; + if (x<0) x=img_width-1; inv_cursor(true); break; @@ -2805,7 +2931,7 @@ case ROCKPAINT_RIGHT | BUTTON_REPEAT: inv_cursor(false); x+=bspeed * accelaration; - if (x>=COLS) x=0; + if (x>=img_width) x=0; inv_cursor(true); break; @@ -2813,7 +2939,7 @@ case ROCKPAINT_UP | BUTTON_REPEAT: inv_cursor(false); y-=bspeed * accelaration; - if (y<0) y=ROWS-1; + if (y<0) y=img_height-1; inv_cursor(true); break; @@ -2821,7 +2947,7 @@ case ROCKPAINT_DOWN | BUTTON_REPEAT: inv_cursor(false); y+=bspeed * accelaration; - if (y>=ROWS) + if (y>=img_height) { toolbar(); restore_screen(); @@ -2951,6 +3077,8 @@ if((bm.width > COLS ) || ( bm.height > ROWS )) return -1; + img_width = bm.width; + img_height = bm.height; for( i = bm.height-1; i >= 0; i-- ) { rb->memmove( save_buffer+i*COLS, save_buffer+i*bm.width, @@ -2967,9 +3095,15 @@ static int save_bitmap( char *file ) { struct bitmap bm; - bm.data = (char*)save_buffer; - bm.height = ROWS; - bm.width = COLS; + int i; + for(i=0; imemcpy( buffer.clipboard+i*img_width, save_buffer+i*COLS, + sizeof( fb_data )*img_width ); + } + bm.data = (char*)buffer.clipboard; + bm.height = img_height; + bm.width = img_width; bm.format = FORMAT_NATIVE; return save_bmp_file( file, &bm ); }