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

    +170

    1. 1
    2. 2
    3. 3
    4. 4
    void Draw_Pixel_Memset(UINT color,    //color = _RGB32BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) + ((a) << 24))
                          UINT *buffer){ //buffer =  (UINT*) ddsd.lpSurface
      memset(buffer, color,8); 
    }

    Рисование пикселя с помощью meset()

    Подскажите, пожалуйста, почему при использование этой функции в 32 битном режиме точка получается какового то серого цвета.
    С другой стороны если использовать 8 битный режим то пиксель будет нужного цвета.

    Источник: http://www.gamedev.ru/code/forum/?id=145274

    Запостил: TarasB, 19 Марта 2011

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

    • |с помощью meset()
      "Моя установить"
      Ответить
    • Сия функция еще за компанию следующий пиксел зарисовывает. Так что правильнее было назвать "Draw_2Pixels_Memset"
      Ответить
    • Фукция `memset` принимет на вход значение типа `char`, т.е. один байт. И этим байтом она забивает весь указанный ей регион памяти. Поэтому в данном примере совершенно пофиг, что там за rgb хранится в параметре `color`. Будет взят младший байт этого `color` (синий канал) и раскопирован во все 8 байтов `buffer`. Цвет, разумеется, получится серым (все каналы одинаковы), полю еще в альфу ляжет значение синего канала.

      Почему 8 - не ясно. Могу предположить, что подразумевалась функция `memcpy` c `sizeof color`? Но это было бы то же самое, что банальное присваивание `*buffer = color`. Опять же 8 вместо `sizeof color` смущает. Поэтому какой головой думал тут аффтар и что он пытался соорудить своим "мемсетом" - не ясно.
      Ответить
      • >`memset` принимет на вход значение типа `char`
        Вообще-то принимает она как раз int, но интерпретирует потом как unsigned char.
        Ответить
      • > Поэтому какой головой думал тут аффтар

        Судя по разговору по ссылке, он ещё не умеет думать.
        Ответить
    • Посоветуйте ему STL. Ещё красивше будет. И никаких серых пикселей!

      std::fill_n(buffer, 1, color);
      Ответить
      • Да чё там, давай сразу из буста какой-нибудь мегашаблон.
        Ответить
    • далеко не самый оптимальный вариант:
      size = 8; // ну не знаю уж почему 8 - рисуете горизонтальную линию из двух пикселей?
      *buffer = color;
      memcpy(&(buffer[1]), buffer, size - sizeof(UINT)); // это нужно если все-таки "линия"
      а вообще, если скорость критична, то советую найти Graphics32 - там в исходниках FillLongword_MMX - оно правда для Delphi, но разберетесь:)
      Ответить

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