tioga 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/Tioga_README +177 -139
  2. data/split/Dtable/dtable.c +3 -0
  3. data/split/Dtable/namespace.h +7 -3
  4. data/split/Dtable/symbols.h +2 -2
  5. data/split/Dvector/dvector.c +3 -2
  6. data/split/Dvector/namespace.h +7 -3
  7. data/split/Dvector/symbols.h +2 -2
  8. data/split/Flate/flate.c +2 -1
  9. data/split/Flate/namespace.h +7 -3
  10. data/split/Flate/symbols.h +2 -2
  11. data/split/Function/extconf.rb +1 -1
  12. data/split/Function/function.c +38 -6
  13. data/split/Function/joint_qsort.c +1 -2
  14. data/split/Function/namespace.h +7 -3
  15. data/split/Function/symbols.h +2 -2
  16. data/split/Tioga/axes.c +4 -5
  17. data/split/Tioga/figures.c +1 -0
  18. data/split/Tioga/figures.h +5 -3
  19. data/split/Tioga/lib/Arcs_and_Circles.rb +1 -1
  20. data/split/Tioga/lib/ColorConstants.rb +9 -9
  21. data/split/Tioga/lib/Creating_Paths.rb +1 -1
  22. data/split/Tioga/lib/FigMkr.rb +25 -23
  23. data/split/Tioga/lib/FigureConstants.rb +2 -2
  24. data/split/Tioga/lib/Figures_and_Plots.rb +6 -6
  25. data/split/Tioga/lib/Images.rb +2 -2
  26. data/split/Tioga/lib/MarkerConstants.rb +3 -3
  27. data/split/Tioga/lib/Markers.rb +6 -6
  28. data/split/Tioga/lib/Page_Frame_Bounds.rb +1 -1
  29. data/split/Tioga/lib/Rectangles.rb +1 -1
  30. data/split/Tioga/lib/Shading.rb +2 -2
  31. data/split/Tioga/lib/Special_Paths.rb +5 -5
  32. data/split/Tioga/lib/Strokes.rb +2 -2
  33. data/split/Tioga/lib/TeX_Text.rb +5 -5
  34. data/split/Tioga/lib/TexPreamble.rb +116 -116
  35. data/split/Tioga/lib/Transparency.rb +2 -2
  36. data/split/Tioga/lib/Using_Paths.rb +1 -1
  37. data/split/Tioga/lib/X_and_Y_Axes.rb +19 -15
  38. data/split/Tioga/lib/irb_tioga.rb +36 -11
  39. data/split/Tioga/lib/maker.rb +201 -0
  40. data/split/Tioga/lib/tioga_ui_cmds.rb +6 -2
  41. data/split/Tioga/namespace.h +7 -3
  42. data/split/Tioga/pdfcoords.c +20 -2
  43. data/split/Tioga/pdfs.h +1 -1
  44. data/split/Tioga/symbols.h +2 -2
  45. data/split/extconf.rb +7 -5
  46. data/split/namespace.h +7 -3
  47. data/split/symbols.c +1 -9
  48. data/split/symbols.h +2 -2
  49. metadata +19 -23
  50. data/split/Dtable/symbols.c +0 -92
  51. data/split/Dvector/symbols.c +0 -92
  52. data/split/Flate/symbols.c +0 -92
  53. data/split/Function/symbols.c +0 -92
  54. data/split/Tioga/symbols.c +0 -92
@@ -34,14 +34,18 @@
34
34
  */
35
35
 
36
36
  #ifdef __APPLE__
37
- # define PRIVATE __private_extern__
37
+ # define INTERN __private_extern__
38
38
  # define PUBLIC
39
39
  #elif __GNUC__ >= 4 /* we have the visibility attribute */
40
- # define PRIVATE __attribute__ ((visibility ("hidden")))
40
+ # define INTERN __attribute__ ((visibility ("hidden")))
41
41
  # define PUBLIC __attribute__ ((visibility ("default")))
42
42
  #else /* not really good */
43
- # define PRIVATE
43
+ # define INTERN
44
44
  # define PUBLIC
45
45
  #endif /* __APPLE__ and __GNU_C_ >= 4*/
46
46
 
47
+ /* In any case, PRIVATE is static */
48
+
49
+ #define PRIVATE static
50
+
47
51
  #endif
@@ -22,10 +22,10 @@ PRIVATE void * rb_import_symbol_no_raise(VALUE module,
22
22
 
23
23
  #define DECLARE_SYMBOL(ret_type,name,args) \
24
24
  typedef ret_type (*rb_export_##name##_type) args;\
25
- PRIVATE rb_export_##name##_type name
25
+ INTERN rb_export_##name##_type name
26
26
 
27
27
  #define IMPLEMENT_SYMBOL(name)\
28
- PRIVATE rb_export_##name##_type name = 0;
28
+ INTERN rb_export_##name##_type name = 0;
29
29
 
30
30
  #define RB_IMPORT_SYMBOL(module, name) \
31
31
  name = (rb_export_##name##_type) rb_import_symbol(module, #name)
@@ -1,4 +1,4 @@
1
- # Dtable installation file
1
+ # Function installation file
2
2
  require 'mkmf'
3
3
 
4
4
  create_makefile 'Dobjects/Function'
@@ -27,6 +27,7 @@
27
27
  #include <ruby.h>
28
28
 
29
29
  #include "dvector.h"
30
+ #include "../symbols.c"
30
31
 
31
32
  #include <math.h>
32
33
  /* compiler-dependent definitions, such as is_okay_number */
@@ -472,8 +473,8 @@ static VALUE function_make_interpolant(VALUE self)
472
473
 
473
474
 
474
475
  /* the function fort joint sorting...*/
475
- PRIVATE void joint_quicksort(double *const x_values, double * const y_values,
476
- size_t total_elems);
476
+ INTERN void joint_quicksort(double *const x_values, double * const y_values,
477
+ size_t total_elems);
477
478
 
478
479
  /* Dvector's lock */
479
480
  #define DVEC_TMPLOCK FL_USER1
@@ -865,9 +866,10 @@ static VALUE function_integrate(int argc, VALUE *argv, VALUE self)
865
866
  }
866
867
 
867
868
  /*
868
- Computes the primitive of the Function and returns it as a new Function.
869
- The newly created function shares the X vector with the previous one.
870
- */
869
+ Computes the primitive of the Function (whose value for the first point is 0)
870
+ and returns it as a new Function.
871
+ The newly created function shares the X vector with the previous one.
872
+ */
871
873
  static VALUE function_primitive(VALUE self)
872
874
  {
873
875
  long size = function_sanity_check(self);
@@ -886,6 +888,34 @@ static VALUE function_primitive(VALUE self)
886
888
  return Function_Create(get_x_vector(self), primitive);
887
889
  }
888
890
 
891
+ /*
892
+ Computes the derivative of the Function and returns it as a new Function.
893
+ The newly created function shares the X vector with the previous one.
894
+ */
895
+ static VALUE function_derivative(VALUE self)
896
+ {
897
+ long size = function_sanity_check(self);
898
+ const double *x = Dvector_Data_for_Read(get_x_vector(self),NULL);
899
+ const double *y = Dvector_Data_for_Read(get_y_vector(self),NULL);
900
+ VALUE derivative = Dvector_Create();
901
+ long i = 0;
902
+ double val = 0;
903
+ /* First value */
904
+ Dvector_Push_Double(derivative, (y[i+1] - y[i]) /(x[i+1] - x[i]));
905
+ i++;
906
+ while(i < (size - 1))
907
+ {
908
+ Dvector_Push_Double(derivative,
909
+ .5 * (
910
+ (y[i+1] - y[i]) /(x[i+1] - x[i]) +
911
+ (y[i] - y[i-1]) /(x[i] - x[i-1])
912
+ ));
913
+ i++;
914
+ }
915
+ Dvector_Push_Double(derivative, (y[i] - y[i-1]) /(x[i] - x[i-1]));
916
+ return Function_Create(get_x_vector(self), derivative);
917
+ }
918
+
889
919
  /*
890
920
  Returns the number of points inside the function.
891
921
  */
@@ -908,7 +938,7 @@ static VALUE function_size(VALUE self)
908
938
  - some functions for data access : #x, #y, #point;
909
939
  - some utiliy functions: #split_monotonic, #strip_nan;
910
940
  - data inspection: #min, #max;
911
- - some computationnal functions: #integrate, #primitive.
941
+ - some computational functions: #integrate, #primitive, #derivative.
912
942
 
913
943
  And getting bigger everyday...
914
944
  */
@@ -965,6 +995,8 @@ void Init_Function()
965
995
  rb_define_method(cFunction, "integrate", function_integrate, -1);
966
996
  /* primitive */
967
997
  rb_define_method(cFunction, "primitive", function_primitive, 0);
998
+ /* derivative */
999
+ rb_define_method(cFunction, "derivative", function_derivative, 0);
968
1000
 
969
1001
  /* distance to a point */
970
1002
  rb_define_method(cFunction, "distance", function_distance, -1);
@@ -94,8 +94,7 @@ typedef struct
94
94
  smaller partition. This *guarantees* no more than log (total_elems)
95
95
  stack size is needed (actually O(1) in this case)! */
96
96
 
97
- PRIVATE
98
- void
97
+ INTERN void
99
98
  joint_quicksort (double *const x_values, double * const y_values,
100
99
  size_t total_elems)
101
100
  {
@@ -34,14 +34,18 @@
34
34
  */
35
35
 
36
36
  #ifdef __APPLE__
37
- # define PRIVATE __private_extern__
37
+ # define INTERN __private_extern__
38
38
  # define PUBLIC
39
39
  #elif __GNUC__ >= 4 /* we have the visibility attribute */
40
- # define PRIVATE __attribute__ ((visibility ("hidden")))
40
+ # define INTERN __attribute__ ((visibility ("hidden")))
41
41
  # define PUBLIC __attribute__ ((visibility ("default")))
42
42
  #else /* not really good */
43
- # define PRIVATE
43
+ # define INTERN
44
44
  # define PUBLIC
45
45
  #endif /* __APPLE__ and __GNU_C_ >= 4*/
46
46
 
47
+ /* In any case, PRIVATE is static */
48
+
49
+ #define PRIVATE static
50
+
47
51
  #endif
@@ -22,10 +22,10 @@ PRIVATE void * rb_import_symbol_no_raise(VALUE module,
22
22
 
23
23
  #define DECLARE_SYMBOL(ret_type,name,args) \
24
24
  typedef ret_type (*rb_export_##name##_type) args;\
25
- PRIVATE rb_export_##name##_type name
25
+ INTERN rb_export_##name##_type name
26
26
 
27
27
  #define IMPLEMENT_SYMBOL(name)\
28
- PRIVATE rb_export_##name##_type name = 0;
28
+ INTERN rb_export_##name##_type name = 0;
29
29
 
30
30
  #define RB_IMPORT_SYMBOL(module, name) \
31
31
  name = (rb_export_##name##_type) rb_import_symbol(module, #name)
data/split/Tioga/axes.c CHANGED
@@ -294,10 +294,9 @@ char *Get_String(VALUE ary, int index) {
294
294
  return StringValuePtr(string);
295
295
  }
296
296
 
297
- #define MIN_FLTDIG 3
298
297
  #define MAX_FIXDIG_POS 6
299
- #define MAX_FIXDIG_NEG 4
300
- #define DIGMAX_DEF 5
298
+ #define MAX_FIXDIG_NEG 6
299
+ #define DIGMAX_DEF 6
301
300
 
302
301
  static void Pick_Label_Precision(double vmin, double vmax, double tick, bool use_fixed_pt,
303
302
  int *mode, int *prec, int digmax, int *scale) {
@@ -391,7 +390,7 @@ static char **Get_Labels(FM *p, PlotAxis *s)
391
390
  ps = NULL;
392
391
  if (i == upper_right && !s->log_values && mode && scale)
393
392
  sprintf(ps = postfix,
394
- (s->vertical)? " (x\\tiogayaxisnumericlabel{10^{%d}})" : " (x\\tiogaxaxisnumericlabel{10^{%d}})",
393
+ (s->vertical)? "$\\times$\\tiogayaxisnumericlabel{10^{%d}}" : "$\\times$\\tiogaxaxisnumericlabel{10^{%d}}",
395
394
  scale);
396
395
  if (i == lower_left && s->nmajors >= 2 && s->vertical &&
397
396
  (s->majors[i] == ((s->reversed)? s->axis_max : s->axis_min)) &&
@@ -557,7 +556,7 @@ static void draw_minor_ticks(FM *p, PlotAxis *s)
557
556
  if (s->number_of_minor_intervals <= 0) {
558
557
  if (s->log_values) {
559
558
  double interval = s->majors[1] - s->majors[0];
560
- s->number_of_minor_intervals = (abs(interval) != 1.0 || s->nmajors > 4)? 1 : 9;
559
+ s->number_of_minor_intervals = (abs(interval) != 1.0 || s->nmajors > 10)? 1 : 9;
561
560
  } else s->number_of_minor_intervals = Pick_Number_of_Minor_Intervals(s->interval);
562
561
  }
563
562
  int i, j, nsub = s->number_of_minor_intervals;
@@ -28,6 +28,7 @@
28
28
  #include "flate.h"
29
29
 
30
30
  #include <symbols.h>
31
+ #include "../symbols.c"
31
32
 
32
33
  #include <stdio.h>
33
34
 
@@ -46,8 +46,10 @@
46
46
 
47
47
  // Frame Sides
48
48
 
49
- #define LEFT 0
49
+ #define LEFT -1
50
+ // LEFT == LEFT_JUSTIFIED
50
51
  #define RIGHT 1
52
+ // RIGHT == RIGHT_JUSTIFIED
51
53
  #define TOP 2
52
54
  #define BOTTOM 3
53
55
 
@@ -84,9 +86,9 @@
84
86
 
85
87
  // Text and Markers
86
88
 
87
- #define LEFT_JUSTIFIED -1
89
+ #define LEFT_JUSTIFIED LEFT
88
90
  #define CENTERED 0
89
- #define RIGHT_JUSTIFIED 1
91
+ #define RIGHT_JUSTIFIED RIGHT
90
92
 
91
93
  #define ALIGNED_AT_TOP 0
92
94
  #define ALIGNED_AT_MIDHEIGHT 1
@@ -11,7 +11,7 @@ class Arcs_and_Circles < Doc < FigureMaker
11
11
  #
12
12
  # The illustration shows in dark blue the arc that is added for the control points given in red.
13
13
  #
14
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/append_arc.jpg
14
+ # link:images/append_arc.png
15
15
  #
16
16
  def append_arc_to_path(x_start, y_start, x_corner, y_corner, x_end, y_end, dx, dy)
17
17
  end
@@ -33,13 +33,13 @@ module Tioga
33
33
  #
34
34
  # - For the protanope, the brightness of red, orange, and yellow is much reduced compared to normal. This dimming can be so pronounced that reds may be confused with black or dark gray, and red traffic lights may appear to be extinguished. They may learn to distinguish reds from yellows and from greens primarily on the basis of their apparent brightness or lightness, not on any perceptible hue difference. Violet, lavender, and purple are indistinguishable from various shades of blue because their reddish components are so dimmed as to be invisible. E.g. Pink flowers, reflecting both red light and blue light, may appear just blue to the protanope.
35
35
  #
36
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/normalcolor72gif.gif
37
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/protanope72gif.gif
36
+ # link:images/normalcolor72gif.png
37
+ # link:images/protanope72gif.png
38
38
  #
39
39
  # - The deuteranope suffers the same hue discrimination problems as the protanope, but without the abnormal dimming. The names red, orange, yellow, and green really mean very little to him aside from being different names that every one else around him seems to be able to agree on. Similarly, violet, lavender, purple, and blue, seem to be too many names to use logically for hues that all look alike to him.
40
40
  #
41
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/normalcolor72gif.gif
42
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/deuteranope72gif.gif
41
+ # link:images/normalcolor72gif.png
42
+ # link:images/deuteranope72gif.png
43
43
  #
44
44
  # ---
45
45
  #
@@ -51,7 +51,7 @@ module Tioga
51
51
  # On the right are the same plots as they might appear to someone with protanopia
52
52
  # (made using VischeckURL[http://www.vischeck.com/vischeck/vischeckURL.php] -- a very useful site).
53
53
  #
54
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/color_choices.jpg
54
+ # link:images/color_choices.png
55
55
  #
56
56
  # By using the first set of colors rather than the second, you get a plot that looks good for
57
57
  # those in your audience with normal color vision and is much easier on those with a color deficiency.
@@ -61,13 +61,13 @@ module Tioga
61
61
  #
62
62
  # ---
63
63
  #
64
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/colors1.jpg
64
+ # link:images/colors1.png
65
65
  #
66
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/colors2.jpg
66
+ # link:images/colors2.png
67
67
  #
68
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/colors3.jpg
68
+ # link:images/colors3.png
69
69
  #
70
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/colors4.jpg
70
+ # link:images/colors4.png
71
71
  #
72
72
 
73
73
  module ColorConstants
@@ -30,7 +30,7 @@ class Creating_Paths < Doc < FigureMaker
30
30
  #
31
31
  # The illustration shows in dark blue the curve that is added for the control points given in red.
32
32
  #
33
- # http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/append_curve.jpg
33
+ # link:images/append_curve.png
34
34
  #
35
35
  def append_curve_to_path(x1, y1, x2, y2, x3, y3)
36
36
  end
@@ -33,7 +33,7 @@ class FigureMaker
33
33
 
34
34
 
35
35
  # The tag used for cvs export
36
- CVS_TAG = "rel_1_4" # now manually cheating...
36
+ CVS_TAG = "rel_1_5" # now manually cheating...
37
37
 
38
38
  # Version now uses the CVS_TAG to create the version number. CVS_TAG should
39
39
  # look like 'rel_1_1_0' for the 1.1.0 release.
@@ -43,7 +43,7 @@ class FigureMaker
43
43
  if version.length > 0
44
44
  return version
45
45
  else
46
- return "SNV $Revision: 313 $" # Can't do better than that.
46
+ return "SNV $Revision: 348 $" # Can't do better than that.
47
47
  end
48
48
  end
49
49
 
@@ -1847,6 +1847,29 @@ class FigureMaker
1847
1847
  end
1848
1848
 
1849
1849
 
1850
+
1851
+ # make create_figure_temp_files public for use by applications like ctioga.
1852
+
1853
+
1854
+ def create_figure_temp_files(name) # returns true if successful, false if failed.
1855
+ if name.kind_of?(Integer)
1856
+ num = name
1857
+ name = @figure_names[num]
1858
+ else
1859
+ num = @figure_names.index(name)
1860
+ end
1861
+ return false if num == nil
1862
+ cmd = @figure_commands[num]
1863
+ return false unless cmd.kind_of?(Proc)
1864
+ begin
1865
+ reset_legend_info
1866
+ result = private_make(name, cmd)
1867
+ return result
1868
+ rescue Exception => er
1869
+ report_error(er, "ERROR while executing command: #{cmd}")
1870
+ end
1871
+ return false
1872
+ end
1850
1873
 
1851
1874
 
1852
1875
 
@@ -1895,27 +1918,6 @@ class FigureMaker
1895
1918
  end
1896
1919
  return result
1897
1920
  end
1898
-
1899
-
1900
- def create_figure_temp_files(name) # returns true if successful, false if failed.
1901
- if name.kind_of?(Integer)
1902
- num = name
1903
- name = @figure_names[num]
1904
- else
1905
- num = @figure_names.index(name)
1906
- end
1907
- return false if num == nil
1908
- cmd = @figure_commands[num]
1909
- return false unless cmd.kind_of?(Proc)
1910
- begin
1911
- reset_legend_info
1912
- result = private_make(name, cmd)
1913
- return result
1914
- rescue Exception => er
1915
- report_error(er, "ERROR while executing command: #{cmd}")
1916
- end
1917
- return false
1918
- end
1919
1921
 
1920
1922
 
1921
1923
  def finish_making_pdfs(fignums,report)
@@ -45,8 +45,8 @@ module FigureConstants
45
45
  ALIGNED_AT_BASELINE = 2
46
46
  ALIGNED_AT_BOTTOM = 3
47
47
 
48
- LEFT = 0
49
- RIGHT = 1
48
+ LEFT = LEFT_JUSTIFIED # LEFT == LEFT_JUSTIFIED so Bill doesn't get confused!
49
+ RIGHT = RIGHT_JUSTIFIED # similarly, make RIGHT == RIGHT_JUSTIFIED
50
50
  TOP = 2
51
51
  BOTTOM = 3
52
52
 
@@ -67,7 +67,7 @@ Example
67
67
  jpg_image_transparent }
68
68
  end
69
69
 
70
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Subfigures.jpg
70
+ link:images/Subfigures.png
71
71
  =end
72
72
  def subfigure(margins=nil,&cmd)
73
73
  end
@@ -89,7 +89,7 @@ Examples
89
89
  t.subplot { t.yaxis_loc = t.ylabel_side = RIGHT; t.no_left_edge; greens }
90
90
  end
91
91
 
92
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Two_Ys.jpg
92
+ link:images/Two_Ys.png
93
93
 
94
94
  def side_by_side
95
95
  t.do_box_labels('Side by Side', 'Position', nil)
@@ -101,7 +101,7 @@ http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Two_Ys.jpg
101
101
  t.yaxis_loc = t.ylabel_side = RIGHT; t.left_edge_type = AXIS_LINE_ONLY; reds }
102
102
  end
103
103
 
104
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Side_by_Side.jpg
104
+ link:images/Side_by_Side.png
105
105
 
106
106
  def rows
107
107
  t.do_box_labels('Blues, Reds, Greens', 'Position', nil)
@@ -122,7 +122,7 @@ http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Side_by_Side.jpg
122
122
  end
123
123
  end
124
124
 
125
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Rows.jpg
125
+ link:images/Rows.png
126
126
 
127
127
  def trio
128
128
  t.rescale(0.6)
@@ -133,7 +133,7 @@ http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Rows.jpg
133
133
  t.subplot('top_margin' => 0.55) { side_by_side }
134
134
  end
135
135
 
136
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Trio.jpg
136
+ link:images/Trio.png
137
137
  =end
138
138
  def subplot(margins=nil,&cmd)
139
139
  end
@@ -215,7 +215,7 @@ Examples
215
215
  end
216
216
  end
217
217
 
218
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Legends.jpg
218
+ link:images/Legends.png
219
219
 
220
220
  =end
221
221
  def show_plot_with_legend(dict=nil, &cmd)
@@ -119,7 +119,7 @@ Examples
119
119
  2) create_monochrome_image_data for checker board pattern
120
120
  3) show_image of Jupiter using the monochrome image data as a stencil_mask
121
121
 
122
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Sample_Jpegs.jpg
122
+ link:images/Sample_Jpegs.png
123
123
 
124
124
  The following is a more lengthy example showing the use of a "false colored" image to
125
125
  represent a 2 dimensional table of data. In this case, the data comes from
@@ -212,7 +212,7 @@ is 'sampled_data' which shows the image in one subplot and the colorbar in anoth
212
212
  end
213
213
  end
214
214
 
215
- http://theory.kitp.ucsb.edu/~paxton/tioga_jpegs/Sampled_Data.jpg
215
+ link:images/Sampled_Data.png
216
216
 
217
217
  =end
218
218
  def show_image(dict)