<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>gtkglextmm: font.cc</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.4 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="examples.html">Examples</a></div> <h1>font.cc</h1>Simple bitmap font rendering example.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span> <span class="comment">/*</span> <span class="comment"> * font.cc:</span> <span class="comment"> * Simple bitmap font rendering example.</span> <span class="comment"> *</span> <span class="comment"> * written by Naofumi Yasufuku <naofumi@users.sourceforge.net></span> <span class="comment"> */</span> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> <span class="preprocessor">#include <gtkmm.h></span> <span class="preprocessor">#include <<a class="code" href="gtkglmm_8h.html">gtkglmm.h</a>></span> <span class="preprocessor">#ifdef G_OS_WIN32</span> <span class="preprocessor"></span><span class="preprocessor">#define WIN32_LEAN_AND_MEAN 1</span> <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span> <span class="preprocessor">#endif</span> <span class="preprocessor"></span> <span class="preprocessor">#include <GL/gl.h></span> <span class="preprocessor">#include <GL/glu.h></span> <span class="comment">//</span> <span class="comment">// OpenGL frame buffer configuration utilities.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">struct </span>GLConfigUtil { <span class="keyword">static</span> <span class="keywordtype">void</span> print_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig, <span class="keyword">const</span> <span class="keywordtype">char</span>* attrib_str, <span class="keywordtype">int</span> attrib, <span class="keywordtype">bool</span> is_boolean); <span class="keyword">static</span> <span class="keywordtype">void</span> examine_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig); }; <span class="comment">//</span> <span class="comment">// Print a configuration attribute.</span> <span class="comment">//</span> <span class="keywordtype">void</span> GLConfigUtil::print_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig, <span class="keyword">const</span> <span class="keywordtype">char</span>* attrib_str, <span class="keywordtype">int</span> attrib, <span class="keywordtype">bool</span> is_boolean) { <span class="keywordtype">int</span> value; <span class="keywordflow">if</span> (glconfig->get_attrib(attrib, value)) { std::cout << attrib_str << <span class="stringliteral">" = "</span>; <span class="keywordflow">if</span> (is_boolean) std::cout << (value == <span class="keyword">true</span> ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; <span class="keywordflow">else</span> std::cout << value << std::endl; } <span class="keywordflow">else</span> { std::cout << <span class="stringliteral">"*** Cannot get "</span> << attrib_str << <span class="stringliteral">" attribute value\n"</span>; } } <span class="comment">//</span> <span class="comment">// Print configuration attributes.</span> <span class="comment">//</span> <span class="keywordtype">void</span> GLConfigUtil::examine_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig) { std::cout << <span class="stringliteral">"\nOpenGL visual configurations :\n\n"</span>; std::cout << <span class="stringliteral">"glconfig->is_rgba() = "</span> << (glconfig->is_rgba() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->is_double_buffered() = "</span> << (glconfig->is_double_buffered() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->is_stereo() = "</span> << (glconfig->is_stereo() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_alpha() = "</span> << (glconfig->has_alpha() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_depth_buffer() = "</span> << (glconfig->has_depth_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_stencil_buffer() = "</span> << (glconfig->has_stencil_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_accum_buffer() = "</span> << (glconfig->has_accum_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << std::endl; print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::USE_GL"</span>, <a name="a0"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a15">Gdk::GL::USE_GL</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::BUFFER_SIZE"</span>, <a name="a1"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a16">Gdk::GL::BUFFER_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::LEVEL"</span>, <a name="a2"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a17">Gdk::GL::LEVEL</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::RGBA"</span>, <a name="a3"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a18">Gdk::GL::RGBA</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::DOUBLEBUFFER"</span>, <a name="a4"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a19">Gdk::GL::DOUBLEBUFFER</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::STEREO"</span>, <a name="a5"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a20">Gdk::GL::STEREO</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::AUX_BUFFERS"</span>, <a name="a6"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a21">Gdk::GL::AUX_BUFFERS</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::RED_SIZE"</span>, <a name="a7"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a22">Gdk::GL::RED_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::GREEN_SIZE"</span>, <a name="a8"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a23">Gdk::GL::GREEN_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::BLUE_SIZE"</span>, <a name="a9"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a24">Gdk::GL::BLUE_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ALPHA_SIZE"</span>, <a name="a10"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a25">Gdk::GL::ALPHA_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::DEPTH_SIZE"</span>, <a name="a11"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a26">Gdk::GL::DEPTH_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::STENCIL_SIZE"</span>, <a name="a12"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a27">Gdk::GL::STENCIL_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_RED_SIZE"</span>, <a name="a13"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a28">Gdk::GL::ACCUM_RED_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_GREEN_SIZE"</span>, <a name="a14"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a29">Gdk::GL::ACCUM_GREEN_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_BLUE_SIZE"</span>, <a name="a15"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a30">Gdk::GL::ACCUM_BLUE_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_ALPHA_SIZE"</span>, <a name="a16"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a31">Gdk::GL::ACCUM_ALPHA_SIZE</a>, <span class="keyword">false</span>); std::cout << std::endl; } <span class="comment">//</span> <span class="comment">// Simple OpenGL scene using bitmap font.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>FontGLScene : <span class="keyword">public</span> Gtk::DrawingArea, <span class="keyword">public</span> Gtk::GL::Widget<FontGLScene> { <span class="keyword">public</span>: FontGLScene(); <span class="keyword">virtual</span> ~FontGLScene(); <span class="keyword">protected</span>: <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_realize(); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_configure_event(GdkEventConfigure* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_expose_event(GdkEventExpose* event); <span class="keyword">protected</span>: <span class="comment">// font rendering stuff:</span> <span class="keyword">static</span> <span class="keyword">const</span> Glib::ustring m_FontString; GLuint m_FontListBase; <span class="keywordtype">int</span> m_FontHeight; }; <span class="keyword">const</span> Glib::ustring FontGLScene::m_FontString = <span class="stringliteral">"courier 12"</span>; FontGLScene::FontGLScene() : m_FontListBase(0), m_FontHeight(0) { <span class="comment">//</span> <span class="comment">// Configure OpenGL-capable visual.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Config> glconfig; <span class="comment">// Try double-buffered visual</span> glconfig = <a name="a17"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a18"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a name="a19"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a> | <a name="a20"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a4">Gdk::GL::MODE_DOUBLE</a>); <span class="keywordflow">if</span> (!glconfig) { std::cerr << <span class="stringliteral">"*** Cannot find the double-buffered visual.\n"</span> << <span class="stringliteral">"*** Trying single-buffered visual.\n"</span>; <span class="comment">// Try single-buffered visual</span> glconfig = <a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a>); <span class="keywordflow">if</span> (!glconfig) { std::cerr << <span class="stringliteral">"*** Cannot find any OpenGL-capable visual.\n"</span>; std::exit(1); } } <span class="comment">// print frame buffer attributes.</span> GLConfigUtil::examine_gl_attrib(glconfig); <span class="comment">//</span> <span class="comment">// Set OpenGL-capability to the widget.</span> <span class="comment">//</span> set_gl_capability(glconfig); } FontGLScene::~FontGLScene() { } <span class="keywordtype">void</span> FontGLScene::on_realize() { <span class="comment">// We need to call the base on_realize()</span> Gtk::DrawingArea::on_realize(); <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <span class="comment">//</span> <span class="comment">// GL calls.</span> <span class="comment">//</span> <span class="comment">// *** OpenGL BEGIN ***</span> <span class="keywordflow">if</span> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span>; <span class="comment">//</span> <span class="comment">// Generate font display lists.</span> <span class="comment">//</span> m_FontListBase = glGenLists (128); Pango::FontDescription font_desc(m_FontString); Glib::RefPtr<Pango::Font> font = <a name="a21"></a><a class="code" href="classGdk_1_1GL_1_1Font.html#e0">Gdk::GL::Font::use_pango_font</a>(font_desc, 0, 128, m_FontListBase); <span class="keywordflow">if</span> (!font) { std::cerr << <span class="stringliteral">"*** Can't load font "</span> << m_FontString << std::endl; Gtk::Main::quit(); } Pango::FontMetrics font_metrics = font->get_metrics(); m_FontHeight = font_metrics.get_ascent() + font_metrics.get_descent(); m_FontHeight = PANGO_PIXELS(m_FontHeight); glClearColor(1.0, 1.0, 1.0, 1.0); glClearDepth(1.0); glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, get_width(), 0.0, get_height(), -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> } <span class="keywordtype">bool</span> FontGLScene::on_configure_event(GdkEventConfigure* event) { <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <span class="comment">//</span> <span class="comment">// GL calls.</span> <span class="comment">//</span> <span class="comment">// *** OpenGL BEGIN ***</span> <span class="keywordflow">if</span> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, get_width(), 0.0, get_height(), -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> FontGLScene::on_expose_event(GdkEventExpose* event) { <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <span class="comment">//</span> <span class="comment">// GL calls.</span> <span class="comment">//</span> <span class="comment">// *** OpenGL BEGIN ***</span> <span class="keywordflow">if</span> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <span class="comment">//</span> <span class="comment">// Draw some text.</span> <span class="comment">//</span> glColor3f(0.0, 0.0, 0.0); <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 2; i >= -2; --i) { glRasterPos2f(10.0, 0.5*get_height() + i*m_FontHeight); <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = <span class="charliteral">' '</span>; j <= <span class="charliteral">'Z'</span>; ++j) glCallList(m_FontListBase+j); } <span class="comment">//</span> <span class="comment">// Show font description string.</span> <span class="comment">//</span> glColor3f(1.0, 0.0, 0.0); glRasterPos2f(10.0, 10.0); glListBase(m_FontListBase); glCallLists(m_FontString.length(), GL_UNSIGNED_BYTE, m_FontString.c_str()); <span class="comment">// Swap buffers.</span> <span class="keywordflow">if</span> (glwindow->is_double_buffered()) glwindow->swap_buffers(); <span class="keywordflow">else</span> glFlush(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="comment">//</span> <span class="comment">// The application class.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>Font : <span class="keyword">public</span> Gtk::Window { <span class="keyword">public</span>: Font(); <span class="keyword">virtual</span> ~Font(); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</span> <span class="keywordtype">void</span> on_button_quit_clicked(); <span class="keyword">protected</span>: <span class="comment">// member widgets:</span> Gtk::VBox m_VBox; FontGLScene m_FontGLScene; Gtk::Button m_ButtonQuit; }; Font::Font() : m_VBox(false, 0), m_ButtonQuit(<span class="stringliteral">"Quit"</span>) { <span class="comment">//</span> <span class="comment">// Top-level window.</span> <span class="comment">//</span> set_title(<span class="stringliteral">"Font"</span>); <span class="comment">// Get automatically redrawn if any of their children changed allocation.</span> set_reallocate_redraws(<span class="keyword">true</span>); add(m_VBox); <span class="comment">//</span> <span class="comment">// Simple OpenGL scene using bitmap font.</span> <span class="comment">//</span> m_FontGLScene.set_size_request(640, 240); m_VBox.pack_start(m_FontGLScene); <span class="comment">//</span> <span class="comment">// Simple quit button.</span> <span class="comment">//</span> m_ButtonQuit.signal_clicked().connect( sigc::mem_fun(*<span class="keyword">this</span>, &Font::on_button_quit_clicked)); m_VBox.pack_start(m_ButtonQuit, Gtk::PACK_SHRINK, 0); <span class="comment">//</span> <span class="comment">// Show window.</span> <span class="comment">//</span> show_all(); } Font::~Font() {} <span class="keywordtype">void</span> Font::on_button_quit_clicked() { Gtk::Main::quit(); } <span class="comment">//</span> <span class="comment">// Main.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv) { Gtk::Main kit(argc, argv); <span class="comment">//</span> <span class="comment">// Init gtkglextmm.</span> <span class="comment">//</span> <a name="a22"></a><a class="code" href="namespaceGtk_1_1GL.html#a2">Gtk::GL::init</a>(argc, argv); <span class="comment">//</span> <span class="comment">// Query OpenGL extension version.</span> <span class="comment">//</span> <span class="keywordtype">int</span> major, minor; <a name="a23"></a><a class="code" href="namespaceGdk_1_1GL.html#a116">Gdk::GL::query_version</a>(major, minor); std::cout << <span class="stringliteral">"OpenGL extension version - "</span> << major << <span class="stringliteral">"."</span> << minor << std::endl; <span class="comment">//</span> <span class="comment">// Instantiate and run the application.</span> <span class="comment">//</span> Font font; kit.run(font); <span class="keywordflow">return</span> 0; } </pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Feb 27 18:46:52 2006 for gtkglextmm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address> </body> </html>