The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include <SDL.h>

#ifdef HAVE_SDL_PANGO
#include <SDL_Pango.h>

SDLPango_Matrix _MATRIX_DEFAULT
    = {0, 255, 0, 0,
       0, 255, 0, 0,
       0, 255, 0, 0,
       0, 255, 0, 0,};

SDLPango_Matrix *MATRIX_DEFAULT = &_MATRIX_DEFAULT;

#endif

MODULE = SDL::Pango	PACKAGE = SDL::Pango	PREFIX = pango_

=for documentation

See L<http:/*sdlpango.sourceforge.net/> */

=cut

#ifdef HAVE_SDL_PANGO

int
pango_init()
	CODE:
		RETVAL = SDLPango_Init();
	OUTPUT:
		RETVAL

int
pango_was_init()
	CODE:
		RETVAL = SDLPango_WasInit();
	OUTPUT:
		RETVAL

void
pango_draw(context, surface, x, y)
	SDLPango_Context *context
	SDL_Surface *surface
	int x
	int y
	CODE:
		SDLPango_Draw(context, surface, x, y);

int
pango_get_layout_width(context)
	SDLPango_Context *context
	CODE:
		RETVAL = SDLPango_GetLayoutWidth(context);
	OUTPUT:
		RETVAL

int
pango_get_layout_height(context)
	SDLPango_Context *context
	CODE:
		RETVAL = SDLPango_GetLayoutHeight(context);
	OUTPUT:
		RETVAL

void
pango_set_default_color(context, ...)
	SDLPango_Context *context
	CODE:
		if(items == 3) /* context, foreground, background */
		{
			Uint32 fg = SvIV(ST(1));
			Uint32 bg = SvIV(ST(2));
			MATRIX_DEFAULT->m[0][1] = (fg >> 24) & 0xFF; /* fg red */
			MATRIX_DEFAULT->m[1][1] = (fg >> 16) & 0xFF; /* fg green */
			MATRIX_DEFAULT->m[2][1] = (fg >>  8) & 0xFF; /* fg blue */
			MATRIX_DEFAULT->m[3][1] =  fg        & 0xFF; /* fg alpha */
			MATRIX_DEFAULT->m[0][0] = (bg >> 24) & 0xFF; /* bg red */
			MATRIX_DEFAULT->m[1][0] = (bg >> 16) & 0xFF; /* bg green */
			MATRIX_DEFAULT->m[2][0] = (bg >>  8) & 0xFF; /* bg blue */
			MATRIX_DEFAULT->m[3][0] =  bg        & 0xFF; /* bg alpha */
			SDLPango_SetDefaultColor(context, MATRIX_DEFAULT);
		}
		else if(items == 9) /* context, fr, fg, fb, fa, br, bg, bb, ba */
		{
			MATRIX_DEFAULT->m[0][1] = SvIV(ST(1)); /* fg red */
			MATRIX_DEFAULT->m[1][1] = SvIV(ST(2)); /* fg green */
			MATRIX_DEFAULT->m[2][1] = SvIV(ST(3)); /* fg blue */
			MATRIX_DEFAULT->m[3][1] = SvIV(ST(4)); /* fg alpha */
			MATRIX_DEFAULT->m[0][0] = SvIV(ST(5)); /* bg red */
			MATRIX_DEFAULT->m[1][0] = SvIV(ST(6)); /* bg green */
			MATRIX_DEFAULT->m[2][0] = SvIV(ST(7)); /* bg blue */
			MATRIX_DEFAULT->m[3][0] = SvIV(ST(8)); /* bg alpha */
			SDLPango_SetDefaultColor(context, MATRIX_DEFAULT);
		}
		else
			croak("Usage: SDL::Pango::set_default_color(context, fg, bg) or (context, r, g, b, a, r, g, b, a)");

void
pango_set_markup(context, markup, length)
	SDLPango_Context *context
	const char *markup
	int length
	CODE:
		SDLPango_SetMarkup(context, markup, length);

void
pango_set_minimum_size(context, width, height)
	SDLPango_Context *context
	int width
	int height
	CODE:
		SDLPango_SetMinimumSize(context, width, height);

void
pango_set_surface_create_args(context, flags, depth, Rmask, Gmask, Bmask, Amask)
	SDLPango_Context *context
	Uint32 flags
    int depth
    Uint32 Rmask
	Uint32 Gmask
	Uint32 Bmask
	Uint32 Amask
	CODE:
		SDLPango_SetSurfaceCreateArgs(context, flags, depth, Rmask, Gmask, Bmask, Amask);

SDL_Surface *
pango_create_surface_draw(context)
	SDLPango_Context *context
	PREINIT:
		char* CLASS = "SDL::Surface";
	CODE:
		RETVAL = SDLPango_CreateSurfaceDraw(context);
	OUTPUT:
		RETVAL

void
pango_set_dpi(context, dpi_x, dpi_y)
	SDLPango_Context *context
	double dpi_x
	double dpi_y
	CODE:
		SDLPango_SetDpi(context, dpi_x, dpi_y);

void
pango_set_text(context, markup, length, alignment = SDLPANGO_ALIGN_LEFT)
	SDLPango_Context *context
	const char *markup
	int length
	SDLPango_Alignment alignment
	CODE:
		SDLPango_SetText_GivenAlignment(context, markup, length, alignment);

void
pango_set_language(context, language_tag)
	SDLPango_Context *context
	const char *language_tag
	CODE:
		SDLPango_SetLanguage(context, language_tag);

void
pango_set_base_direction(context, direction)
	SDLPango_Context *context
	int direction
	CODE:
		SDLPango_SetBaseDirection(context, direction);

#endif