1. C++ / Говнокод #5743

    +173

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 21 Февраля 2011

    Комментарии (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[256][8][8] памяти будет жрать огого.
              Ответить
              • 16K. А vector<bool> 2K
                Ответить
              • Хорошо, пусть будет bool symbols[223][8][8] -- 14272 байта. Текущий код с данными занимает не намного меньше, а может и больше.

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

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