squib 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +62 -14
  5. data/Gemfile +1 -1
  6. data/README.md +16 -10
  7. data/RELEASE TODO.md +2 -1
  8. data/Rakefile +11 -0
  9. data/lib/squib/api/data.rb +3 -3
  10. data/lib/squib/api/image.rb +7 -5
  11. data/lib/squib/api/save.rb +31 -2
  12. data/lib/squib/api/settings.rb +1 -1
  13. data/lib/squib/api/shapes.rb +86 -0
  14. data/lib/squib/api/text.rb +6 -2
  15. data/lib/squib/api/text_embed.rb +7 -5
  16. data/lib/squib/args/typographer.rb +22 -16
  17. data/lib/squib/card.rb +5 -5
  18. data/lib/squib/conf.rb +111 -0
  19. data/lib/squib/constants.rb +11 -31
  20. data/lib/squib/deck.rb +15 -48
  21. data/lib/squib/graphics/cairo_context_wrapper.rb +3 -1
  22. data/lib/squib/graphics/gradient_regex.rb +1 -0
  23. data/lib/squib/graphics/hand.rb +43 -0
  24. data/lib/squib/graphics/image.rb +5 -3
  25. data/lib/squib/graphics/save_doc.rb +1 -1
  26. data/lib/squib/graphics/shapes.rb +74 -0
  27. data/lib/squib/graphics/showcase.rb +5 -2
  28. data/lib/squib/graphics/text.rb +18 -7
  29. data/lib/squib/input_helpers.rb +2 -2
  30. data/lib/squib/version.rb +1 -1
  31. data/samples/csv_import.rb +3 -5
  32. data/samples/custom-config.yml +0 -1
  33. data/samples/custom_config.rb +1 -1
  34. data/samples/draw_shapes.rb +11 -0
  35. data/samples/embed_text.rb +1 -1
  36. data/samples/hand.rb +24 -0
  37. data/samples/load_images.rb +14 -0
  38. data/samples/sample.csv +3 -3
  39. data/samples/text_options.rb +4 -0
  40. data/spec/api/api_data_spec.rb +19 -0
  41. data/spec/api/api_image_spec.rb +1 -1
  42. data/spec/api/api_settings_spec.rb +18 -0
  43. data/spec/api/api_text_spec.rb +3 -3
  44. data/spec/conf_spec.rb +29 -0
  45. data/spec/data/conf/basic.yml +0 -0
  46. data/spec/data/conf/empty.yml +1 -0
  47. data/spec/data/samples/csv_import.rb.txt +4 -38
  48. data/spec/data/samples/custom_config.rb.txt +4 -0
  49. data/spec/data/samples/draw_shapes.rb.txt +57 -0
  50. data/spec/data/samples/hand.rb.txt +514 -0
  51. data/spec/data/samples/load_images.rb.txt +6 -0
  52. data/spec/data/samples/text_options.rb.txt +81 -0
  53. data/spec/data/xlsx/basic.xlsx +0 -0
  54. data/spec/data/xlsx/formulas.xlsx +0 -0
  55. data/spec/graphics/graphics_images_spec.rb +49 -48
  56. data/spec/graphics/graphics_shapes_spec.rb +43 -41
  57. data/spec/graphics/graphics_text_spec.rb +25 -11
  58. data/spec/samples/_diffs/gitkeep.txt +0 -0
  59. data/spec/samples/expected/autoscale_00.png +0 -0
  60. data/spec/samples/expected/autoscale_01.png +0 -0
  61. data/spec/samples/expected/autoscale_02.png +0 -0
  62. data/spec/samples/expected/backend_00.png +0 -0
  63. data/spec/samples/expected/backend_00.svg +78 -0
  64. data/spec/samples/expected/backend_01.png +0 -0
  65. data/spec/samples/expected/backend_01.svg +78 -0
  66. data/spec/samples/expected/basic_00.png +0 -0
  67. data/spec/samples/expected/basic_01.png +0 -0
  68. data/spec/samples/expected/basic_02.png +0 -0
  69. data/spec/samples/expected/cairo_access_00.png +0 -0
  70. data/spec/samples/expected/cairo_access_01.png +0 -0
  71. data/spec/samples/expected/card_00.png +0 -0
  72. data/spec/samples/expected/card_01.png +0 -0
  73. data/spec/samples/expected/colors_00.png +0 -0
  74. data/spec/samples/expected/config_disable_text_00.png +0 -0
  75. data/spec/samples/expected/config_text_00.png +0 -0
  76. data/spec/samples/expected/custom-config_00.png +0 -0
  77. data/spec/samples/expected/embed_00.png +0 -0
  78. data/spec/samples/expected/embed_multi_00.png +0 -0
  79. data/spec/samples/expected/embed_multi_01.png +0 -0
  80. data/spec/samples/expected/embed_multi_02.png +0 -0
  81. data/spec/samples/expected/embed_multisheet_00.png +0 -0
  82. data/spec/samples/expected/gitkeep.txt +0 -0
  83. data/spec/samples/expected/gradient_00.png +0 -0
  84. data/spec/samples/expected/hand.png +0 -0
  85. data/spec/samples/expected/hand_pretty.png +0 -0
  86. data/spec/samples/expected/landscape_00.png +0 -0
  87. data/spec/samples/expected/layout2_00.png +0 -0
  88. data/spec/samples/expected/layout_00.png +0 -0
  89. data/spec/samples/expected/layout_builtin_hand_00.png +0 -0
  90. data/spec/samples/expected/layout_builtin_playing_card_00.png +0 -0
  91. data/spec/samples/expected/load_images_00.png +0 -0
  92. data/spec/samples/expected/portrait_00.png +0 -0
  93. data/spec/samples/expected/ranges_00.png +0 -0
  94. data/spec/samples/expected/ranges_01.png +0 -0
  95. data/spec/samples/expected/ranges_02.png +0 -0
  96. data/spec/samples/expected/sample_csv_00.png +0 -0
  97. data/spec/samples/expected/sample_csv_01.png +0 -0
  98. data/spec/samples/expected/sample_excel_00.png +0 -0
  99. data/spec/samples/expected/sample_excel_01.png +0 -0
  100. data/spec/samples/expected/sample_excel_02.png +0 -0
  101. data/spec/samples/expected/save_sheet_00.png +0 -0
  102. data/spec/samples/expected/save_sheet_01.png +0 -0
  103. data/spec/samples/expected/save_sheet_range_00.png +0 -0
  104. data/spec/samples/expected/save_sheet_range_01.png +0 -0
  105. data/spec/samples/expected/save_single_sheet_00.png +0 -0
  106. data/spec/samples/expected/saves_notrim_01.png +0 -0
  107. data/spec/samples/expected/shape_00.png +0 -0
  108. data/spec/samples/expected/showcase.png +0 -0
  109. data/spec/samples/expected/showcase2.png +0 -0
  110. data/spec/samples/expected/showcase_individual_00.png +0 -0
  111. data/spec/samples/expected/showcase_individual_01.png +0 -0
  112. data/spec/samples/expected/showcase_individual_02.png +0 -0
  113. data/spec/samples/expected/showcase_individual_03.png +0 -0
  114. data/spec/samples/expected/text_00.png +0 -0
  115. data/spec/samples/expected/text_01.png +0 -0
  116. data/spec/samples/expected/text_02.png +0 -0
  117. data/spec/samples/expected/tgc_sample_00.png +0 -0
  118. data/spec/samples/expected/units_00.png +0 -0
  119. data/spec/samples/samples_regression_spec.rb +7 -5
  120. data/spec/samples/sanity.html.erb +28 -0
  121. data/spec/samples/sanity.rb +70 -0
  122. data/spec/spec_helper.rb +15 -1
  123. data/squib.gemspec +3 -1
  124. data/squib.sublime-project +27 -40
  125. metadata +177 -4
@@ -52,6 +52,12 @@ cairo: scale([0.9765625, 0.9765625])
52
52
  cairo: render_rsvg_handle([RSVG::Handle, "#backdrop"])
53
53
  cairo: restore([])
54
54
  cairo: save([])
55
+ cairo: translate([50, 600])
56
+ cairo: rotate([0])
57
+ cairo: scale([0.5859375, 0.5859375])
58
+ cairo: render_rsvg_handle([RSVG::Handle, nil])
59
+ cairo: restore([])
60
+ cairo: save([])
55
61
  cairo: translate([0, 0])
56
62
  cairo: rotate([0])
57
63
  cairo: scale([0.8021390374331551, 0.8032128514056225])
@@ -560,6 +560,10 @@ cairo: update_pango_layout([MockDouble])
560
560
  cairo: move_to([0, 0])
561
561
  cairo: update_pango_layout([MockDouble])
562
562
  cairo: show_pango_layout([MockDouble])
563
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
564
+ cairo: set_source_color([:cyan])
565
+ cairo: set_line_width([2.0])
566
+ cairo: stroke([])
563
567
  cairo: restore([])
564
568
  cairo: save([])
565
569
  cairo: set_source_color([:black])
@@ -577,6 +581,10 @@ cairo: update_pango_layout([MockDouble])
577
581
  cairo: move_to([0, 0])
578
582
  cairo: update_pango_layout([MockDouble])
579
583
  cairo: show_pango_layout([MockDouble])
584
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
585
+ cairo: set_source_color([:cyan])
586
+ cairo: set_line_width([2.0])
587
+ cairo: stroke([])
580
588
  cairo: restore([])
581
589
  cairo: save([])
582
590
  cairo: set_source_color([:black])
@@ -594,6 +602,10 @@ cairo: update_pango_layout([MockDouble])
594
602
  cairo: move_to([0, 0])
595
603
  cairo: update_pango_layout([MockDouble])
596
604
  cairo: show_pango_layout([MockDouble])
605
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
606
+ cairo: set_source_color([:cyan])
607
+ cairo: set_line_width([2.0])
608
+ cairo: stroke([])
597
609
  cairo: restore([])
598
610
  cairo: save([])
599
611
  cairo: set_source_color([:black])
@@ -824,6 +836,75 @@ cairo: update_pango_layout([MockDouble])
824
836
  cairo: show_pango_layout([MockDouble])
825
837
  cairo: restore([])
826
838
  cairo: save([])
839
+ cairo: set_source_color([:green])
840
+ cairo: translate([540.0, 900.0])
841
+ cairo: rotate([0])
842
+ cairo: move_to([0, 0])
843
+ pango: font_description=([MockDouble])
844
+ pango: text=(["Stroke n <span fgcolor=\"#ff0000\">fill</span>"])
845
+ pango: markup=(["foo"])
846
+ pango: width=([261120.0])
847
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
848
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
849
+ pango: alignment=([#<Pango::Layout::Alignment left>])
850
+ pango: justify=([false])
851
+ pango: spacing=([0])
852
+ cairo: update_pango_layout([MockDouble])
853
+ cairo: move_to([0, 0])
854
+ cairo: update_pango_layout([MockDouble])
855
+ cairo: show_pango_layout([MockDouble])
856
+ cairo: set_source_color([:blue])
857
+ cairo: set_line_width([2.0])
858
+ cairo: pango_layout_path([MockDouble])
859
+ cairo: stroke([])
860
+ cairo: restore([])
861
+ cairo: save([])
862
+ cairo: set_source_color([:green])
863
+ cairo: translate([540.0, 900.0])
864
+ cairo: rotate([0])
865
+ cairo: move_to([0, 0])
866
+ pango: font_description=([MockDouble])
867
+ pango: text=(["Stroke n <span fgcolor=\"#ff0000\">fill</span>"])
868
+ pango: markup=(["foo"])
869
+ pango: width=([261120.0])
870
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
871
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
872
+ pango: alignment=([#<Pango::Layout::Alignment left>])
873
+ pango: justify=([false])
874
+ pango: spacing=([0])
875
+ cairo: update_pango_layout([MockDouble])
876
+ cairo: move_to([0, 0])
877
+ cairo: update_pango_layout([MockDouble])
878
+ cairo: show_pango_layout([MockDouble])
879
+ cairo: set_source_color([:blue])
880
+ cairo: set_line_width([2.0])
881
+ cairo: pango_layout_path([MockDouble])
882
+ cairo: stroke([])
883
+ cairo: restore([])
884
+ cairo: save([])
885
+ cairo: set_source_color([:green])
886
+ cairo: translate([540.0, 900.0])
887
+ cairo: rotate([0])
888
+ cairo: move_to([0, 0])
889
+ pango: font_description=([MockDouble])
890
+ pango: text=(["Stroke n <span fgcolor=\"#ff0000\">fill</span>"])
891
+ pango: markup=(["foo"])
892
+ pango: width=([261120.0])
893
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
894
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
895
+ pango: alignment=([#<Pango::Layout::Alignment left>])
896
+ pango: justify=([false])
897
+ pango: spacing=([0])
898
+ cairo: update_pango_layout([MockDouble])
899
+ cairo: move_to([0, 0])
900
+ cairo: update_pango_layout([MockDouble])
901
+ cairo: show_pango_layout([MockDouble])
902
+ cairo: set_source_color([:blue])
903
+ cairo: set_line_width([2.0])
904
+ cairo: pango_layout_path([MockDouble])
905
+ cairo: stroke([])
906
+ cairo: restore([])
907
+ cairo: save([])
827
908
  cairo: set_source_color([:black])
828
909
  cairo: translate([50, 1000])
829
910
  cairo: rotate([0])
Binary file
@@ -3,81 +3,82 @@ require 'squib'
3
3
 
4
4
  describe Squib::Card do
5
5
 
6
- before(:example) do
7
- @deck = double(Squib::Deck)
8
- @context = double(Cairo::Context)
9
- @svg = double(RSVG::Handle)
10
- @png = double(Cairo::ImageSurface)
11
- allow(Cairo::Context).to receive(:new).and_return(@context)
12
- allow(Cairo::ImageSurface).to receive(:from_png).and_return(@png)
13
- allow(Cairo::ImageSurface).to receive(:new).and_return(@png)
14
- allow(RSVG::Handle).to receive(:new_from_file).and_return(@svg)
15
- allow(@deck).to receive(:dir).and_return('_output')
16
- allow(@deck).to receive(:count_format).and_return('%02d')
17
- allow(@deck).to receive(:prefix).and_return('card_')
18
- allow(@deck).to receive(:antialias).and_return('best')
6
+ let(:deck) { double(Squib::Deck) }
7
+ let(:context) { double(Cairo::Context) }
8
+ let(:svg) { double(RSVG::Handle) }
9
+ let(:png) { double(Cairo::ImageSurface) }
19
10
 
11
+ before(:each) do
12
+ allow(Cairo::Context).to receive(:new).and_return(context)
13
+ allow(Cairo::ImageSurface).to receive(:from_png).and_return(png)
14
+ allow(Cairo::ImageSurface).to receive(:new).and_return(png)
15
+ allow(RSVG::Handle).to receive(:new_from_data).and_return(svg)
16
+ allow(deck).to receive(:dir).and_return('_output')
17
+ allow(deck).to receive(:count_format).and_return('%02d')
18
+ allow(deck).to receive(:prefix).and_return('card_')
19
+ allow(deck).to receive(:antialias).and_return('subpixel')
20
+ allow(deck).to receive(:backend).and_return('memory')
20
21
  end
21
22
 
22
23
  context '#png' do
23
24
  it 'makes all the expected calls on a smoke test' do
24
- expect(@context).to receive(:antialias=).with('subpixel')
25
- expect(@context).to receive(:save).once
26
- expect(@context).to receive(:translate).with(-37, -38).once
27
- expect(@context).to receive(:rotate).with(0.0).once
28
- expect(@context).to receive(:translate).with(37, 38).once
29
- expect(@context).to receive(:set_source).with(@png, 37, 38).once
30
- expect(@context).to receive(:paint).with(0.9).once
31
- expect(@context).to receive(:restore).once
25
+ expect(context).to receive(:antialias=).with('subpixel')
26
+ expect(context).to receive(:save).once
27
+ expect(context).to receive(:translate).with(-37, -38).once
28
+ expect(context).to receive(:rotate).with(0.0).once
29
+ expect(context).to receive(:translate).with(37, 38).once
30
+ expect(context).to receive(:set_source).with(png, 37, 38).once
31
+ expect(context).to receive(:paint).with(0.9).once
32
+ expect(context).to receive(:restore).once
32
33
 
33
- card = Squib::Card.new(@deck, 100, 150)
34
+ card = Squib::Card.new(deck, 100, 150)
34
35
  # png(file, x, y, alpha, blend, angle)
35
36
  card.png('foo.png', 37, 38, :native, :native, 0.9, :none, 0.0, nil)
36
37
  end
37
38
 
38
39
  it 'sets blend when needed' do
39
- @context.as_null_object
40
- expect(@context).to receive(:operator=).with(:overlay).once
40
+ context.as_null_object
41
+ expect(context).to receive(:operator=).with(:overlay).once
41
42
 
42
- card = Squib::Card.new(@deck, 100, 150)
43
+ card = Squib::Card.new(deck, 100, 150)
43
44
  card.png('foo.png', 37, 38, :native, :native, 0.9, :overlay, 0.0, nil)
44
45
  end
45
46
  end
46
47
 
47
48
  context '#svg' do
48
49
  it 'makes all the expected calls on a smoke test' do
49
- expect(@svg).to receive(:width).and_return(100).twice
50
- expect(@svg).to receive(:height).and_return(100).twice
51
- expect(@context).to receive(:antialias=).with('subpixel').once
52
- expect(@context).to receive(:save).once
53
- expect(@context).to receive(:rotate).with(0.0).once
54
- expect(@context).to receive(:translate).with(37, 38).once
55
- expect(@context).to receive(:scale).with(1.0, 1.0).once
56
- expect(@context).to receive(:render_rsvg_handle).with(@svg, 'id').once
57
- expect(@context).to receive(:restore).once
50
+ expect(svg).to receive(:width).and_return(100).twice
51
+ expect(svg).to receive(:height).and_return(100).twice
52
+ expect(context).to receive(:antialias=).with('subpixel').once
53
+ expect(context).to receive(:save).once
54
+ expect(context).to receive(:rotate).with(0.0).once
55
+ expect(context).to receive(:translate).with(37, 38).once
56
+ expect(context).to receive(:scale).with(1.0, 1.0).once
57
+ expect(context).to receive(:render_rsvg_handle).with(svg, 'id').once
58
+ expect(context).to receive(:restore).once
58
59
 
59
- card = Squib::Card.new(@deck, 100, 150)
60
- # svg(file, id, x, y, width, height, alpha, blend, angle)
61
- card.svg('foo.png', 'id', 37, 38, :native, :native, 0.9, :none, 0.0, nil)
60
+ card = Squib::Card.new(deck, 100, 150)
61
+ # svg(file, data, id, x, y, width, height, alpha, blend, angle)
62
+ card.svg(nil, '<svg></svg>', 'id', 37, 38, :native, :native, 0.9, :none, 0.0, nil)
62
63
  end
63
64
 
64
65
  it 'sets blend when needed' do
65
- @context.as_null_object
66
- @svg.as_null_object
67
- expect(@context).to receive(:operator=).with(:overlay).once
66
+ context.as_null_object
67
+ svg.as_null_object
68
+ expect(context).to receive(:operator=).with(:overlay).once
68
69
 
69
- card = Squib::Card.new(@deck, 100, 150)
70
- card.svg('foo.png', nil, 37, 38, :native, :native, 0.9, :overlay, 0.0, nil)
70
+ card = Squib::Card.new(deck, 100, 150)
71
+ card.svg(nil, '<svg></svg>', nil, 37, 38, :native, :native, 0.9, :overlay, 0.0, nil)
71
72
  end
72
73
 
73
74
  it 'sets width & height when needed' do
74
- @context.as_null_object
75
- expect(@svg).to receive(:width).and_return(100).once
76
- expect(@svg).to receive(:height).and_return(100).once
77
- expect(@context).to receive(:scale).with(2.0, 3.0).once
75
+ context.as_null_object
76
+ expect(svg).to receive(:width).and_return(100).once
77
+ expect(svg).to receive(:height).and_return(100).once
78
+ expect(context).to receive(:scale).with(2.0, 3.0).once
78
79
 
79
- card = Squib::Card.new(@deck, 100, 150)
80
- card.svg('foo.png', nil, 37, 38, 200, 300, 0.9, :none, 0.0, nil)
80
+ card = Squib::Card.new(deck, 100, 150)
81
+ card.svg(nil, '<svg></svg>', nil, 37, 38, 200, 300, 0.9, :none, 0.0, nil)
81
82
  end
82
83
  end
83
84
 
@@ -3,33 +3,35 @@ require 'squib'
3
3
 
4
4
  describe Squib::Card do
5
5
 
6
- def expect_stroke(fill_color, stroke_color, stroke_width)
7
- expect(@context).to receive(:set_source_color).with(stroke_color).once
8
- expect(@context).to receive(:set_line_width).with(stroke_width).once
9
- expect(@context).to receive(:stroke).once
10
- expect(@context).to receive(:set_source_color).with(fill_color).once
11
- expect(@context).to receive(:fill).once
6
+ let(:deck) { double(Squib::Deck) }
7
+ let(:cxt) { double(Cairo::Context) }
8
+
9
+ def expect_stroke(cxt, fill_color, stroke_color, stroke_width)
10
+ expect(cxt).to receive(:set_source_color).with(stroke_color).once
11
+ expect(cxt).to receive(:set_line_width).with(stroke_width).once
12
+ expect(cxt).to receive(:stroke).once
13
+ expect(cxt).to receive(:set_source_color).with(fill_color).once
14
+ expect(cxt).to receive(:fill).once
12
15
  end
13
16
 
14
17
  before(:each) do
15
- @deck = double(Squib::Deck)
16
- @context = double(Cairo::Context)
17
- allow(Cairo::Context).to receive(:new).and_return(@context)
18
- allow(@deck).to receive(:dir).and_return('_output')
19
- allow(@deck).to receive(:count_format).and_return('%02d')
20
- allow(@deck).to receive(:prefix).and_return('card_')
21
- allow(@deck).to receive(:antialias).and_return('best')
18
+ allow(Cairo::Context).to receive(:new).and_return(cxt)
19
+ allow(deck).to receive(:dir).and_return('_output')
20
+ allow(deck).to receive(:count_format).and_return('%02d')
21
+ allow(deck).to receive(:prefix).and_return('card_')
22
+ allow(deck).to receive(:antialias).and_return('subpixel')
23
+ allow(deck).to receive(:backend).and_return('memory')
22
24
  end
23
25
 
24
26
  context 'rect' do
25
27
  it 'make all the expected calls on a smoke test' do
26
- expect(@context).to receive(:antialias=).with('subpixel')
27
- expect(@context).to receive(:save).once
28
- expect(@context).to receive(:rounded_rectangle).with(37, 38, 50, 100, 10, 15).twice
29
- expect_stroke('#fff', '#f00', 2.0)
30
- expect(@context).to receive(:restore).once
28
+ expect(cxt).to receive(:antialias=).with('subpixel')
29
+ expect(cxt).to receive(:save).once
30
+ expect(cxt).to receive(:rounded_rectangle).with(37, 38, 50, 100, 10, 15).twice
31
+ expect_stroke(cxt, '#fff', '#f00', 2.0)
32
+ expect(cxt).to receive(:restore).once
31
33
 
32
- card = Squib::Card.new(@deck, 100, 150)
34
+ card = Squib::Card.new(deck, 100, 150)
33
35
  # rect(x, y, width, height, x_radius, y_radius,
34
36
  # fill_color, stroke_color, stroke_width)
35
37
  card.rect(37, 38, 50, 100, 10, 15, '#fff', '#f00', 2.0)
@@ -38,14 +40,14 @@ describe Squib::Card do
38
40
 
39
41
  context 'circle' do
40
42
  it 'make all the expected calls on a smoke test' do
41
- expect(@context).to receive(:antialias=).with('subpixel')
42
- expect(@context).to receive(:save).once
43
- expect(@context).to receive(:move_to).with(137, 38)
44
- expect(@context).to receive(:circle).with(37, 38, 100).twice
45
- expect_stroke('#fff', '#f00', 2.0)
46
- expect(@context).to receive(:restore).once
43
+ expect(cxt).to receive(:antialias=).with('subpixel')
44
+ expect(cxt).to receive(:save).once
45
+ expect(cxt).to receive(:move_to).with(137, 38)
46
+ expect(cxt).to receive(:circle).with(37, 38, 100).twice
47
+ expect_stroke(cxt, '#fff', '#f00', 2.0)
48
+ expect(cxt).to receive(:restore).once
47
49
 
48
- card = Squib::Card.new(@deck, 100, 150)
50
+ card = Squib::Card.new(deck, 100, 150)
49
51
  # circle(x, y, radius,
50
52
  # fill_color, stroke_color, stroke_width)
51
53
  card.circle(37, 38, 100, '#fff', '#f00', 2.0)
@@ -54,29 +56,29 @@ describe Squib::Card do
54
56
 
55
57
  context 'triangle' do
56
58
  it 'make all the expected calls on a smoke test' do
57
- expect(@context).to receive(:antialias=).with('subpixel')
58
- expect(@context).to receive(:save).once
59
- expect(@context).to receive(:triangle).with(1, 2, 3, 4, 5, 6).twice
60
- expect_stroke('#fff', '#f00', 2.0)
61
- expect(@context).to receive(:restore).once
59
+ expect(cxt).to receive(:antialias=).with('subpixel')
60
+ expect(cxt).to receive(:save).once
61
+ expect(cxt).to receive(:triangle).with(1, 2, 3, 4, 5, 6).twice
62
+ expect_stroke(cxt, '#fff', '#f00', 2.0)
63
+ expect(cxt).to receive(:restore).once
62
64
 
63
- card = Squib::Card.new(@deck, 100, 150)
65
+ card = Squib::Card.new(deck, 100, 150)
64
66
  card.triangle(1, 2, 3, 4, 5, 6, '#fff', '#f00', 2.0)
65
67
  end
66
68
  end
67
69
 
68
70
  context 'line' do
69
71
  it 'make all the expected calls on a smoke test' do
70
- expect(@context).to receive(:antialias=).with('subpixel')
71
- expect(@context).to receive(:save).once
72
- expect(@context).to receive(:move_to).with(1, 2).once
73
- expect(@context).to receive(:line_to).with(3, 4).once
74
- expect(@context).to receive(:set_source_color).with('#fff').once
75
- expect(@context).to receive(:set_line_width).with(2.0).once
76
- expect(@context).to receive(:stroke).once
77
- expect(@context).to receive(:restore).once
72
+ expect(cxt).to receive(:antialias=).with('subpixel')
73
+ expect(cxt).to receive(:save).once
74
+ expect(cxt).to receive(:move_to).with(1, 2).once
75
+ expect(cxt).to receive(:line_to).with(3, 4).once
76
+ expect(cxt).to receive(:set_source_color).with('#fff').once
77
+ expect(cxt).to receive(:set_line_width).with(2.0).once
78
+ expect(cxt).to receive(:stroke).once
79
+ expect(cxt).to receive(:restore).once
78
80
 
79
- card = Squib::Card.new(@deck, 100, 150)
81
+ card = Squib::Card.new(deck, 100, 150)
80
82
  card.line(1, 2, 3, 4, '#fff', 2.0)
81
83
  end
82
84
  end
@@ -16,6 +16,8 @@ describe Squib::Card, '#text' do
16
16
  allow(deck).to receive(:count_format).and_return('%02d')
17
17
  allow(deck).to receive(:prefix).and_return('card_')
18
18
  allow(deck).to receive(:antialias).and_return('best')
19
+ allow(deck).to receive(:antialias).and_return('subpixel')
20
+ allow(deck).to receive(:backend).and_return('memory')
19
21
  allow(layout).to receive(:context).and_return(pango_cxt)
20
22
  end
21
23
 
@@ -50,11 +52,12 @@ describe Squib::Card, '#text' do
50
52
  # text(str, font, font_size, color,
51
53
  # x, y, width, height,
52
54
  # markup, justify, wrap, ellipsize,
53
- # spacing, align, valign, hint, angle)
55
+ # spacing, align, valign, hint, angle,
56
+ # stroke_width, stroke_color)
54
57
  ret = card.text(Squib::TextEmbed.new,'foo', 'Sans 12', nil, '#abc',
55
58
  10, 15, 20, 25,
56
59
  nil, false, false, false,
57
- 1.0, :left, :top, nil, 0.0)
60
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
58
61
  expect(ret).to eq({width: 0, height: 0})
59
62
  end
60
63
  end
@@ -71,7 +74,8 @@ describe Squib::Card, '#text' do
71
74
  allow(deck).to receive(:dir).and_return('_output')
72
75
  allow(deck).to receive(:count_format).and_return('%02d')
73
76
  allow(deck).to receive(:prefix).and_return('card_')
74
- allow(deck).to receive(:antialias).and_return('best')
77
+ allow(deck).to receive(:antialias).and_return('subpixel')
78
+ allow(deck).to receive(:backend).and_return('memory')
75
79
  end
76
80
 
77
81
  it 'aligns right with strings' do
@@ -80,7 +84,7 @@ describe Squib::Card, '#text' do
80
84
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
81
85
  10, 15, 20, 50,
82
86
  nil, false, false, false,
83
- 1.0, 'right', :top, nil, 0.0)
87
+ 1.0, 'right', :top, nil, 0.0, '#fff', 0)
84
88
  end
85
89
 
86
90
  it 'aligns center with strings' do
@@ -89,7 +93,7 @@ describe Squib::Card, '#text' do
89
93
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
90
94
  10, 15, 20, 50,
91
95
  nil, false, false, false,
92
- 1.0, 'center', :top, nil, 0.0)
96
+ 1.0, 'center', :top, nil, 0.0, '#fff', 0)
93
97
  end
94
98
 
95
99
  it 'sets wrap to char with string char' do
@@ -98,7 +102,7 @@ describe Squib::Card, '#text' do
98
102
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
99
103
  10, 15, 20, 50,
100
104
  nil, false, 'char', false,
101
- 1.0, :left, :top, nil, 0.0)
105
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
102
106
  end
103
107
 
104
108
  it 'sets wrap to word with word string' do
@@ -107,7 +111,7 @@ describe Squib::Card, '#text' do
107
111
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
108
112
  10, 15, 20, 50,
109
113
  nil, false, 'word', false,
110
- 1.0, :left, :top, nil, 0.0)
114
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
111
115
  end
112
116
 
113
117
  it 'sets wrap to word_char with symbol word_char' do
@@ -116,7 +120,7 @@ describe Squib::Card, '#text' do
116
120
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
117
121
  10, 15, 20, 50,
118
122
  nil, false, :word_char, false,
119
- 1.0, :left, :top, nil, 0.0)
123
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
120
124
  end
121
125
 
122
126
  it 'sets wrap to word_char with true' do
@@ -125,7 +129,7 @@ describe Squib::Card, '#text' do
125
129
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
126
130
  10, 15, 20, 50,
127
131
  nil, false, true, false,
128
- 1.0, :left, :top, nil, 0.0)
132
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
129
133
  end
130
134
 
131
135
  it 'sets ellipsize to start properly' do
@@ -134,7 +138,7 @@ describe Squib::Card, '#text' do
134
138
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
135
139
  10, 15, 20, 50,
136
140
  nil, false, true, :start,
137
- 1.0, :left, :top, nil, 0.0)
141
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
138
142
  end
139
143
 
140
144
  it 'sets ellipsize to middle properly' do
@@ -143,7 +147,17 @@ describe Squib::Card, '#text' do
143
147
  card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
144
148
  10, 15, 20, 50,
145
149
  nil, false, true, 'middle',
146
- 1.0, :left, :top, nil, 0.0)
150
+ 1.0, :left, :top, nil, 0.0, '#fff', 0)
151
+ end
152
+
153
+ it 'implements stroke and fill when asked to' do
154
+ card = Squib::Card.new(deck, 100, 150)
155
+ expect(context).to receive(:set_line_width).with(3.0).once
156
+ expect(context).to receive(:pango_layout_path).once
157
+ card.text(Squib::TextEmbed.new, 'foo', 'Sans 12', nil, '#abc',
158
+ 10, 15, 20, 50,
159
+ nil, false, true, 'middle',
160
+ 1.0, :left, :top, nil, 0.0, '#f00', 3.0)
147
161
  end
148
162
 
149
163
  end