rfreeimage 0.2.1 → 0.2.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4b988773094fee17bb5d9dc7815ec8d2c44f053
4
- data.tar.gz: 1fad08335ed9ba58ff109715254b73293d0e59bb
3
+ metadata.gz: c9c9e8cdd384482e5a8231dcbf76f2eef0c5abb0
4
+ data.tar.gz: 3a007f7207ac6b4ab4bc70cf165e67426883e541
5
5
  SHA512:
6
- metadata.gz: e3bd93eafac76ce447ae422ed096a4a9aa0b0922693cc59f9e7d7e96f15aa5cf902562dec048cd8e5c3703254373a42fc29d42c138e1f017c8ec6082f3e76651
7
- data.tar.gz: 60ed61b07b748c07caa421861300cb5f4cf49768b8475fc42d380b183d9192a329c5b42d6948fbd01c9a85045469f35272a29f5658a0f13fcb66a54fc4a22564
6
+ metadata.gz: f6511c5393c22018e14436d651a5b8d310eb82450553515d60e53ce5b9e0aa97123131a3a3df5c38235dcdebdbb56f5683dc5d2d7ecb746284b2d52cba1535e0
7
+ data.tar.gz: a6664341d28ffb484e1922376d79592801e912b25e88c0ec8842301d37c445150ca300a80a37d30eb418e11d1891455f30c21ba0e02edfc62ac6b6c086734d45
@@ -25,6 +25,24 @@ static void try_sort(int *x, int *y)
25
25
  }
26
26
  }
27
27
 
28
+ static int min_of_arrary(int x1, int x2, int x3, int x4)
29
+ {
30
+ int m = x1;
31
+ if(x2 < m) m = x2;
32
+ if(x3 < m) m = x3;
33
+ if(x4 < m) m = x4;
34
+ return m;
35
+ }
36
+
37
+ static int max_of_arrary(int x1, int x2, int x3, int x4)
38
+ {
39
+ int m = x1;
40
+ if(x2 > m) m = x2;
41
+ if(x3 > m) m = x3;
42
+ if(x4 > m) m = x4;
43
+ return m;
44
+ }
45
+
28
46
  static VALUE rb_rfi_version(VALUE self)
29
47
  {
30
48
  return rb_ary_new3(3, INT2NUM(FREEIMAGE_MAJOR_VERSION),
@@ -48,6 +66,67 @@ struct native_image {
48
66
  FIBITMAP *handle;
49
67
  };
50
68
 
69
+ static void dd_line(struct native_image* img, int x0, int y0,
70
+ int x1,int y1,
71
+ unsigned int bgra, int size)
72
+ {
73
+ float x, dx, dy, y, k, deta, threshold=0.0001;
74
+ int hs = size / 2, i;
75
+
76
+ dx = x1-x0;
77
+ dy = y1-y0;
78
+
79
+ if(dx < threshold && dx > -threshold){
80
+ k = 0.0;
81
+ }
82
+ else
83
+ {
84
+ k=dy * 1.0 / dx;
85
+ }
86
+
87
+ if(dx > threshold)
88
+ {
89
+ deta = k > 1 ? 1.0 / k : 1;
90
+ for(i = -hs; i <= hs; i++) {
91
+ y = y0;
92
+ for (x = x0; x <= x1; x += deta){
93
+ FreeImage_SetPixelColor(img->handle, x + i, img->h - (y + i) - 1 , (RGBQUAD*)&bgra);
94
+ y = y + k * deta;
95
+ }
96
+ }
97
+ }
98
+ else if(dx < -threshold)
99
+ {
100
+ deta = k > 1 ? 1.0 / k : 1;
101
+ for(i = -hs; i <= hs; i++) {
102
+ y = y0;
103
+ for (x = x0; x >= x1; x -= deta){
104
+ FreeImage_SetPixelColor(img->handle, x + i, img->h - (y + i) - 1, (RGBQUAD*)&bgra);
105
+ y = y - k * deta;
106
+ }
107
+ }
108
+ }
109
+ else
110
+ {
111
+ if(dy >= 0)
112
+ {
113
+ for(i = -hs; i <= hs; i++) {
114
+ for (y = y0; y <= y1; y++){
115
+ FreeImage_SetPixelColor(img->handle, x0 + i, img->h - (y + i) - 1, (RGBQUAD*)&bgra);
116
+ }
117
+ }
118
+ }
119
+ else
120
+ {
121
+ for(i = -hs; i <= hs; i++) {
122
+ for (y = y0; y >= y1; y--){
123
+ FreeImage_SetPixelColor(img->handle, x0 + i, img->h - (y + i) - 1, (RGBQUAD*)&bgra);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
51
130
  static void Image_free(struct native_image* img)
52
131
  {
53
132
  if(!img)
@@ -673,6 +752,27 @@ static VALUE Image_draw_point(VALUE self, VALUE _x, VALUE _y, VALUE color, VALUE
673
752
  return self;
674
753
  }
675
754
 
755
+ static VALUE Image_draw_line(VALUE self, VALUE _x1, VALUE _y1,
756
+ VALUE _x2, VALUE _y2,
757
+ VALUE color, VALUE _size)
758
+ {
759
+ struct native_image* img;
760
+ int x1 = NUM2INT(_x1);
761
+ int y1 = NUM2INT(_y1);
762
+ int x2 = NUM2INT(_x2);
763
+ int y2 = NUM2INT(_y2);
764
+ int size = NUM2INT(_size);
765
+ unsigned int bgra = NUM2UINT(color);
766
+ if (size < 0)
767
+ rb_raise(rb_eArgError, "Invalid point size: %d", size);
768
+ Data_Get_Struct(self, struct native_image, img);
769
+ RFI_CHECK_IMG(img);
770
+
771
+ dd_line(img, x1, y1, x2, y2, bgra, size);
772
+
773
+ return self;
774
+ }
775
+
676
776
  static VALUE Image_draw_rectangle(VALUE self, VALUE _x1, VALUE _y1,
677
777
  VALUE _x2, VALUE _y2,
678
778
  VALUE color, VALUE _width)
@@ -710,6 +810,40 @@ static VALUE Image_draw_rectangle(VALUE self, VALUE _x1, VALUE _y1,
710
810
  return self;
711
811
  }
712
812
 
813
+ /*
814
+ daw arbitrari quadrangle
815
+ four point is given clockwise ordered
816
+ */
817
+ static VALUE Image_draw_quadrangle(VALUE self, VALUE _x1, VALUE _y1,
818
+ VALUE _x2, VALUE _y2,
819
+ VALUE _x3, VALUE _y3,
820
+ VALUE _x4, VALUE _y4,
821
+ VALUE color, VALUE _width)
822
+ {
823
+ struct native_image* img;
824
+ int x1 = NUM2INT(_x1);
825
+ int y1 = NUM2INT(_y1);
826
+ int x2 = NUM2INT(_x2);
827
+ int y2 = NUM2INT(_y2);
828
+ int x3 = NUM2INT(_x3);
829
+ int y3 = NUM2INT(_y3);
830
+ int x4 = NUM2INT(_x4);
831
+ int y4 = NUM2INT(_y4);
832
+ int size = NUM2INT(_width);
833
+ unsigned int bgra = NUM2UINT(color);
834
+ if (size < 0)
835
+ rb_raise(rb_eArgError, "Invalid line width: %d", size);
836
+ Data_Get_Struct(self, struct native_image, img);
837
+ RFI_CHECK_IMG(img);
838
+
839
+ dd_line(img, x1, y1, x2, y2, bgra, size);
840
+ dd_line(img, x2, y2, x3, y3, bgra, size);
841
+ dd_line(img, x3, y3, x4, y4, bgra, size);
842
+ dd_line(img, x4, y4, x1, y1, bgra, size);
843
+
844
+ return self;
845
+ }
846
+
713
847
  static VALUE Image_fill_rectangle(VALUE self, VALUE _x1, VALUE _y1,
714
848
  VALUE _x2, VALUE _y2,
715
849
  VALUE color)
@@ -737,6 +871,56 @@ static VALUE Image_fill_rectangle(VALUE self, VALUE _x1, VALUE _y1,
737
871
  return self;
738
872
  }
739
873
 
874
+ /*
875
+ daw arbitrari quadrangle
876
+ four point is given clockwise ordered
877
+ */
878
+ static VALUE Image_fill_quadrangle(VALUE self, VALUE _x1, VALUE _y1,
879
+ VALUE _x2, VALUE _y2,
880
+ VALUE _x3, VALUE _y3,
881
+ VALUE _x4, VALUE _y4,
882
+ VALUE color)
883
+ {
884
+ struct native_image* img;
885
+ int x1 = NUM2INT(_x1);
886
+ int y1 = NUM2INT(_y1);
887
+ int x2 = NUM2INT(_x2);
888
+ int y2 = NUM2INT(_y2);
889
+ int x3 = NUM2INT(_x3);
890
+ int y3 = NUM2INT(_y3);
891
+ int x4 = NUM2INT(_x4);
892
+ int y4 = NUM2INT(_y4);
893
+ unsigned int bgra = NUM2UINT(color);
894
+
895
+ int d1, d2, d3, d4;
896
+ int x,y;
897
+ int minx, miny, maxx, maxy;
898
+
899
+ Data_Get_Struct(self, struct native_image, img);
900
+ RFI_CHECK_IMG(img);
901
+
902
+ minx = min_of_arrary(x1,x2,x3,x4);
903
+ maxx = max_of_arrary(x1,x2,x3,x4);
904
+ miny = min_of_arrary(y1,y2,y3,y4);
905
+ maxy = max_of_arrary(y1,y2,y3,y4);
906
+
907
+ for(x = minx; x <= maxx; x++) {
908
+ for(y = miny; y <= maxy; y++) {
909
+ //if inner
910
+ d1 = (x2 - x1) * (y - y1) - (y2 - y1) * (x - x1);
911
+ d2 = (x3 - x2) * (y - y2) - (y3 - y2) * (x - x2);
912
+ d3 = (x4 - x3) * (y - y3) - (y4 - y3) * (x - x3);
913
+ d4 = (x1 - x4) * (y - y4) - (y1 - y4) * (x - x4);
914
+
915
+ if((d1 > 0 && d2 > 0 && d3 >0 && d4 >0) || (d1 < 0 && d2 < 0 && d3 < 0 && d4 <0))
916
+ {
917
+ FreeImage_SetPixelColor(img->handle, x, img->h - y, (RGBQUAD*)&bgra);
918
+ }
919
+ }
920
+ }
921
+
922
+ return self;
923
+ }
740
924
 
741
925
  void Init_rfreeimage(void)
742
926
  {
@@ -772,8 +956,11 @@ void Init_rfreeimage(void)
772
956
 
773
957
  /* draw */
774
958
  rb_define_method(Class_Image, "draw_point", Image_draw_point, 4);
959
+ rb_define_method(Class_Image, "draw_line", Image_draw_line, 4 + 2);
775
960
  rb_define_method(Class_Image, "draw_rectangle", Image_draw_rectangle, 4 + 2);
961
+ rb_define_method(Class_Image, "draw_quadrangle", Image_draw_quadrangle, 8 + 2);
776
962
  rb_define_method(Class_Image, "fill_rectangle", Image_fill_rectangle, 4 + 1);
963
+ rb_define_method(Class_Image, "fill_quadrangle", Image_fill_quadrangle, 8 + 1);
777
964
 
778
965
  rb_define_singleton_method(Class_Image, "ping", Image_ping, 1);
779
966
  rb_define_singleton_method(Class_Image, "from_blob", Image_from_blob, -1);
@@ -1,3 +1,3 @@
1
1
  module RFreeImage
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfreeimage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuheng Chen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-18 00:00:00.000000000 Z
11
+ date: 2018-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler