Writer for JavaScript-based HTML movies.
| 745 | |
| 746 | @writers.register('html') |
| 747 | class HTMLWriter(FileMovieWriter): |
| 748 | """Writer for JavaScript-based HTML movies.""" |
| 749 | |
| 750 | supported_formats = ['png', 'jpeg', 'tiff', 'svg'] |
| 751 | |
| 752 | @classmethod |
| 753 | def isAvailable(cls): |
| 754 | return True |
| 755 | |
| 756 | def __init__(self, fps=30, codec=None, bitrate=None, extra_args=None, |
| 757 | metadata=None, embed_frames=False, default_mode='loop', |
| 758 | embed_limit=None): |
| 759 | |
| 760 | if extra_args: |
| 761 | _log.warning("HTMLWriter ignores 'extra_args'") |
| 762 | extra_args = () # Don't lookup nonexistent rcParam[args_key]. |
| 763 | self.embed_frames = embed_frames |
| 764 | self.default_mode = default_mode.lower() |
| 765 | _api.check_in_list(['loop', 'once', 'reflect'], |
| 766 | default_mode=self.default_mode) |
| 767 | |
| 768 | # Save embed limit, which is given in MB |
| 769 | self._bytes_limit = mpl._val_or_rc(embed_limit, 'animation.embed_limit') |
| 770 | # Convert from MB to bytes |
| 771 | self._bytes_limit *= 1024 * 1024 |
| 772 | |
| 773 | super().__init__(fps, codec, bitrate, extra_args, metadata) |
| 774 | |
| 775 | def setup(self, fig, outfile, dpi=None, frame_dir=None): |
| 776 | outfile = Path(outfile) |
| 777 | _api.check_in_list(['.html', '.htm'], outfile_extension=outfile.suffix) |
| 778 | |
| 779 | self._saved_frames = [] |
| 780 | self._total_bytes = 0 |
| 781 | self._hit_limit = False |
| 782 | |
| 783 | if not self.embed_frames: |
| 784 | if frame_dir is None: |
| 785 | frame_dir = outfile.with_name(outfile.stem + '_frames') |
| 786 | frame_dir.mkdir(parents=True, exist_ok=True) |
| 787 | frame_prefix = frame_dir / 'frame' |
| 788 | else: |
| 789 | frame_prefix = None |
| 790 | |
| 791 | super().setup(fig, outfile, dpi, frame_prefix) |
| 792 | self._clear_temp = False |
| 793 | |
| 794 | def grab_frame(self, **savefig_kwargs): |
| 795 | _validate_grabframe_kwargs(savefig_kwargs) |
| 796 | if self.embed_frames: |
| 797 | # Just stop processing if we hit the limit |
| 798 | if self._hit_limit: |
| 799 | return |
| 800 | f = BytesIO() |
| 801 | self.fig.savefig(f, format=self.frame_format, |
| 802 | dpi=self.dpi, **savefig_kwargs) |
| 803 | imgdata64 = base64.encodebytes(f.getvalue()).decode('ascii') |
| 804 | self._total_bytes += len(imgdata64) |
no outgoing calls
no test coverage detected
searching dependent graphs…