source: gnome-po-thumbnailer/trunk/fuentes/po-thumbnailer.c @ 194

Last change on this file since 194 was 194, checked in by jrpelegrina, 5 years ago

First release to xenial

File size: 5.3 KB
Line 
1#include <stdio.h>
2#include<stdlib.h>
3#include <gdkmm-2.4/gdkmm.h>
4#include <gettext-po.h>
5#include <assert.h>
6
7#include <string>
8#include <iostream>
9#include <cmath>
10
11#define RADIOUS 62
12#define DEFAULT_THUMB_SIZE 128
13
14using namespace std;
15
16static char **file_arguments;
17static gint size=DEFAULT_THUMB_SIZE;
18
19static const GOptionEntry goption_options[] = {
20        { "size", 's', 0, G_OPTION_ARG_INT, &size, NULL, "SIZE" },
21        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, "<input> <ouput>" },
22        { NULL }
23};
24
25
26
27void create_pie(int size,int translated,int fuzzy, int untranslated,const char* file_name)
28{
29
30        int width=size;
31        int height=size;
32        int center_x=width/2;
33        int center_y=height/2;
34
35        float total_percent=2*M_PI;
36        float total=translated+fuzzy+untranslated;
37                       
38        float translated_percentage=translated/total;
39        float fuzzy_percentage=fuzzy/total;
40        float untranslated_percentage=untranslated/total;
41
42               
43        float next_value=0;
44                       
45        Cairo::RefPtr<Cairo::Surface> surface=Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32,width,height);
46        Cairo::RefPtr<Cairo::Context> context= Cairo::Context::create(surface);
47
48        context->set_line_width(3);
49
50
51        // TRANSLATED
52
53        context->arc(center_x,center_y,RADIOUS,0,total_percent*translated_percentage);
54        context->set_source_rgba(0.0,0.3,0.0,1);
55        context->line_to(center_x,center_y);
56        context->save();
57        context->fill();
58        context->stroke();                     
59                       
60        // FUZZY
61                       
62        next_value=total_percent*translated_percentage;
63        context->arc(center_x,center_y,RADIOUS,next_value,next_value+total_percent*fuzzy_percentage);
64        context->set_source_rgba(0.8,0.8,0.0,1);
65        context->line_to(center_x,center_y);
66        context->fill();
67        context->stroke();     
68                       
69        // UNTRANSLATED
70                       
71        next_value+=total_percent*fuzzy_percentage;
72        context->arc(center_x,center_y,RADIOUS,next_value,next_value+total_percent*untranslated_percentage);
73        context->set_source_rgba(0.8,0.0,0.0,1);
74        context->line_to(center_x,center_y);
75        context->fill();
76        context->stroke();             
77                       
78                       
79        if(untranslated==0 && fuzzy==0 && translated!=0)
80        {
81                // Translation is complete
82                               
83                context->arc(center_x,center_y,RADIOUS/1.8,0,total_percent);
84                context->set_source_rgba(0.0,0.0,0.0,1);
85                context->fill();
86                context->stroke();
87                               
88                context->arc(center_x,center_y,RADIOUS/2,0,total_percent);
89                context->set_source_rgba(1.0,1.0,1.0,1);
90                context->fill();
91                context->stroke();
92                               
93                context->move_to(center_x/2 + 35,center_y*1.4 - 25);
94                context->set_source_rgba(0.0,0.7,0.0,1);
95                context->set_font_size(100);
96                context->show_text("✓");
97                context->stroke();
98        }
99                       
100                       
101        if(untranslated==0 && fuzzy==0 && translated==0)
102        {
103                // Translation is wrong
104                               
105                               
106                context->arc(center_x,center_y,RADIOUS,0,total_percent);
107                context->set_source_rgba(0.0,0.0,0.0,1);
108                context->line_to(center_x,center_y);
109                context->fill();
110                context->stroke();     
111                                       
112                context->arc(center_x,center_y,RADIOUS/1.6,0,total_percent);
113                context->set_source_rgba(1.0,1.0,1.0,1);
114                context->fill();
115                context->stroke();
116                               
117                context->move_to(center_x/1.68,center_y*1.33);
118                context->set_source_rgba(0.7,0.0,0.0,1);
119                context->set_font_size(50);
120                context->show_text("�");
121                context->stroke();
122        }
123                       
124        surface->write_to_png(file_name);
125                                               
126                       
127}
128       
129
130static bool parse_error1=false;
131static bool parse_error2=false;
132
133void xerror_handler(
134        int severity,
135        po_message_t message, const char *filename, size_t lineno,
136        size_t column, int multiline_p, const char *message_text)
137{
138        parse_error1=true;
139}
140
141void xerror2_handler(
142        int severity,
143        po_message_t message1, const char *filename1, size_t lineno1,
144        size_t column1, int multiline_p1, const char *message_text1,
145        po_message_t message2, const char *filename2, size_t lineno2,
146        size_t column2, int multiline_p2, const char *message_text2)
147{
148        parse_error2=true;     
149}
150
151
152
153int* parse_po(const char *file)
154{
155        po_file_t po;
156        struct po_xerror_handler xerror_handlers;
157        xerror_handlers.xerror=xerror_handler;
158        xerror_handlers.xerror2=xerror2_handler;
159       
160        static int output[4]={0,0,0,0};
161       
162        po=po_file_read(file,&xerror_handlers);
163       
164        if(parse_error1 || parse_error2)
165        {
166                return output;
167        }
168       
169        po_message_iterator_t it;
170        it = po_message_iterator( po, NULL );
171        po_message_t msg;
172        const char* msgstr;
173        while ((msg=po_next_message(it))!= NULL)
174        {
175                if (po_message_is_obsolete(msg))
176                        output[4]++;
177                else 
178                if (po_message_is_fuzzy( msg))
179                        output[1]++;
180                else 
181                {
182                        msgstr = po_message_msgstr( msg );
183                        if ( msgstr[0] == '\0' )
184                                output[2]++;
185                        else
186                                output[0]++;
187                }
188        }
189        po_message_iterator_free(it);
190
191        po_file_free(po);
192        return output;
193
194}
195
196
197int main(int argc, char* argv[])
198{
199        GError *error=NULL;
200        GFile *input;
201        GFile *output;
202        GOptionContext *context;
203        g_type_init();
204       
205        context = g_option_context_new("Po document thumbnailer");
206        g_option_context_add_main_entries(context,goption_options,NULL);
207       
208        if(!g_option_context_parse(context,&argc,&argv,&error))
209        {
210                g_printerr("%s",error->message);
211                g_error_free(error);
212                g_option_context_free(context);
213                return 1;
214        }
215
216        if (file_arguments == NULL || g_strv_length (file_arguments) != 2) 
217        {
218                return 1;
219        }
220       
221        g_option_context_free(context);
222       
223        input= g_file_new_for_commandline_arg(file_arguments[0]);
224        output=g_file_new_for_commandline_arg(file_arguments[1]);
225       
226        int* pie_values=parse_po(g_file_get_parse_name(input));
227        create_pie(size,pie_values[0],pie_values[1],pie_values[2],g_file_get_parse_name(output));
228       
229
230        return 0;
231}
Note: See TracBrowser for help on using the repository browser.