//------------------------------------------------------------------- void gui_read_draw(int enforce_redraw) { if (conf.reader_autoscroll && !pause && get_tick_count()-last_time >= conf.reader_autoscroll_delay*1000 && (conf.reader_pos+read_on_screen)<read_file_size) { conf.reader_pos += read_on_screen; read_to_draw = 1; } if (read_to_draw) { int n, i, ii, ll, new_word=1; xx=x; yy=y; lseek(read_file, conf.reader_pos, SEEK_SET); read_on_screen=0; while (yy<=y+h-rbf_font_height()) { n=read(read_file, buffer, READ_BUFFER_SIZE); if (n==0) { read_goto_next_line(); if (yy < y+h) draw_filled_rect(x, yy, x+w-1, y+h-1, MAKE_COLOR(BG_COLOR(conf.reader_color), BG_COLOR(conf.reader_color))); break; } i=0; while (i<n && yy<=y+h-rbf_font_height()) { switch (buffer[i]) { case '\r': new_word = 1; break; case '\n': read_goto_next_line(); new_word = 1; break; case '\t': buffer[i] = ' '; // no break here default: if (conf.reader_wrap_by_words) { if (buffer[i] == ' ') { new_word = 1; if (xx==x) //ignore leading spaces break; } else if (new_word) { new_word = 0; for (ii=i, ll=0; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } if (ii==n) { memcpy(buffer, buffer+i, n-i); n=ii=n-i; read_on_screen+=i; i=0; n+=read(read_file, buffer+n, READ_BUFFER_SIZE-n); for (; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } } if (xx+ll>=x+w && ll<w) { read_goto_next_line(); continue; } } } if (!read_fit_next_char(buffer[i])) { read_goto_next_line(); continue; } xx+=rbf_draw_char(xx, yy, buffer[i], conf.reader_color); break; } ++i; if (xx >= x+w) { xx = x; yy += rbf_font_height(); } } read_on_screen+=i; } sprintf(buffer, "(%3d%%) %d/%d ", (read_file_size)?(conf.reader_pos*100/read_file_size):0, conf.reader_pos, read_file_size); buffer[camera_screen.width/FONT_WIDTH]=0; draw_txt_string((camera_screen.ts_button_border/FONT_WIDTH), 0, buffer, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE)); //title infoline // scrollbar if (read_file_size) { i=h-1 -1; // full height n=i*read_on_screen/read_file_size; // bar height if (n<20) n=20; i=(i-n)*conf.reader_pos/read_file_size; // top pos draw_filled_rect(x+w+6+2, y+1, x+w+6+6, y+1+i, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); draw_filled_rect(x+w+6+2, y+i+n, x+w+6+6, y+h-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); draw_filled_rect(x+w+6+2, y+1+i, x+w+6+6, y+i+n, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE)); } else { draw_filled_rect((x+w)*FONT_WIDTH+2, y*FONT_HEIGHT+1, (x+w)*FONT_WIDTH+6, (y+h)*FONT_HEIGHT-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK)); } read_to_draw = 0; last_time = get_tick_count(); } gui_read_draw_batt(); gui_read_draw_clock(); }
//------------------------------------------------------------------- void gui_read_draw(int force_redraw) { if (do_not_draw) return; busy_drawing = 1; twoColors col = user_color(conf.reader_color); static int first_draw = 1; if (first_draw || force_redraw) { if (first_draw) { // font has to be loaded from here (SpyTask) rbf_load_from_file(conf.reader_rbf_file, conf.reader_codepage); } draw_rectangle(camera_screen.disp_left, 0, camera_screen.disp_right, y-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK), RECT_BORDER0|DRAW_FILLED); draw_rectangle(camera_screen.disp_left, y, camera_screen.disp_right, camera_screen.height-1, MAKE_COLOR(BG_COLOR(col), BG_COLOR(col)), RECT_BORDER0|DRAW_FILLED); gui_read_draw_scroll_indicator(); read_to_draw = 1; first_draw = 0; } if (conf.reader_autoscroll && !pause && get_tick_count()-last_time >= conf.reader_autoscroll_delay*1000 && (conf.reader_pos+read_on_screen)<read_file_size) { conf.reader_pos += read_on_screen; read_to_draw = 1; } if (read_to_draw) { int n, m, i, ii, ll, new_word=1; xx=x; yy=y; lseek(read_file, conf.reader_pos, SEEK_SET); read_on_screen=0; while (yy<=y+h-rbf_font_height()) { n=read(read_file, buffer, READ_BUFFER_SIZE); if (n==0) { read_goto_next_line(); if (yy < y+h) draw_rectangle(x, yy, x+w-1, y+h-1, MAKE_COLOR(BG_COLOR(col), BG_COLOR(col)), RECT_BORDER0|DRAW_FILLED); break; } else if (n<0) { // read failed do_not_draw = 1; busy_drawing = 0; return; } i=0; while (i<n && yy<=y+h-rbf_font_height()) { switch (buffer[i]) { case '\r': new_word = 1; break; case '\n': read_goto_next_line(); new_word = 1; break; case '\t': buffer[i] = ' '; // no break here default: if (conf.reader_wrap_by_words) { if (buffer[i] == ' ') { new_word = 1; if (xx==x) //ignore leading spaces break; } else if (new_word) { new_word = 0; for (ii=i, ll=0; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } if (ii==n) { memcpy(buffer, buffer+i, n-i); n=ii=n-i; read_on_screen+=i; i=0; m=read(read_file, buffer+n, READ_BUFFER_SIZE-n); if (m<0) { // read failed do_not_draw = 1; busy_drawing = 0; return; } n+=m; for (; ii<n && buffer[ii]!=' ' && buffer[ii]!='\t' && buffer[ii]!='\r' && buffer[ii]!='\n'; ++ii) { ll+=rbf_char_width(buffer[ii]); } } if (xx+ll>=x+w && ll<w) { read_goto_next_line(); continue; } } } if (!read_fit_next_char(buffer[i])) { read_goto_next_line(); continue; } xx+=rbf_draw_char(xx, yy, buffer[i], col); break; } ++i; if (xx >= x+w) { xx = x; yy += rbf_font_height(); } } read_on_screen+=i; } sprintf(buffer, "(%3d%%) %d/%d", (read_file_size)?(conf.reader_pos*100/read_file_size):0, conf.reader_pos, read_file_size); draw_string_justified(camera_screen.disp_left, 0, buffer, MAKE_COLOR(COLOR_BLACK, COLOR_WHITE), 0, 20*FONT_WIDTH, TEXT_LEFT|TEXT_FILL); //title infoline // scrollbar if (read_file_size) { i=h-1 -1; // full height n=i*read_on_screen/read_file_size; // bar height if (n<20) n=20; i=(i-n)*conf.reader_pos/read_file_size; // top pos draw_rectangle(x+w+6+2, y+1, x+w+6+6, y+1+i, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK), RECT_BORDER0|DRAW_FILLED); draw_rectangle(x+w+6+2, y+i+n, x+w+6+6, y+h-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK), RECT_BORDER0|DRAW_FILLED); draw_rectangle(x+w+6+2, y+1+i, x+w+6+6, y+i+n, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE), RECT_BORDER0|DRAW_FILLED); } else { draw_rectangle((x+w)*FONT_WIDTH+2, y*FONT_HEIGHT+1, (x+w)*FONT_WIDTH+6, (y+h)*FONT_HEIGHT-1-1, MAKE_COLOR(COLOR_BLACK, COLOR_BLACK), RECT_BORDER0|DRAW_FILLED); } read_to_draw = 0; last_time = get_tick_count(); } gui_read_draw_batt(); gui_read_draw_clock(); busy_drawing = 0; }