Конференция "Игры" » Не правильно написал код работы с Windows шрифтами.
 
  • @!!ex © (17.02.09 18:41) [0]
    Создаю шрифты.
    Часть шрифтов не работает.
    Не рисуется вообще.
    Поменя какие нибудь параметры шрифта(размер, свойства), нарисуется, но какой нибудь/какие нибудь другие шрифты рисоваться перестают.
    НЕ понимаю в чем проблема.
    Обычно использую свою систему шрифтов, текстурные.
    А тут понадобилось сделать системные и вот такой косяк...
    Код отвечающий за шрифты

     struct sFont
     {
       int Font;
       std::string Name;
       int Size;
       bool Bold;
       bool Italic;
       bool Underline;
       int YShift;
       int OSFont;
     }
    ;

     
     class cFont
     {
       sFont      *m_Font;
     public:
       cFont(std::string Name, int Size, bool Bold = false, bool Italic = false, bool Underline = false);
       virtual ~cFont();
       void Draw(float x, float y, cVector4f& Color, const char* Text);
       cVector2i GetTextSize(const char* Text) {return osal::GetTextSize(Text,m_Font->OSFont);}
    ;
       sFont* GetDirectData() {return m_Font;}
     };

    static int s_DisplayListPosition = 0;
    static std::vector<gapi::sFont*> s_Fonts;

    gapi::cFont::cFont(std::string Name, int Size, bool Bold, bool Italic, bool Underline)
    {
     for (unsigned int i = 0; i<s_Fonts.size(); i++)
       if (s_Fonts[i]->Size == Size && s_Fonts[i]->Bold == Bold && s_Fonts[i]->Italic == Italic && s_Fonts[i]->Underline == Underline && s_Fonts[i]->Name == Name)
       {
         m_Font = s_Fonts[i];
         return;
       }
    ;
     loger::Add("Init font");
     loger::AddString(Name+IntToStr(Size));

     m_Font = new gapi::sFont();

     m_Font->Name = Name;
     m_Font->Size = Size;
     m_Font->Bold = Bold;
     m_Font->Italic = Italic;
     m_Font->Underline = Underline;

    #ifdef WIN32
     LOGFONTA LogFont;
       LogFont.lfHeight = -MulDiv(Size, GetDeviceCaps(osal::OSWindows_GetDC(), LOGPIXELSY), 72);
     m_Font->YShift = -LogFont.lfHeight;
       LogFont.lfWidth = 0;
       LogFont.lfEscapement = 0;
       LogFont.lfOrientation = 0;
         if (Bold)
           LogFont.lfWeight = FW_BOLD;
         else
           LogFont.lfWeight = FW_NORMAL;
       LogFont.lfItalic = Italic;
       LogFont.lfUnderline = Underline;
       LogFont.lfStrikeOut = 0;
       LogFont.lfCharSet = DEFAULT_CHARSET;
     //strcpy((char*)&LogFont.lfFaceName,Name.c_str());
     strcpy(LogFont.lfFaceName,Name.c_str());
       LogFont.lfQuality = DEFAULT_QUALITY;
       LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
       LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
         //lfPitchAndFamily := VARIABLE_PITCH;
       LogFont.lfPitchAndFamily = FIXED_PITCH;
       LogFont.lfPitchAndFamily = DEFAULT_PITCH;

     m_Font->OSFont = (int)CreateFontIndirectA(&LogFont);

     SelectObject(osal::OSWindows_GetDC(),(HFONT)m_Font->OSFont);
     m_Font->Font = s_DisplayListPosition;
       wglUseFontBitmaps (osal::OSWindows_GetDC(), 0, 256, m_Font->Font);
    #endif
     s_DisplayListPosition +=256;
     s_Fonts.push_back(m_Font);
    };

    gapi::cFont::~cFont()
    {
    }
    ;

    void gapi::cFont::Draw(float x, float y, cVector4f& Color, const char* Text)
    {
     gapi::SetTexturesCount(0);
       gapi::Color4fv(&Color);
         glRasterPos2f(x,y+m_Font->YShift);
         glListBase(m_Font->Font);
         glCallLists(strlen(Text), GL_UNSIGNED_BYTE, Text);
       gapi::Color4f(1,1,1,1);
     gapi::SetTexturesCount(1);
    }
    ;

 
Конференция "Игры" » Не правильно написал код работы с Windows шрифтами.
Есть новые Нет новых   [134430   +2][b:0][p:0.002]