Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2018
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.94 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <gdk/gdk.h>
  3. #include <cairo.h>
  4.  
  5. #define BITMAP_WIDTH (500)
  6. #define BITMAP_HEIGHT (500)
  7. #define TEXTVIEW_HEIGHT (100)
  8.  
  9. GtkWidget *window;
  10. GtkWidget *darea;
  11. GtkWidget *vbox;
  12. GtkWidget *hbox;
  13. GtkWidget *hbox01;
  14. GtkWidget *button01;
  15. GtkWidget *button02;
  16. GtkWidget *vbox02;
  17. GtkWidget *scrolledwindow;
  18. GtkWidget *textview;
  19. GThread* thread;
  20. volatile int execflag01;
  21. int count;
  22. int time_count;
  23. char buf[1024];
  24. double start_time, end_time;
  25.  
  26.  
  27. double seconds();
  28. void delete_text(GtkTextView *textview);
  29. void set_text(GtkTextView *textview, const gchar *text);
  30. void append_text(GtkTextView *textview , const gchar *text);
  31. void scroll_to_bottom(GtkScrolledWindow *scrolled_window);
  32.  
  33. static void do_drawing (cairo_t *, GtkWidget * widget);
  34.  
  35. struct {
  36. cairo_surface_t *image;
  37. } glob;
  38.  
  39. static gboolean on_draw_event (GtkWidget * widget, cairo_t * cr, gpointer user_data)
  40. {
  41. cr = gdk_cairo_create (gtk_widget_get_window (widget));
  42. do_drawing (cr, widget);
  43. cairo_destroy (cr);
  44.  
  45. return FALSE;
  46. }
  47.  
  48.  
  49. static void do_drawing (cairo_t * cr, GtkWidget * widget)
  50. {
  51. gfloat screen_width;
  52. gfloat screen_height;
  53. gfloat image_width;
  54. gfloat image_height;
  55. gfloat x_scaling;
  56. gfloat y_scaling;
  57.  
  58. /* ディスプレイの全画面の大きさを取得 */
  59. screen_width = gdk_screen_get_width (gdk_screen_get_default ());
  60. screen_height = gdk_screen_get_height (gdk_screen_get_default ());
  61.  
  62. /* イメージの大きさを取得 */
  63. image_width = cairo_image_surface_get_width (glob.image);
  64. image_height = cairo_image_surface_get_height (glob.image);
  65.  
  66. x_scaling = 1.0;
  67. y_scaling = 1.0;
  68.  
  69. cairo_scale (cr, x_scaling, y_scaling);
  70. cairo_set_source_surface (cr, glob.image, 0, 0);
  71. cairo_paint (cr);
  72. }
  73.  
  74.  
  75. static void load_image ()
  76. {
  77. cairo_t *ic;
  78. glob.image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, BITMAP_WIDTH, BITMAP_HEIGHT);
  79. ic = cairo_create (glob.image);
  80.  
  81. //長方形の描画
  82. {
  83. //色の指定(外枠:Red,Green,Blue)
  84. cairo_set_source_rgb(ic, 0.0, 0.0, 1.0);
  85. //長方形(x,y,width,height)を描画
  86. cairo_rectangle(ic, 0.0, 0.0, BITMAP_WIDTH, BITMAP_HEIGHT);
  87. //長方形の外枠を作る
  88. cairo_stroke_preserve(ic);
  89. //色を指定(塗りつぶし:Red,Green,Blue)
  90. cairo_set_source_rgb(ic, 0.0, 0.0, 1.0);
  91. //長方形を塗りつぶす
  92. cairo_fill(ic);
  93. cairo_stroke (ic);
  94. }
  95. cairo_destroy (ic);
  96. }
  97.  
  98.  
  99. static gpointer thread_func( gpointer data){
  100. int i, j, col, i1, depth;
  101. double xgap, ygap, xx, yy, a1, b1, x1, y1, tmp1, x2, y2;
  102. double xcorner, ycorner, length;
  103.  
  104. cairo_t *ic;
  105. int count01;
  106.  
  107. struct {
  108. double xcorner;
  109. double ycorner;
  110. double length;
  111. } param[8];
  112.  
  113. param[0].xcorner = -1.785666666666666e+000; param[0].ycorner = -2.508333333333312e-002;
  114. param[0].length = 5.000000000000000e-002;
  115.  
  116. param[1].xcorner = -1.759984700520832e+000; param[1].ycorner = -1.518603515624978e-002;
  117. param[1].length = 9.765625000000001e-005;
  118.  
  119. param[2].xcorner = -1.759906697591145e+000; param[2].ycorner = -1.515360514322895e-002;
  120. param[2].length = 6.103515625000000e-006;
  121.  
  122. param[3].xcorner = -1.759901244004566e+000; param[3].ycorner = -1.515219028790770e-002;
  123. param[3].length = 4.768371582031250e-008;
  124.  
  125. param[4].xcorner = -1.759901209723814e+000; param[4].ycorner = -1.515217680089193e-002;
  126. param[4].length = 5.820766091346741e-012;
  127.  
  128. param[5].xcorner = -2.112213541666665e-001; param[5].ycorner = -7.939140624999994e-001;
  129. param[5].length = 1.562500000000000e-003;
  130.  
  131. param[6].xcorner = -2.238124999999996e-001; param[6].ycorner = -6.581041666666665e-001;
  132. param[6].length = 1.250000000000000e-002;
  133.  
  134. param[7].xcorner = -2.137343749999995e-001; param[7].ycorner = -6.554270833333333e-001;
  135. param[7].length = 3.906250000000000e-004;
  136.  
  137. ic = cairo_create (glob.image);
  138.  
  139. start_time = seconds();
  140.  
  141. for (count01 = 0; count01 < 8; count01++) {
  142. cairo_set_source_rgb(ic, 0.0, 0.0, 1.0);
  143. cairo_rectangle(ic, 0.0, 0.0, BITMAP_WIDTH, BITMAP_HEIGHT);
  144. cairo_stroke_preserve(ic);
  145. cairo_set_source_rgb(ic, 0.0, 0.0, 1.0);
  146. cairo_fill(ic);
  147.  
  148. xcorner = param[count01].xcorner;
  149. ycorner = param[count01].ycorner;
  150. length = param[count01].length;
  151. depth = 1000;
  152.  
  153. xgap = length / BITMAP_WIDTH;
  154. ygap = length / BITMAP_HEIGHT;
  155.  
  156. gdk_threads_enter();
  157. sprintf(buf, "xcorner = %.15e, ycorner = %.15e\n", xcorner, ycorner);
  158. append_text(GTK_TEXT_VIEW(textview), buf);
  159. sprintf(buf, "length = %.15e\n", length);
  160. append_text(GTK_TEXT_VIEW(textview), buf);
  161. sprintf(buf, "depth = %d\n\n", depth);
  162. append_text(GTK_TEXT_VIEW(textview), buf);
  163. gdk_threads_leave();
  164. usleep(10000);
  165. gdk_threads_enter();
  166. scroll_to_bottom(scrolledwindow);
  167. gdk_threads_leave();
  168.  
  169. xx = xcorner;
  170. yy = ycorner;
  171. for(j = 0; j < BITMAP_HEIGHT; j++) {
  172. ic = cairo_create (glob.image);
  173. for(i = 0; i < BITMAP_WIDTH; i++) {
  174. a1 = xx; b1 = yy;
  175. i1 = 0;
  176. x1 = 0; y1 = 0;
  177. x2 = x1 * x1;
  178. y2 = y1 * y1;
  179. while ((i1 < depth) && (x2+y2 <=4)) {
  180. tmp1 = x2 - y2 + a1;
  181. y1 = 2 * x1 * y1 + b1;
  182. x1 = tmp1;
  183. x2 = x1 * x1;
  184. y2 = y1 * y1;
  185. i1++;
  186. }
  187. if (i1 == depth) i1 = 0;
  188. else i1++;
  189.  
  190. col = i1;
  191. gdk_threads_enter();
  192. cairo_set_source_rgb(ic, (col % 256) / 256.0, 0.0, 0.0);
  193. cairo_rectangle(ic, (double)i, (double)j, 1.0, 1.0);
  194. cairo_stroke(ic);
  195. gdk_threads_leave();
  196.  
  197. xx = xx + xgap;
  198. }
  199. yy = yy + ygap;
  200. xx = xcorner;
  201.  
  202. if (j % 5 == 0) {
  203. gdk_threads_enter();
  204. gtk_widget_queue_draw(darea);
  205. gdk_threads_leave();
  206. }
  207. usleep(1000);
  208. }
  209. gdk_threads_enter();
  210. gtk_widget_queue_draw(darea);
  211. gdk_threads_leave();
  212. usleep(50000);
  213. }
  214. end_time = seconds();
  215.  
  216. gdk_threads_enter();
  217. sprintf(buf, "実行時間: %f秒", end_time - start_time);
  218. append_text(GTK_TEXT_VIEW(textview), buf);
  219. gdk_threads_leave();
  220. usleep(50000);
  221. gdk_threads_enter();
  222. scroll_to_bottom(scrolledwindow);
  223. gdk_threads_leave();
  224.  
  225.  
  226. cairo_destroy (ic);
  227. execflag01 = 0;
  228. }
  229.  
  230.  
  231. static void on_button01_clicked(GtkWidget *button, gpointer user_data){
  232. GError *error;
  233. if (execflag01 == 0) {
  234. execflag01 = 1;
  235. count = BITMAP_HEIGHT;
  236. time_count = 1000;
  237. thread = g_thread_create( thread_func, (gpointer)darea, FALSE, &error);
  238. }
  239. }
  240.  
  241. void delete_text(GtkTextView *textview){
  242. GtkTextBuffer *buffer;
  243. GtkTextIter start, end;
  244. buffer = gtk_text_view_get_buffer(textview);
  245. gtk_text_buffer_get_start_iter (buffer , &start);
  246. gtk_text_buffer_get_end_iter (buffer , &end);
  247. gtk_text_buffer_delete(buffer, &start, &end);
  248. }
  249.  
  250. void set_text(GtkTextView *textview, const gchar *text)
  251. {
  252. GtkTextBuffer *buffer;
  253. buffer = gtk_text_view_get_buffer(textview);
  254. gtk_text_buffer_set_text(buffer, text, -1);
  255. }
  256.  
  257. void append_text(GtkTextView *textview , const gchar *text)
  258. {
  259. GtkTextBuffer *buffer;
  260. GtkTextIter iter;
  261. buffer = gtk_text_view_get_buffer (textview);
  262. gtk_text_buffer_get_end_iter(buffer, &iter);
  263. gtk_text_buffer_insert(buffer, &iter, text, -1);
  264. }
  265.  
  266. void scroll_to_bottom(GtkScrolledWindow *scrolled_window)
  267. {
  268. GtkAdjustment *vadj;
  269. gdouble size;
  270. vadj = gtk_scrolled_window_get_vadjustment(scrolled_window);
  271. size = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj);
  272. if (size < 0) size = 0.0;
  273. gtk_adjustment_set_value(vadj, size);
  274. }
  275.  
  276. double seconds() {
  277. struct timeval tm;
  278. double t ;
  279. static int base_sec = 0,base_usec = 0;
  280. gettimeofday(&tm, NULL);
  281. if(base_sec == 0 && base_usec == 0)
  282. {
  283. base_sec = tm.tv_sec; base_usec = tm.tv_usec; t = 0.0;
  284. } else {
  285. t = (double) (tm.tv_sec-base_sec) + ((double) (tm.tv_usec-base_usec))/1.0e6 ;
  286. }
  287. return t;
  288. }
  289.  
  290.  
  291. int main (int argc, char *argv[])
  292. {
  293. load_image ();
  294. execflag01 = 0;
  295. gtk_init (&argc, &argv);
  296. gdk_threads_init();
  297.  
  298. gdk_threads_enter();
  299.  
  300. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  301. gtk_container_set_border_width(GTK_CONTAINER(window), 5);
  302.  
  303. vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  304. gtk_container_add(GTK_CONTAINER(window), vbox);
  305.  
  306. darea = gtk_drawing_area_new ();
  307. gtk_box_pack_start(GTK_BOX(vbox), darea, FALSE, FALSE, 0);
  308. gtk_widget_set_size_request(darea, BITMAP_WIDTH, BITMAP_HEIGHT);
  309.  
  310. hbox01 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  311. button02 = gtk_button_new_from_stock(GTK_STOCK_QUIT);
  312. gtk_box_pack_end(GTK_BOX(hbox01), button02, FALSE, FALSE, 0);
  313.  
  314. button01 = gtk_button_new_with_label("開始");
  315. gtk_box_pack_end(GTK_BOX(hbox01), button01, FALSE, FALSE, 0);
  316.  
  317. gtk_box_pack_start(GTK_BOX(vbox), hbox01, FALSE, FALSE, 0);
  318.  
  319. vbox02 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  320. scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
  321. gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_ETCHED_OUT);
  322. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  323. gtk_widget_set_size_request(GTK_SCROLLED_WINDOW(scrolledwindow), BITMAP_HEIGHT, TEXTVIEW_HEIGHT);
  324. gtk_box_pack_start(GTK_BOX(vbox02), scrolledwindow, TRUE, TRUE, 0);
  325.  
  326. textview = gtk_text_view_new();
  327. gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
  328. set_text(GTK_TEXT_VIEW(textview), "");
  329.  
  330. gtk_box_pack_start(GTK_BOX(vbox), vbox02, FALSE, FALSE, 0);
  331.  
  332. g_signal_connect(G_OBJECT(button01), "clicked", G_CALLBACK(on_button01_clicked), NULL);
  333. g_signal_connect (G_OBJECT (darea), "draw", G_CALLBACK (on_draw_event), NULL);
  334. g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  335. g_signal_connect(G_OBJECT(button02), "clicked", G_CALLBACK(gtk_main_quit), NULL);
  336.  
  337. gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
  338. gtk_window_set_title (GTK_WINDOW (window), "Cairo Test");
  339. gtk_window_set_decorated (GTK_WINDOW (window), TRUE);
  340. gtk_widget_set_size_request(window, BITMAP_WIDTH, BITMAP_HEIGHT + 30 + TEXTVIEW_HEIGHT);
  341.  
  342. gtk_widget_show_all (window);
  343. gtk_main ();
  344.  
  345. gdk_threads_leave();
  346.  
  347. cairo_surface_destroy (glob.image);
  348. return 0;
  349. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement