diff options
author | Jonathon Jongsma <jjongsma@gnome.org> | 2006-07-04 23:06:07 +0000 |
---|---|---|
committer | Jonathon Jongsma <jjongsma@gnome.org> | 2006-07-04 23:06:07 +0000 |
commit | 7529b1e7972e671673b9e46ceea9479dbae9e110 (patch) | |
tree | bd82a6b117d594957488b262de5b53b192c68ac2 | |
parent | e975124de994758b2ded45378d0e3133e7249c0b (diff) |
2006-07-04 Jonathon Jongsma <jonathon.jongsma@gmail.com>
* cairomm/scaledfont.cc, cairomm/scaledfont.h: wrap ScaledFont, including
new API for cairo 1.2
* cairomm/Makefile.am: add scaledfont.* to list of sources
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | cairomm/Makefile.am | 4 | ||||
-rw-r--r-- | cairomm/scaledfont.cc | 103 | ||||
-rw-r--r-- | cairomm/scaledfont.h | 152 |
4 files changed, 263 insertions, 2 deletions
@@ -1,5 +1,11 @@ 2006-07-04 Jonathon Jongsma <jonathon.jongsma@gmail.com> + * cairomm/scaledfont.cc, cairomm/scaledfont.h: wrap ScaledFont, including + new API for cairo 1.2 + * cairomm/Makefile.am: add scaledfont.* to list of sources + +2006-07-04 Jonathon Jongsma <jonathon.jongsma@gmail.com> + * cairomm/surface.h: Remove comments stating that PDF, PS, and SVG are experimental surfaces. As of 1.2.0, these three surfaces are officially supported by the cairo library. diff --git a/cairomm/Makefile.am b/cairomm/Makefile.am index 83be658..35be984 100644 --- a/cairomm/Makefile.am +++ b/cairomm/Makefile.am @@ -2,9 +2,9 @@ SUBDIRS = INCLUDES = -I$(top_srcdir) @CAIROMM_CFLAGS@ -h_sources_public = cairomm.h context.h enums.h fontface.h fontoptions.h path.h pattern.h surface.h xlib_surface.h win32_surface.h exception.h refptr.h +h_sources_public = cairomm.h context.h enums.h fontface.h fontoptions.h path.h pattern.h surface.h xlib_surface.h win32_surface.h exception.h refptr.h scaledfont.h h_sources_private = private.h -cc_sources = context.cc fontface.cc fontoptions.cc path.cc pattern.cc surface.cc xlib_surface.cc win32_surface.cc exception.cc +cc_sources = context.cc fontface.cc fontoptions.cc path.cc pattern.cc surface.cc xlib_surface.cc win32_surface.cc exception.cc scaledfont.cc cc_sources_private = private.cc # Support for DLL on cygwin/mingw using libtool > 1.4 diff --git a/cairomm/scaledfont.cc b/cairomm/scaledfont.cc new file mode 100644 index 0000000..56736de --- /dev/null +++ b/cairomm/scaledfont.cc @@ -0,0 +1,103 @@ +/* Copyright (C) 2006 The cairomm Development Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +#include <cairomm/scaledfont.h> +#include <cairomm/private.h> // for check_status_and_throw_exception + +namespace Cairo +{ + +ScaledFont::ScaledFont(cobject* cobj, bool has_reference) +{ + if(has_reference) + m_cobject = cobj; + else + m_cobject = cairo_scaled_font_reference(cobj); +} + +RefPtr<ScaledFont> ScaledFont::create(FontFace font_face, Matrix& font_matrix, + Matrix& ctm, FontOptions options) +{ + cairo_scaled_font_t* cobj = cairo_scaled_font_create(font_face.cobj(), + static_cast<cairo_matrix_t*>(&font_matrix), + static_cast<cairo_matrix_t*>(&ctm), options.cobj() + ); + check_status_and_throw_exception(cairo_scaled_font_status(cobj)); + return RefPtr<ScaledFont>(new ScaledFont(cobj, false)); +} + +void ScaledFont::extents(FontExtents& extents) const +{ + cairo_scaled_font_extents(m_cobject, static_cast<cairo_font_extents_t*>(&extents)); + check_object_status_and_throw_exception(*this); +} + +void ScaledFont::text_extents(const std::string& utf8, TextExtents& extents) const +{ + cairo_scaled_font_text_extents(m_cobject, utf8.c_str(), static_cast<cairo_text_extents_t*>(&extents)); + check_object_status_and_throw_exception(*this); +} + +void ScaledFont::glyph_extents(std::vector<Glyph> glyphs, TextExtents& extents) +{ + // copy the data from the vector to a standard C array. I don't believe + // this will be a frequently used function so I think the performance hit is + // more than offset by the increased flexibility of the STL interface. + Glyph glyph_array[glyphs.size()]; + std::copy(glyphs.begin(), glyphs.end(), glyph_array); + + cairo_scaled_font_glyph_extents(m_cobject, glyph_array, glyphs.size(), + static_cast<cairo_text_extents_t*>(&extents)); + check_object_status_and_throw_exception(*this); +} + +RefPtr<FontFace> ScaledFont::get_font_face() const +{ + cairo_font_face_t* face = cairo_scaled_font_get_font_face(m_cobject); + check_object_status_and_throw_exception(*this); + return RefPtr<FontFace>(new FontFace(face, true)); +} + +void ScaledFont::get_font_options(FontOptions& options) const +{ + cairo_scaled_font_get_font_options(m_cobject, options.cobj()); + check_object_status_and_throw_exception(*this); +} + +void ScaledFont::get_font_matrix(Matrix& font_matrix) const +{ + cairo_scaled_font_get_font_matrix(m_cobject, + static_cast<cairo_matrix_t*>(&font_matrix)); + check_object_status_and_throw_exception(*this); +} + +void ScaledFont::get_ctm(Matrix& ctm) const +{ + cairo_scaled_font_get_ctm(m_cobject, static_cast<cairo_matrix_t*>(&ctm)); + check_object_status_and_throw_exception(*this); +} + +FontType ScaledFont::get_type() const +{ + cairo_font_type_t font_type = cairo_scaled_font_get_type(m_cobject); + check_object_status_and_throw_exception(*this); + return static_cast<FontType>(font_type); +} + +} // namespace Cairo +// vim: ts=2 sw=2 et diff --git a/cairomm/scaledfont.h b/cairomm/scaledfont.h new file mode 100644 index 0000000..26ef27e --- /dev/null +++ b/cairomm/scaledfont.h @@ -0,0 +1,152 @@ +/* Copyright (C) 2006 The cairomm Development Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +#ifndef __CAIROMM_SCALEDFONT_H +#define __CAIROMM_SCALEDFONT_H + +#include <cairomm/context.h> // Matrix +#include <cairomm/fontoptions.h> // Matrix + +namespace Cairo +{ + +typedef enum +{ +} ScaledFontType; + +/** A ScaledFont is a font scaled to a particular size and device resolution. It + * is most useful for low-level font usage where a library or application wants + * to cache a reference to a scaled font to speed up the computation of metrics. + */ +class ScaledFont +{ + +public: + /** The underlying C cairo object type */ + typedef cairo_scaled_font_t cobject; + + /** Provides acces to the underlying C cairo object */ + inline cobject* cobj() { return m_cobject; } + + /** Provides acces to the underlying C cairo object */ + inline const cobject* cobj() const { return m_cobject; } + +#ifndef DOXYGEN_IGNORE_THIS + // For use only by the cairomm implementation. + inline ErrorStatus get_status() const + { return cairo_scaled_font_status(const_cast<cairo_scaled_font_t*>(cobj())); } + + // for RefPtr + void reference() const { cairo_scaled_font_reference(m_cobject); } + void unreference() const { cairo_scaled_font_destroy(m_cobject); } +#endif //DOXYGEN_IGNORE_THIS + + /** Createa C++ wrapper object from the C instance. This C++ object should + * then be given to a RefPtr. + */ + explicit ScaledFont(cobject* cobj, bool has_reference = false); + + /** Creates a ScaledFont object from a font face and matrices that describe + * the size of the font and the environment in which it will be used. + * + * \param font_matrix font space to user space transformation matrix for the + * font. In the simplest case of a N point font, this matrix is just a scale + * by N, but it can also be used to shear the font or stretch it unequally + * along the two axes. See Context::set_font_matrix(). + * \param ctm user to device transformation matrix with which the font will be + * used. + * \param options: options to use when getting metrics for the font and + * rendering with it. + */ + static RefPtr<ScaledFont> create(FontFace font_face, Matrix& font_matrix, + Matrix& ctm, FontOptions options); + + /** Gets the metrics for a ScaledFont */ + void extents(FontExtents& extents) const; + + /** Gets the extents for a string of text. The extents describe a user-space + * rectangle that encloses the "inked" portion of the text drawn at the origin + * (0,0) (as it would be drawn by Context::show_text() if the cairo graphics + * state were set to the same font_face, font_matrix, ctm, and font_options as + * the ScaledFont object). Additionally, the x_advance and y_advance values + * indicate the amount by which the current point would be advanced by + * Context::show_text(). + * + * Note that whitespace characters do not directly contribute to the size of + * the rectangle (extents.width and extents.height). They do contribute + * indirectly by changing the position of non-whitespace characters. In + * particular, trailing whitespace characters are likely to not affect the + * size of the rectangle, though they will affect the x_advance and y_advance + * values. + * + * \param utf8 a string of text, encoded in UTF-8 + * \param extents Returns the extents of the given string + * + * \since 1.2 + */ + void text_extents(const std::string& utf8, TextExtents& extents) const; + + /** Gets the extents for an array of glyphs. The extents describe a user-space + * rectangle that encloses the "inked" portion of the glyphs, (as they would + * be drawn by Context::show_glyphs() if the cairo graphics state were set to the + * same font_face, font_matrix, ctm, and font_options as the ScaledFont + * object). Additionally, the x_advance and y_advance values indicate the + * amount by which the current point would be advanced by Context::show_glyphs(). + * + * Note that whitespace glyphs do not contribute to the size of the rectangle + * (extents.width and extents.height). + * + * \param glyphs A vector of glyphs to calculate the extents of + * \param extents Returns the extents for the array of glyphs + **/ + void glyph_extents(std::vector<Glyph> glyphs, TextExtents& extents); + + /** The FontFace with which this ScaledFont was created. + * \since 1.2 + */ + RefPtr<FontFace> get_font_face() const; + + /** Gets the FontOptions with which the ScaledFont was created. + * \since 1.2 + */ + void get_font_options(FontOptions& options) const; + + /** Gets the font matrix with which the ScaledFont was created. + * \since 1.2 + */ + void get_font_matrix(Matrix& font_matrix) const; + + /** Gets the CTM with which the ScaledFont was created. + * \since 1.2 + */ + void get_ctm(Matrix& ctm) const; + + /** Gets the type of scaled Font + * \since 1.2 + */ + FontType get_type() const; + + protected: + /** The underlying C cairo object that is wrapped by this ScaledFont */ + cobject* m_cobject; +}; + +} + +#endif // __CAIROMM_SCALEDFONT_H +// vim: ts=2 sw=2 et |