Кресты / Говнокод #5743 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
void DrawingLibrary::drawText(int x0, int y0, char string[], int strlen, int red, int green, int blue, int alpha) {
	for(int i = 0; i < strlen; ++i) {
		char chr = string[i];
		int sX = x0 + i * 8;
		// проходимся по символам, рисуя их
		if(chr == '!') {
			bool symbol[8][8] = {{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
		else if(chr == '"') {
			bool symbol[8][8] = {{0,0,0,0,1,0,1,0},{0,0,0,0,1,0,1,0},{0,0,0,0,1,0,1,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
		else if(chr == '#') {
			bool symbol[8][8] = {{0,0,0,0,1,0,1,0},{0,0,0,0,1,0,1,0},{0,0,0,1,1,1,1,1},{0,0,0,0,1,0,1,0},{0,0,0,1,1,1,1,1},{0,0,0,0,1,0,1,0},{0,0,0,0,1,0,1,0},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
		/* еще 135 строк такого "кода" */
		else if(chr == 'э') {
			bool symbol[8][8] = {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,1},{0,0,0,0,0,1,1,1},{0,0,0,0,0,0,0,1},{0,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
		else if(chr == 'ю') {
			bool symbol[8][8] = {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,1,0,0,1,0},{0,0,0,1,0,1,0,1},{0,0,0,1,1,1,0,1},{0,0,0,1,0,1,0,1},{0,0,0,1,0,0,1,0},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
		else if(chr == 'я') {
			bool symbol[8][8] = {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,1},{0,0,0,0,1,0,0,1},{0,0,0,0,0,1,1,1},{0,0,0,0,0,1,0,1},{0,0,0,0,1,0,0,1},{0,0,0,0,0,0,0,0}};
			this->drawSymbol(sX, y0, symbol, red, green, blue, alpha);
		}
	}
}

Функция, рисующая на картинке текст.

Запостил: ShitCode ShitCode, (Updated )

Комментарии (26) RSS

    • Это библиотека, рисующая на экране. От API требует только возможность рисовать пиксели, все остальное делает сама. А шрифт я брал от компьютера Радио-86РК.
      Ответить
  • >C++
    >char string[]

    Мдя... про std::string афтар не слышал
    Ответить
    • Слышал, и даже использую:
      // выводим FPS
      	std::ostringstream fpsTextStream;
      	fpsTextStream << "FPS: " << this->fpsCount;
      	std::string fpsTextString(fpsTextStream.str());
      	char *fpsText = new char[fpsTextString.length() + 1];
      	std::strncpy(fpsText, fpsTextString.c_str(), fpsTextString.length() + 1);
      	this->drawFilledRectangle(0, 0, (fpsTextString.length() * 8) + 1, 8, 0, 0, 0, 100);
      	this->drawText(1, 1, fpsText, fpsTextString.length() + 1, 255, 255, 255, 100);
      	delete [] fpsText;


      Но мне больше интереснее с массивом char. И не надо, пожалуйста, холивара char vs. std::string.
      Ответить
      • Если с массивом, то тогда std::vector в помощь.
        new/delete здесь не лучший вариант.
        А в исходном ГК надо бы вынести this->drawSymbol(sX, y0, symbol, red, green, blue, alpha); и использовать switch.
        Ответить
        • Тогда уж лучше bool symbols[256][8][8]. А ещё лучше -- uint8_t symbols[256][8].
          Ответить
            • Хорошо, пусть будет bool symbols[223][8][8] -- 14272 байта. Текущий код с данными занимает не намного меньше, а может и больше.

              А uint8_t symbols[223][8] -- всего 1784 байта.
              Ответить
              • Не, никак. У русских символов код почему-то отрицательный (у 'я', например, -1). Не победимый говнокод у меня какой-то 🙂 Всем спасибо!
                Ответить
                  • В конце-концов мы тут просто смеемся, фиксить этот ужос я никого не прошу. Возможно, потом я сам что-нибудь придумаю.
                    Ответить
                  • Хм, не додумался. А с unsigned char - работает! Делаю с таблицей. Спасибо, посылаю луч добра 😀
                    Ответить
                    • Сделал, и все работает! Количество строк сократилось на ~400.
                      Ответить
        • Со switch'eм суть останется такая же. А про вектор - не стоит засовывать его ради только вывода FPS, ИМХО.
          Ответить
      • >Слышал, и даже использую:
        Нужно бы это оформить отдельным говнокодом... 😀
        Ответить
  • можно пойти дальше - поддерживать стандартные шрифты:
    для этого нужно формировать массив symbols[223][8][8] ну или symbols[223][8] (если сойдет без сглаживания) в функции инициализации шрифта (ну или брутально в конструкторе). Для этого при инициализации можно вывести все 223 символа в буферную картинку стандартными методами.
    Если сделать некоряво, то будет на порядок быстрее стандартного API.
    Ответить
  • Посоны, а почему внешний файл с матрицей (размеров 2048 байтов) нельзя использовать?
    Ответить
    • Ну вроде достаточно очевидно, что кодо-независимые данные нужно выносить (типа как пиксельные данные для шрифтов).
      Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8