1. Си / Говнокод #3766

    +139

    1. 1
    2. 2
    3. 3
    4. 4
    inline Gdiplus::Color colorrefToGdiColor(COLORREF col, char alpha)
    {
    	return (static_cast<unsigned long>(static_cast<unsigned char>((col & Gdiplus::Color::RedMask) >> Gdiplus::Color::RedShift)) <<   Gdiplus::Color::BlueShift) | (static_cast<unsigned long>(static_cast<unsigned char>((col & Gdiplus::Color::GreenMask) >> Gdiplus::Color::GreenShift)) << Gdiplus::Color::GreenShift) | (static_cast<unsigned long>(static_cast<unsigned char>((col & Gdiplus::Color::BlueMask) >> Gdiplus::Color::BlueShift)) << Gdiplus::Color::RedShift) | (static_cast<unsigned long>(alpha) << Gdiplus::Color::AlphaShift);
    }

    Тихо себя ненавижу. Слава Б-г'у это всё выкидывается.

    Запостил: Altravert, 23 Июля 2010

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

    • Ой бляттть, это ж плюсы. Позор мне.
      Ответить
    • Хы, а причем БГ то тут, он менеджер, а не программист. Да и когда тысячи людей делают одно, подобные казусы будут.
      Ответить
    • BlueShift ... сразу вспомнил про Half-Life
      Ответить
      • Shift:

        2 a chiefly dialect : a change of clothes b (1) chiefly dialect : shirt (2) : a woman's slip or chemise (3) : a usually loose-fitting or semifitted dress

        И еще маски какие-то, чем они там вообще занимаются?
        Ответить
        • Там цвет хранится одной цифрой типа 0xAARRGGBB. Маски соответственно

          enum
          {
          AlphaShift = 24,
          RedShift = 16,
          GreenShift = 8,
          BlueShift = 0
          };

          enum
          {
          AlphaMask = 0xff000000,
          RedMask = 0x00ff0000,
          GreenMask = 0x0000ff00,
          BlueMask = 0x000000ff
          };

          Также там есть методы типа
          BYTE GetGreen() const { return (BYTE) (Argb >> GreenShift); }
          на которые студия естественно громко матерится (типа ты че, баран, большие типы режешь).
          Убожество в общем.
          Ответить
      • >BlueShit
        Что-же такое нужно сьесть, что-бы его увидеть...
        Ответить
    • Вот в нашем Си такого не было.
      А что, #define уже отменили? Стандартная практика же:

      #define blabla (expression)
      void func()
      {
      // Use it
      }
      #undef blabla
      Ответить
      • Дефайны я не люблю. Использую, конечно, но стараюсь обходиться. Ну как-то отпадает желание, когда в WinGDI.h видишь
        #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g) )<<8))|(((DWORD)(BYTE)(b))<<16)))
        Ответить
      • А что дает это? Что за expression? И зачем undef?
        Ответить
        • Дает, что можно немного сократить код, поскольку у нас тут три с половиной одинаковых куска.
          expression в данном случае будет что-то вроде того куска со статик кастами. Параметром будут слова с масками и шифтами.

          андеф чтобы прибрать за собой. На всякий случай (особенно важно в заголовочных фйайлах). В большинстве случаев не укусит, но, имхо, все равно стóит.
          Ответить
    • Вообще, у Gdiplus::Color есть конструктор принимающий 4 BYTE
      статик касты можно смело выкидывать)

      inline Gdiplus::Color COLORREFToColor(COLORREF clr, int alpha = 255)
      {
      return Gdiplus::Color(alpha, GetRValue(clr), GetGValue(clr), GetBValue(clr));
      }
      Ответить
      • Я в курсе. Но -- но -- но -- ноубадикэрс) Не для гдишного цвета это должно было быть, а макросы я не помню почему отбросил.
        Черт, это было очень давно и мне давно очень стыдно)
        Ответить
    • Мне одному название COLORREF кажется идиотским?
      Ответить

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