@@ -770,7 +770,7 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms,
770
770
771
771
self._path_collection_id += 1
772
772
773
- def _draw_gouraud_triangle(self, gc, points, colors, trans ):
773
+ def _draw_gouraud_triangle(self, transformed_points, colors):
774
774
# This uses a method described here:
775
775
#
776
776
# http://www.svgopen.org/2005/papers/Converting3DFaceToSVG/index.html
@@ -782,43 +782,17 @@ def _draw_gouraud_triangle(self, gc, points, colors, trans):
782
782
# opposite edge. Underlying these three gradients is a solid
783
783
# triangle whose color is the average of all three points.
784
784
785
- writer = self.writer
786
- if not self._has_gouraud:
787
- self._has_gouraud = True
788
- writer.start(
789
- 'filter',
790
- id='colorAdd')
791
- writer.element(
792
- 'feComposite',
793
- attrib={'in': 'SourceGraphic'},
794
- in2='BackgroundImage',
795
- operator='arithmetic',
796
- k2="1", k3="1")
797
- writer.end('filter')
798
- # feColorMatrix filter to correct opacity
799
- writer.start(
800
- 'filter',
801
- id='colorMat')
802
- writer.element(
803
- 'feColorMatrix',
804
- attrib={'type': 'matrix'},
805
- values='1 0 0 0 0 \n0 1 0 0 0 \n0 0 1 0 0' +
806
- ' \n1 1 1 1 0 \n0 0 0 0 1 ')
807
- writer.end('filter')
808
-
809
785
avg_color = np.average(colors, axis=0)
810
786
if avg_color[-1] == 0:
811
787
# Skip fully-transparent triangles
812
788
return
813
789
814
- trans_and_flip = self._make_flip_transform(trans)
815
- tpoints = trans_and_flip.transform(points)
816
-
790
+ writer = self.writer
817
791
writer.start('defs')
818
792
for i in range(3):
819
- x1, y1 = tpoints [i]
820
- x2, y2 = tpoints [(i + 1) % 3]
821
- x3, y3 = tpoints [(i + 2) % 3]
793
+ x1, y1 = transformed_points [i]
794
+ x2, y2 = transformed_points [(i + 1) % 3]
795
+ x3, y3 = transformed_points [(i + 2) % 3]
822
796
rgba_color = colors[i]
823
797
824
798
if x2 == x3:
@@ -858,9 +832,9 @@ def _draw_gouraud_triangle(self, gc, points, colors, trans):
858
832
writer.end('defs')
859
833
860
834
# triangle formation using "path"
861
- dpath = "M " + _short_float_fmt(x1)+',' + _short_float_fmt(y1)
862
- dpath += " L " + _short_float_fmt(x2) + ',' + _short_float_fmt(y2)
863
- dpath += " " + _short_float_fmt(x3) + ',' + _short_float_fmt(y3) + " Z"
835
+ dpath = (f "M { _short_float_fmt(x1)},{ _short_float_fmt(y1)}"
836
+ f" L { _short_float_fmt(x2)},{ _short_float_fmt(y2)}"
837
+ f" { _short_float_fmt(x3)},{ _short_float_fmt(y3)} Z")
864
838
865
839
writer.element(
866
840
'path',
@@ -902,11 +876,36 @@ def _draw_gouraud_triangle(self, gc, points, colors, trans):
902
876
903
877
def draw_gouraud_triangles(self, gc, triangles_array, colors_array,
904
878
transform):
905
- self.writer.start('g', **self._get_clip_attrs(gc))
879
+ writer = self.writer
880
+ writer.start('g', **self._get_clip_attrs(gc))
906
881
transform = transform.frozen()
907
- for tri, col in zip(triangles_array, colors_array):
908
- self._draw_gouraud_triangle(gc, tri, col, transform)
909
- self.writer.end('g')
882
+ trans_and_flip = self._make_flip_transform(transform)
883
+
884
+ if not self._has_gouraud:
885
+ self._has_gouraud = True
886
+ writer.start(
887
+ 'filter',
888
+ id='colorAdd')
889
+ writer.element(
890
+ 'feComposite',
891
+ attrib={'in': 'SourceGraphic'},
892
+ in2='BackgroundImage',
893
+ operator='arithmetic',
894
+ k2="1", k3="1")
895
+ writer.end('filter')
896
+ # feColorMatrix filter to correct opacity
897
+ writer.start(
898
+ 'filter',
899
+ id='colorMat')
900
+ writer.element(
901
+ 'feColorMatrix',
902
+ attrib={'type': 'matrix'},
903
+ values='1 0 0 0 0 \n0 1 0 0 0 \n0 0 1 0 0 \n1 1 1 1 0 \n0 0 0 0 1 ')
904
+ writer.end('filter')
905
+
906
+ for points, colors in zip(triangles_array, colors_array):
907
+ self._draw_gouraud_triangle(trans_and_flip.transform(points), colors)
908
+ writer.end('g')
910
909
911
910
def option_scale_image(self):
912
911
# docstring inherited
0 commit comments