/*************************************************************** * Name: wxCairo.cpp * Purpose: Code for Application Frame * Author: Igor I (info@tiptopcity.com) * Created: 2009-05-24 * Copyright: Igor I (www.tiptopcity.com) * License: **************************************************************/ #ifdef WX_PRECOMP #include "wx_pch.h" #endif //------------------------------------------------------------------------------ //#include //#include //#include #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__) #include #else #endif #include //#include //#include //#include #include #include #include "wxCairo.h" #include "stdTools.h" //#include "wxgui/debug.h" //------------------------------------------------------------------------------ struct stdword{ std::string str; int width; }; //------------------------------------------------------------------------------ wxCairo::wxCairo() { glId=0; m_buffer=NULL; m_surface=NULL; m_cr=NULL; m_format = CAIRO_FORMAT_RGB24; m_width=0; m_height=0; } //------------------------------------------------------------------------------ wxCairo::~wxCairo() { if(m_buffer!=NULL) delete m_buffer; if(m_surface!=NULL) cairo_surface_destroy(m_surface); if(m_cr!=NULL) cairo_destroy(m_cr); } //------------------------------------------------------------------------------ unsigned char* wxCairo::CreateBuffer(int width,int height) { if(width!=m_width || m_height!=height) { if(m_buffer!=NULL) delete m_buffer; m_width=width; m_height=height; m_buffer = new unsigned char[width*height*4]; //RGBA memset(m_buffer, 0, width*height*4); //Обнулим массив Init(); return m_buffer; }else { memset(m_buffer, 0, width*height*4); //Обнулим(отчистим) массив return m_buffer; } } //------------------------------------------------------------------------------ bool wxCairo::Init() { if(m_surface!=NULL) cairo_surface_destroy(m_surface); if(m_cr!=NULL) cairo_destroy(m_cr); m_surface = cairo_image_surface_create_for_data(m_buffer, m_format, m_width, m_height, m_width*4); m_cr = cairo_create(m_surface); cairo_set_antialias(m_cr, CAIRO_ANTIALIAS_NONE); return true; } //------------------------------------------------------------------------------ /*void wxCairo::Draw(wxPaintDC& dc) { // Convert from Cairo RGB24 format to wxImage BGR format. unsigned char *dRGB = new unsigned char[m_width*m_height*3]; //unsigned char *dA = new unsigned char[m_width*m_height]; for(int y=0;y> (pos - loc * 8); if (val) mas[loc] = mas[loc] | mask; else { mask = ~mask; //Отрицание mas[loc] = mas[loc] & mask; } } //------------------------------------------------------------------------------ void wxCairo::setFontface(std::string family,bool slant,bool weight) { cairo_font_slant_t s; if (slant) s = CAIRO_FONT_SLANT_ITALIC; else s = CAIRO_FONT_SLANT_NORMAL; cairo_font_weight_t w; if (weight) w = CAIRO_FONT_WEIGHT_BOLD; else w = CAIRO_FONT_WEIGHT_NORMAL; cairo_select_font_face(m_cr,family.c_str(),s,w); } //------------------------------------------------------------------------------ void wxCairo::setFontface(const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { cairo_select_font_face(m_cr, family, slant, weight); } //------------------------------------------------------------------------------ //the new font size, in user space units void wxCairo::setFontSize(double size) { cairo_set_font_size(m_cr,size); } //------------------------------------------------------------------------------ void wxCairo::seveToPNG(std::string filePath) { cairo_surface_write_to_png(m_surface, filePath.c_str()); } //------------------------------------------------------------------------------ //Ширина текста в пикселях double wxCairo::getTextWidth(std::wstring& str) { std::string utf8 = convUTF16ToUTF8(str); cairo_text_extents_t ext; cairo_text_extents(m_cr, utf8.c_str(), &ext); return ext.width; } //------------------------------------------------------------------------------ //Высота текста в пикселях double wxCairo::getTextHeight(std::wstring& str) { std::string utf8 = convUTF16ToUTF8(str); cairo_text_extents_t ext; cairo_text_extents(m_cr, utf8.c_str(), &ext); return ext.height; } //------------------------------------------------------------------------------ //Вывести текст по центру области void wxCairo::ShowTextCenter(std::wstring& str, int xStart, int xEnd, int y) { std::string utf8 = convUTF16ToUTF8(str); cairo_text_extents_t ext; cairo_text_extents(m_cr, utf8.c_str(), &ext); ext.width = xStart + (((xEnd - xStart) / 2.0f) - (ext.width / 2.0f)); cairo_move_to(m_cr, ext.width, y); cairo_show_text(m_cr, utf8.c_str()); } //------------------------------------------------------------------------------ //Вывести текст с переносом на следующую строку с выравниванием по словам, высота символов однирна //xStart начало для вычисления центра //xEnd конец для вычисления центра //y высота void wxCairo::ShowTextBR(std::wstring& str, int xStart, int xEnd, int y) { /*stdword line; std::vector parts; int maxH=0; std::vector array =split(str,L' '); for (std::vector::iterator it = array.begin() ; it != array.end(); ++it) { std::wstring s=*it; line.word = convUTF16ToUTF8(s); cairo_text_extents(m_cr, line.word.c_str(), &line.ext); line.ext.width+=line.ext.width/s.length(); //Так как пробел почемуто обрезается при расчёте ширины parts.push_back(line); if(maxH::iterator it = parts.begin() ; it != parts.end(); ++it) { line=*it; if(w+line.ext.width array =split(str,L' '); //Для разбивки на слова int height=0; //Высота символов std::vector parts; //Для разбивки на строки stdword line; line.width=0; line.str=""; for (std::vector::iterator it = array.begin() ; it != array.end(); ++it) { std::wstring s=*it; std::string word = convUTF16ToUTF8(s); cairo_text_extents_t ext; cairo_text_extents(m_cr, word.c_str(), &ext); ext.width+=ext.width/s.length(); //Так как пробел почемуто обрезается при расчёте ширины if(height::iterator it = parts.begin() ; it != parts.end(); ++it) { stdword line=*it; int width = xStart + (((xEnd - xStart) / 2.0f) - (line.width / 2.0f)); cairo_move_to(m_cr, width, y); cairo_show_text(m_cr, line.str.c_str()); y+=height; } } //------------------------------------------------------------------------------