#include #include #include #include #include #include #include #include #define RADIOUS 62 #define DEFAULT_THUMB_SIZE 128 using namespace std; static char **file_arguments; static gint size=DEFAULT_THUMB_SIZE; static const GOptionEntry goption_options[] = { { "size", 's', 0, G_OPTION_ARG_INT, &size, NULL, "SIZE" }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, " " }, { NULL } }; void create_pie(int size,int translated,int fuzzy, int untranslated,const char* file_name) { int width=size; int height=size; int center_x=width/2; int center_y=height/2; float total_percent=2*M_PI; float total=translated+fuzzy+untranslated; float translated_percentage=translated/total; float fuzzy_percentage=fuzzy/total; float untranslated_percentage=untranslated/total; float next_value=0; Cairo::RefPtr surface=Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32,width,height); Cairo::RefPtr context= Cairo::Context::create(surface); context->set_line_width(3); // TRANSLATED context->arc(center_x,center_y,RADIOUS,0,total_percent*translated_percentage); context->set_source_rgba(0.0,0.3,0.0,1); context->line_to(center_x,center_y); context->save(); context->fill(); context->stroke(); // FUZZY next_value=total_percent*translated_percentage; context->arc(center_x,center_y,RADIOUS,next_value,next_value+total_percent*fuzzy_percentage); context->set_source_rgba(0.8,0.8,0.0,1); context->line_to(center_x,center_y); context->fill(); context->stroke(); // UNTRANSLATED next_value+=total_percent*fuzzy_percentage; context->arc(center_x,center_y,RADIOUS,next_value,next_value+total_percent*untranslated_percentage); context->set_source_rgba(0.8,0.0,0.0,1); context->line_to(center_x,center_y); context->fill(); context->stroke(); if(untranslated==0 && fuzzy==0 && translated!=0) { // Translation is complete context->arc(center_x,center_y,RADIOUS/1.8,0,total_percent); context->set_source_rgba(0.0,0.0,0.0,1); context->fill(); context->stroke(); context->arc(center_x,center_y,RADIOUS/2,0,total_percent); context->set_source_rgba(1.0,1.0,1.0,1); context->fill(); context->stroke(); context->move_to(center_x/2,center_y*1.4); context->set_source_rgba(0.0,0.7,0.0,1); context->set_font_size(100); context->show_text("✓"); context->stroke(); } if(untranslated==0 && fuzzy==0 && translated==0) { // Translation is wrong context->arc(center_x,center_y,RADIOUS,0,total_percent); context->set_source_rgba(0.0,0.0,0.0,1); context->line_to(center_x,center_y); context->fill(); context->stroke(); context->arc(center_x,center_y,RADIOUS/1.6,0,total_percent); context->set_source_rgba(1.0,1.0,1.0,1); context->fill(); context->stroke(); context->move_to(center_x/1.68,center_y*1.33); context->set_source_rgba(0.7,0.0,0.0,1); context->set_font_size(50); context->show_text("�"); context->stroke(); } surface->write_to_png(file_name); } static bool parse_error1=false; static bool parse_error2=false; void xerror_handler( int severity, po_message_t message, const char *filename, size_t lineno, size_t column, int multiline_p, const char *message_text) { parse_error1=true; } void xerror2_handler( int severity, po_message_t message1, const char *filename1, size_t lineno1, size_t column1, int multiline_p1, const char *message_text1, po_message_t message2, const char *filename2, size_t lineno2, size_t column2, int multiline_p2, const char *message_text2) { parse_error2=true; } int* parse_po(const char *file) { po_file_t po; struct po_xerror_handler xerror_handlers; xerror_handlers.xerror=xerror_handler; xerror_handlers.xerror2=xerror2_handler; static int output[4]={0,0,0,0}; po=po_file_read(file,&xerror_handlers); if(parse_error1 || parse_error2) { return output; } po_message_iterator_t it; it = po_message_iterator( po, NULL ); po_message_t msg; const char* msgstr; while ((msg=po_next_message(it))!= NULL) { if (po_message_is_obsolete(msg)) output[4]++; else if (po_message_is_fuzzy( msg)) output[1]++; else { msgstr = po_message_msgstr( msg ); if ( msgstr[0] == '\0' ) output[2]++; else output[0]++; } } po_message_iterator_free(it); po_file_free(po); return output; } int main(int argc, char* argv[]) { GError *error=NULL; GFile *input; GFile *output; GOptionContext *context; g_type_init(); context = g_option_context_new("Po document thumbnailer"); g_option_context_add_main_entries(context,goption_options,NULL); if(!g_option_context_parse(context,&argc,&argv,&error)) { g_printerr("%s",error->message); g_error_free(error); g_option_context_free(context); return 1; } if (file_arguments == NULL || g_strv_length (file_arguments) != 2) { return 1; } g_option_context_free(context); input= g_file_new_for_commandline_arg(file_arguments[0]); output=g_file_new_for_commandline_arg(file_arguments[1]); int* pie_values=parse_po(g_file_get_parse_name(input)); create_pie(size,pie_values[0],pie_values[1],pie_values[2],g_file_get_parse_name(output)); return 0; }