]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/font.cpp
initial (not yet working) code for DirectFB port
[wxWidgets.git] / src / dfb / font.cpp
diff --git a/src/dfb/font.cpp b/src/dfb/font.cpp
new file mode 100644 (file)
index 0000000..e954b9f
--- /dev/null
@@ -0,0 +1,275 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/dfb/font.cpp
+// Purpose:     wxFont implementation
+// Author:      Vaclav Slavik
+// Created:     2006-08-08
+// RCS-ID:      $Id$
+// Copyright:   (c) 2006 REA Elektronik GmbH
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/font.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+#endif
+
+#include "wx/fontutil.h"
+#include "wx/dfb/private.h"
+
+// ----------------------------------------------------------------------------
+// wxFontRefData
+// ----------------------------------------------------------------------------
+
+// FIXME: for now, always use single font
+static IDirectFBFontPtr gs_font = NULL;
+static unsigned gs_fontRefCnt = 0;
+
+class wxFontRefData : public wxObjectRefData
+{
+public:
+    wxFontRefData(int size = wxDEFAULT,
+                  int family = wxDEFAULT,
+                  int style = wxDEFAULT,
+                  int weight = wxDEFAULT,
+                  bool underlined = false,
+                  const wxString& faceName = wxEmptyString,
+                  wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        if ( family == wxDEFAULT )
+            family = wxSWISS;
+        if ( style == wxDEFAULT )
+            style = wxNORMAL;
+        if ( weight == wxDEFAULT )
+            weight = wxNORMAL;
+        if ( size == wxDEFAULT )
+            size = 12;
+
+        m_info.family = (wxFontFamily)family;
+        m_info.faceName = faceName;
+        m_info.style = (wxFontStyle)style;
+        m_info.weight = (wxFontWeight)weight;
+        m_info.pointSize = size;
+        m_info.underlined = underlined;
+        m_info.encoding = encoding;
+
+        // FIXME: always use default font for now
+        if ( !gs_font )
+        {
+            IDirectFBPtr dfb(wxTheApp->GetDirectFBInterface());
+
+            DFBFontDescription desc;
+            desc.flags = (DFBFontDescriptionFlags)0;
+            IDirectFBFontPtr f;
+            if ( DFB_CALL( dfb->CreateFont(dfb, NULL, &desc, &f) ) )
+                gs_font = f;
+        }
+        if ( gs_font ) // the above may fail
+        {
+            gs_fontRefCnt++;
+            m_font = gs_font;
+        }
+    }
+
+    wxFontRefData(const wxFontRefData& data)
+    {
+        m_info = data.m_info;
+        m_font = data.m_font;
+    }
+
+    ~wxFontRefData()
+    {
+        if ( m_font )
+        {
+            m_font.Reset();
+            // FIXME
+            if ( --gs_fontRefCnt == 0 )
+                gs_font = NULL;
+        }
+    }
+
+    wxNativeFontInfo m_info;
+    IDirectFBFontPtr m_font;
+};
+
+
+// ----------------------------------------------------------------------------
+// wxFont
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
+
+bool wxFont::Create(const wxNativeFontInfo& info)
+{
+    return Create(info.pointSize, info.family, info.style, info.weight,
+                  info.underlined, info.faceName, info.encoding);
+}
+
+bool wxFont::Create(int pointSize,
+                    int family,
+                    int style,
+                    int weight,
+                    bool underlined,
+                    const wxString& face,
+                    wxFontEncoding encoding)
+{
+    m_refData = new wxFontRefData(pointSize, family, style, weight,
+                                  underlined, face, encoding);
+    return true;
+}
+
+wxObjectRefData *wxFont::CreateRefData() const
+{
+    return new wxFontRefData;
+}
+
+wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
+{
+    return new wxFontRefData(*(wxFontRefData *)data);
+}
+
+
+// ----------------------------------------------------------------------------
+// accessors
+// ----------------------------------------------------------------------------
+
+IDirectFBFontPtr wxFont::GetDirectFBFont() const
+{
+    wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
+
+    return M_FONTDATA->m_font;
+}
+
+int wxFont::GetPointSize() const
+{
+    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.pointSize;
+}
+
+wxString wxFont::GetFaceName() const
+{
+    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.faceName;
+}
+
+int wxFont::GetFamily() const
+{
+    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.family;
+}
+
+int wxFont::GetStyle() const
+{
+    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.style;
+}
+
+int wxFont::GetWeight() const
+{
+    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.weight;
+}
+
+bool wxFont::GetUnderlined() const
+{
+    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.underlined;
+}
+
+
+wxFontEncoding wxFont::GetEncoding() const
+{
+    wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
+
+    return M_FONTDATA->m_info.encoding;
+}
+
+bool wxFont::IsFixedWidth() const
+{
+    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
+
+    return true; // FIXME_DFB
+}
+
+const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
+{
+    wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
+
+    return &(M_FONTDATA->m_info);
+}
+
+// ----------------------------------------------------------------------------
+// change font attributes
+// ----------------------------------------------------------------------------
+
+void wxFont::SetPointSize(int pointSize)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.pointSize = pointSize;
+}
+
+void wxFont::SetFamily(int family)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.family = (wxFontFamily)family;
+}
+
+void wxFont::SetStyle(int style)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.style = (wxFontStyle)style;
+}
+
+void wxFont::SetWeight(int weight)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.weight = (wxFontWeight)weight;
+}
+
+bool wxFont::SetFaceName(const wxString& faceName)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.faceName = faceName;
+
+    return wxFontBase::SetFaceName(faceName);
+}
+
+void wxFont::SetUnderlined(bool underlined)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.underlined = underlined;
+}
+
+void wxFont::SetEncoding(wxFontEncoding encoding)
+{
+    AllocExclusive();
+
+    M_FONTDATA->m_info.encoding = encoding;
+}