@@ -375,9 +375,20 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0,
375375 # this is to work around spurious warnings coming
376376 # out of masked arrays.
377377 with np .errstate (invalid = 'ignore' ):
378- rgba [..., 1 ] = A < 0 # under data
379- rgba [..., 2 ] = A > 1 # over data
380- rgba [..., 3 ] = ~ A .mask # bad data
378+ rgba [..., 1 ] = np .where (A < 0 , np .nan , 1 ) # under data
379+ rgba [..., 2 ] = np .where (A > 1 , np .nan , 1 ) # over data
380+ # Have to invert mask, Agg knows what alpha means
381+ # so if you put this in as 0 for 'good' points, they
382+ # all get zeroed out
383+ rgba [..., 3 ] = 1
384+ if A .mask .shape == A .shape :
385+ # this is the case of a nontrivial mask
386+ mask = np .where (A .mask , np .nan , 1 )
387+ else :
388+ # this is the case that the mask is a
389+ # numpy.bool_ of False
390+ mask = A .mask
391+ # ~A.mask # masked data
381392 A = rgba
382393 output = np .zeros ((out_height , out_width , 4 ),
383394 dtype = A .dtype )
@@ -418,12 +429,37 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0,
418429 # Convert back to a masked greyscale array so
419430 # colormapping works correctly
420431 hid_output = output
432+ # any pixel where the a masked pixel is included
433+ # in the kernel (pulling this down from 1) needs to
434+ # be masked in the output
435+ if len (mask .shape ) == 2 :
436+ out_mask = np .empty ((out_height , out_width ),
437+ dtype = mask .dtype )
438+ _image .resample (mask , out_mask , t ,
439+ _interpd_ [self .get_interpolation ()],
440+ True , 1 ,
441+ self .get_filternorm () or 0.0 ,
442+ self .get_filterrad () or 0.0 )
443+ out_mask = np .isnan (out_mask )
444+ else :
445+ out_mask = mask
446+ # we need to mask both pixels which came in as masked
447+ # and the pixels that Agg is telling us to ignore (relavent
448+ # to non-affine transforms)
449+ # Use half alpha as the threshold for pixels to mask.
450+ out_mask = out_mask | (hid_output [..., 3 ] < .5 )
421451 output = np .ma .masked_array (
422- hid_output [..., 0 ], hid_output [..., 3 ] < 0.5 )
423- # relabel under data
424- output [hid_output [..., 1 ] > .5 ] = - 1
452+ hid_output [..., 0 ],
453+ out_mask )
454+ # 'unshare' the mask array to
455+ # needed to suppress numpy warning
456+ del out_mask
457+ invalid_mask = ~ output .mask * ~ np .isnan (output .data )
458+ # relabel under data. If any of the input data for
459+ # the pixel has input out of the norm bounds,
460+ output [np .isnan (hid_output [..., 1 ]) * invalid_mask ] = - 1
425461 # relabel over data
426- output [hid_output [..., 2 ] > .5 ] = 2
462+ output [np . isnan ( hid_output [..., 2 ]) * invalid_mask ] = 2
427463
428464 output = self .to_rgba (output , bytes = True , norm = False )
429465
0 commit comments