Проблема при обработке и отображении текста книги, где символы появляются один за другим - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть поток символов книги. У меня есть фрагмент кода, который, когда слово не помещается в оставшееся пространство строки, помещает его на следующую строку. Все работает, но моя проблема возникает, когда я пытаюсь добавить функциональность страницы (переключение страниц). Поскольку слова, которые не помещаются в строку, go на следующую строку и pu sh другие слова, если я на странице 82, я должен обрабатывать каждую страницу до 82, чтобы получить точное содержание страницы 82. Код работает, но он начинает отставать, когда я углубляюсь в книгу. Я полагаю, это общая проблема. Я не могу обработать всю книгу заранее, потому что хочу добавить динамический шрифт c (т. Е. Пользователь может переключать шрифт в любое время), который требует обработки и отображения на go.

Вот мой код: (он в Arduino IDE, C ++)

// Void to open a page of a book
#define line_size 43
#define page_lines 21
void lib_open_book(String file_name, int page) {
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 0);
  tft.setFont(&TomThumb);
  File myFile = SD.open(file_name);
  if (myFile) {
    int lines = 0;
    int space_left = line_size;
    String current_word = "";
    while (myFile.available()) {
      char c = myFile.read();
      // The code goes through all characters, processes text and counts lines
      // If I'm on page 8, it will have processed and counted the lines of all the previous pages
      // In that way, the system targets for example the lines 42 to 63 and displays them, that would be page 3
      if(lines >= page * page_lines && lines < (page + 1) * page_lines) {
        // We have reached the line count required to display the targeted page
        // Now processing the page and displaying it
        if(current_word.length() == space_left + current_word.length()) {
          if(c == ' ') {
            tft.print(current_word);
            tft.println();
            current_word = "";
            space_left = line_size;
          } else {
            tft.println();
            current_word += c;
            current_word.remove(0, 1);
            space_left = line_size - current_word.length();
          }
          lines++;
        } else {
          if(c == ' ') {
            tft.print(current_word);
            current_word = c;
          } else {
            current_word += c;
          }
          space_left--;
        }
      } else {
        // Processing pages before the targeted page so we get an accurate line count
        // Nothing is printed here, only processing and updating the line count
        if(current_word.length() == space_left + current_word.length()) {
          if(c == ' ') {
            current_word = "";
            space_left = line_size;
          } else {
            current_word += c;
            current_word.remove(0, 1);
            space_left = line_size - current_word.length();
          }
          lines++;
        } else {
          if(c == ' ') {
            current_word = c;
          } else {
            current_word += c;
          }
          space_left--;
        }
      }
    }
    tft.setFont();
    myFile.close();
  } else {
    tft.print("Error opening file.");
  }
}

Как бы я go решил эту проблему?

...