1
/* SDL_Pango.c -- A companion library to SDL for working with Pango.
2
Copyright (C) 2004 NAKAMURA Ken'ichi
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Lesser General Public
6
License as published by the Free Software Foundation; either
7
version 2.1 of the License, or (at your option) any later version.
9
This library is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Lesser General Public License for more details.
14
You should have received a copy of the GNU Lesser General Public
15
License along with this library; if not, write to the Free Software
16
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22
\section intro Introduction
24
Pango is the text rendering engine of GNOME 2.x. SDL_Pango connects the
25
engine to SDL. In Windows, pre-built binary package (MSI and merge module)
28
\subsection dist Distribution
30
If you are a game software developer, you should know the difficulties of
31
distribution. So I will start to introduce SDL_Pango from the viewpoint
34
In Un*x, SDL_Pango is hard to use as system-independent module, because
35
it depends on fontconfig and Pango which are designed as system-singleton
36
modules. If you use SDL_Pango, your software will require those modules
37
installed to target system. If your software is shipped as shrink-wrap
38
package, it may cause much problem on your support desk. You should
39
carefully design your installation process.
41
In Windows, SDL_Pango is distributed as "merge module" which contains
42
fontconfig and Pango. Those binaries are modified as side-by-side components.
43
You should use Windows Installer and merge the module
44
on your MSI package. The merge module not only contains files, but also includes
45
custom action which must be run at installation.
47
\subsection api High-level API
49
From the viewpoint of text rendering, the heart of SDL_Pango is high-level API.
50
Other text rendering APIs, like DrawText() of Windows, font and text must be
51
specified separately. In SDL_Pango, font specification is embedded in text like
55
<span font_family="Courier New"><i>This is Courier New and italic.</i></span>
58
Color, size, subscript/superscript, obliquing, weight, and other many features
59
are also available in same way.
61
\subsection i18n Internationalized Text
63
Internationalized text is another key feature. Text is specified by UTF-8. RTL
64
script (Arabic and Hebrew) and complicated rendering (Arabic, Indic and Thai) are
65
supported. You can see it with GNOME 2.x.
67
\section get Getting Started
69
\subsection getlatest Get latest files
71
Get latest files from http://sourceforge.net/projects/sdlpango/ .
73
\subsection install Install Header and Library
75
In Windows and VS2003, I strongly recommend you to install MSI package. It contains Pango
76
and fontconfig binaries which are modified as side-by-side components. It is
77
nearly impossible to build them. (I spent much time to build them...)
79
In MinGW, I recommend you to use VS2003. Otherwise you may run into the maze of
80
distribution. If you insist MinGW, you should use MinGW binary archive.
82
In Un*x, installation consists of:
90
\subsection inc Includes
92
To use SDL_Pango functions in a C/C++ source code file, you must use the SDL_Pango.h
96
#include "SDL_Pango.h"
99
In Windows, SDL_Pango.h is installed on \c \%ProgramFiles\%\\SDL_Pango \c Development\\include
100
(usually \c C:\\Program \c Files\\SDL_Pango \c Development\\include). You should add this
101
directory to include path.
103
\subsection comp Compiling
105
In Un*x, to link with SDL_Pango you should use sdl-config to get the required SDL
106
compilation options. After that, compiling with SDL_Pango is quite easy.
108
Note: Some systems may not have the SDL_Pango library and include file in the same
109
place as the SDL library and includes are located, in that case you will need to
110
add more -I and -L paths to these command lines.
112
Simple Example for compiling an object file:
115
cc -c `sdl-config --cflags` mysource.c
118
Simple Example for linking an object file:
121
cc -o myprogram mysource.o `sdl-config --libs` -lSDL_Pango
124
Now myprogram is ready to run.
126
You can see a sample of autoconfiscation in 'test' directory.
128
In Windows, MSI package installs many dlls to \c \%ProgramFiles\%\\SDL_Pango \c Development\\import_lib.
129
To link with SDL_Pango you should use SDL_Pango.lib.
131
SDL_Pango.dll depends on many dlls and other many files. Those dlls are installed on
132
\c \%ProgramFiles\%\\SDL_Pango \c Development\\bin. MSI package adds the directory to PATH environment
135
\section devel Development
137
\subsection font Font Handling
139
In Un*x, font handling depends on fontconfig of your system.
141
In Windows, local.conf of fontconfig is placed on \c \%ProgramFiles\%\\SDL_Pango \c Development\\etc\\fonts.
142
You should know about fontconfig's font cache mechanism.
144
\subsection example Step-by-step Example
146
The operation of SDL_Pango is done via context.
149
SDLPango_Context *context = SDLPango_CreateContext();
152
Specify default colors and minimum surface size.
155
SDLPango_SetDefaultColor(context, MATRIX_TRANSPARENT_BACK_WHITE_LETTER);
156
SDLPango_SetMinimumSize(context, 640, 0);
162
SDLPango_SetMarkup(context, "This is <i>markup</i> text.", -1);
165
Now you can get the size of surface.
168
int w = SDLPango_GetLayoutWidth(context);
169
int h = SDLPango_GetLayoutHeight(context);
172
Create surface to draw.
177
SDL_Surface *surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
178
w + margin_x * 2, h + margin_y * 2,
179
32, (Uint32)(255 << (8 * 3)), (Uint32)(255 << (8 * 2)),
180
(Uint32)(255 << (8 * 1)), 255);
186
SDLPango_Draw(context, surface, margin_x, margin_y);
189
You must free the surface by yourself.
192
SDL_FreeSurface(surface);
198
SDLPango_FreeContext(context);
201
You can see actual code in \c test/testbench.cpp.
203
\subsection pack Packaging
205
In Un*x, do it yourself.
207
In Windows, font files must be installed on apprication folder (usually
208
\c C:\\Program \c Files\\[Manufacturer]\\[ProductName]). The property of
209
apprication folder must be \c TARGETDIR (this is default setting of VS2003).
210
SDL.dll also must be installed on apprication folder. Add SDL_Pango.msm to
213
\section ack Acknowledgment
215
SDL_Pango is developed with financial assistance of Information-technology Promotion Agency, Japan.
217
- NAKAMURA Ken'ichi <nakamura@sbp.fp.a.u-tokyo.ac.jp>
222
@brief Implementation of SDL_Pango
224
@author NAKAMURA Ken'ichi
229
#include <pango/pango.h>
230
#include <pango/pangoft2.h>
232
#include "SDL_Pango.h"
234
//! non-zero if initialized
235
static int IS_INITIALIZED = 0;
237
#define DEFAULT_FONT_FAMILY "Sans"
238
#define DEFAULT_FONT_SIZE 12
239
#define DEFAULT_DPI 96
240
#define _MAKE_FONT_NAME(family, size) family " " #size
241
#define MAKE_FONT_NAME(family, size) _MAKE_FONT_NAME(family, size)
242
#define DEFAULT_DEPTH 32
243
#define DEFAULT_RMASK (Uint32)(255 << (8 * 3))
244
#define DEFAULT_GMASK (Uint32)(255 << (8 * 2))
245
#define DEFAULT_BMASK (Uint32)(255 << (8 * 1))
246
#define DEFAULT_AMASK (Uint32)255
248
static FT_Bitmap *createFTBitmap(int width, int height);
250
static void freeFTBitmap(FT_Bitmap *bitmap);
252
static void getItemProperties (
254
PangoUnderline *uline,
255
gboolean *strikethrough,
257
PangoColor *fg_color,
259
PangoColor *bg_color,
262
PangoRectangle *ink_rect,
263
PangoRectangle *logical_rect);
265
static void clearFTBitmap(FT_Bitmap *bitmap);
267
typedef struct _surfaceArgs {
276
typedef struct _contextImpl {
277
PangoContext *context;
278
PangoFontMap *font_map;
279
PangoFontDescription *font_desc;
281
surfaceArgs surface_args;
282
FT_Bitmap *tmp_ftbitmap;
283
SDLPango_Matrix color_matrix;
290
Initialize the Glib and Pango API.
291
This must be called before using other functions in this library,
292
excepting SDLPango_WasInit.
293
SDL does not have to be initialized before this call.
309
Query the initilization status of the Glib and Pango API.
310
You may, of course, use this before SDLPango_Init to avoid
311
initilizing twice in a row.
313
@return zero when already initialized.
314
non-zero when not initialized.
319
return IS_INITIALIZED;
325
@param *context [in] Context
326
@param *surface [out] Surface to draw on it
327
@param *color_matrix [in] Foreground and background color
328
@param *font [in] Innter variable of Pango
329
@param *glyphs [in] Innter variable of Pango
330
@param *rect [in] Draw on this area
331
@param baseline [in] Horizontal location of glyphs
335
SDLPango_Context *context,
336
SDL_Surface *surface,
337
SDLPango_Matrix *color_matrix,
339
PangoGlyphString *glyphs,
343
pango_ft2_render(context->tmp_ftbitmap, font, glyphs, rect->x, rect->y + baseline);
345
SDLPango_CopyFTBitmapToSurface(
346
context->tmp_ftbitmap,
351
clearFTBitmap(context->tmp_ftbitmap);
355
Draw horizontal line of a pixel.
357
@param *surface [out] Surface to draw on it
358
@param *color_matrix [in] Foreground and background color
359
@param y [in] Y location of line
360
@param start [in] Left of line
361
@param end [in] Right of line
363
static void drawHLine(
364
SDL_Surface *surface,
365
SDLPango_Matrix *color_matrix,
375
int pixel_bytes = surface->format->BytesPerPixel;
377
if (y < 0 || y >= surface->h)
380
if (end <= 0 || start >= surface->w)
386
if (end >= surface->w)
389
p = (Uint8 *)(surface->pixels) + y * surface->pitch + start * pixel_bytes;
390
color = SDL_MapRGBA(surface->format,
391
color_matrix->m[0][1],
392
color_matrix->m[1][1],
393
color_matrix->m[2][1],
394
color_matrix->m[3][1]);
396
switch(pixel_bytes) {
399
for (ix = 0; ix < end - start; ix++)
400
*p16++ = (Uint16)color;
404
for (ix = 0; ix < end - start; ix++)
408
SDL_SetError("surface->format->BytesPerPixel is invalid value");
416
@param *context [in] Context
417
@param *surface [out] Surface to draw on it
418
@param *line [in] Innter variable of Pango
419
@param x [in] X location of line
420
@param y [in] Y location of line
421
@param height [in] Height of line
422
@param baseline [in] Rise / sink of line (for super/subscript)
426
SDLPango_Context *context,
427
SDL_Surface *surface,
428
PangoLayoutLine *line,
434
GSList *tmp_list = line->runs;
435
PangoColor fg_color, bg_color;
436
PangoRectangle logical_rect;
437
PangoRectangle ink_rect;
441
SDLPango_Matrix color_matrix = context->color_matrix;
442
PangoUnderline uline = PANGO_UNDERLINE_NONE;
443
gboolean strike, fg_set, bg_set, shape_set;
445
PangoLayoutRun *run = tmp_list->data;
448
tmp_list = tmp_list->next;
450
getItemProperties(run->item,
451
&uline, &strike, &rise,
452
&fg_color, &fg_set, &bg_color, &bg_set,
453
&shape_set, &ink_rect, &logical_rect);
455
risen_y = y + baseline - PANGO_PIXELS (rise);
458
color_matrix.m[0][1] = (Uint8)(fg_color.red >> 8);
459
color_matrix.m[1][1] = (Uint8)(fg_color.green >> 8);
460
color_matrix.m[2][1] = (Uint8)(fg_color.blue >> 8);
461
color_matrix.m[3][1] = 255;
462
if(color_matrix.m[3][0] == 0) {
463
color_matrix.m[0][0] = (Uint8)(fg_color.red >> 8);
464
color_matrix.m[1][0] = (Uint8)(fg_color.green >> 8);
465
color_matrix.m[2][0] = (Uint8)(fg_color.blue >> 8);
470
color_matrix.m[0][0] = (Uint8)(bg_color.red >> 8);
471
color_matrix.m[1][0] = (Uint8)(bg_color.green >> 8);
472
color_matrix.m[2][0] = (Uint8)(bg_color.blue >> 8);
473
color_matrix.m[3][0] = 255;
477
if (uline == PANGO_UNDERLINE_NONE)
478
pango_glyph_string_extents (run->glyphs, run->item->analysis.font,
479
NULL, &logical_rect);
481
pango_glyph_string_extents (run->glyphs, run->item->analysis.font,
482
&ink_rect, &logical_rect);
484
d_rect.w = (Uint16)PANGO_PIXELS(logical_rect.width);
485
d_rect.h = (Uint16)height;
486
d_rect.x = (Uint16)(x + PANGO_PIXELS (x_off));
487
d_rect.y = (Uint16)(risen_y - baseline);
489
if((! context->tmp_ftbitmap) || d_rect.w + d_rect.x > context->tmp_ftbitmap->width
490
|| d_rect.h + d_rect.y > context->tmp_ftbitmap->rows)
492
freeFTBitmap(context->tmp_ftbitmap);
493
context->tmp_ftbitmap = createFTBitmap(d_rect.w + d_rect.x, d_rect.h + d_rect.y);
496
drawGlyphString(context, surface,
498
run->item->analysis.font, run->glyphs, &d_rect, baseline);
501
case PANGO_UNDERLINE_NONE:
503
case PANGO_UNDERLINE_DOUBLE:
504
drawHLine(surface, &color_matrix,
506
x + PANGO_PIXELS (x_off + ink_rect.x),
507
x + PANGO_PIXELS (x_off + ink_rect.x + ink_rect.width));
509
case PANGO_UNDERLINE_SINGLE:
510
drawHLine(surface, &color_matrix,
512
x + PANGO_PIXELS (x_off + ink_rect.x),
513
x + PANGO_PIXELS (x_off + ink_rect.x + ink_rect.width));
515
case PANGO_UNDERLINE_ERROR:
519
int end_x = x + PANGO_PIXELS (x_off + ink_rect.x + ink_rect.width);
521
for (point_x = x + PANGO_PIXELS (x_off + ink_rect.x) - 1;
526
drawHLine(surface, &color_matrix,
528
point_x, MIN (point_x + 1, end_x));
530
drawHLine(surface, &color_matrix,
532
point_x, MIN (point_x + 1, end_x));
534
counter = (counter + 1) % 2;
538
case PANGO_UNDERLINE_LOW:
539
drawHLine(surface, &color_matrix,
540
risen_y + PANGO_PIXELS (ink_rect.y + ink_rect.height),
541
x + PANGO_PIXELS (x_off + ink_rect.x),
542
x + PANGO_PIXELS (x_off + ink_rect.x + ink_rect.width));
547
drawHLine(surface, &color_matrix,
548
risen_y + PANGO_PIXELS (logical_rect.y + logical_rect.height / 2),
549
x + PANGO_PIXELS (x_off + logical_rect.x),
550
x + PANGO_PIXELS (x_off + logical_rect.x + logical_rect.width));
552
x_off += logical_rect.width;
557
Innter function of Pango. Stolen from GDK.
559
@param *item [in] The item to get property
560
@param *uline [out] Kind of underline
561
@param *strikethrough [out] Strike-through line
562
@param *rise [out] Rise/sink of line (for super/subscript)
563
@param *fg_color [out] Color of foreground
564
@param *fg_set [out] True if fg_color set
565
@param *bg_color [out] Color of background
566
@param *bg_set [out] True if bg_color valid
567
@param *shape_set [out] True if ink_rect and logical_rect valid
568
@param *ink_rect [out] Ink rect
569
@param *logical_rect [out] Logical rect
574
PangoUnderline *uline,
575
gboolean *strikethrough,
577
PangoColor *fg_color,
579
PangoColor *bg_color,
582
PangoRectangle *ink_rect,
583
PangoRectangle *logical_rect)
585
GSList *tmp_list = item->analysis.extra_attrs;
588
*strikethrough = FALSE;
603
PangoAttribute *attr = tmp_list->data;
605
switch (attr->klass->type) {
606
case PANGO_ATTR_UNDERLINE:
608
*uline = ((PangoAttrInt *)attr)->value;
611
case PANGO_ATTR_STRIKETHROUGH:
613
*strikethrough = ((PangoAttrInt *)attr)->value;
616
case PANGO_ATTR_FOREGROUND:
618
*fg_color = ((PangoAttrColor *)attr)->color;
623
case PANGO_ATTR_BACKGROUND:
625
*bg_color = ((PangoAttrColor *)attr)->color;
630
case PANGO_ATTR_SHAPE:
634
*logical_rect = ((PangoAttrShape *)attr)->logical_rect;
636
*ink_rect = ((PangoAttrShape *)attr)->ink_rect;
639
case PANGO_ATTR_RISE:
641
*rise = ((PangoAttrInt *)attr)->value;
647
tmp_list = tmp_list->next;
652
Copy bitmap to surface.
653
From (x, y)-(w, h) to (x, y)-(w, h) of rect.
655
@param *bitmap [in] Grayscale bitmap
656
@param *surface [out] Surface
657
@param *matrix [in] Foreground and background color
658
@param *rect [in] Rect to copy
661
SDLPango_CopyFTBitmapToSurface(
662
const FT_Bitmap *bitmap,
663
SDL_Surface *surface,
664
const SDLPango_Matrix *matrix,
671
int height = rect->h;
675
if(x + width > surface->w) {
676
width = surface->w - x;
680
if(y + height > surface->h) {
681
height = surface->h - y;
686
if(SDL_LockSurface(surface)) {
687
SDL_SetError("surface lock failed");
688
SDL_FreeSurface(surface);
692
p_ft = (Uint8 *)bitmap->buffer + (bitmap->pitch * y);
693
p_sdl = (Uint8 *)surface->pixels + (surface->pitch * y);
694
for(i = 0; i < height; i ++) {
696
for(k = 0; k < width; k ++) {
697
/* TODO: rewrite by matrix calculation library */
698
Uint8 pixel[4]; /* 4: RGBA */
701
for(n = 0; n < 4; n ++) {
703
w = ((Uint16)matrix->m[n][0] * (256 - p_ft[k + x])) + ((Uint16)matrix->m[n][1] * p_ft[k + x]);
704
pixel[n] = (Uint8)(w >> 8);
707
switch(surface->format->BytesPerPixel) {
709
((Uint16 *)p_sdl)[k + x] = (Uint16)SDL_MapRGBA(surface->format, pixel[0], pixel[1], pixel[2], pixel[3]);
712
((Uint32 *)p_sdl)[k + x] = SDL_MapRGBA(surface->format, pixel[0], pixel[1], pixel[2], pixel[3]);
715
SDL_SetError("surface->format->BytesPerPixel is invalid value");
719
p_ft += bitmap->pitch;
720
p_sdl += surface->pitch;
723
SDL_UnlockSurface(surface);
727
Create a context which contains Pango objects.
729
@return A pointer to the context as a SDLPango_Context*.
732
SDLPango_CreateContext()
734
SDLPango_Context *context = g_malloc(sizeof(SDLPango_Context));
735
G_CONST_RETURN char *charset;
737
context->font_map = pango_ft2_font_map_new ();
738
pango_ft2_font_map_set_resolution (PANGO_FT2_FONT_MAP (context->font_map), DEFAULT_DPI, DEFAULT_DPI);
740
context->context = pango_ft2_font_map_create_context (PANGO_FT2_FONT_MAP (context->font_map));
742
g_get_charset(&charset);
743
pango_context_set_language (context->context, pango_language_from_string (charset));
744
pango_context_set_base_dir (context->context, PANGO_DIRECTION_LTR);
746
context->font_desc = pango_font_description_from_string(
747
MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE));
749
context->layout = pango_layout_new (context->context);
751
SDLPango_SetSurfaceCreateArgs(context, SDL_SWSURFACE | SDL_SRCALPHA, DEFAULT_DEPTH,
752
DEFAULT_RMASK, DEFAULT_GMASK, DEFAULT_BMASK, DEFAULT_AMASK);
754
context->tmp_ftbitmap = NULL;
756
context->color_matrix = *MATRIX_TRANSPARENT_BACK_BLACK_LETTER;
758
context->min_height = 0;
759
context->min_width = 0;
767
@param *context [i/o] Context to be free
770
SDLPango_FreeContext(SDLPango_Context *context)
772
freeFTBitmap(context->tmp_ftbitmap);
774
g_object_unref (context->layout);
776
pango_font_description_free(context->font_desc);
778
g_object_unref(context->context);
780
g_object_unref(context->font_map);
786
Specify Arguments when create a surface.
787
When SDL_Pango creates a surface, the arguments are used.
789
@param *context [i/o] Context
790
@param flags [in] Same as SDL_CreateRGBSurface()
791
@param depth [in] Same as SDL_CreateRGBSurface()
792
@param Rmask [in] Same as SDL_CreateRGBSurface()
793
@param Gmask [in] Same as SDL_CreateRGBSurface()
794
@param Bmask [in] Same as SDL_CreateRGBSurface()
795
@param Amask [in] Same as SDL_CreateRGBSurface()
798
SDLPango_SetSurfaceCreateArgs(
799
SDLPango_Context *context,
802
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
804
context->surface_args.flags = flags;
805
context->surface_args.depth = depth;
806
context->surface_args.Rmask = Rmask;
807
context->surface_args.Gmask = Gmask;
808
context->surface_args.Bmask = Bmask;
809
context->surface_args.Amask = Amask;
813
Create a surface and draw text on it.
814
The size of surface is same as lauout size.
816
@param *context [in] Context
817
@return A newly created surface
819
SDL_Surface * SDLPango_CreateSurfaceDraw(
820
SDLPango_Context *context)
822
PangoRectangle logical_rect;
823
SDL_Surface *surface;
826
pango_layout_get_extents (context->layout, NULL, &logical_rect);
827
width = PANGO_PIXELS (logical_rect.width);
828
height = PANGO_PIXELS (logical_rect.height);
829
if(width < context->min_width)
830
width = context->min_width;
831
if(height < context->min_height)
832
height = context->min_height;
834
surface = SDL_CreateRGBSurface(
835
context->surface_args.flags,
836
width, height, context->surface_args.depth,
837
context->surface_args.Rmask,
838
context->surface_args.Gmask,
839
context->surface_args.Bmask,
840
context->surface_args.Amask);
842
SDLPango_Draw(context, surface, 0, 0);
848
Draw text on a existing surface.
850
@param *context [in] Context
851
@param *surface [i/o] Surface to draw on it
852
@param x [in] X of left-top of drawing area
853
@param y [in] Y of left-top of drawing area
857
SDLPango_Context *context,
858
SDL_Surface *surface,
861
PangoLayoutIter *iter;
862
PangoRectangle logical_rect;
866
SDL_SetError("surface is NULL");
870
iter = pango_layout_get_iter (context->layout);
872
pango_layout_get_extents (context->layout, NULL, &logical_rect);
873
width = PANGO_PIXELS (logical_rect.width);
874
height = PANGO_PIXELS (logical_rect.height);
876
SDL_FillRect(surface, NULL, SDL_MapRGBA(surface->format, 0, 0, 0, 0));
878
if((! context->tmp_ftbitmap) || context->tmp_ftbitmap->width < width
879
|| context->tmp_ftbitmap->rows < height)
881
freeFTBitmap(context->tmp_ftbitmap);
882
context->tmp_ftbitmap = createFTBitmap(width, height);
886
PangoLayoutLine *line;
889
line = pango_layout_iter_get_line (iter);
891
pango_layout_iter_get_line_extents (iter, NULL, &logical_rect);
892
baseline = pango_layout_iter_get_baseline (iter);
898
x + PANGO_PIXELS (logical_rect.x),
899
y + PANGO_PIXELS (logical_rect.y),
900
PANGO_PIXELS (logical_rect.height),
901
PANGO_PIXELS (baseline - logical_rect.y));
902
} while (pango_layout_iter_next_line (iter));
904
pango_layout_iter_free (iter);
908
Allocate buffer and create a FTBitmap object.
910
@param width [in] Width
911
@param height [in] Height
912
@return FTBitmap object
916
int width, int height)
921
bitmap = g_malloc(sizeof(FT_Bitmap));
922
bitmap->width = width;
923
bitmap->rows = height;
924
bitmap->pitch = (width + 3) & ~3;
925
bitmap->num_grays = 256;
926
bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
927
buf = g_malloc (bitmap->pitch * bitmap->rows);
928
memset (buf, 0x00, bitmap->pitch * bitmap->rows);
929
bitmap->buffer = buf;
935
Free a FTBitmap object.
937
@param *bitmap [i/o] FTbitmap to be free
944
g_free(bitmap->buffer);
950
Clear a FTBitmap object.
952
@param *bitmap [i/o] FTbitmap to be clear
958
Uint8 *p = (Uint8 *)bitmap->buffer;
959
int length = bitmap->pitch * bitmap->rows;
961
memset(p, 0, length);
965
Specify minimum size of drawing rect.
967
@param *context [i/o] Context
968
@param width [in] Width. -1 means no wrapping mode.
969
@param height [in] Height. zero/minus value means non-specified.
972
SDLPango_SetMinimumSize(
973
SDLPango_Context *context,
974
int width, int height)
978
pango_width = width * PANGO_SCALE;
981
pango_layout_set_width(context->layout, pango_width);
983
context->min_width = width;
984
context->min_height = height;
988
Specify default color.
990
@param *context [i/o] Context
991
@param *color_matrix [in] Foreground and background color
994
SDLPango_SetDefaultColor(
995
SDLPango_Context *context,
996
const SDLPango_Matrix *color_matrix)
998
context->color_matrix = *color_matrix;
1004
@param *context [in] Context
1008
SDLPango_GetLayoutWidth(
1009
SDLPango_Context *context)
1011
PangoRectangle logical_rect;
1013
pango_layout_get_extents (context->layout, NULL, &logical_rect);
1015
return PANGO_PIXELS (logical_rect.width);
1021
@param *context [in] Context
1025
SDLPango_GetLayoutHeight(
1026
SDLPango_Context *context)
1028
PangoRectangle logical_rect;
1030
pango_layout_get_extents (context->layout, NULL, &logical_rect);
1032
return PANGO_PIXELS (logical_rect.height);
1036
Set markup text to context.
1038
Markup format is same as pango.
1040
@param *context [i/o] Context
1041
@param *markup [in] Markup text
1042
@param length [in] Text length. -1 means NULL-terminated text.
1046
SDLPango_Context *context,
1050
pango_layout_set_markup (context->layout, markup, length);
1051
pango_layout_set_auto_dir (context->layout, TRUE);
1052
pango_layout_set_alignment (context->layout, PANGO_ALIGN_LEFT);
1053
pango_layout_set_font_description (context->layout, context->font_desc);
1057
Set plain text to context.
1060
@param *context [i/o] Context
1061
@param *text [in] Plain text
1062
@param length [in] Text length. -1 means NULL-terminated text.
1066
SDLPango_Context *context,
1070
pango_layout_set_attributes(context->layout, NULL);
1071
pango_layout_set_text (context->layout, text, length);
1072
pango_layout_set_auto_dir (context->layout, TRUE);
1073
pango_layout_set_alignment (context->layout, PANGO_ALIGN_LEFT);
1074
pango_layout_set_font_description (context->layout, context->font_desc);
1080
@param *context [i/o] Context
1081
@param dpi_x [in] X dpi
1082
@param dpi_y [in] Y dpi
1086
SDLPango_Context *context,
1087
double dpi_x, double dpi_y)
1089
pango_ft2_font_map_set_resolution (PANGO_FT2_FONT_MAP (context->font_map), dpi_x, dpi_y);
1093
Set language to context.
1095
@param *context [i/o] Context
1096
@param *language_tag [in] A RFC-3066 format language tag
1098
void SDLCALL SDLPango_SetLanguage(
1099
SDLPango_Context *context,
1100
const char *language_tag)
1102
pango_context_set_language (context->context, pango_language_from_string (language_tag));
1106
Set base direction to context.
1108
@param *context [i/o] Context
1109
@param direction [in] Direction
1111
void SDLCALL SDLPango_SetBaseDirection(
1112
SDLPango_Context *context,
1113
SDLPango_Direction direction)
1115
PangoDirection pango_dir;
1118
case SDLPANGO_DIRECTION_LTR:
1119
pango_dir = PANGO_DIRECTION_LTR;
1121
case SDLPANGO_DIRECTION_RTL:
1122
pango_dir = PANGO_DIRECTION_RTL;
1124
case SDLPANGO_DIRECTION_WEAK_LTR:
1125
pango_dir = PANGO_DIRECTION_WEAK_LTR;
1127
case SDLPANGO_DIRECTION_WEAK_RTL:
1128
pango_dir = PANGO_DIRECTION_WEAK_RTL;
1130
case SDLPANGO_DIRECTION_NEUTRAL:
1131
pango_dir = PANGO_DIRECTION_NEUTRAL;
1134
SDL_SetError("unknown direction value");
1138
pango_context_set_base_dir (context->context, pango_dir);
1142
Get font map from context.
1144
@param *context [in] Context
1147
PangoFontMap* SDLCALL SDLPango_GetPangoFontMap(
1148
SDLPango_Context *context)
1150
return context->font_map;
1154
Get font description from context.
1156
@param *context [in] Context
1157
@return Font description
1159
PangoFontDescription* SDLCALL SDLPango_GetPangoFontDescription(
1160
SDLPango_Context *context)
1162
return context->font_desc;
1166
Get layout from context.
1168
@param *context [in] Context
1171
PangoLayout* SDLCALL SDLPango_GetPangoLayout(
1172
SDLPango_Context *context)
1174
return context->layout;