Files
Leviathan/Client/Game/game/Localization/MiddleEast/KPangoCairo.cpp
T
2026-06-01 12:46:52 +02:00

205 lines
5.8 KiB
C++

#include "stdafx.h"
#ifdef _COUNTRY_ME_
#include <windef.h>
#include "KPangoCairo.h"
#include <toolkit/XStringUtil.h>
#include "SGameOperationManager.h"
PangoFontMap* KTextLayout::s_pFontMap = NULL;
PangoContext* KTextLayout::s_pPangoContext = NULL;
bool g_bSaveToPng = false;
bool KTextLayout::InitLayoutEngine()
{
s_pFontMap = pango_cairo_font_map_get_default();
s_pPangoContext = pango_font_map_create_context( s_pFontMap );
return s_pFontMap && s_pPangoContext;
}
void KTextLayout::DestroyLayoutEngine()
{
g_object_unref( s_pPangoContext );
s_pFontMap = NULL;
}
KTextLayout::KTextLayout( int nWidth, int nHeight, int nSpacing, DWORD dwAlign )
: m_context( NULL ), m_cr( NULL ), m_surface( NULL ), m_layout( NULL ),
m_nWidth( nWidth ), m_nHeight( nHeight ), m_nSpacing( nSpacing ), m_dwAlign( dwAlign )
{
m_context = (PangoContext*)g_object_ref( s_pPangoContext );
// m_context = pango_font_map_create_context( pango_cairo_font_map_get_default() );
cairo_font_options_t* option;
option = cairo_font_options_create();
cairo_font_options_set_antialias ( option, CAIRO_ANTIALIAS_GRAY );
pango_cairo_context_set_font_options( m_context, option );
cairo_font_options_destroy(option);
m_layout = pango_layout_new( m_context );
if ( nWidth >= 0 )
pango_layout_set_width( m_layout, nWidth * PANGO_SCALE );
else
pango_layout_set_width( m_layout, -1 );
if ( nHeight >= 0 )
pango_layout_set_height( m_layout, nHeight * PANGO_SCALE );
else
pango_layout_set_height( m_layout, nHeight );
pango_layout_set_justify( m_layout, false);
pango_layout_set_indent( m_layout, 0 );
pango_layout_set_spacing( m_layout, nSpacing * PANGO_SCALE );
pango_layout_set_wrap( m_layout, PANGO_WRAP_WORD_CHAR );
m_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, m_nWidth, m_nHeight );
m_cr = cairo_create( m_surface );
pango_cairo_update_context( m_cr, m_context );
pango_layout_context_changed( m_layout );
}
KTextLayout::~KTextLayout()
{
if ( m_layout )
g_object_unref( m_layout );
if ( m_context )
g_object_unref( m_context );
if ( m_cr )
cairo_destroy( m_cr );
if ( m_surface )
cairo_surface_destroy( m_surface );
}
void KTextLayout::_Render( LPCSTR szText, double r, double g, double b, double a, double dX, double dY )
{
cairo_set_source_rgba( m_cr, r, g, b, a );
cairo_move_to( m_cr, dX, dY);
pango_layout_set_text( m_layout, szText, -1 );
pango_cairo_show_layout( m_cr, m_layout );
if ( g_bSaveToPng )
{
static int nFileNo = 0;
std::string strFileName;
XStringUtil::Format( strFileName, "PNG-%06d.png", nFileNo++ );
cairo_surface_write_to_png( m_surface, strFileName.c_str() );
}
}
void KTextLayout::Render( KTextParagraph* pParagraph )
{
Layout( pParagraph );
PangoAttrList* pAttrList;
pAttrList = pParagraph->GetPangoAttrListWithoutColor();
pango_layout_set_attributes( m_layout, pAttrList );
pango_attr_list_unref( pAttrList );
if ( pParagraph->GetAttr()->bShadow )
{
double dOffset = (pParagraph->GetAttr()->nFontSize / 10. );
_Render( pParagraph->GetString().c_str(), 0, 0, 0, 0.8, dOffset, dOffset );
}
pAttrList = pParagraph->GetPangoAttrList();
pango_layout_set_attributes( m_layout, pAttrList );
pango_attr_list_unref( pAttrList );
_Render( pParagraph->GetString().c_str(),
((pParagraph->GetAttr()->dwColor & 0xff0000) >> 16) / 255.0,
((pParagraph->GetAttr()->dwColor & 0x00ff00) >> 8) / 255.0,
((pParagraph->GetAttr()->dwColor & 0x0000ff) >> 0) / 255.0,
1.0 );
}
KSize KTextLayout::GetLayoutSize( KTextParagraph* pParagraph )
{
if ( pParagraph->m_bEmoticon )
return KSize( 0, 0 );
Layout( pParagraph );
PangoAttrList* pAttrList = pParagraph->GetPangoAttrListWithoutColor();
pango_layout_set_attributes( m_layout, pAttrList );
pango_attr_list_unref( pAttrList );
pango_layout_set_text( m_layout, pParagraph->GetString().c_str(), -1 );
int nWidth, nHeight;
pango_layout_get_pixel_size( m_layout, &nWidth, &nHeight );
return KSize( nWidth, nHeight );
}
void KTextLayout::SplitLine( std::vector< std::string > & vecLineList, const std::string& _strOriginal, const char* szFontName, int nFontSize, bool bBold )
{
PangoFontDescription *desc;
std::string strOriginal = multibyte_to_utf8( _strOriginal );
std::string strFont;
XStringUtil::Format( strFont, "%s %d", szFontName, nFontSize );
desc = pango_font_description_from_string( strFont.c_str() );
if ( bBold )
pango_font_description_set_weight( desc, PANGO_WEIGHT_BOLD );
pango_layout_set_font_description( m_layout, desc );
pango_font_description_free( desc );
pango_layout_set_text( m_layout, strOriginal.c_str(), -1 );
int nLines = pango_layout_get_line_count( m_layout );
PangoLayoutLine* pLine;
std::string strLine;
for ( int i = 0; i < nLines; ++i )
{
pLine = pango_layout_get_line_readonly( m_layout, i );
strLine = strOriginal.substr( pLine->start_index, pLine->length );
vecLineList.push_back( utf8_to_multibyte( strLine ) );
}
}
void KTextLayout::Layout( KTextParagraph* pParagraph )
{
PangoFontDescription *desc;
std::string strFont;
XStringUtil::Format( strFont, "%s %d", pParagraph->GetAttr()->strFontName.c_str(), pParagraph->GetAttr()->nFontSize );
desc = pango_font_description_from_string( strFont.c_str() );
if ( pParagraph->GetAttr()->bBold )
pango_font_description_set_weight( desc, PANGO_WEIGHT_BOLD );
pango_layout_set_font_description( m_layout, desc );
pango_font_description_free( desc );
if ( (m_dwAlign & KTextParagraph::KTALIGN_HCENTER) == KTextParagraph::KTALIGN_HCENTER )
pango_layout_set_alignment( m_layout, PANGO_ALIGN_CENTER );
else if ( (m_dwAlign & KTextParagraph::KTALIGN_LEFT) == KTextParagraph::KTALIGN_LEFT )
pango_layout_set_alignment( m_layout, PANGO_ALIGN_LEFT );
else if ( (m_dwAlign & KTextParagraph::KTALIGN_RIGHT) == KTextParagraph::KTALIGN_RIGHT )
pango_layout_set_alignment( m_layout, PANGO_ALIGN_RIGHT );
}
#endif