|
Packit |
0ec9dd |
/* Pango
|
|
Packit |
0ec9dd |
* pango-impl-utils.h: Macros for get_type() functions
|
|
Packit |
0ec9dd |
* Inspired by Jody Goldberg's gsf-impl-utils.h
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Copyright (C) 2003 Red Hat Software
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is free software; you can redistribute it and/or
|
|
Packit |
0ec9dd |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License as published by the Free Software Foundation; either
|
|
Packit |
0ec9dd |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
0ec9dd |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
0ec9dd |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
0ec9dd |
* Library General Public License for more details.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License along with this library; if not, write to the
|
|
Packit |
0ec9dd |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
0ec9dd |
* Boston, MA 02111-1307, USA.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#ifndef __PANGO_IMPL_UTILS_H__
|
|
Packit |
0ec9dd |
#define __PANGO_IMPL_UTILS_H__
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#include <glib.h>
|
|
Packit |
0ec9dd |
#include <glib-object.h>
|
|
Packit |
0ec9dd |
#include <pango/pango.h>
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
G_BEGIN_DECLS
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* String interning for static strings */
|
|
Packit |
0ec9dd |
#define I_(string) g_intern_static_string (string)
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* Some functions for handling PANGO_ATTR_SHAPE */
|
|
Packit |
0ec9dd |
void _pango_shape_shape (const char *text,
|
|
Packit |
0ec9dd |
unsigned int n_chars,
|
|
Packit |
0ec9dd |
PangoRectangle *shape_ink,
|
|
Packit |
0ec9dd |
PangoRectangle *shape_logical,
|
|
Packit |
0ec9dd |
PangoGlyphString *glyphs);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
void _pango_shape_get_extents (gint n_chars,
|
|
Packit |
0ec9dd |
PangoRectangle *shape_ink,
|
|
Packit |
0ec9dd |
PangoRectangle *shape_logical,
|
|
Packit |
0ec9dd |
PangoRectangle *ink_rect,
|
|
Packit |
0ec9dd |
PangoRectangle *logical_rect);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* We define these functions static here because we don't want to add public API
|
|
Packit |
0ec9dd |
* for them (if anything, it belongs to glib, but glib found it trivial enough
|
|
Packit |
0ec9dd |
* not to add API for). At some point metrics calculations will be
|
|
Packit |
0ec9dd |
* centralized and this mess can be minimized. Or so I hope.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static inline G_GNUC_UNUSED int
|
|
Packit |
0ec9dd |
pango_unichar_width (gunichar c)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
return G_UNLIKELY (g_unichar_iszerowidth (c)) ? 0 :
|
|
Packit |
0ec9dd |
G_UNLIKELY (g_unichar_iswide (c)) ? 2 : 1;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static G_GNUC_UNUSED glong
|
|
Packit |
0ec9dd |
pango_utf8_strwidth (const gchar *p)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
glong len = 0;
|
|
Packit |
0ec9dd |
g_return_val_if_fail (p != NULL, 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
while (*p)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
len += pango_unichar_width (g_utf8_get_char (p));
|
|
Packit |
0ec9dd |
p = g_utf8_next_char (p);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return len;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* Glib's g_utf8_strlen() is broken and stops at embedded NUL's.
|
|
Packit |
0ec9dd |
* Wrap it here. */
|
|
Packit |
0ec9dd |
static G_GNUC_UNUSED glong
|
|
Packit |
0ec9dd |
pango_utf8_strlen (const gchar *p, gssize max)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
glong len = 0;
|
|
Packit |
0ec9dd |
const gchar *start = p;
|
|
Packit |
0ec9dd |
g_return_val_if_fail (p != NULL || max == 0, 0);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (max <= 0)
|
|
Packit |
0ec9dd |
return g_utf8_strlen (p, max);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
p = g_utf8_next_char (p);
|
|
Packit |
0ec9dd |
while (p - start < max)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
++len;
|
|
Packit |
0ec9dd |
p = g_utf8_next_char (p);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* only do the last len increment if we got a complete
|
|
Packit |
0ec9dd |
* char (don't count partial chars)
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
if (p - start <= max)
|
|
Packit |
0ec9dd |
++len;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return len;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/* To be made public at some point */
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static G_GNUC_UNUSED void
|
|
Packit |
0ec9dd |
pango_glyph_string_reverse_range (PangoGlyphString *glyphs,
|
|
Packit |
0ec9dd |
int start, int end)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
int i, j;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
for (i = start, j = end - 1; i < j; i++, j--)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoGlyphInfo glyph_info;
|
|
Packit |
0ec9dd |
gint log_cluster;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
glyph_info = glyphs->glyphs[i];
|
|
Packit |
0ec9dd |
glyphs->glyphs[i] = glyphs->glyphs[j];
|
|
Packit |
0ec9dd |
glyphs->glyphs[j] = glyph_info;
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
log_cluster = glyphs->log_clusters[i];
|
|
Packit |
0ec9dd |
glyphs->log_clusters[i] = glyphs->log_clusters[j];
|
|
Packit |
0ec9dd |
glyphs->log_clusters[j] = log_cluster;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
G_END_DECLS
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#endif /* __PANGO_IMPL_UTILS_H__ */
|