diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | examples/text/Makefile.am | 5 | ||||
-rw-r--r-- | examples/text/user-font.cc | 66 |
3 files changed, 75 insertions, 2 deletions
@@ -1,5 +1,11 @@ 2008-12-07 Jonathon Jongsma <jonathon@quotidian.org> + * examples/text/Makefile.am: + * examples/text/user-font.cc: Added a very simple example of using a + UserFontFace to draw text + +2008-12-07 Jonathon Jongsma <jonathon@quotidian.org> + * cairomm/fontface.cc: Fix the default implementation of UserFontFace::init() to set up the font extents parameter correctly according to the documentation diff --git a/examples/text/Makefile.am b/examples/text/Makefile.am index adb68b0..19f6e70 100644 --- a/examples/text/Makefile.am +++ b/examples/text/Makefile.am @@ -1,9 +1,10 @@ include $(top_srcdir)/examples/Makefile.am_fragment # build the executable but don't install it -noinst_PROGRAMS = text_rotate toy-text +noinst_PROGRAMS = text_rotate toy-text user-font text_rotate_SOURCES = text-rotate.cc toy_text_SOURCES=toy-text.cc +user_font_SOURCES=user-font.cc -CLEANFILES = text-rotate.png toy-text.png +CLEANFILES = text-rotate.png toy-text.png user-font.png diff --git a/examples/text/user-font.cc b/examples/text/user-font.cc new file mode 100644 index 0000000..8e5dae9 --- /dev/null +++ b/examples/text/user-font.cc @@ -0,0 +1,66 @@ +#include <cairomm/cairomm.h> +#include <iostream> + +const double HEIGHT = 200.0; +const double WIDTH = 400.0; +const double FONT_SIZE = 64.0; +const double TEXT_ORIGIN_Y = (HEIGHT / 2.0) + (FONT_SIZE / 2.0); +const double TEXT_ORIGIN_X = 50.0; // arbitrary + +// A *very* simple font that just draws a box for every glyph +class BoxFontFace : public Cairo::UserFontFace +{ +public: + static Cairo::RefPtr<BoxFontFace> create() + { + return Cairo::RefPtr<BoxFontFace>(new BoxFontFace()); + } + + virtual Cairo::ErrorStatus + render_glyph(const Cairo::RefPtr<Cairo::ScaledFont>& /*scaled_font*/, + unsigned long glyph, + const Cairo::RefPtr<Cairo::Context>& cr, + Cairo::TextExtents& /*metrics*/) + { + std::cout << "Rendering glyph " << glyph << std::endl; + cr->set_line_width(0.05); + // FIXME: is the negative Y value correct? + cr->rectangle(0.0, 0.0, 1.0, -1.0); + cr->stroke(); + return CAIRO_STATUS_SUCCESS; + } + +protected: + BoxFontFace() : UserFontFace() { } +}; + +int main(int, char**) +{ + Cairo::RefPtr<Cairo::ImageSurface> surface = + Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, WIDTH, HEIGHT); + Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface); + // fill background in white + cr->set_source_rgb(1.0, 1.0, 1.0); + cr->paint(); + + // draw a little dot at the point where text will be drawn + cr->arc(TEXT_ORIGIN_X, TEXT_ORIGIN_Y, FONT_SIZE / 4.0, 0, 2*M_PI); + cr->set_source_rgba(0.0, 1.0, 0.0, 0.5); + cr->fill(); + + // draw the text + cr->move_to(TEXT_ORIGIN_X, TEXT_ORIGIN_Y); + cr->set_source_rgb(0.8, 0.2, 0.2); + + // this scope block is simply to test that the user font can still be + // drawn even after the UserFont wrapper object has been de-referenced + { + Cairo::RefPtr<BoxFontFace> font = BoxFontFace::create(); + cr->set_font_face(font); + } + + cr->set_font_size(FONT_SIZE); + cr->show_text("cairomm!"); + surface->write_to_png("user-font.png"); + return 0; +} |