diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d76262..c84bfb8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,14 +1,89 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# SPDX-FileCopyrightText: 2023 Jose D. Montoya # -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: Unlicense name: Build CI -on: [pull_request, push] +on: + pull_request: + types: [opened, reopened] + push: jobs: - test: + build-wheel: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: jposada202020/workflows-circuitpython-libs/build@main + - uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - uses: actions/checkout@v3 + + - name: Build wheel + run: pip wheel -w dist --no-deps . + + - name: check dist + run: pipx run twine check dist/* + + - name: Archive wheel + uses: actions/upload-artifact@v4 + with: + name: wheel + path: ${{ github.workspace }}/dist/ + + linters: + runs-on: ubuntu-latest + steps: + + - uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - uses: actions/checkout@v3 + + - name: Install pre-commit and deps + run: pip install pre-commit -r requirements.txt + + - name: Setup problem matchers + uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 + + - name: Pre-commit hooks + run: pre-commit run --all-files + + build-bundles: + runs-on: ubuntu-latest + steps: + - name: Translate Repo Name For Build Tools filename_prefix + id: repo-name + run: | + echo repo-name=$( + echo ${{ github.repository }} | + awk -F '\/' '{ print tolower($2) }' | + tr '_' '-' + ) >> $GITHUB_OUTPUT + + - uses: actions/checkout@v3 + + - name: Set up Python 3.x + uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - name: Checkout tools repo + uses: actions/checkout@v3 + with: + repository: adafruit/actions-ci-circuitpython-libs + path: actions-ci + + - name: Install deps + run: | + source actions-ci/install.sh + + - name: Build assets + run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . + + - name: Archive bundles + uses: actions/upload-artifact@v4 + with: + name: bundles + path: ${{ github.workspace }}/bundles/ diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml index 65775b7..160fce3 100644 --- a/.github/workflows/release_pypi.yml +++ b/.github/workflows/release_pypi.yml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# SPDX-FileCopyrightText: 2025 Jose D. Montoya # # SPDX-License-Identifier: MIT @@ -9,11 +9,28 @@ on: types: [published] jobs: - upload-release-assets: + pypi-publish: + name: Publish release to PyPI runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/circuitpython-uplot + permissions: + id-token: write steps: - - name: Run PyPI Release CI workflow - uses: adafruit/workflows-circuitpython-libs/release-pypi@main - with: - pypi-username: ${{ secrets.pypi_username }} - pypi-password: ${{ secrets.pypi_password }} + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + shell: bash + run: | + python -m pip install --upgrade pip + pip install --upgrade build + - name: Build package + run: | + find -type f -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) -exec sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" {} + + python -m build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore index 929fe03..52ca3dd 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ _build .vscode *~ mpy-cross +.ipynb_checkpoints diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d000ade..c0e8ede 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,27 +1,30 @@ -# SPDX-FileCopyrightText: 2023 Jose D. Montoya +# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò # # SPDX-License-Identifier: Unlicense repos: - repo: https://github.com/python/black - rev: 23.3.0 + rev: 24.10.0 hooks: - id: black - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v5.0.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace + - id: mixed-line-ending + args: + - --fix=lf - repo: https://github.com/pycqa/pylint - rev: v2.17.4 + rev: v3.3.1 hooks: - id: pylint name: pylint (library code) types: [python] args: - --disable=consider-using-f-string - exclude: "^(docs/|examples/|tests/)" + exclude: "^(docs/|examples/|tests/|setup.py$)" - id: pylint name: pylint (example code) description: Run pylint rules on "examples/*.py" files @@ -29,3 +32,10 @@ repos: files: "^examples/" args: - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code + - id: pylint + name: pylint (test code) + description: Run pylint rules on "tests/*.py" files + types: [python] + files: "^tests/" + args: + - --disable=missing-docstring,consider-using-f-string,duplicate-code diff --git a/.pylintrc b/.pylintrc index b7af89b..f6bdfea 100644 --- a/.pylintrc +++ b/.pylintrc @@ -14,7 +14,7 @@ unsafe-load-any-extension=no [MESSAGES CONTROL] confidence= -disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code +disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding,protected-access,unnecessary-list-index-lookup,duplicate-code,import-outside-toplevel,attribute-defined-outside-init, too-many-positional-arguments enable= [REPORTS] @@ -80,7 +80,7 @@ class-rgx=[A-Z_][a-zA-Z0-9_]+$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ docstring-min-length=-1 function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,ubar,rx,ry,x0,y0,y1,x1,ulogging,ufillbetween,ucartesian,y2,umap,upie,shade +good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_,cs,TVOC,bar,rx,ry,x0,y0,y1,x1,logging,fillbetween,cartesian,y2,map,pie,shade include-naming-hint=no inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ @@ -110,12 +110,12 @@ valid-metaclass-classmethod-first-arg=mcs max-args=15 max-attributes=30 max-bool-expr=5 -max-branches=20 +max-branches=25 max-locals=25 max-parents=7 max-public-methods=20 max-returns=6 -max-statements=60 +max-statements=70 min-public-methods=0 [EXCEPTIONS] diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 19d9be3..3cdb96e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,7 +5,7 @@ version: 2 build: - os: ubuntu-22.04 + os: ubuntu-lts-latest tools: python: "3" diff --git a/README.rst b/README.rst index 5a519ba..326a4ba 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,3 @@ -.. image:: https://readthedocs.org/projects/circuitpython-uplot/badge/?version=latest - :target: https://circuitpython-uplot.readthedocs.io/ - :alt: Documentation Status - .. image:: https://github.com/jposada202020/CircuitPython_uplot/workflows/Build%20CI/badge.svg :target: https://github.com/jposada202020/CircuitPython_uplot/actions :alt: Build Status @@ -14,10 +10,6 @@ :alt: Total PyPI downloads :target: https://pepy.tech/project/circuitpython-uplot -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - :alt: Code Style: Black - Framework to display different graphical plots in displayio. Take a look in the `examples `_ section in RTD to see the gallery @@ -27,8 +19,11 @@ For detailed view of the library please refer to the `Quick start guide `_. Thanks to @Casainho +Below a picture of a real live application. for more information visit the project `page `_. Thanks to @Casainho .. image:: https://github.com/jposada202020/CircuitPython_uplot/blob/main/docs/logging.png diff --git a/circuitpython_uplot/ubar.py b/circuitpython_uplot/bar.py similarity index 95% rename from circuitpython_uplot/ubar.py rename to circuitpython_uplot/bar.py index b892303..f1cc770 100644 --- a/circuitpython_uplot/ubar.py +++ b/circuitpython_uplot/bar.py @@ -4,7 +4,7 @@ """ -`ubar` +`bar` ================================================================================ CircuitPython scatter graph @@ -15,7 +15,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from math import sin, cos, ceil @@ -30,14 +30,14 @@ # pylint: disable=no-self-use -class ubar: +class Bar: """ Main class to display different graphics """ def __init__( self, - plot: Uplot, + plot: Plot, x: list, y: list, color: int = 0xFFFFFF, @@ -49,7 +49,7 @@ def __init__( max_value=None, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list x: x data :param list y: y data :param int color: boxes color. Defaults to const:``0xFFFFFF`` @@ -70,14 +70,17 @@ def __init__( self._projection = projection self._filled = fill + self._y = [i * plot.scale for i in y] + if max_value is None: - y_max = max(y) + y_max = max(self._y) else: y_max = max_value - self._y = [i * plot.scale for i in y] - self._bar_space = int(bar_space / plot.scale) + + xstart = int(xstart / plot.scale) + self._graphx = plot.scale * ceil( abs(plot._newxmax - plot._newxmin) / (len(x) + 4) ) @@ -113,14 +116,14 @@ def __init__( self._create_bars(xstart, i) if projection: - self._create_projections(xstart, i, len(color_palette)) + self._create_projections(xstart, i, len(self._bars)) plot.show_text( str(y[i]), xstart + (i * self._graphx) + self._graphx // 2, plot._newymin, ) - xstart = xstart + self._bar_space + xstart = xstart + self._bar_space // plot.scale plot._index_colorused = plot._index_colorused + 1 self._color_index = self._color_index + 1 else: @@ -164,11 +167,11 @@ def __init__( plot._index_colorused, ) - xstart = xstart + bar_space + xstart = xstart + self._bar_space plot._index_colorused = plot._index_colorused + 1 plot.show_text( str(y[i]), - xstart + (i * self._graphx) - bar_space + self._graphx // 2, + xstart + (i * self._graphx) - self._bar_space + self._graphx // 2, plot._newymin, ) @@ -233,7 +236,7 @@ def _create_projections(self, xstart: int, indice: int, color_lenght: int): ) def _draw_rectangle( - self, plot: Uplot, x: int, y: int, width: int, height: int, color: int + self, plot: Plot, x: int, y: int, width: int, height: int, color: int ) -> None: """ Helper function to draw bins rectangles diff --git a/circuitpython_uplot/ucartesian.py b/circuitpython_uplot/cartesian.py similarity index 54% rename from circuitpython_uplot/ucartesian.py rename to circuitpython_uplot/cartesian.py index e16bf04..fda8da6 100644 --- a/circuitpython_uplot/ucartesian.py +++ b/circuitpython_uplot/cartesian.py @@ -4,7 +4,7 @@ """ -`ucartesian` +`cartesian` ================================================================================ CircuitPython cartesian graph @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line, fill_region @@ -26,69 +26,89 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ucartesian: +class Cartesian: """ Class to draw cartesian plane """ def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y: Union[list, np.linspace, np.ndarray], rangex: Optional[list] = None, rangey: Optional[list] = None, line_color: Optional[int] = None, + line_style: Optional[str] = None, + ticksx: Union[np.array, list] = None, + ticksy: Union[np.array, list] = None, fill: bool = False, nudge: bool = True, logging: bool = False, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y: y points coordinates :param list|None rangex: x range limits. Defaults to None :param list|None rangey: y range limits. Defaults to None :param int|None line_color: line color. Defaults to None + :param str|None line_style: line style. Defaults to None + :param np.array|list ticksx: X axis ticks values + :param np.array|list ticksy: Y axis ticks values :param bool fill: Show the filling. Defaults to `False` :param bool nudge: moves the graph a little for better displaying. Defaults to `True` :param bool logging: used to change the logic of the cartesian to work as a logger """ self.points = [] + self.ticksx = ticksx + self.ticksy = ticksy if line_color is not None: plot._plot_palette[plot._index_colorused] = line_color + if line_style is None: + self._line_type = "-" + else: + self._line_type = line_style + + if self._line_type not in ["-", ".", "- -", "-.-"]: + raise ValueError("line_style must be a valid option") + + if line_style is None: + self._line_type = "-" + if nudge: nudge_factor = 1 else: nudge_factor = 0 if rangex is None: - xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) - xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + self.xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + self.xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + else: - xmin = min(rangex) - xmax = max(rangex) + self.xmin = min(rangex) + self.xmax = max(rangex) if rangey is None: - ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) - ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + self.ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + self.ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) else: - ymin = min(rangey) - ymax = max(rangey) + self.ymin = min(rangey) + self.ymax = max(rangey) x = np.array(x) y = np.array(y) xnorm = np.array( - plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, x), + plot.transform(self.xmin, self.xmax, plot._newxmin, plot._newxmax, x), dtype=np.int16, ) ynorm = np.array( - plot.transform(ymin, ymax, plot._newymin, plot._newymax, y), + plot.transform(self.ymin, self.ymax, plot._newymin, plot._newymax, y), dtype=np.int16, ) @@ -121,22 +141,17 @@ def __init__( for index, _ in enumerate(xnorm): if index + 1 >= len(xnorm): break - if y[index] >= ymax: + if y[index] >= self.ymax: continue - draw_line( - plot._plotbitmap, - xnorm[index], - ynorm[index], - xnorm[index + 1], - ynorm[index + 1], - plot._index_colorused, - ) + + self._draw_plotline(plot, index, xnorm, ynorm) + if plot._showticks: if plot._cartesianfirst: if logging: - x = np.linspace(xmin, xmax, 100) - y = np.linspace(ymin, ymax, 100) - plot._draw_ticks(x, y) + x = np.linspace(self.xmin, self.xmax, 100) + y = np.linspace(self.ymin, self.ymax, 100) + plot._draw_ticks(x, y, self.ticksx, self.ticksy) plot._cartesianfirst = False plot._showticks = False @@ -144,3 +159,39 @@ def __init__( plot._index_colorused = plot._index_colorused else: plot._index_colorused = plot._index_colorused + 1 + + def _draw_plotline(self, plot, index, xnorm, ynorm): + if self._line_type == "-": + self._plot_line(plot, index, xnorm, ynorm) + elif self._line_type == "-.-": + if index % 3 == 0: + self._plot_line(plot, index, xnorm, ynorm) + else: + plot._plotbitmap[xnorm[index], ynorm[index]] = plot._index_colorused + elif self._line_type == ".": + plot._plotbitmap[xnorm[index], ynorm[index]] = plot._index_colorused + elif self._line_type == "- -": + if index % 2 == 0: + self._plot_line(plot, index, xnorm, ynorm) + + @staticmethod + def _plot_line(plot, index, xnorm, ynorm): + draw_line( + plot._plotbitmap, + xnorm[index], + ynorm[index], + xnorm[index + 1], + ynorm[index + 1], + plot._index_colorused, + ) + + +class LineStyle: + """ + Line style class + """ + + SOLID = "-" + DASHED = "- -" + DASH_DOT = "-.-" + DOTTED = "." diff --git a/circuitpython_uplot/ufillbetween.py b/circuitpython_uplot/fillbetween.py similarity index 94% rename from circuitpython_uplot/ufillbetween.py rename to circuitpython_uplot/fillbetween.py index 3592f3e..d2f170a 100644 --- a/circuitpython_uplot/ufillbetween.py +++ b/circuitpython_uplot/fillbetween.py @@ -4,7 +4,7 @@ """ -`ufillbetween` +`fillbetween` ================================================================================ CircuitPython fillbetween graph @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from ulab import numpy as np @@ -26,14 +26,14 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ufillbetween: +class Fillbetween: """ Class to draw a fillbetween graph """ def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y1: Union[list, np.linspace, np.ndarray], y2: Union[list, np.linspace, np.ndarray], @@ -43,7 +43,7 @@ def __init__( nudge: bool = True, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y1: y1 points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y2: y2 points coordinates diff --git a/circuitpython_uplot/ulogging.py b/circuitpython_uplot/logging.py similarity index 72% rename from circuitpython_uplot/ulogging.py rename to circuitpython_uplot/logging.py index 95fdac3..c60c120 100644 --- a/circuitpython_uplot/ulogging.py +++ b/circuitpython_uplot/logging.py @@ -4,18 +4,18 @@ """ -`ulogging` +`logging` ================================================================================ CircuitPython logging data graph -* Author(s): Jose D. Montoya +* Author: Jose D. Montoya """ try: - from typing import Union - from circuitpython_uplot.uplot import Uplot + from typing import Union, Optional + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line, fill_region @@ -25,14 +25,14 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class ulogging: +class Logging: """ Class to log data """ def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y: Union[list, np.linspace, np.ndarray], rangex: list, @@ -42,10 +42,12 @@ def __init__( ticksy: Union[np.array, list] = np.array([0, 10, 30, 50, 70, 90]), tick_pos: bool = False, fill: bool = False, + limits: Optional[list] = None, + limits_color: int = 0xFF0000, ) -> None: """ - :param Uplot plot: Plot object for the log to be drawn + :param Plot plot: Plot object for the log to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list|ulab.numpy.linspace|ulab.numpy.ndarray y: y points coordinates :param list|None rangex: x range limits. Defaults to None @@ -61,6 +63,7 @@ def __init__( self.points = [] self.ticksx = np.array(ticksx) self.ticksy = np.array(ticksy) + self._fill = fill if tick_pos: self._tickposx = plot._tickheightx self._tickposy = plot._tickheighty @@ -70,18 +73,29 @@ def __init__( plot._plot_palette[plot._index_colorused] = line_color + self._line_index = plot._index_colorused + self.xmin = rangex[0] self.xmax = rangex[1] self.ymin = rangey[0] self.ymax = rangey[1] - self.draw_points(plot, x, y, fill) + if limits is not None: + self._limits = np.array( + plot.transform( + self.ymin, + self.ymax, + plot._newymin, + plot._newymax, + np.array(limits), + ), + dtype=np.int16, + ) + plot._plot_palette[9] = limits_color + else: + self._limits = None - if plot._showticks: - if plot._loggingfirst: - self._draw_ticks(plot) - plot._loggingfirst = False - plot._showticks = False + self.draw_points(plot, x, y) def _draw_ticks(self, plot) -> None: """ @@ -89,20 +103,20 @@ def _draw_ticks(self, plot) -> None: """ - ticksxnorm = np.array( + self._ticksxnorm = np.array( plot.transform( self.xmin, self.xmax, plot._newxmin, plot._newxmax, self.ticksx ), dtype=np.int16, ) - ticksynorm = np.array( + self._ticksynorm = np.array( plot.transform( self.ymin, self.ymax, plot._newymin, plot._newymax, self.ticksy ), dtype=np.int16, ) - for i, tick in enumerate(ticksxnorm): + for i, tick in enumerate(self._ticksxnorm): draw_line( plot._plotbitmap, tick, @@ -113,7 +127,7 @@ def _draw_ticks(self, plot) -> None: ) if plot._showtext: plot.show_text(f"{self.ticksx[i]:.0f}", tick, plot._newymin, (0.5, 0.0)) - for i, tick in enumerate(ticksynorm): + for i, tick in enumerate(self._ticksynorm): draw_line( plot._plotbitmap, plot._newxmin - self._tickposy, @@ -140,23 +154,34 @@ def clear_plot(plot) -> None: 0, ) - def draw_points(self, plot: Uplot, x: list, y: list, fill: bool = False) -> None: + def draw_points(self, plot: Plot, x: list, y: list) -> None: """ Draws points in the plot - :param Uplot plot: plot object provided + :param Plot plot: plot object provided :param list x: list of x values :param list y: list of y values :param bool fill: parameter to fill the plot graphic. Defaults to False :return: None """ + self.clear_plot(plot) + if self._limits: + self._draw_limit_lines(plot) + self.draw_new_lines(plot, x, y) + if plot._showticks: + if plot._loggingfirst: + self._draw_ticks(plot) + plot._loggingfirst = False + plot._showticks = False - self.draw_new_lines(plot, x, y, fill) + if plot._tickgrid: + plot._draw_gridx(self._ticksxnorm) + plot._draw_gridy(self._ticksynorm) - def draw_new_lines(self, plot: Uplot, x: list, y: list, fill: bool = False) -> None: + def draw_new_lines(self, plot: Plot, x: list, y: list) -> None: """ Draw the plot lines - :param Uplot plot: plot object provided + :param Plot plot: plot object provided :param list x: list of x values :param list y: list of y values :param bool fill: parameter to fill the plot graphic. Defaults to False @@ -186,9 +211,10 @@ def draw_new_lines(self, plot: Uplot, x: list, y: list, fill: bool = False) -> N ynorm[index], xnorm[index + 1], ynorm[index + 1], - plot._index_colorused, + self._line_index, ) - if fill: + + if self._fill: for index, _ in enumerate(xnorm): draw_line( plot._plotbitmap, @@ -196,5 +222,23 @@ def draw_new_lines(self, plot: Uplot, x: list, y: list, fill: bool = False) -> N ynorm[index], xnorm[index], plot._newymin, - plot._index_colorused, + self._line_index, ) + + def _draw_limit_lines(self, plot: Plot) -> None: + draw_line( + plot._plotbitmap, + plot._newxmin + 1, + self._limits[0], + plot._newxmax - 1, + self._limits[0], + 9, + ) + draw_line( + plot._plotbitmap, + plot._newxmin + 1, + self._limits[1], + plot._newxmax - 1, + self._limits[1], + 9, + ) diff --git a/circuitpython_uplot/umap.py b/circuitpython_uplot/map.py similarity index 95% rename from circuitpython_uplot/umap.py rename to circuitpython_uplot/map.py index 48115bb..fb9f286 100644 --- a/circuitpython_uplot/umap.py +++ b/circuitpython_uplot/map.py @@ -5,7 +5,7 @@ """ -`umap` +`map` ================================================================================ CircuitPython color map graph @@ -15,7 +15,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass @@ -27,21 +27,21 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class umap: +class Map: """ Main class to display different graphics """ def __init__( self, - plot: Uplot, + plot: Plot, data_points: np.ndarray, initial_color: int, final_color: int, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param np.array data_points: data points to create the color map :param int initial_color: initial color to create the color map :param int final_color: final color to create the color map diff --git a/circuitpython_uplot/upie.py b/circuitpython_uplot/pie.py similarity index 90% rename from circuitpython_uplot/upie.py rename to circuitpython_uplot/pie.py index 989462d..02bcb8a 100644 --- a/circuitpython_uplot/upie.py +++ b/circuitpython_uplot/pie.py @@ -4,7 +4,7 @@ """ -`upie` +`pie` ================================================================================ CircuitPython pie graph @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass @@ -26,17 +26,17 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -class upie: +class Pie: """ Class to draw pie """ def __init__( - self, plot: Uplot, data: list, x: int = 0, y: int = 0, radius: int = 40 + self, plot: Plot, data: list, x: int = 0, y: int = 0, radius: int = 40 ) -> None: """ - :param Uplot plot: Plot object for the upie to be drawn + :param Plot plot: Plot object for the pie to be drawn :param list data: data to make the pie :param int x: pie center x coordinate :param int y: pie center y coordinate diff --git a/circuitpython_uplot/uplot.py b/circuitpython_uplot/plot.py similarity index 72% rename from circuitpython_uplot/uplot.py rename to circuitpython_uplot/plot.py index 20e1eb4..7a63109 100644 --- a/circuitpython_uplot/uplot.py +++ b/circuitpython_uplot/plot.py @@ -4,7 +4,7 @@ """ -`uplot` +`plot` ================================================================================ CircuitPython Plot Class @@ -21,12 +21,8 @@ """ -# pylint: disable=too-many-statements, unused-import, no-member -# pylint: disable=unused-import, import-outside-toplevel, undefined-variable -# pylint: disable=attribute-defined-outside-init - try: - from typing import Union, Tuple + from typing import Union, Tuple, Optional from typing_extensions import Literal except ImportError: pass @@ -41,7 +37,7 @@ __repo__ = "https://github.com/jposada202020/CircuitPython_uplot.git" -class Uplot(displayio.Group): +class Plot(displayio.Group): """ Canvas Class to add different elements to the screen. The origin point set by ``x`` and ``y`` properties @@ -82,13 +78,13 @@ def __init__( height = 100 if x + width > 481: print( - "Modify this settings. Some of the graphics will not shown int the screen" + "Modify this setting. Some of the graphics will not shown int the screen" ) print("Defaulting to x=0") x = 0 if y + height > 321: print( - "Modify this settings. Some of the graphics will not shown int the screen" + "Modify this setting. Some of the graphics will not shown int the screen" ) print("Defaulting to y=0") y = 0 @@ -96,6 +92,7 @@ def __init__( super().__init__(x=x, y=y, scale=scale) self._axesparams = "box" + self._decimal_points = None self._width = width self._height = height @@ -109,6 +106,7 @@ def __init__( self._cartesianfirst = True self._loggingfirst = True + self._scatterfirst = True self._showtext = False @@ -127,7 +125,7 @@ def __init__( self._index_colorused = 4 - self._plotbitmap = displayio.Bitmap(width, height, 20) + self._plotbitmap = displayio.Bitmap(width, height, 10) if show_box: self._drawbox() @@ -164,12 +162,13 @@ def axs_params(self, axstype: Literal["box", "cartesian", "line"] = "box") -> No """ Setting up axs visibility - :param axstype: argument with the kind of axs you selected + :param str axstype: argument with the kind of axs you selected :return: None """ self._axesparams = axstype + self._update_plot() def _drawbox(self) -> None: """ @@ -178,6 +177,7 @@ def _drawbox(self) -> None: :return: None """ + self._plotbitmap.fill(0) if self._axesparams == "cartesian": draw_box = [True, True, False, False] @@ -230,7 +230,8 @@ def _drawbox(self) -> None: def draw_circle(self, radius: int = 5, x: int = 100, y: int = 100) -> None: """ - Draw a circle in the plot area + Draw a circle in the plot area. This function is kept here for + historical reasons. Please use :meth:`scatter` instead. :param int radius: circle radius :param int x: circles center x coordinate position in pixels, Defaults to 100. @@ -269,24 +270,41 @@ def transform( / (oldrangemax - oldrangemin) ) + newrangemin - def _draw_ticks(self, x: int, y: int) -> None: + def _draw_ticks(self, x: int, y: int, ticksx=None, ticksy=None) -> None: """ Draw ticks in the plot area :param int x: x coord :param int y: y coord + :param list[int] ticksx: x ticks data. Defaults to None + :param list[int] ticksy: y ticks data. Defaults to None :return:None """ - ticks = np.array([10, 30, 50, 70, 90]) - subticks = np.array([20, 40, 60, 80]) - ticksxnorm = np.array(self.transform(0, 100, np.min(x), np.max(x), ticks)) - ticksynorm = np.array(self.transform(0, 100, np.min(y), np.max(y), ticks)) + ticks_dummy = np.array([10, 30, 50, 70, 90]) + subticks_dummy = np.array([20, 40, 60, 80]) + + if ticksx is None: + ticksxnorm = np.array( + self.transform(0, 100, np.min(x), np.max(x), ticks_dummy) + ) + subticksxnorm = np.array( + self.transform(0, 100, np.min(x), np.max(x), subticks_dummy) + ) + else: + ticksxnorm = np.array(ticksx) - subticksxnorm = np.array(self.transform(0, 100, np.min(x), np.max(x), subticks)) - subticksynorm = np.array(self.transform(0, 100, np.min(y), np.max(y), subticks)) + if ticksy is None: + ticksynorm = np.array( + self.transform(0, 100, np.min(y), np.max(y), ticks_dummy) + ) + subticksynorm = np.array( + self.transform(0, 100, np.min(y), np.max(y), subticks_dummy) + ) + else: + ticksynorm = np.array(ticksy) ticksxrenorm = np.array( self.transform( @@ -294,24 +312,27 @@ def _draw_ticks(self, x: int, y: int) -> None: ), dtype=np.int16, ) + ticksyrenorm = np.array( self.transform( np.min(y), np.max(y), self._newymin, self._newymax, ticksynorm ), dtype=np.int16, ) - subticksxrenorm = np.array( - self.transform( - np.min(x), np.max(x), self._newxmin, self._newxmax, subticksxnorm - ), - dtype=np.int16, - ) - subticksyrenorm = np.array( - self.transform( - np.min(y), np.max(y), self._newymin, self._newymax, subticksynorm - ), - dtype=np.int16, - ) + if ticksx is None: + subticksxrenorm = np.array( + self.transform( + np.min(x), np.max(x), self._newxmin, self._newxmax, subticksxnorm + ), + dtype=np.int16, + ) + if ticksy is None: + subticksyrenorm = np.array( + self.transform( + np.min(y), np.max(y), self._newymin, self._newymax, subticksynorm + ), + dtype=np.int16, + ) for i, tick in enumerate(ticksxrenorm): draw_line( self._plotbitmap, @@ -323,7 +344,10 @@ def _draw_ticks(self, x: int, y: int) -> None: ) if self._showtext: self.show_text( - "{:.2f}".format(ticksxnorm[i]), tick, self._newymin, (0.5, 0.0) + "{:.{}f}".format(ticksxnorm[i], self._decimal_points), + tick, + self._newymin + 5, + (0.5, 0.0), ) for i, tick in enumerate(ticksyrenorm): draw_line( @@ -336,26 +360,33 @@ def _draw_ticks(self, x: int, y: int) -> None: ) if self._showtext: self.show_text( - "{:.2f}".format(ticksynorm[i]), self._newxmin, tick, (1.0, 0.5) + "{:.{}f}".format(ticksynorm[i], self._decimal_points), + self._newxmin - 5, + tick, + (1.0, 0.5), + ) + + if ticksx is None: + for tick in subticksxrenorm: + draw_line( + self._plotbitmap, + tick, + self._newymin, + tick, + self._newymin - self._tickheightx // 2, + 2, + ) + + if ticksy is None: + for tick in subticksyrenorm: + draw_line( + self._plotbitmap, + self._newxmin, + tick, + self._newxmin + self._tickheighty // 2, + tick, + 2, ) - for tick in subticksxrenorm: - draw_line( - self._plotbitmap, - tick, - self._newymin, - tick, - self._newymin - self._tickheightx // 2, - 2, - ) - for tick in subticksyrenorm: - draw_line( - self._plotbitmap, - self._newxmin, - tick, - self._newxmin + self._tickheighty // 2, - tick, - 2, - ) if self._tickgrid: self._draw_gridx(ticksxrenorm) @@ -369,19 +400,26 @@ def tick_params( tickcolor: int = 0xFFFFFF, tickgrid: bool = False, showtext: bool = False, + decimal_points: int = 0, ) -> None: """ Function to set ticks parameters + :param bool show_ticks: Show ticks. Defaults to `True` :param int tickx_height: X axes tick height in pixels. Defaults to 8 :param int ticky_height: Y axes tick height in pixels. Defaults to 8 :param int tickcolor: tick color in hex. Defaults to white. ``0xFFFFFF`` :param bool tickgrid: defines if the grid is to be shown. Defaults to `False` :param bool showtext: Show Axes text. Defaults to `False` + :param int decimal_points: Number of decimal points to show. Defaults to :const:`0` :return: None """ + if showtext and self.padding < 20: + raise ValueError( + "Please select a padding that allows to show the tick text" + ) self._showticks = show_ticks self._tickheightx = tickx_height @@ -389,6 +427,7 @@ def tick_params( self._plot_palette[2] = tickcolor self._tickgrid = tickgrid self._showtext = showtext + self._decimal_points = decimal_points if self._showtext: from adafruit_display_text import bitmap_label @@ -438,7 +477,7 @@ def _draw_gridy(self, ticks_data: list[int]) -> None: ) start = start + self._grid_espace + self._grid_lenght - def update_plot(self) -> None: + def _update_plot(self) -> None: """ Function to update graph @@ -449,7 +488,14 @@ def update_plot(self) -> None: self._drawbox() def show_text( - self, text: str, x: int, y: int, anchorpoint: Tuple = (0.5, 0.0) + self, + text: str, + x: int, + y: int, + anchorpoint: Tuple = (0.5, 0.0), + text_color: Optional[int] = None, + free_text: bool = False, + font=None, ) -> None: """ @@ -458,17 +504,38 @@ def show_text( :param int x: x coordinate :param int y: y coordinate :param Tuple anchorpoint: Display_text anchor point. Defaults to (0.5, 0.0) + :param int color: text color. Defaults to None + :param bool free_text: Select to show free text + :param font: font to be used. Defaults to None :return: None """ - if self._showtext: - text_toplot = self.bitmap_label.Label(terminalio.FONT, text=text, x=x, y=y) + if font is None: + font = terminalio.FONT + try: + self.bitmap_label + except AttributeError: + from adafruit_display_text import bitmap_label + + self.bitmap_label = bitmap_label + + if text_color is None: + text_color = self._plot_palette[2] + + if self._showtext or free_text: + text_toplot = self.bitmap_label.Label( + font, text=text, x=x, y=y, color=text_color + ) text_toplot.anchor_point = anchorpoint text_toplot.anchored_position = (x, y) self.append(text_toplot) -# pylint: disable=missing-class-docstring, too-few-public-methods, invalid-name +# pylint: disable=too-few-public-methods, invalid-name class color: + """ + Class to define colors in HEX + """ + WHITE = 0xFFFFFF BLACK = 0x000000 RED = 0xFF0000 @@ -479,3 +546,10 @@ class color: ORANGE = 0xFF9933 TEAL = 0x158FAD GRAY = 0x808080 + PINK = 0xFF40C0 + LIGHT_GRAY = 0xAAAAAA + BROWN = 0xCA801D + DARK_GREEN = 0x008700 + TURQUOISE = 0x00C0C0 + DARK_BLUE = 0x0000AA + DARK_RED = 0x800000 diff --git a/circuitpython_uplot/polar.py b/circuitpython_uplot/polar.py new file mode 100644 index 0000000..c4ab576 --- /dev/null +++ b/circuitpython_uplot/polar.py @@ -0,0 +1,156 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +""" + +`polar` +================================================================================ + +CircuitPython Polar graph + +* Author(s): Jose D. Montoya + + +""" +try: + from typing import Optional, Union + from circuitpython_uplot.plot import Plot +except ImportError: + pass +from bitmaptools import draw_line, draw_circle +from ulab import numpy as np + +__version__ = "0.11.0" +__repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" + + +# pylint: disable=dangerous-default-value +class Polar: + """ + Class to draw polar plots + """ + + def __init__( + self, + plot: Plot, + radius: Union[list, np.linspace, np.ndarray], + theta: Union[list, np.linspace, np.ndarray], + rangex: Optional[list] = None, + rangey: Optional[list] = None, + line_color: Optional[int] = None, + polar_plot_line_color: int = 0x647182, + nudge: bool = True, + radius_ticks: list = [1.0, 2.0], + ) -> None: + """ + + :param Plot plot: Plot object for the scatter to be drawn + :param list|ulab.numpy.linspace|ulab.numpy.ndarray radius: radius points + :param list|ulab.numpy.linspace|ulab.numpy.ndarray theta: theta points + :param list|None rangex: x range limits. Defaults to None + :param list|None rangey: y range limits. Defaults to None + :param int|None line_color: line color. Defaults to None + :param bool fill: Show the filling. Defaults to `False` + :param bool nudge: moves the graph a little for better displaying. Defaults to `True` + + """ + + angles_list = [45, 90, 135, 180, 225, 270, 315, 360] + angles = np.ndarray(angles_list, dtype=np.int16) + + self.angle_radians = np.radians(angles) + self._color_index = plot._index_colorused + 1 + + if line_color is not None: + plot._plot_palette[plot._index_colorused] = line_color + + plot._plot_palette[self._color_index] = polar_plot_line_color + + if nudge: + nudge_factor = 1 + else: + nudge_factor = 0 + + if rangex is None: + xmin = np.min(radius) - nudge_factor * ( + abs(np.max(radius) - np.min(radius)) / 10 + ) + xmax = np.max(radius) + nudge_factor * ( + abs(np.max(radius) - np.min(radius)) / 10 + ) + else: + xmin = min(rangex) + xmax = max(rangex) + + if rangey is None: + ymin = np.min(theta) - nudge_factor * ( + abs(np.max(theta) - np.min(theta)) / 10 + ) + ymax = np.max(theta) + nudge_factor * ( + abs(np.max(theta) - np.min(theta)) / 10 + ) + else: + ymin = min(rangey) + ymax = max(rangey) + + xnorm = np.array( + plot.transform( + xmin, + xmax, + plot._newxmin, + plot._newxmax, + np.cos(np.array(radius)) * np.array(theta), + ), + dtype=np.int16, + ) + ynorm = np.array( + plot.transform( + ymin, + ymax, + plot._newymin, + plot._newymax, + np.sin(np.array(radius)) * np.array(theta), + ), + dtype=np.int16, + ) + + rnorm = np.array( + plot.transform( + 0, xmax, plot._newxmin, plot._newxmax, np.array(radius_ticks) + ), + dtype=np.int16, + ) + + self.originx = int(plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, 0)) + self.originy = int(plot.transform(ymin, ymax, plot._newymin, plot._newymax, 0)) + + for index, _ in enumerate(xnorm): + if index + 1 >= len(xnorm): + break + if theta[index] >= ymax: + continue + draw_line( + plot._plotbitmap, + xnorm[index], + ynorm[index], + xnorm[index + 1], + ynorm[index + 1], + plot._index_colorused, + ) + for radius_norm in rnorm: + draw_circle( + plot._plotbitmap, + self.originx, + self.originy, + radius_norm // 2, + self._color_index, + ) + + for element in self.angle_radians: + x = self.originx + int(np.cos(element) * rnorm[-1] // 2) + y = self.originy + int(np.sin(element) * rnorm[-1] // 2) + + draw_line( + plot._plotbitmap, self.originx, self.originy, x, y, self._color_index + ) diff --git a/circuitpython_uplot/scatter.py b/circuitpython_uplot/scatter.py new file mode 100644 index 0000000..220d755 --- /dev/null +++ b/circuitpython_uplot/scatter.py @@ -0,0 +1,186 @@ +# SPDX-FileCopyrightText: 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + + +""" + +`scatter` +================================================================================ + +CircuitPython scatter graph + +* Author(s): Jose D. Montoya + + +""" +try: + from typing import Optional, Union + from circuitpython_uplot.plot import Plot +except ImportError: + pass + + +from ulab import numpy as np +import displayio +from vectorio import Circle, Polygon + +__version__ = "0.0.0+auto.0" +__repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" + + +_TRIANGLE = [(0, 0), (8, 0), (4, -7)] +_SQUARE = [(0, 0), (6, 0), (6, -6), (0, -6)] +_DIAMOND = [(0, 0), (3, -4), (6, 0), (3, 4)] + + +class Scatter: + """ + Main class to display different graphics + """ + + def __init__( + self, + plot: Plot, + x: Union[list, np.linspace, np.ndarray], + y: Union[list, np.linspace, np.ndarray], + rangex: Optional[list] = None, + rangey: Optional[list] = None, + radius: Optional[Union[list, int]] = 3, + pointer_color: int = 0xFF905D, + pointer: Optional[str] = None, + nudge: bool = True, + ) -> None: + """ + + :param plot: Plot object for the scatter to be drawn + :param x: x points coordinates + :param y: y points coordinates + :param list|None rangex: x range limits + :param list|None rangey: y range limits + :param int|list radius: circle radius + :param int pointer_color: pointer color. Default is 0xFF905D + :param str|None pointer: pointer shape. + :param bool nudge: moves the graph a little for better displaying + + """ + if nudge: + nudge_factor = 1 + else: + nudge_factor = 0 + + if pointer is None: + self._pointer = "circle" + else: + self._pointer = pointer + + self._radius = radius + self._pointer_color = pointer_color + + if isinstance(self._radius, list) and self._pointer != "circle": + raise ValueError( + f"Pointer paramater is {self._pointer}. Variable Radius are not accepted" + ) + + if rangex is None: + xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) + else: + xmin = min(rangex) + xmax = max(rangex) + + if rangey is None: + ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) + else: + ymin = min(rangey) + ymax = max(rangey) + + x = np.array(x) + y = np.array(y) + + self._xnorm = np.array( + plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, x), + dtype=np.int16, + ) + self._ynorm = np.array( + plot.transform(ymin, ymax, plot._newymin, plot._newymax, y), + dtype=np.int16, + ) + + self._draw_pointer(plot) + + if plot._scatterfirst: + if plot._showticks: + plot._draw_ticks(x, y) + + plot._scatterfirst = False + plot._showticks = False + + def _draw_pointer(self, plot: Plot) -> None: + """ + + :param plot: Plot object for the scatter to be drawn + + """ + palette = displayio.Palette(1) + palette[0] = self._pointer_color + if isinstance(self._radius, list): + for i, _ in enumerate(self._xnorm): + plot.append( + Circle( + pixel_shader=palette, + radius=self._radius[i], + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + else: + for i, _ in enumerate(self._xnorm): + if self._pointer == "circle": + plot.append( + Circle( + pixel_shader=palette, + radius=self._radius, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "triangle": + plot.append( + Polygon( + points=_TRIANGLE, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "square": + plot.append( + Polygon( + points=_SQUARE, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + elif self._pointer == "diamond": + plot.append( + Polygon( + points=_DIAMOND, + pixel_shader=palette, + x=self._xnorm[i], + y=self._ynorm[i], + ) + ) + + +class Pointer: + """ + Pointer container class + """ + + CIRCLE = "circle" + TRIANGLE = "triangle" + SQUARE = "square" + DIAMOND = "diamond" diff --git a/circuitpython_uplot/shade.py b/circuitpython_uplot/shade.py index 5034198..4e7aca3 100644 --- a/circuitpython_uplot/shade.py +++ b/circuitpython_uplot/shade.py @@ -7,7 +7,7 @@ `shade` ================================================================================ -CircuitPython shade utility for uPlot. +CircuitPython shade utility for Plotting. * Author(s): Jose D. Montoya @@ -15,7 +15,7 @@ """ try: from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from ulab import numpy as np @@ -33,7 +33,7 @@ class shade: def __init__( self, - plot: Uplot, + plot: Plot, x: Union[list, np.linspace, np.ndarray], y1: list, y2: list, @@ -43,7 +43,7 @@ def __init__( nudge: bool = True, ) -> None: """ - :param Uplot plot: Plot object for the scatter to be drawn + :param Plot plot: Plot object for the scatter to be drawn :param list|ulab.numpy.linspace|ulab.numpy.ndarray x: x points coordinates :param list y1: y1 points coordinates :param list y2: y2 points coordinates @@ -100,7 +100,7 @@ def __init__( plot._plotbitmap, min(xnorm), min(y1norm), - max(xnorm), + max(xnorm) + 1, max(y2norm), plot._index_colorused, ) diff --git a/circuitpython_uplot/usvg.py b/circuitpython_uplot/svg.py similarity index 82% rename from circuitpython_uplot/usvg.py rename to circuitpython_uplot/svg.py index 2cee46b..a4b4a28 100644 --- a/circuitpython_uplot/usvg.py +++ b/circuitpython_uplot/svg.py @@ -4,7 +4,7 @@ """ -`usvg` +`svg` ================================================================================ CircuitPython svg icon utility for CircuitPython_uplot @@ -14,7 +14,7 @@ """ try: - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot except ImportError: pass from bitmaptools import draw_line @@ -24,16 +24,14 @@ __repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" -# pylint: disable=too-many-arguments, invalid-name, no-self-use, too-few-public-methods -# pylint: disable=too-many-locals, too-many-branches, protected-access, unnecessary-list-index-lookup -class usvg: +class SVG: """ class to render svg images in the plot area """ def __init__( self, - plot: Uplot, + plot: Plot, icon: dict, x: int, y: int, @@ -42,7 +40,7 @@ def __init__( ) -> None: """ - :param Uplot plot: Plot object for the log to be drawn + :param Plot plot: Plot object for the log to be drawn :param dictionary icon: icon dictionary :param int x: x position for the svg image :param int y: y position for the svg image diff --git a/circuitpython_uplot/uscatter.py b/circuitpython_uplot/uscatter.py deleted file mode 100644 index 64fdb93..0000000 --- a/circuitpython_uplot/uscatter.py +++ /dev/null @@ -1,108 +0,0 @@ -# SPDX-FileCopyrightText: 2023 Jose D. Montoya -# -# SPDX-License-Identifier: MIT - - -""" - -`uscatter` -================================================================================ - -CircuitPython scatter graph - -* Author(s): Jose D. Montoya - - -""" -try: - from typing import Optional, Union - from circuitpython_uplot.uplot import Uplot -except ImportError: - pass - - -from ulab import numpy as np -import displayio -from vectorio import Circle - -__version__ = "0.0.0+auto.0" -__repo__ = "https://github.com/adafruit/CircuitPython_uplot.git" - - -# pylint: disable=too-few-public-methods, invalid-name, duplicate-code, too-many-locals, too-many-arguments -class uscatter: - """ - Main class to display different graphics - """ - - def __init__( - self, - plot: Uplot, - x: Union[list, np.linspace, np.ndarray], - y: Union[list, np.linspace, np.ndarray], - rangex: Optional[list] = None, - rangey: Optional[list] = None, - radius: Optional[Union[list, int]] = 3, - circle_color: int = 0xFF905D, - nudge: bool = True, - ) -> None: - """ - - :param plot: Plot object for the scatter to be drawn - :param x: x points coordinates - :param y: y points coordinates - :param list|None rangex: x range limits - :param list|None rangey: y range limits - :param int|list radius: circle radius - :param bool nudge: moves the graph a little for better displaying - - """ - if nudge: - nudge_factor = 1 - else: - nudge_factor = 0 - - if rangex is None: - xmin = np.min(x) - nudge_factor * (abs(np.max(x) - np.min(x)) / 10) - xmax = np.max(x) + nudge_factor * (abs(np.max(x) - np.min(x)) / 10) - else: - xmin = min(rangex) - xmax = max(rangex) - - if rangey is None: - ymin = np.min(y) - nudge_factor * (abs(np.max(y) - np.min(y)) / 10) - ymax = np.max(y) + nudge_factor * (abs(np.max(y) - np.min(y)) / 10) - else: - ymin = min(rangey) - ymax = max(rangey) - - x = np.array(x) - y = np.array(y) - - xnorm = np.array( - plot.transform(xmin, xmax, plot._newxmin, plot._newxmax, x), - dtype=np.int16, - ) - ynorm = np.array( - plot.transform(ymin, ymax, plot._newymin, plot._newymax, y), - dtype=np.int16, - ) - - palette = displayio.Palette(1) - palette[0] = circle_color - - if isinstance(radius, list): - for i, _ in enumerate(x): - plot.append( - Circle( - pixel_shader=palette, radius=radius[i], x=xnorm[i], y=ynorm[i] - ) - ) - else: - for i, _ in enumerate(x): - plot.append( - Circle(pixel_shader=palette, radius=radius, x=xnorm[i], y=ynorm[i]) - ) - - if plot._showticks: - plot._draw_ticks(x, y) diff --git a/docs/uplot_3DBars.jpg b/docs/3DBars.jpg similarity index 100% rename from docs/uplot_3DBars.jpg rename to docs/3DBars.jpg diff --git a/docs/api.rst b/docs/api.rst index 5b85315..b16d5d0 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,32 +1,35 @@ -Uplot Library -============== +Microplot Library +====================== -.. automodule:: circuitpython_uplot.uplot +.. automodule:: circuitpython_uplot.plot :members: -.. automodule:: circuitpython_uplot.uscatter +.. automodule:: circuitpython_uplot.scatter :members: -.. automodule:: circuitpython_uplot.ubar +.. automodule:: circuitpython_uplot.bar :members: -.. automodule:: circuitpython_uplot.upie +.. automodule:: circuitpython_uplot.pie :members: -.. automodule:: circuitpython_uplot.ucartesian +.. automodule:: circuitpython_uplot.cartesian :members: -.. automodule:: circuitpython_uplot.ufillbetween +.. automodule:: circuitpython_uplot.fillbetween :members: -.. automodule:: circuitpython_uplot.umap +.. automodule:: circuitpython_uplot.map :members: -.. automodule:: circuitpython_uplot.ulogging +.. automodule:: circuitpython_uplot.logging :members: -.. automodule:: circuitpython_uplot.usvg +.. automodule:: circuitpython_uplot.svg :members: .. automodule:: circuitpython_uplot.shade :members: + +.. automodule:: circuitpython_uplot.polar + :members: diff --git a/docs/uplot_ex8.jpg b/docs/bar_example.jpg similarity index 100% rename from docs/uplot_ex8.jpg rename to docs/bar_example.jpg diff --git a/docs/boxes_types.png b/docs/boxes_types.png new file mode 100644 index 0000000..73e5e66 Binary files /dev/null and b/docs/boxes_types.png differ diff --git a/docs/uplot_ex11.jpg b/docs/cartesian_advance.jpg similarity index 100% rename from docs/uplot_ex11.jpg rename to docs/cartesian_advance.jpg diff --git a/docs/cartesian_fill.jpg b/docs/cartesian_fill.jpg new file mode 100644 index 0000000..787e698 Binary files /dev/null and b/docs/cartesian_fill.jpg differ diff --git a/docs/uplot_cartesian.gif b/docs/cartesian_logging_data.gif similarity index 100% rename from docs/uplot_cartesian.gif rename to docs/cartesian_logging_data.gif diff --git a/docs/cartesian_scatter_polyfit.jpg b/docs/cartesian_scatter_polyfit.jpg new file mode 100644 index 0000000..30cdfe4 Binary files /dev/null and b/docs/cartesian_scatter_polyfit.jpg differ diff --git a/docs/cartesian_trig_functions.jpg b/docs/cartesian_trig_functions.jpg new file mode 100644 index 0000000..734e245 Binary files /dev/null and b/docs/cartesian_trig_functions.jpg differ diff --git a/docs/colors.png b/docs/colors.png new file mode 100644 index 0000000..d8e9a0a Binary files /dev/null and b/docs/colors.png differ diff --git a/docs/conf.py b/docs/conf.py index 9c7c2b2..c5bcb16 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,7 +42,7 @@ source_suffix = ".rst" master_doc = "index" # General information about the project. -project = "CircuitPython uplot Library" +project = "CircuitPython microplot Library" creation_year = "2023" current_year = str(datetime.datetime.now().year) year_duration = ( @@ -89,17 +89,10 @@ # on_rtd = os.environ.get("READTHEDOCS", None) == "True" -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] - except: - html_theme = "default" - html_theme_path = ["."] -else: - html_theme_path = ["."] +import sphinx_rtd_theme + +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/docs/uplot_ex6.jpg b/docs/display_shapes.jpg similarity index 100% rename from docs/uplot_ex6.jpg rename to docs/display_shapes.jpg diff --git a/docs/examples.rst b/docs/examples.rst index 4f24965..b67ce1b 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,243 +1,343 @@ +================= +Plot Examples +================= + Simple test ------------ Ensure your device works with this simple test. -.. literalinclude:: ../examples/uplot_simpletest.py - :caption: examples/uplot_simpletest.py +.. literalinclude:: ../examples/plot_simpletest.py + :caption: examples/plot_simpletest.py :lines: 5- -.. image:: ../docs/uplot_ex1.jpg +.. image:: ../docs/plot_simple_test.jpg Plot Example ------------- Plot some data for x and y -.. literalinclude:: ../examples/uplot_plot_example.py - :caption: examples/uplot_plot_example.py +.. literalinclude:: ../examples/plot_example.py + :caption: examples/plot_example.py :lines: 5- -.. image:: ../docs/uplot_ex4.jpg +.. image:: ../docs/plot_example.jpg Tick Parameters Settings Example ---------------------------------- Setting up the ticks parameters -.. literalinclude:: ../examples/uplot_tickparameters.py - :caption: examples/uplot_tickparameters.py +.. literalinclude:: ../examples/tickparameters.py + :caption: examples/tickparameters.py :lines: 5- -.. image:: ../docs/uplot_ex3.jpg +.. image:: ../docs/tickparameters.jpg Integration Example ------------------- Example showing different graphics elements integration -.. literalinclude:: ../examples/uplot_integration_example.py - :caption: examples/uplot_integration_example.py +.. literalinclude:: ../examples/integration_example.py + :caption: examples/integration_example.py :lines: 5- -.. image:: ../docs/uplot_ex5.jpg +.. image:: ../docs/integration_example.jpg + +================== +Scatter examples +================== Scatter Example ------------------- Scatter plot Example -.. literalinclude:: ../examples/uplot_uscatter.py - :caption: examples/uplot_uscatter.py +.. literalinclude:: ../examples/scatter.py + :caption: examples/scatter.py :lines: 5- -.. image:: ../docs/uplot_ex7.jpg +.. image:: ../docs/scatter.jpg -Display_shapes Example ------------------------ +Scatter Circle Pointers with diferent Radius +--------------------------------------------- -Display Shapes integration example +Example showing how to use different radius in the circle pointers -.. literalinclude:: ../examples/uplot_display_shapes.py - :caption: examples/uplot_display_shapes.py +.. literalinclude:: ../examples/scatter_circle_radius.py + :caption: examples/scatter_circle_radius.py :lines: 5- -.. image:: ../docs/uplot_ex6.jpg +.. image:: ../docs/scatter_circle_radius.jpg -Ubar Example ----------------- +Scatter Pointers Example +---------------------------- -ubar example +Example showing how to use different pointers -.. literalinclude:: ../examples/uplot_ubar_example.py - :caption: examples/uplot_ubar_example.py +.. literalinclude:: ../examples/scatter.py + :caption: examples/scatter.py :lines: 5- -.. image:: ../docs/uplot_ex8.jpg +.. image:: ../docs/scatter_pointers.jpg -Ubar Scale Example ---------------------- +Scatter using different datasets +---------------------------------- -Bar plot example showing how to use the scale +Example showing how to use different datasets -.. literalinclude:: ../examples/uplot_ubar_scale_example.py - :caption: examples/uplot_ubar_scale_example.py +.. literalinclude:: ../examples/scatter_using_different_datasets.py + :caption: examples/scatter_using_different_datasets.py :lines: 5- -.. image:: ../docs/bar_scale.jpg +.. image:: ../docs/scatter_using_different_datasets.jpg +================== +Cartesian examples +================== -Ubar Color Palette Example ----------------------------- +Cartesian and Scatter Example +------------------------------ -Bar plot example showing how to pass a user color Palette +Example showing how to use cartesian and scatter in the same plot -.. literalinclude:: ../examples/uplot_ubar_colorpalette.py - :caption: examples/uplot_ubar_colorpalette.py +.. literalinclude:: ../examples/cartersian_and_scatter_polyfit_example.py + :caption: examples/cartersian_and_scatter_polyfit_example.py :lines: 5- -.. image:: ../docs/bar_palette.jpg +.. image:: ../docs/cartesian_scatter_polyfit.jpg +Plot Line Style Example +--------------------------- -Bar plot updating values Example ---------------------------------- +Plot some data for x and y with different line styles -Bar Plot example showing how to update values for a filled bars bar plot +.. literalinclude:: ../examples/plot_line_styles.py + :caption: examples/plot_line_styles.py + :lines: 5- +.. image:: ../docs/line_style.jpg + +Cartesian fill Example +--------------------------- -.. literalinclude:: ../examples/uplot_ubar_updating_values.py - :caption: examples/uplot_ubar_updating_values.py +Cartesian fill example + +.. literalinclude:: ../examples/cartesian_fill.py + :caption: examples/cartesian_fill.py :lines: 5- +.. image:: ../docs/cartesian_fill.jpg -Bar plot updating bar colors Example -------------------------------------- +Cartesian Advanced Example +--------------------------- -Bar Plot example showing how to update colors for a filled bars bar plot +Showing the ability to display to graphs in the same plot with different colors -.. literalinclude:: ../examples/uplot_ubar_color_changing.py - :caption: examples/uplot_ubar_color_changing.py +.. literalinclude:: ../examples/cartesian_advanced.py + :caption: examples/cartesian_advanced.py :lines: 5- +.. image:: ../docs/cartesian_advance.jpg +Cartesian Table Example +--------------------------- -Ubar 3D Example ----------------- +Example showing how to add a data table to the plot + +.. literalinclude:: ../examples/cartesian_table.py + :caption: examples/cartesian_table.py + :lines: 5- + +Lissajous Curves Example +--------------------------- -ubar 3D example +Example showing how to draw lissajous curves -.. literalinclude:: ../examples/uplot_ubar_3Dbars.py - :caption: examples/uplot_ubar_3Dbars.py +.. literalinclude:: ../examples/lissajous_curves.py + :caption: examples/lissajous_curves.py :lines: 5- -.. image:: ../docs/uplot_3DBars.jpg +.. image:: ../docs/lissajous.jpg -Upie Example ----------------- +Cartesian Polar Plots Example +-------------------------------- -upie example +Example showing how to draw polar plots using Cartesian -.. literalinclude:: ../examples/uplot_upie_example.py - :caption: examples/uplot_upie_example.py +.. literalinclude:: ../examples/polar_plots.py + :caption: examples/polar_plots.py :lines: 5- -.. image:: ../docs/uplot_ex9.jpg +.. image:: ../docs/polar_plots.jpg -Cartesian Advanced Example ---------------------------- +Cartesian Trigonometric Plots Example +-------------------------------------- -Showing the ability to display to graphs in the same plot with different colors +Example showing how to draw Trigonometrics plots using Cartesian -.. literalinclude:: ../examples/uplot_ucartesian_advanced.py - :caption: examples/uplot_ucartesian_advanced.py +.. literalinclude:: ../examples/cartesian_trig_functions.py + :caption: examples/cartesian_trig_functions.py :lines: 5- -.. image:: ../docs/uplot_ex11.jpg +.. image:: ../docs/cartesian_trig_functions.jpg -Cartesian Table Example + +Cartesian Animation Example --------------------------- -Example showing how to add a data table to the plot +Cartesian animation example -.. literalinclude:: ../examples/uplot_ucartesian_table.py - :caption: examples/uplot_ucartesian_table.py +.. literalinclude:: ../examples/cartesian_logging_data.py + :caption: examples/cartesian_logging_data.py :lines: 5- +.. image:: ../docs/cartesian_logging_data.gif -Lissajous Curves Example + +Cartesian Koch Snowflake --------------------------- -Example showing how to draw lissajous curves +Cartesian koch snowflake example -.. literalinclude:: ../examples/uplot_lissajous_curves.py - :caption: examples/uplot_lissajous_curves.py +.. literalinclude:: ../examples/cartesian_koch.py + :caption: examples/cartesian_koch.py :lines: 5- -.. image:: ../docs/uplot_lissajous.jpg +.. image:: ../docs/koch.jpg -Stackplot Example +Cartesian Koch Curve --------------------------- -Stackplot simple example +Cartesian koch curve example -.. literalinclude:: ../examples/uplot_stackplot.py - :caption: examples/uplot_stackplot.py - :lines: 8- -.. image:: ../docs/uplot_ex12.jpg +.. literalinclude:: ../examples/cartesian_koch_2.py + :caption: examples/cartesian_koch_2.py + :lines: 5- +.. image:: ../docs/koch2.jpg -Advanced Example ---------------------------- +================== +Bar Examples +================== + +Bar Example +---------------- -plot different ulements in a single display +Bar example -.. literalinclude:: ../examples/uplot_readme_example.py - :caption: examples/uplot_readme_example.py +.. literalinclude:: ../examples/bar_example.py + :caption: examples/bar_example.py :lines: 5- -.. image:: ../docs/readme.png +.. image:: ../docs/bar_example.jpg -Ufillbetween Example ---------------------------- +Bar Scale Example +--------------------- -example of ufillbetween plot +Bar plot example showing how to use the scale -.. literalinclude:: ../examples/uplot_ufillbetween.py - :caption: examples/uplot_ufillbetween.py +.. literalinclude:: ../examples/bar_scale_example.py + :caption: examples/bar_scale_example.py :lines: 5- -.. image:: ../docs/uplot_ex15.jpg +.. image:: ../docs/bar_scale.jpg -Uboxplot Example ---------------------------- -example of uboxplot integration with uplot +Bar Color Palette Example +---------------------------- -.. literalinclude:: ../examples/uplot_uboxplot.py - :caption: examples/uplot_uboxplot.py - :lines: 8- -.. image:: ../docs/uplot_ex16.jpg +Bar plot example showing how to pass a user color Palette + +.. literalinclude:: ../examples/bar_colorpalette.py + :caption: examples/bar_colorpalette.py + :lines: 5- +.. image:: ../docs/bar_palette.jpg -Umap Example ---------------------------- -umap simple example +Bar plot updating values Example +--------------------------------- -.. literalinclude:: ../examples/uplot_umap.py - :caption: examples/uplot_umap.py +Bar Plot example showing how to update values for a filled bars bar plot + +.. literalinclude:: ../examples/bar_updating_values.py + :caption: examples/bar_updating_values.py :lines: 5- -.. image:: ../docs/uplot_ex17.jpg -Sparkline Animation Example +Bar plot updating bar colors Example +------------------------------------- + +Bar Plot example showing how to update colors for a filled bars bar plot + +.. literalinclude:: ../examples/bar_color_changing.py + :caption: examples/bar_color_changing.py + :lines: 5- + + +Bar 3D Example +---------------- + +Bar 3D example + +.. literalinclude:: ../examples/bar_3Dbars.py + :caption: examples/bar_3Dbars.py + :lines: 5- +.. image:: ../docs/3DBars.jpg + +================ +Pie Examples +================ + +Pie Example +---------------- + +Pie example + +.. literalinclude:: ../examples/pie_example.py + :caption: examples/pie_example.py + :lines: 5- +.. image:: ../docs/pie.jpg + +=================== +Stackplot Examples +=================== + +Stackplot Example --------------------------- -Sparkline animation example +Stackplot simple example + +.. literalinclude:: ../examples/stackplot.py + :caption: examples/stackplot.py + :lines: 8- +.. image:: ../docs/stackplot_example.jpg + +==================== +Fillbetween Examples +==================== -.. literalinclude:: ../examples/uplot_sparkline.py - :caption: examples/uplot_sparkline.py +Fillbetween Example +--------------------------- + +Example of fillbetween plot + +.. literalinclude:: ../examples/fillbetween.py + :caption: examples/fillbetween.py :lines: 5- +.. image:: ../docs/fillbetween_example.jpg -Cartesian Animation Example +==================== +Map Examples +==================== + +Map Example --------------------------- -Cartesian animation example +map simple example -.. literalinclude:: ../examples/uplot_ucartesian_loggin_data.py - :caption: examples/uplot_ucartesian_loggin_data.py +.. literalinclude:: ../examples/map.py + :caption: examples/map.py :lines: 5- -.. image:: ../docs/uplot_cartesian.gif +.. image:: ../docs/map.jpg + + +==================== +Logging Examples +==================== Logging Example --------------------------- Logging example -.. literalinclude:: ../examples/uplot_ulogging.py - :caption: examples/uplot_ulogging.py +.. literalinclude:: ../examples/logging.py + :caption: examples/logging.py :lines: 5- Logging Fill Example @@ -245,10 +345,10 @@ Logging Fill Example Logging fill example -.. literalinclude:: ../examples/uplot_logging_fill.py - :caption: examples/uplot_logging_fill.py +.. literalinclude:: ../examples/logging_fill.py + :caption: examples/logging_fill.py :lines: 5- -.. image:: ../docs/uplot_ex22.jpg +.. image:: ../docs/logging_fill.jpg Logging Changing Values Example @@ -256,8 +356,8 @@ Logging Changing Values Example This example shows how to redraw new_values in the same plot -.. literalinclude:: ../examples/uplot_logging_changing_values.py - :caption: examples/uplot_logging_changing_values.py +.. literalinclude:: ../examples/logging_changing_values.py + :caption: examples/logging_changing_values.py :lines: 5- Logging with Table Example @@ -265,8 +365,8 @@ Logging with Table Example This example shows how to add a data table to the plot -.. literalinclude:: ../examples/uplot_logging_table.py - :caption: examples/uplot_logging_table.py +.. literalinclude:: ../examples/logging_table.py + :caption: examples/logging_table.py :lines: 10- .. image:: ../docs/logging_table.jpg @@ -276,26 +376,121 @@ Logging Animation Example This example shows how to animate a plot -.. literalinclude:: ../examples/uplot_ulogging_animation.py - :caption: examples/uplot_ulogging_animation.py +.. literalinclude:: ../examples/logging_animation.py + :caption: examples/logging_animation.py + :lines: 5- + +Logging Animation Example +--------------------------------------- + +This example shows how to add limits to our plot + +.. literalinclude:: ../examples/logging_limits.py + :caption: examples/logging_limits.py + :lines: 5- +.. image:: ../docs/logging_limits.jpg + + +Logging with Dial Gauge Library +--------------------------------------- + +This example shows how to add limits to our plot + +.. literalinclude:: ../examples/logging_with_dial_gauge.py + :caption: examples/logging_with_dial_gauge.py :lines: 5- +.. image:: ../docs/logging_dial.jpg + +==================== +SVG Examples +==================== SVG Images examples --------------------------- SVG Images example -.. literalinclude:: ../examples/uplot_usvg_example.py - :caption: examples/uplot_usvg_example.py +.. literalinclude:: ../examples/svg_example.py + :caption: examples/svg_example.py :lines: 5- -.. image:: ../docs/uplot_ex23.jpg +.. image:: ../docs/svg.jpg + +==================== +Shade Examples +==================== Shade examples --------------------------- Shade example -.. literalinclude:: ../examples/uplot_shade_example.py - :caption: examples/uplot_shade_example.py +.. literalinclude:: ../examples/shade_example.py + :caption: examples/shade_example.py + :lines: 5- +.. image:: ../docs/shade.jpg + +==================== +Polar Plot Examples +==================== + +Polar example +--------------------------- + +Show how to use the Polar Plot + +.. literalinclude:: ../examples/polar_example.py + :caption: examples/polar_example.py + :lines: 5- +.. image:: ../docs/polar_example.jpg + +Polar Advanced Example +--------------------------- + +Polar Advanced example + +.. literalinclude:: ../examples/polar_advanced.py + :caption: examples/polar_advanced.py + :lines: 5- +.. image:: ../docs/polar_advanced.jpg + +================== +Others +================== +Sparkline Animation Example +--------------------------- + +Sparkline animation example + +.. literalinclude:: ../examples/sparkline.py + :caption: examples/sparkline.py :lines: 5- -.. image:: ../docs/uplot_shade.jpg + +Display_shapes Example +----------------------- + +Display Shapes integration example + +.. literalinclude:: ../examples/display_shapes.py + :caption: examples/display_shapes.py + :lines: 5- +.. image:: ../docs/display_shapes.jpg + +Advanced Example +--------------------------- + +plot different elements in a single display + +.. literalinclude:: ../examples/readme_example.py + :caption: examples/readme_example.py + :lines: 5- +.. image:: ../docs/readme.png + +Uboxplot Example +--------------------------- + +example of uboxplot integration in a plot + +.. literalinclude:: ../examples/uboxplot_example.py + :caption: examples/uboxplot_example.py + :lines: 8- +.. image:: ../docs/uboxplot_example.jpg diff --git a/docs/uplot_ex15.jpg b/docs/fillbetween_example.jpg similarity index 100% rename from docs/uplot_ex15.jpg rename to docs/fillbetween_example.jpg diff --git a/docs/grid_text.png b/docs/grid_text.png new file mode 100644 index 0000000..4ad9cd7 Binary files /dev/null and b/docs/grid_text.png differ diff --git a/docs/index.rst b/docs/index.rst index 8b4e797..c2bc3ca 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,17 +1,17 @@ :orphan: -.. title:: uplot documentation +.. title:: microplot documentation .. module:: uplot -################### -uplot documentation -################### +######################### +Microplot documentation +######################### Framework to display different plots in displayio. Similar to widget Take a look in the `examples `_ section in RTD to see the gallery -uplot is to be used with CircuitPython as some of the behind the curtains methods are +microplot is to be used with CircuitPython as some of the behind the curtains methods are in the CircuitPython core and could differ from MicroPython or Python diff --git a/docs/uplot_ex5.jpg b/docs/integration_example.jpg similarity index 100% rename from docs/uplot_ex5.jpg rename to docs/integration_example.jpg diff --git a/docs/koch.jpg b/docs/koch.jpg new file mode 100644 index 0000000..24bc8d8 Binary files /dev/null and b/docs/koch.jpg differ diff --git a/docs/koch2.jpg b/docs/koch2.jpg new file mode 100644 index 0000000..44f9390 Binary files /dev/null and b/docs/koch2.jpg differ diff --git a/docs/line_style.jpg b/docs/line_style.jpg new file mode 100644 index 0000000..46b68d3 Binary files /dev/null and b/docs/line_style.jpg differ diff --git a/docs/uplot_lissajous.jpg b/docs/lissajous.jpg similarity index 100% rename from docs/uplot_lissajous.jpg rename to docs/lissajous.jpg diff --git a/docs/logging_dial.jpg b/docs/logging_dial.jpg new file mode 100644 index 0000000..b696816 Binary files /dev/null and b/docs/logging_dial.jpg differ diff --git a/docs/uplot_ex22.jpg b/docs/logging_fill.jpg similarity index 100% rename from docs/uplot_ex22.jpg rename to docs/logging_fill.jpg diff --git a/docs/logging_limits.jpg b/docs/logging_limits.jpg new file mode 100644 index 0000000..436fec5 Binary files /dev/null and b/docs/logging_limits.jpg differ diff --git a/docs/uplot_ex17.jpg b/docs/map.jpg similarity index 100% rename from docs/uplot_ex17.jpg rename to docs/map.jpg diff --git a/docs/uplot_ex9.jpg b/docs/pie.jpg similarity index 100% rename from docs/uplot_ex9.jpg rename to docs/pie.jpg diff --git a/docs/uplot_ex4.jpg b/docs/plot_example.jpg similarity index 100% rename from docs/uplot_ex4.jpg rename to docs/plot_example.jpg diff --git a/docs/uplot_ex1.jpg b/docs/plot_simple_test.jpg similarity index 100% rename from docs/uplot_ex1.jpg rename to docs/plot_simple_test.jpg diff --git a/docs/polar_advanced.jpg b/docs/polar_advanced.jpg new file mode 100644 index 0000000..21fa553 Binary files /dev/null and b/docs/polar_advanced.jpg differ diff --git a/docs/polar_example.jpg b/docs/polar_example.jpg new file mode 100644 index 0000000..1d4b577 Binary files /dev/null and b/docs/polar_example.jpg differ diff --git a/docs/polar_plots.jpg b/docs/polar_plots.jpg new file mode 100644 index 0000000..32960a9 Binary files /dev/null and b/docs/polar_plots.jpg differ diff --git a/docs/quick_start.rst b/docs/quick_start.rst index eb81584..5d19461 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -1,52 +1,53 @@ -A small tour for uplot. +A small tour explaining microplot. Plot Usage ============= -We start importing some fundamental libraries for uplot to operate +We start by importing some fundamental libraries for the plot library to operate + .. code-block:: python import board - import displayio - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.plot import Plot -For reference, screen in CircuitPython are defined from left to right and up to bottom. This means -that our (x=0, y=0) will be in the left upper corner of the screen. -For boards or feather with a integrated screen the following statement will initiate the scree +For reference, screens in CircuitPython are defined from left to right and top to bottom. This means +that our (x=0, y=0) coordinates would be in the left upper corner of the screen. +For boards or feathers with an integrated screen the following statement will initiate the screen .. code-block:: python display = board.DISPLAY -For other displays please consult the right support library +For other displays please consult their support library -We add the plot area. in this case we are selecting the whole screen as our plot area +After this, we are ready to add the plot area. The following code will create a plot area that will cover the whole screen. +However you can select any area of the screen. .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) -The Uplot will be used to display our graphics. The position and the size of the plot area +The plot object will be used to display our graphics. The position and the size of the plot area could vary. This allows us to have more than 1 plot at the same time in the screen. -Every one of them with different characteristics or graphs. +Each one of them can have different characteristics or graphs according to your needs. -Options available are: +Options available to customize the plot area are: * width: width of the plot area * height: height of the plot area - * backround_color: Allows to change the background color. The default is black. - * box_color: Allows to change the box color. Default is white. + * background_color: allows you to change the background color. The default is black. + * box_color: allows you to change the box color. This default is white. * padding: allows the user to give the plot area a pad. This is helpful if you are planning to include text and legends in the axes. - * scale: scale of the plot. This will allow a plot to be scaled up at a user defined rate. This is currently only available for logging and bar plots. + * scale: scale of the plot. This will allow a plot to be scaled up at a user defined rate. This is only available for logging and bar plots. -We tell the microcontroller to display our plot: +We then tell the microcontroller to display our plot: .. code-block:: python display.show(plot) -And that is it you know have a plot area to add amazing graphs! +And this is how to build a plot area to add amazing graphs! .. image:: ../docs/readme.png @@ -56,21 +57,24 @@ Good Luck! Graphics =========== -At the moment the following objects can be added to the plot area: +The following objects can be added to the plot area: * Elements in the library * Cartesian Plane - * Ufillbetween graph + * Fillbetween graph * Stackplot * Bar graph * Pie Chart * Colormap + * Polar graph + * SVG (Rudimentary support) + * Logging graph * Display_shapes library objects * Histograms from the uhistogram library * Boxplots from the uboxplot library * Individual Vectorio Objects -In a more advanced method it is possible to add directly to the plot area using the plot bitmap object +It is possible to add directly to the plot area using the plot bitmap object as shown below The following code shows an example adding a shape from the Adafruit_Display_shapes library @@ -80,10 +84,10 @@ library import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect - from circuitpython_uplot.uplot import Uplot + from circuitpython_uplot.uplot import Plot display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) roundrect = RoundRect(30, 30, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) plot.append(roundrect) display.show(plot) @@ -93,11 +97,11 @@ library Ticks and Grid =============== Plot axes are shown by default. To change this behaviour you would need -to use the correct keyword in the `Uplot.axs_params` function: +to use the correct keyword in the `Plot.axs_params` function: -.. py:function:: Uplot.axs_params(axstype: Literal["box", "cartesian", "line"] = "box") +.. py:function:: Plot.axs_params(axstype = "box") - :param axstype: Option to display the axes + :param axstype: Option to display the axes. Defaults to "box" Options available are: * box : draws a box @@ -108,22 +112,32 @@ The following snippet shows how to create a cartesian plot .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) plot.axs_params(axstype="cartesian") -Tick spacing and numbers are selected by default. However it's possible to customize -the following parameters: +.. image:: ../docs/boxes_types.png -.. py:function:: Uplot.tick_params(tickx_height, ticky_height, tickcolor, tickgrid) +Tick spacing and numbers are selected and calculated by default. In Cartesian and Logging Plots you can select the ticks to +show in the plot. For other plots, it is possible to customize the following parameters: +.. py:function:: Plot.tick_params(showtick, tickx_height, ticky_height, tickcolor, tickgrid, showtext, decimal_points) + + :param bool showtick: displays the tick. Defaults to `True` :param int tickx_height: tickx_height in pixels :param int ticky_height: ticky_height in pixels :param int tickcolor: tickcolor in Hex format :param bool tickgrid: displays the tickgrid. Defaults to `False` + :param bool showtext: displays the tick text. Defaults to `False` + :param int decimal_points: number of decimal points to show. Defaults to :const:`0` + .. code-block:: python - plot.tick_params(tickx_height=12, tickcolor=0xFF0008) + plot.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x000000) + +.. image:: ../docs/ticks_params.png + +Be aware that ticks are not shown by default. If you want to show them you need to add a graph to the plot. Gridlines are normally ``OFF``. If you want visible gridlines then use: @@ -133,13 +147,27 @@ Gridlines are normally ``OFF``. If you want visible gridlines then use: plot.tick_params(tickgrid=True) +If you want to show the axes text, you can use: + +.. code-block:: python + + plot.tick_params(showtext=True) + +If you want to show some decimal places in the text use: + +.. code-block:: python + + plot.tick_params(decimal_points=2) + +.. image:: ../docs/grid_text.png + Colors =============== You can choose some colors directly from the library. This can be done by importing the color class: .. code-block:: python - from circuitpython_uplot.uplot import color + from circuitpython_uplot.plot import color This will allow you to use the colors in the list as color variable definitions * WHITE @@ -152,45 +180,54 @@ This will allow you to use the colors in the list as color variable definitions * ORANGE * TEAL * GRAY + * PINK + * LIGHT_GRAY + * BROWN + * DARK_GREEN + * TURQUOISE + * DARK_BLUE + * DARK_RED -.. code-block:: python - plot = Uplot(0, 0, display.width, display.height, background_color=color.WHITE, box_color=color.BLACK) +.. code-block:: python + plot = Plot(0, 0, display.width, display.height, background_color=color.WHITE, box_color=color.BLACK) +.. image:: ../docs/colors.png =========== Cartesian =========== -With the cartesian class it's possible to add (x,y) plots. You can add different (x,y) plots to the -same plot area. After you create your plot area you will need to define the xy plane -for the plot. Secondly, you will need to give some ``x`` and ``y`` data. -This data will be converted to a `ulab.numpy.ndarray`. For more information please refer -to the `ulab` library +With the cartesian class is possible to add (x,y) plots. You add it to the plot area created as explained +above. Then you will need to give some ``x`` and ``y`` data. The following code + .. code-block:: python from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ucartesian import ucartesian + from circuitpython_uplot.plot import Plot + from circuitpython_uplot.cartesian import Cartesian + display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) - x = np.linspace(-4, 4, num=25) - constant = 1.0 / np.sqrt(2 * np.pi) - y = constant * np.exp((-(x**2)) / 2.0) + x = [0, 1, 2, 3] + y = [0, 2, 4, 6] After the initial setup we add our xy plane and show our plot .. code-block:: python - ucartesian(plot, x, y) + Cartesian(plot, x, y) display.show(plot) +You can add more than one graph to the same plot. Howver, you need to define the range of the graph as the two +graphs will share the same axes. There are some parameters that you can customize: - * rangex and rangey: you could specify the ranges of your graph. Allowing you to move your graph according to your needs. This parameters only accept lists - * line color: you could specify the color in HEX + * rangex and rangey: you could specify the ranges of your graph. Allowing you to move your graph according to your needs. This parameters only accept lists. This is needed for plotting more than one curve in the plot area. + * line color: you could specify the color in HEX. Or you could use the color class as explained above. + * line style: you could specify the line style. The default is a solid line. see below for more details * fill: if you selected this as `True` the area under your graph will be filled * nudge: this parameter allows yuo to move a little bit the graph. This is useful when the data start/end in the limits of your range @@ -203,39 +240,73 @@ the y axis to [0, 1], line color to Green :const:`0x00FF00` and no filling x = np.linspace(-3, 3, num=50) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 2.0) - ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) + Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) if you want to add more than un line to your plot, you could do something like this: .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = np.linspace(-4, 4, num=25) y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x - ucartesian(plot, x, y1) - ucartesian(plot, x, y1) + Cartesian(plot, x, y1, rangex=[-5, 5], rangey=[0, 1]) + Cartesian(plot, x, y2, rangex=[-5, 5], rangey=[0, 1]) + display.show(plot) + +if you need to override the ticks automatic rendering, you can use the following code: + +.. code-block:: python + + plot = Plot(0, 0, display.width, display.height) + x = np.linspace(-4, 4, num=25) + y1 = x**2 / 2 + Cartesian(plot, x, y1, ticksx=[-4, -2, 0, 2, 4], ticksy=[0, 5, 10, 15, 20]) + display.show(plot) +If you are adding more than one curve to the plot ticks will be defined for all curves. +And needs to be defined in the first cartesian graph added to the plot. + +Line styles +============ +You can select the line style of your Cartesian graph. The following line styles are available: + * SOLID + * DOTTED + * DASHED + * DASH_DOT + +This can be done by importing the color class, from the cartesian library: + +.. code-block:: python + + from circuitpython_uplot.cartesian import LineStyle + +You can select a dotted line by using the following code: ``line_style=LineStyle.DOTTED``. + +.. code-block:: python + + Cartesian(plot, x, y, line_style=LineStyle.DOTTED) + =============== Pie Chart =============== -You can easily create Pie charts with uplot. Pie Charts are limited to 6 elements as per the automatic coloring. +You can easily create Pie charts with plot. Pie Charts are limited to 6 elements as per the automatic coloring. To make the Pie Chart the data needs to be in a python list form. The library will take care of the rest .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.upie import upie + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.pie import Pie display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = [5, 2, 7, 3] - upie(plot, a) + Pie(plot, a) display.show(plot) There are no other special parameters to customize @@ -251,21 +322,22 @@ Creates a scatter plot with x,y data. You can customize the circle diameter if y from random import choice import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.uscatter import uscatter + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.scatter import Scatter display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = np.linspace(1, 100) b = [choice(a) for _ in a] - uscatter(plot, a, b) + Scatter(plot, a, b) There are some parameters that you can customize: * rangex and rangey: you can specify the ranges of your graph. This allows you to move your graph according to your needs. This parameters only accept lists - * radius: circles radius/radii - * circle_color: you can specify the color in HEX + * radius: circles radius/radii. If a different value is given for each point, the radius should be a list of values. If selected pointer is not a circle, this parameter will be ignored + * pointer_color: you can specify the color in HEX. Or you could use the color class as explained above. + * pointer: you can select the pointer shape. The default is a circle. See below for more details * nudge: this parameter allows you to move the graph slighty. This is useful when the data start/end in the limits of your range @@ -275,98 +347,119 @@ There are some parameters that you can customize: z = [4, 5, 6, 7, 8] radi = [choice(z) for _ in a] b = [choice(a) for _ in a] - uscatter(plot, a, b, rangex=[0,210], rangey=[0, 210], radius=radi, circle_color=0xF456F3) + Scatter(plot, a, b, rangex=[0,210], rangey=[0, 210], radius=radi, pointer_color=0xF456F3) + + +Pointer styles +============== +You can select the pointer style of your Scatter graph. The following pointer styles are available: + * CIRCLE + * SQUARE + * TRIANGLE + * DIAMOND + +This can be done by importing the color class, from the cartesian library: + +.. code-block:: python + + from circuitpython_uplot.scatter import Pointer + +You can select a square pointer using the following code: ``pointer=Pointer.SQUARE``. + +.. code-block:: python + + Scatter(plot, a, b, pointer=Pointer.SQUARE) =============== Bar Plot =============== Allows you to graph bar plots. You just need to give the values of the bar in a python list. -You can choose to create shell or filled bars. +You can choose to create shell or filled bars or 3D projected bars. .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - ubar(plot, a, b) + Bar(plot, a, b) -You can select the color or and if the bars are filled +You can select the color or/and if the bars are filled .. code-block:: python - ubar(plot, a, b, 0xFF1000, True) + Bar(plot, a, b, color=0xFF1000, fill=True) You can also select the bar spacing and the xstart position: .. code-block:: python - ubar(plot, a, b, 0xFF1000, fill=True, bar_space=30, xstart=70) + Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70) For bar filled graphs you can pass a color_palette list. This will allow you to select the color of each bar -This will not work for shell bars sadly. +This will not work for shell bars. .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) - ubar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) + plot = Plot(0, 0, display.width, display.height) + Bar(plot, a, b, fill=True, bar_space=30, xstart=70, color_palette=[0xFF1000, 0x00FF00, 0x0000FF, 0x00FFFF]) -with the projection argument you can show the bars with projection. This will give them a 3D +With the projection argument you can show the bars with projection. This will give them a 3D appearance .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.bar import bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - ubar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) + Bar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) -For filled unprojected bars you can update their values. This is useful for data logging. +For filled unprojected bars you can update their values in real time. This is useful for data logging. The max_value argument will allow you to set the maximum value of the graph. The plot will scale according to this max value, and bar plot will update their values accordingly .. code-block:: python import board - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ubar import ubar + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.bar import Bar display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] - my_ubar = ubar(plot, a, b, color=0xFF1000, fill=True, color_palette=[0xFF1000, 0x00FF00, 0xFFFF00, 0x123456], max_value=10) + my_bar = Bar(plot, a, b, color=0xFF1000, fill=True, color_palette=[0xFF1000, 0x00FF00, 0xFFFF00, 0x123456], max_value=10) -Then you can update the values of the bar plot: +Then you can update the values of the bar plot in a loop: .. code-block:: python - my_ubar.update_values([1, 2, 3, 4]) + my_bar.update_values([1, 2, 3, 4]) Also for Filled unprojected bars you can change all bars color at once. The following @@ -374,16 +467,13 @@ code will change all the bar's color to red .. code-block:: python - my_ubar.update_colors(0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000) + my_bar.update_colors(0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000) -If you prefer, you can change the color of a single bar using the following code: +If you prefer, you can change the color of a single bar using the code below that will change the first bar to Blue.: .. code-block:: python - my_ubar.update_bar_color(0, 0x0000FF) - -This will change the first bar to Blue. - + my_bar.update_bar_color(0, 0x0000FF) =============== @@ -397,20 +487,20 @@ it will fill the area between two curves: import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.ufillbetween import ufillbetween + from circuitpython_uplot.uplot import Plot + from circuitpython_uplot.fillbetween import Fillbetween display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = np.linspace(0, 8, num=25) y1 = x**2 / 2 y2 = 2 + x**2 + 3 * x - ufillbetween(plot, x, y1, y2) + Fillbetween(plot, x, y1, y2) display.show(plot) @@ -425,13 +515,13 @@ You can choose the initial and final colors for the color map. import board from ulab import numpy as np - from circuitpython_uplot.uplot import Uplot - from circuitpython_uplot.umap import umap + from circuitpython_uplot.plot import Plot + from circuitpython_uplot.map import Map display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height, show_box=False) + plot = Plot(0, 0, display.width, display.height, show_box=False) x = np.array( [ @@ -445,7 +535,7 @@ You can choose the initial and final colors for the color map. dtype=np.int16, ) - umap(plot, x, 0xFF0000, 0x0000FF) + Map(plot, x, 0xFF0000, 0x0000FF) display.show(plot) @@ -467,12 +557,12 @@ There are some parameters that you can customize: .. code-block:: python - plot = Uplot(0, 0, display.width, display.height) + plot = Plot(0, 0, display.width, display.height) x = [10, 20, 30, 40, 50] temp_y = [10, 15, 35, 10, 25] - my_log = ulogging(plot, x, y, rangex=[0, 200], rangey=[0, 100], ticksx=[10, 50, 80, 100], ticksy=[15, 30, 45, 60],) + my_log = Logging(plot, x, y, rangex=[0, 200], rangey=[0, 100], ticksx=[10, 50, 80, 100], ticksy=[15, 30, 45, 60],) if you want to redraw new data in the same plot, you could do something like this: @@ -497,10 +587,24 @@ For example, if you want to load the Temperature icon with a scale of 2 .. code-block:: python - from circuitpython_uplot.usvg import usvg + from circuitpython_uplot.svg import SVG from circuitpython_uplot.icons import Temperature display = board.DISPLAY - plot = Uplot(0, 0, display.width, display.height) - usvg(plot, Temperature, 250, 50, 2) + plot = Plot(0, 0, display.width, display.height) + SVG(plot, Temperature, 250, 50, 2) display.show(plot) + +=============== +SHADE +=============== +Shade is a small module to add a shaded area to the plot. This is useful to highlight a specific area in the plot. +By itself will only fill rectangular areas in the plot area. However, it can be used in conjunction with other modules to create +more complex plots. Refer to the examples for more details. + +===================== +Polar Plot +===================== + +Allows to plot polar graphs. You just need to give the values of the graph in a python list. +See the examples folder for more information. diff --git a/docs/readme3.png b/docs/readme3.png new file mode 100644 index 0000000..2c469a3 Binary files /dev/null and b/docs/readme3.png differ diff --git a/docs/readme4.png b/docs/readme4.png new file mode 100644 index 0000000..52a764e Binary files /dev/null and b/docs/readme4.png differ diff --git a/docs/uplot_ex7.jpg b/docs/scatter.jpg similarity index 100% rename from docs/uplot_ex7.jpg rename to docs/scatter.jpg diff --git a/docs/scatter_circle_radius.jpg b/docs/scatter_circle_radius.jpg new file mode 100644 index 0000000..feaf08b Binary files /dev/null and b/docs/scatter_circle_radius.jpg differ diff --git a/docs/scatter_pointers.jpg b/docs/scatter_pointers.jpg new file mode 100644 index 0000000..6851394 Binary files /dev/null and b/docs/scatter_pointers.jpg differ diff --git a/docs/scatter_using_different_datasets.jpg b/docs/scatter_using_different_datasets.jpg new file mode 100644 index 0000000..fef7a16 Binary files /dev/null and b/docs/scatter_using_different_datasets.jpg differ diff --git a/docs/uplot_shade.jpg b/docs/shade.jpg similarity index 100% rename from docs/uplot_shade.jpg rename to docs/shade.jpg diff --git a/docs/uplot_ex12.jpg b/docs/stackplot_example.jpg similarity index 100% rename from docs/uplot_ex12.jpg rename to docs/stackplot_example.jpg diff --git a/docs/uplot_ex23.jpg b/docs/svg.jpg similarity index 100% rename from docs/uplot_ex23.jpg rename to docs/svg.jpg diff --git a/docs/uplot_ex3.jpg b/docs/tickparameters.jpg similarity index 100% rename from docs/uplot_ex3.jpg rename to docs/tickparameters.jpg diff --git a/docs/ticks_params.png b/docs/ticks_params.png new file mode 100644 index 0000000..1d93a9e Binary files /dev/null and b/docs/ticks_params.png differ diff --git a/docs/uplot_ex16.jpg b/docs/uboxplot_example.jpg similarity index 100% rename from docs/uplot_ex16.jpg rename to docs/uboxplot_example.jpg diff --git a/docs/uplot_ex10.jpg b/docs/uplot_ex10.jpg deleted file mode 100644 index 732ac23..0000000 Binary files a/docs/uplot_ex10.jpg and /dev/null differ diff --git a/examples/uplot_ubar_3Dbars.py b/examples/bar_3Dbars.py similarity index 51% rename from examples/uplot_ubar_3Dbars.py rename to examples/bar_3Dbars.py index f6088cf..1f5834a 100644 --- a/examples/uplot_ubar_3Dbars.py +++ b/examples/bar_3Dbars.py @@ -2,16 +2,15 @@ # # SPDX-License-Identifier: MIT -import time import board -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") @@ -19,11 +18,16 @@ b = [3, 5, 1, 9, 7] # Creating a 3D bar -ubar(plot, a, b, color=0xFF1000, fill=True, bar_space=30, xstart=70, projection=True) +Bar( + plot, + a, + b, + color=0xFF1000, + fill=True, + bar_space=30, + xstart=70, + projection=True, +) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_ubar_color_changing.py b/examples/bar_color_changing.py similarity index 64% rename from examples/uplot_ubar_color_changing.py rename to examples/bar_color_changing.py index 8b39cbd..69c5571 100644 --- a/examples/uplot_ubar_color_changing.py +++ b/examples/bar_color_changing.py @@ -4,8 +4,8 @@ import time import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -15,7 +15,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, @@ -28,14 +28,14 @@ display.show(plot) # Dummy data to plot -some_values = [55, 20, 25, 30, 35, 10] +some_values = [45, 20, 25, 30, 35, 10] a = ["a", "b", "c", "d", "e", "f"] # Showing the plot -display.show(plot) +display.root_group = plot # Creating the bar -my_ubar = ubar( +my_bar = Bar( plot, a, some_values, @@ -46,11 +46,18 @@ ) time.sleep(2) # Changing all the bars to Yellow -my_ubar.update_colors( - [color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW, color.YELLOW] +my_bar.update_colors( + [ + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + color.YELLOW, + ] ) time.sleep(2) # Changing the 3 bar to Purple -my_ubar.update_bar_color(2, color.PURPLE) +my_bar.update_bar_color(2, color.PURPLE) diff --git a/examples/uplot_ubar_colorpalette.py b/examples/bar_colorpalette.py similarity index 84% rename from examples/uplot_ubar_colorpalette.py rename to examples/bar_colorpalette.py index cdac994..c10b948 100644 --- a/examples/uplot_ubar_colorpalette.py +++ b/examples/bar_colorpalette.py @@ -3,8 +3,8 @@ # SPDX-License-Identifier: MIT import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -14,7 +14,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, @@ -29,7 +29,7 @@ a = ["a", "b", "c", "d", "e", "f"] # Creating the Bar Plot -ubar( +Bar( plot, a, activities_latest_heart_value, @@ -39,4 +39,4 @@ ) # Showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/uplot_ubar_example.py b/examples/bar_example.py similarity index 53% rename from examples/uplot_ubar_example.py rename to examples/bar_example.py index 8d2af39..8ab8e1e 100644 --- a/examples/uplot_ubar_example.py +++ b/examples/bar_example.py @@ -2,26 +2,21 @@ # # SPDX-License-Identifier: MIT -import time import board -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] -ubar(plot, a, b, 0xFF1000, True) +Bar(plot, a, b, 0xFF1000, True) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_ubar_scale_example.py b/examples/bar_scale_example.py similarity index 50% rename from examples/uplot_ubar_scale_example.py rename to examples/bar_scale_example.py index 02f5384..8cb0c99 100644 --- a/examples/uplot_ubar_scale_example.py +++ b/examples/bar_scale_example.py @@ -2,13 +2,11 @@ # # SPDX-License-Identifier: MIT -import time import board import displayio -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.bar import Bar -# from uplot_examples import u8 # Setting up the display display = board.DISPLAY @@ -16,23 +14,19 @@ group = displayio.Group() # Creating the plot objects -plot_scale1 = Uplot(0, 0, 100, 100, 1, scale=1) -plot_scale2 = Uplot(125, 0, 100, 100, 1, scale=2) +plot_scale1 = Plot(0, 0, 100, 100, 1, scale=1) +plot_scale2 = Plot(125, 0, 100, 100, 1, scale=2) # Creating the data a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] # Creating the bar plot -ubar(plot_scale1, a, b, 0xFF1000, True, bar_space=8, xstart=10) -ubar(plot_scale2, a, b, 0xFF1000, True, bar_space=4, xstart=5) +Bar(plot_scale1, a, b, 0xFF1000, True, bar_space=8, xstart=10) +Bar(plot_scale2, a, b, 0xFF1000, True, bar_space=4, xstart=5) # Plotting and showing the plot group.append(plot_scale1) group.append(plot_scale2) -display.show(group) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = group diff --git a/examples/uplot_ubar_updating_values.py b/examples/bar_updating_values.py similarity index 81% rename from examples/uplot_ubar_updating_values.py rename to examples/bar_updating_values.py index 0ff6dd7..1684eb9 100644 --- a/examples/uplot_ubar_updating_values.py +++ b/examples/bar_updating_values.py @@ -4,8 +4,8 @@ import time import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ubar import ubar +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.bar import Bar # Setting up the display display = board.DISPLAY @@ -15,7 +15,7 @@ DISPLAY_HEIGHT = 320 # Defining the plot -plot = Uplot( +plot = Plot( 0, 0, DISPLAY_WIDTH, @@ -31,10 +31,10 @@ add = 1 # Showing the plot -display.show(plot) +display.root_group = plot # Creating the bar -my_ubar = ubar( +my_bar = Bar( plot, a, some_values, @@ -53,12 +53,12 @@ for i in range(20): values_changed = [j + add for j in some_values] - my_ubar.update_values(values_changed) + my_bar.update_values(values_changed) add += 1 time.sleep(0.1) for i in range(20): values_changed = [j + add for j in some_values] - my_ubar.update_values(values_changed) + my_bar.update_values(values_changed) add -= 1 time.sleep(0.1) diff --git a/examples/cartersian_and_scatter_polyfit_example.py b/examples/cartersian_and_scatter_polyfit_example.py new file mode 100644 index 0000000..8da765a --- /dev/null +++ b/examples/cartersian_and_scatter_polyfit_example.py @@ -0,0 +1,122 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import displayio +from ulab import numpy as np +from table import Table +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter +from circuitpython_uplot.cartesian import Cartesian + +# In order to run this example you need to install the following libraries: +# - adafruit_display_text +# - adafruit_bitmap_font +# - CircuitPython_TABLE (from https://github.com/jposada202020/CircuitPython_TABLE) + +g = displayio.Group() + +table_width = 125 + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width - table_width, display.height, padding=1) +plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0x939597, tickgrid=True) +plot_table = Plot( + display.width - table_width - 1, + 0, + table_width - 1, + display.height, + padding=1, +) + +display.root_group = g +g.append(plot) +g.append(plot_table) + + +general_rangex = [0, 17] +general_rangey = [0, 70] + +# Creating the values +x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) +y = np.array([3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46]) + +# Creating the table +# To use the font, create a fonts directory in the root of the CIRCUITPY drive, +# and add the font file from the fonts folder +# fmt: off +my_table = Table( + 10, + 10, + 140, + 315, + [("-----------", "-----------",)], + [("Value X", "Value Y",), ("1", "3",), ("2", "14",),("3", "23",),("4", "25",), + ("5", "23",),("6", "15",),("7", "9",),("8", "5",),("9", "9",),("10", "13",), + ("11", "17",),("12", "24",),("13", "32",),("14", "36",), + ("15", "46",)], + "fonts/LibreBodoniv2002-Bold-10.bdf", + text_color = 0xFFFFFF, +) +# fmt: on +plot_table.append(my_table) + +# Polyfit Curve third degree +z = np.polyfit(x, y, 3) +new_x = np.linspace(0, 16, 50) +fit = z[0] * new_x**3 + z[1] * new_x**2 + z[2] * new_x + z[3] +Cartesian(plot, new_x, fit, rangex=general_rangex, rangey=general_rangey) + +# Polyfit Curve Second degree +z = np.polyfit(x, y, 2) +new_x = np.linspace(0, 16, 50) +fit = z[0] * new_x**2 + z[1] * new_x + z[2] +Cartesian(plot, new_x, fit, rangex=general_rangex, rangey=general_rangey) + +# Polyfit Curve First degree +z = np.polyfit(x, y, 1) +new_x = np.linspace(0, 16, 50) +fit = z[0] * new_x + z[1] +Cartesian(plot, new_x, fit, rangex=general_rangex, rangey=general_rangey) + +# Adding the Scatter Plot +Scatter( + plot, + x, + y, + rangex=general_rangex, + rangey=general_rangey, + pointer="triangle", + pointer_color=0x00FFFF, +) + +# Adding the labels for the Polylines +# change the x and y values to move the text according to your needs +plot.show_text( + "Polyfit 1", + x=300, + y=10, + anchorpoint=(0.5, 0.0), + text_color=0x149F14, + free_text=True, +) +plot.show_text( + "Polyfit 2", + x=72, + y=270, + anchorpoint=(0.0, 0.0), + text_color=0x647182, + free_text=True, +) +plot.show_text( + "Polyfit 3", + x=175, + y=200, + anchorpoint=(0.5, 0.0), + text_color=0x7428EF, + free_text=True, +) diff --git a/examples/uplot_ucartesian_advanced.py b/examples/cartesian_advanced.py similarity index 57% rename from examples/uplot_ucartesian_advanced.py rename to examples/cartesian_advanced.py index 69d26dc..61d2948 100644 --- a/examples/uplot_ucartesian_advanced.py +++ b/examples/cartesian_advanced.py @@ -2,15 +2,14 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Creating some points to graph x = np.linspace(-4, 4, num=25) @@ -18,17 +17,13 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000) +Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0xFF0000) # Creating some points to graph x = np.linspace(-3, 3, num=50) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 2.0) -ucartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) +Cartesian(plot, x, y, rangex=[-5, 5], rangey=[0, 1], line_color=0x00FF00) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/cartesian_fill.py b/examples/cartesian_fill.py new file mode 100644 index 0000000..65f5c4a --- /dev/null +++ b/examples/cartesian_fill.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width - 125, display.height, padding=25) + +display.root_group = plot + +# Creating the values +x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) +y = np.array([3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46]) + +# Polyfit Curve third degree +z = np.polyfit(x, y, 3) +new_x = np.linspace(0, 15, 50) +fit = z[0] * new_x**3 + z[1] * new_x**2 + z[2] * new_x + z[3] +Cartesian( + plot, + new_x, + fit, + rangex=[0, 15], + rangey=[0, 70], + fill=True, +) diff --git a/examples/cartesian_koch.py b/examples/cartesian_koch.py new file mode 100644 index 0000000..f690375 --- /dev/null +++ b/examples/cartesian_koch.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +# Example adapted to use in CircuitPython and Microplot from +# https://github.com/TheAlgorithms/Python/blob/master/fractals/koch_snowflake.py +# License MIT + +import board +from ulab import numpy +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + + +def iterate(initial_vectors: list[numpy.ndarray], steps: int) -> list[numpy.ndarray]: + vectors = initial_vectors + for _ in range(steps): + vectors = iteration_step(vectors) + return vectors + + +def iteration_step(vectors: list[numpy.ndarray]) -> list[numpy.ndarray]: + new_vectors = [] + for i, start_vector in enumerate(vectors[:-1]): + end_vector = vectors[i + 1] + new_vectors.append(start_vector) + difference_vector = end_vector - start_vector + new_vectors.append(start_vector + difference_vector / 3) + new_vectors.append( + start_vector + difference_vector / 3 + rotate(difference_vector / 3, 60) + ) + new_vectors.append(start_vector + difference_vector * 2 / 3) + new_vectors.append(vectors[-1]) + + return new_vectors + + +def rotate(vector: numpy.ndarray, angle_in_degrees: float) -> numpy.ndarray: + theta = numpy.radians(angle_in_degrees) + c, s = numpy.cos(theta), numpy.sin(theta) + rotation_matrix = numpy.array(((c, -s), (s, c))) + return numpy.dot(rotation_matrix, vector) + + +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, 200, 200, padding=0) + +# initial triangle of Koch snowflake +VECTOR_1 = numpy.array([0, 0]) +VECTOR_2 = numpy.array([0.5, 0.8660254]) +VECTOR_3 = numpy.array([1, 0]) +INITIAL_VECTORS = [VECTOR_1, VECTOR_2, VECTOR_3, VECTOR_1] +# uncomment for simple Koch curve instead of Koch snowflake +# INITIAL_VECTORS = [VECTOR_1, VECTOR_3] + +# Due to memory restrictions the maximum number of iterations is 3. +processed_vectors = iterate(INITIAL_VECTORS, 3) +x_coordinates, y_coordinates = zip(*processed_vectors) + +# Adding the Cartesian plot +Cartesian(plot, x_coordinates, y_coordinates) +display.root_group = plot diff --git a/examples/cartesian_koch_2.py b/examples/cartesian_koch_2.py new file mode 100644 index 0000000..28cb4b2 --- /dev/null +++ b/examples/cartesian_koch_2.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT +# pylint: disable=unused-argument, use-dict-literal +# Example adapted to use in CircuitPython and Microplot from +# Heltonbiker +# https://stackoverflow.com/questions/7409938/fractal-koch-curve + +import math +import board +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + +angles = [math.radians(60 * x) for x in range(6)] +sines = [math.sin(x) for x in angles] +cosin = [math.cos(x) for x in angles] + + +def L(angle, coords, jump): + return (angle + 1) % 6 + + +def R(angle, coords, jump): + return (angle + 4) % 6 + + +def F(angle, coords, jump): + coords.append( + ( + coords[-1][0] + jump * cosin[angle], + coords[-1][1] + jump * sines[angle], + ) + ) + return angle + + +decode = dict(L=L, R=R, F=F) + + +def koch(steps, length=200, startPos=(0, 0)): + pathcodes = "F" + for _ in range(steps): + pathcodes = pathcodes.replace("F", "FLFRFLF") + + jump = float(length) / (3**steps) + coords = [startPos] + angle = 0 + + for move in pathcodes: + angle = decode[move](angle, coords, jump) + + return coords + + +TOTALWIDTH = 300 +display = board.DISPLAY +plot = Plot(0, 0, display.width, display.height, padding=0) +points = koch(5, TOTALWIDTH, (-TOTALWIDTH / 2, 0)) +x_coordinates, y_coordinates = zip(*points) + +# Adding the Cartesian plot +Cartesian(plot, x_coordinates, y_coordinates) +display.root_group = plot diff --git a/examples/uplot_ucartesian_loggin_data.py b/examples/cartesian_logging_data.py similarity index 90% rename from examples/uplot_ucartesian_loggin_data.py rename to examples/cartesian_logging_data.py index dbe890a..72f1b28 100644 --- a/examples/uplot_ucartesian_loggin_data.py +++ b/examples/cartesian_logging_data.py @@ -8,13 +8,13 @@ import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -41,7 +41,7 @@ g.append(text_humidity) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, @@ -52,7 +52,7 @@ background_color=color.WHITE, ) -plot_2 = Uplot( +plot_2 = Plot( 0, 180, 200, @@ -79,11 +79,11 @@ g.append(plot_1) g.append(plot_2) -display.show(g) +display.root_group = g display.refresh() for i, element in enumerate(x): - ucartesian( + Cartesian( plot_1, x[0:i], temp_y[0:i], @@ -93,7 +93,7 @@ line_color=color.BLACK, logging=True, ) - ucartesian( + Cartesian( plot_2, x[0:i], humidity_y[0:i], diff --git a/examples/uplot_ucartesian_table.py b/examples/cartesian_table.py similarity index 89% rename from examples/uplot_ucartesian_table.py rename to examples/cartesian_table.py index f7850a6..359621d 100644 --- a/examples/uplot_ucartesian_table.py +++ b/examples/cartesian_table.py @@ -6,8 +6,8 @@ import board from ulab import numpy as np from table import Table -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade @@ -42,7 +42,7 @@ def heat_index(temp, humidity): display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, padding=5) +plot = Plot(0, 0, display.width, display.height, padding=5) # Create a group to hold the objects g = displayio.Group() @@ -101,7 +101,7 @@ def heat_index(temp, humidity): # Drawing the graphs for i in range(40, 110, 10): - ucartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) + Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) g.append(plot) @@ -119,4 +119,4 @@ def heat_index(temp, humidity): color.BLUE, ) g.append(my_table) -display.show(g) +display.root_group = g diff --git a/examples/cartesian_trig_functions.py b/examples/cartesian_trig_functions.py new file mode 100644 index 0000000..02e0206 --- /dev/null +++ b/examples/cartesian_trig_functions.py @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: Copyright (c) Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import displayio +import ulab.numpy as np +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import bitmap_label +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + +font_file = "fonts/LeagueSpartan-Bold-16.bdf" +font_to_use = bitmap_font.load_font(font_file) + +g = displayio.Group() +text = "Sin(x)" +text_area = bitmap_label.Label(font_to_use, text=text, color=0x149F14) +text_area.x = 60 +text_area.y = 15 +# board.DISPLAY.show(text_area) + +text2 = "Cos(x)" +text2_area = bitmap_label.Label(font_to_use, text=text2, color=0x647182) +text2_area.x = 135 +text2_area.y = 135 + +display = board.DISPLAY +# Compute the x and y coordinates for points on a sine curve +x = np.arange(0, 3 * np.pi, 0.1) +y = np.sin(x) +y2 = np.cos(x) + +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +Cartesian(plot, x, y, rangex=[0, 10], rangey=[-1.1, 1.1]) +Cartesian(plot, x, y2, rangex=[0, 10], rangey=[-1.1, 1.1]) + +g.append(plot) +g.append(text_area) +g.append(text2_area) + +display.root_group = g diff --git a/examples/uplot_display_shapes.py b/examples/display_shapes.py similarity index 83% rename from examples/uplot_display_shapes.py rename to examples/display_shapes.py index bb215c1..c49d65c 100644 --- a/examples/uplot_display_shapes.py +++ b/examples/display_shapes.py @@ -2,17 +2,16 @@ # # SPDX-License-Identifier: MIT -import time import board from adafruit_display_shapes.polygon import Polygon from adafruit_display_shapes.roundrect import RoundRect -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Plot # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) @@ -42,8 +41,4 @@ plot.append(roundrect) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/fillbetween.py b/examples/fillbetween.py new file mode 100644 index 0000000..a6a5ccc --- /dev/null +++ b/examples/fillbetween.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.fillbetween import Fillbetween + + +# Setting up the display +display = board.DISPLAY + +plot = Plot(0, 0, display.width, display.height) + +x = np.linspace(0, 8, num=25) + +y1 = x**2 / 2 +y2 = 2 + x**2 + 3 * x + +Fillbetween(plot, x, y1, y2) + +display.root_group = plot diff --git a/examples/fonts/LeagueSpartan-Bold-16.bdf b/examples/fonts/LeagueSpartan-Bold-16.bdf new file mode 100644 index 0000000..9508339 --- /dev/null +++ b/examples/fonts/LeagueSpartan-Bold-16.bdf @@ -0,0 +1,12458 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "LeagueSpartan-Bold.otf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-League Spartan-Bold-R-Normal--22-160-100-100-P-111-ISO10646-1 +SIZE 16 100 100 +FONTBOUNDINGBOX 30 32 -3 -7 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "League Spartan" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 22 +POINT_SIZE 160 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 111 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 15 +FONT_DESCENT 4 +COPYRIGHT "OFL" +_OTF_FONTFILE "LeagueSpartan-Bold.otf" +_OTF_PSNAME "LeagueSpartan-Bold" +ENDPROPERTIES +CHARS 561 +STARTCHAR 000D +ENCODING 13 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0020 +ENCODING 32 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 16 1 0 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +60 +60 +60 +00 +70 +F0 +F0 +70 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 9 +BITMAP +EC +EE +EE +CC +CC +44 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 15 1 0 +BITMAP +0660 +0E60 +0C60 +0CE0 +3FF0 +7FF0 +18C0 +19C0 +3980 +7FE0 +FFE0 +3380 +7300 +6300 +6300 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 -2 +BITMAP +0600 +0600 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +0600 +0600 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 15 1 0 +BITMAP +7818 +FE38 +C630 +C660 +C660 +FEC0 +3980 +0180 +033C +077E +06E7 +0CE3 +0CE7 +187E +383C +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +07C0 +1FE0 +1FE0 +3CE0 +1CE0 +1CE0 +1FC0 +1F80 +3F88 +7BDC +F0FC +F0F8 +7FF8 +7FFC +1F1E +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 6 1 9 +BITMAP +E0 +E0 +E0 +E0 +C0 +40 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 21 1 -5 +BITMAP +10 +38 +30 +70 +70 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +60 +60 +70 +30 +38 +10 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 21 1 -5 +BITMAP +40 +E0 +60 +70 +70 +30 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +70 +70 +60 +E0 +40 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 10 +BITMAP +10 +10 +FE +38 +38 +6C +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 9 1 3 +BITMAP +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 7 1 -3 +BITMAP +60 +F0 +F0 +70 +30 +60 +40 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 3 1 4 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 4 1 0 +BITMAP +70 +F0 +F0 +70 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 17 1 -1 +BITMAP +0380 +0380 +0300 +0700 +0600 +0E00 +0E00 +0C00 +1C00 +1800 +3800 +3000 +7000 +7000 +6000 +E000 +C000 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +0F80 +1FC0 +3FE0 +78F0 +7070 +7070 +7070 +F070 +7070 +7070 +7070 +78F0 +3FE0 +1FC0 +0F80 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 15 0 0 +BITMAP +1C +3C +FC +FC +DC +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0F80 +3FC0 +7FE0 +F0E0 +70E0 +00E0 +01E0 +01E0 +03C0 +0780 +1F00 +3E00 +7FE0 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1F00 +3FC0 +7FC0 +71E0 +00E0 +01C0 +07C0 +07C0 +01E0 +00E0 +20E0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0780 +0780 +0F80 +0F80 +1F80 +3B80 +3B80 +7380 +7380 +FFE0 +FFE0 +FFE0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +7F80 +7F80 +7F80 +7000 +F000 +EF00 +FF80 +FFC0 +23C0 +01C0 +01C0 +E3C0 +FF80 +7F80 +3E00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0780 +0F00 +1E00 +1C00 +3C00 +7E00 +7F80 +FFC0 +F1C0 +E1C0 +E1C0 +E1C0 +FFC0 +7F80 +1E00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 1 0 +BITMAP +FFE0 +FFE0 +FFC0 +03C0 +0380 +0780 +0700 +0F00 +0E00 +1E00 +1C00 +3800 +7800 +7000 +F000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +7F80 +7F80 +F1C0 +E1C0 +7380 +3F80 +7F80 +FFC0 +E1C0 +E1C0 +F1C0 +FFC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +7F80 +FFC0 +E1C0 +E1C0 +E1C0 +E1C0 +FFC0 +7FC0 +3F80 +0700 +0F00 +1E00 +3C00 +7800 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +60 +F0 +F0 +60 +00 +00 +60 +F0 +F0 +70 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 13 1 -3 +BITMAP +60 +F0 +F0 +60 +00 +00 +60 +F0 +F0 +F0 +20 +60 +C0 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 11 1 2 +BITMAP +0040 +01C0 +0FC0 +3F80 +FC00 +F000 +FC00 +7F00 +0FC0 +03C0 +00C0 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 7 1 4 +BITMAP +FF80 +FF80 +FF80 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 11 1 2 +BITMAP +8000 +E000 +F800 +7F00 +1FC0 +03C0 +0FC0 +3F00 +FC00 +F000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +1F00 +7F80 +FFC0 +63C0 +03C0 +0380 +0F00 +0E00 +1C00 +1C00 +0000 +0C00 +1E00 +1E00 +0C00 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +07E0 +1FF0 +7C7C +701C +E76E +CFE6 +DCE6 +DC66 +DC66 +CFFE +E7BC +7020 +7EF0 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E3C0 +E3C0 +E380 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +FFC0 +FF80 +FF00 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +FE00 +FF80 +FFC0 +E3C0 +E1E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +E3C0 +FFC0 +FF80 +FE00 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 15 1 0 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 15 1 0 +BITMAP +FF +FF +FF +E0 +E0 +E0 +FF +FF +FF +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +FFF0 +FFF0 +FFF0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 15 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 0 0 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +4F +FE +FE +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +E1E0 +E3C0 +E780 +E700 +EF00 +FE00 +FC00 +FC00 +FE00 +EE00 +EF00 +E780 +E3C0 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 15 15 1 0 +BITMAP +F81E +F83E +F83E +FC3E +FC3E +FC7E +EC7E +EE6E +EEEE +E6EE +E7CE +E7CE +E3CE +E38E +E00E +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 15 1 0 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E3C0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FC00 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 -4 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +F00E +700E +781E +7C3E +3FFC +1FF8 +07E0 +0FE6 +1FFE +08FE +003C +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +F03C +703C +7838 +7878 +3878 +3870 +3CF0 +1CF0 +1CE0 +1EE0 +0FE0 +0FC0 +0FC0 +07C0 +0780 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 15 0 0 +BITMAP +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +783C +3C78 +3C70 +1EF0 +0FE0 +0FC0 +07C0 +07C0 +0FE0 +0FE0 +1EF0 +3CF8 +3C78 +783C +F03E +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 15 0 0 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 15 0 0 +BITMAP +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +C000 +E000 +6000 +7000 +7000 +3800 +3800 +1800 +1C00 +0C00 +0E00 +0600 +0700 +0300 +0380 +0380 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +FC +FC +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +FC +FC +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 4 1 11 +BITMAP +38 +7C +6E +C7 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 2 0 -2 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 4 1 11 +BITMAP +40 +E0 +70 +18 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 9 0 0 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FFC0 +F1E0 +E1E0 +F1E0 +FFC0 +FFC0 +EF00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 8 16 0 0 +BITMAP +0F +1F +3E +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 -5 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FBC0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 15 1 0 +BITMAP +E0 +F0 +F0 +60 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 20 -1 -5 +BITMAP +18 +3C +3C +18 +00 +00 +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 16 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E380 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 9 1 0 +BITMAP +EF3C +FFFE +F3EF +E3C7 +E387 +E387 +E387 +E387 +E387 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 9 0 0 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 1 -5 +BITMAP +EF80 +FFC0 +FFC0 +F1E0 +E0E0 +F1E0 +FFC0 +FFC0 +EF00 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 1 -5 +BITMAP +3DE0 +7FE0 +FFE0 +E1E0 +E1E0 +E1E0 +FFE0 +7FE0 +3DE0 +01E0 +01E0 +01E0 +01E0 +01E0 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +F0E0 +70E0 +79E0 +39C0 +3BC0 +3F80 +1F80 +1F00 +0F00 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 9 0 0 +BITMAP +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +F3C0 +7380 +3F00 +3E00 +1E00 +3F00 +7F80 +F380 +E1C0 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +3C +3C +70 +70 +70 +70 +70 +70 +70 +F0 +E0 +70 +70 +70 +70 +70 +70 +70 +70 +3C +3C +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 19 1 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 21 1 -5 +BITMAP +F0 +F0 +38 +38 +38 +38 +38 +38 +38 +3C +1C +38 +38 +38 +38 +38 +38 +38 +38 +F0 +F0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 4 1 5 +BITMAP +3800 +7FE0 +EFC0 +0780 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 16 1 -1 +BITMAP +70 +F0 +F0 +70 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +08 +08 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +08 +08 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1F00 +3FC0 +7FC0 +70C0 +7080 +7000 +7000 +3800 +FF00 +FF00 +1C00 +1C00 +7EF0 +FFE0 +C3C0 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 10 1 2 +BITMAP +FEC0 +FFC0 +FF80 +E3C0 +E1C0 +E1C0 +E3C0 +FF80 +FFC0 +DEC0 +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 15 0 0 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +7FF0 +7FF0 +0700 +0700 +7FF0 +7FF0 +0700 +0700 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +00 +00 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -5 +BITMAP +3E00 +7F00 +7F80 +F300 +F000 +7C00 +3F00 +7F80 +E7C0 +E1C0 +E1C0 +FB80 +FF00 +7F00 +0F80 +0780 +E380 +FF80 +FF00 +3E00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 3 1 11 +BITMAP +66 +E7 +67 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +0FC0 +1FF0 +7838 +601C +C78C +CF8C +CC06 +8C06 +CC06 +CF8C +C78C +601C +7838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 6 1 9 +BITMAP +7E +7E +C6 +C6 +7E +78 +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1100 +3380 +7700 +E600 +CE00 +E600 +7300 +3B80 +0100 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 5 1 2 +BITMAP +FF80 +FF80 +FF80 +0380 +0380 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 3 1 4 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 7 8 1 7 +BITMAP +38 +C6 +BA +AA +B2 +AA +C6 +38 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 2 1 11 +BITMAP +FF +FF +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 4 1 12 +BITMAP +70 +D0 +D0 +70 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 12 1 1 +BITMAP +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 1 9 +BITMAP +E0 +90 +30 +20 +C0 +F0 +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 0 9 +BITMAP +70 +10 +30 +10 +D0 +70 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 4 4 3 11 +BITMAP +10 +70 +F0 +C0 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 -4 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FE00 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1FE0 +7FE0 +7F60 +FF60 +FF60 +FF60 +7F60 +7F60 +3F60 +0360 +0360 +0360 +0360 +0360 +0360 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 4 1 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 5 5 2 -5 +BITMAP +60 +70 +18 +F8 +F0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 135 0 +DWIDTH 3 0 +BBX 2 6 0 9 +BITMAP +40 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 6 1 9 +BITMAP +3C +7E +C6 +C6 +7E +3C +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +4400 +EE00 +6700 +3380 +3980 +7380 +6700 +EE00 +4400 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 15 1 0 +BITMAP +2030 +E060 +E0C0 +60C0 +6180 +6180 +6300 +6338 +6678 +0658 +0CD8 +1998 +19FC +3018 +3018 +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +6030 +E060 +E0C0 +60C0 +6180 +6180 +633C +637E +6646 +0C06 +0C0E +181C +1838 +307E +307E +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 15 1 0 +BITMAP +7818 +FC30 +4C30 +1860 +1860 +0CC0 +CCC0 +FD9C +7B3C +033C +066C +064C +0CFE +0C0C +180C +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0E00 +1E00 +1E00 +0E00 +0000 +0E00 +0E00 +0E00 +3C00 +7800 +7000 +F1C0 +7FC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0400 +0E00 +0700 +0380 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0300 +07C0 +1EE0 +0840 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0F60 +0FE0 +19C0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0CE0 +1EE0 +0CE0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0380 +06C0 +06C0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 18 15 0 0 +BITMAP +01FFC0 +01FFC0 +03FFC0 +03F000 +07F000 +077000 +0F7FC0 +0E7FC0 +1E7FC0 +1C7000 +3FF000 +3FF000 +787FC0 +707FC0 +F07FC0 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 -5 +BITMAP +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +7FF0 +1FF0 +0FE0 +0100 +03C0 +00C0 +07C0 +0780 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +2000 +7000 +3800 +0C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +1800 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6700 +7700 +6700 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 20 0 0 +BITMAP +80 +E0 +F0 +30 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 1 0 +BITMAP +10 +38 +F0 +C0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 20 -1 0 +BITMAP +18 +7C +EE +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 0 +BITMAP +E6 +EF +E6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +7F00 +7FC0 +7FE0 +71E0 +70F0 +7070 +FC70 +FC70 +FC70 +7070 +70F0 +71F0 +7FE0 +7FC0 +7F00 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 0 +BITMAP +0E60 +1FE0 +19C0 +0000 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 1 +BITMAP +0700 +0780 +01C0 +0080 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0040 +00E0 +01E0 +0380 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0730 +07F0 +0FE0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0660 +0E70 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 8 1 3 +BITMAP +6300 +F780 +7F00 +3E00 +3E00 +7F00 +F780 +6300 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 15 0 0 +BITMAP +07E2 +1FFE +3FFC +3C3C +783E +706E +70CE +F18E +730E +760E +7C1E +3C3C +3FFC +7FF8 +C7E0 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +1800 +1C00 +1E00 +0600 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0100 +0380 +0700 +0C00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0600 +1F00 +3BC0 +1080 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +3980 +3BC0 +3980 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0100 +0380 +0780 +0600 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +E000 +E000 +E000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E3C0 +FFC0 +FF80 +FF00 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1F00 +3F80 +7F80 +71C0 +E1C0 +E1C0 +E380 +E780 +E780 +E3C0 +E1C0 +E1C0 +E1C0 +E7C0 +E780 +E700 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0400 +0E00 +0F00 +0380 +0100 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0100 +0300 +0700 +0E00 +0800 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 0 +BITMAP +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 14 0 0 +BITMAP +1CC0 +1FC0 +3F80 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 13 0 0 +BITMAP +19C0 +3DC0 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0F00 +1F80 +1980 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 9 1 0 +BITMAP +FC78 +FEFE +47CE +3BFF +FFFF +E780 +E7CC +FFFE +7C7C +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +10 +3C +0C +7C +78 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0800 +1C00 +1E00 +0700 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +3B80 +3B80 +3980 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +40 +E0 +70 +38 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +10 +38 +70 +E0 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 14 -1 0 +BITMAP +30 +7C +EE +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 13 -1 0 +BITMAP +EE +EE +CE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +6200 +7E00 +7E00 +3F00 +3F00 +3380 +03C0 +3FC0 +7FC0 +FFC0 +E1E0 +E1E0 +E1C0 +FFC0 +7F80 +1F00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3980 +7F80 +7F00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0800 +0C00 +0E00 +0700 +0100 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1C80 +3F80 +7F00 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +3980 +3BC0 +3980 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 11 1 2 +BITMAP +0C00 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +0000 +0C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 9 0 0 +BITMAP +1F60 +3FC0 +7FC0 +73E0 +F5E0 +79E0 +7FC0 +7F80 +DF00 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0800 +1C00 +1E00 +0600 +0200 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +1000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0C00 +1E00 +7F80 +2100 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 21 1 -5 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FFC0 +F1E0 +E1E0 +F1E0 +FFC0 +FFC0 +E700 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 -5 +BITMAP +3980 +3BC0 +3980 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 18 0 0 +BITMAP +0FE0 +0FE0 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +3FC0 +3FC0 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +30C0 +39C0 +1F80 +0F00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 -5 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0010 +0030 +0020 +003C +0038 +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 14 0 -5 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00C0 +0080 +0180 +01F0 +00E0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0080 +01C0 +03C0 +0700 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +04 +0E +1E +38 +10 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0300 +0780 +1FC0 +08C0 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +10 +3C +FE +C6 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0300 +0780 +0300 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +18 +3C +18 +00 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +08C0 +0FC0 +0780 +0000 +07E0 +1FF0 +3FF0 +7C60 +F000 +F000 +E000 +E000 +E000 +F000 +F000 +7C60 +3FF0 +1FF0 +07E0 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +42 +E7 +7E +3C +10 +00 +3E +7F +FE +E0 +E0 +E0 +FE +7F +3E +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3300 +1F00 +0E00 +0000 +FE00 +FF80 +FFC0 +E3C0 +E1E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +E3C0 +FFC0 +FF80 +FE00 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 15 16 0 0 +BITMAP +00E6 +00E6 +00E6 +00E2 +00E4 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +7F00 +7FC0 +7FE0 +71E0 +70F0 +7070 +FC70 +FC70 +FC70 +7070 +70F0 +71F0 +7FE0 +7FC0 +7F00 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 16 0 0 +BITMAP +00E0 +00E0 +03F0 +03F0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 18 1 0 +BITMAP +7F00 +7F00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6300 +7E00 +3C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1100 +7180 +3F80 +1F00 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +1800 +1C00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0C00 +0E00 +0E00 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 -5 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0400 +0C00 +0C00 +0F00 +0700 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 -5 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0600 +0400 +0C00 +0F80 +0700 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +6200 +3E00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +2100 +7380 +3F00 +1E00 +0400 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 -5 +BITMAP +0200 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0E70 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 -5 +BITMAP +3080 +39C0 +3F80 +0F00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0180 +03C0 +0180 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 -5 +BITMAP +0E00 +0E00 +0E00 +0000 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 21 0 -7 +BITMAP +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +01C0 +01C0 +01C0 +0080 +0180 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 -5 +BITMAP +0200 +0400 +0600 +0600 +0400 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0600 +1F00 +3BC0 +1080 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +FFF0 +FFF0 +FFF0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 22 1 0 +BITMAP +0800 +1E00 +3F00 +7300 +0000 +0000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +FBC0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 15 0 0 +BITMAP +7078 +7078 +FFF8 +FFF8 +7078 +7078 +7FF8 +7FF8 +7FF8 +7078 +7078 +7078 +7078 +7078 +7078 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +7000 +7000 +FC00 +FC00 +7000 +7000 +7000 +7780 +7FE0 +7DE0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 0 +BITMAP +73 +FE +DE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +39 +7F +CE +00 +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 18 -1 0 +BITMAP +FE +FE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 13 -1 0 +BITMAP +FE +FE +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 19 -1 0 +BITMAP +C6 +7E +3C +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +42 +E3 +7F +3C +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 -5 +BITMAP +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 -5 +BITMAP +70 +78 +78 +30 +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 19 1 0 +BITMAP +60 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 10 20 0 0 +BITMAP +0600 +0F80 +3DC0 +1080 +0000 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +0F00 +4F00 +FE00 +FE00 +7800 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 8 19 -1 -5 +BITMAP +18 +3C +FF +42 +00 +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 21 1 -7 +BITMAP +E1E0 +E3C0 +E780 +E700 +EF00 +FE00 +FC00 +FC00 +FE00 +EE00 +EF00 +E780 +E3C0 +E3C0 +E1E0 +0000 +0E00 +0E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 22 1 -6 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E380 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +0000 +1C00 +1C00 +1C00 +0C00 +1800 +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +E780 +E700 +EE00 +FC00 +FC00 +FE00 +EF00 +E780 +E3C0 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0400 +0E00 +1C00 +3800 +0000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 22 1 0 +BITMAP +10 +38 +78 +E0 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 21 1 -6 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1C00 +1C00 +1C00 +0800 +1800 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 22 1 -6 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +60 +C0 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 1 0 +BITMAP +E0C0 +E0C0 +E0C0 +E080 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 1 0 +BITMAP +E4 +E6 +E6 +E2 +E4 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E700 +E780 +E780 +E700 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 16 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +EE +EF +EF +EE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +3800 +3800 +3800 +3A00 +3E00 +3C00 +3800 +7800 +F800 +F800 +3800 +3800 +3FC0 +3FC0 +3FC0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 16 0 0 +BITMAP +38 +38 +38 +38 +3C +3C +3C +78 +F8 +F8 +B8 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 0 +BITMAP +0080 +01C0 +0380 +0600 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0100 +0300 +0F00 +0C00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 21 1 -7 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +0000 +0700 +0700 +0300 +0100 +0200 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 -7 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +0000 +0C00 +1C00 +0C00 +0400 +0800 +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 19 1 0 +BITMAP +0CC0 +0FC0 +0700 +0000 +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +2100 +7700 +3E00 +1C00 +0000 +0000 +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 1 -5 +BITMAP +F838 +F838 +FC38 +FC38 +EE38 +EE38 +E738 +E738 +E3B8 +E3B8 +E1F8 +E1F8 +E0F8 +E0F8 +E078 +0038 +0038 +00F8 +01F8 +01F0 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 -5 +BITMAP +EF00 +FF80 +F3C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +01C0 +01C0 +07C0 +0F80 +0F00 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +07F0 +07F0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0E70 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1100 +3180 +3F80 +1F00 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 1 +BITMAP +0330 +0770 +0EE0 +0480 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0080 +0DC0 +1D80 +3300 +2200 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 17 15 0 0 +BITMAP +07FF80 +1FFF80 +3FFF80 +7C7000 +787000 +707000 +F07F80 +F07F80 +F07F80 +707000 +787000 +7C7000 +3FFF80 +1FFF80 +07FF80 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 18 9 0 0 +BITMAP +1F3E00 +3FFF80 +7FF380 +71FF80 +F1FFC0 +71E000 +7FF300 +3FFF80 +1F3F00 +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 1 0 +BITMAP +0200 +0700 +0E00 +0C00 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +04 +0C +3C +38 +20 +00 +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 21 1 -7 +BITMAP +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +0000 +0C00 +1E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 -6 +BITMAP +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +00 +38 +38 +38 +10 +30 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3300 +3F00 +0E00 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +84 +CE +FC +38 +10 +00 +EF +FE +FE +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 0 +BITMAP +0100 +0380 +0780 +0E00 +0000 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +08 +1C +3C +78 +20 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 0 +BITMAP +0600 +0F00 +3F80 +3180 +0000 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +10 +3C +FE +C6 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 20 0 -5 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +07E0 +01E0 +00E0 +60E0 +7FE0 +FFC0 +3F80 +0400 +0700 +0180 +0F00 +0F00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +3E +FE +E2 +F0 +7E +0F +CF +FE +FC +10 +3C +0C +7C +78 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 19 0 0 +BITMAP +1180 +1F80 +0F00 +0400 +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 15 1 0 +BITMAP +84 +EE +FC +38 +10 +00 +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 -5 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0400 +0F00 +0300 +1B00 +0E00 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 8 18 0 -5 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +08 +0E +03 +1E +1E +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 19 0 0 +BITMAP +3100 +1F00 +0E00 +0000 +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 9 14 0 0 +BITMAP +0180 +3980 +3880 +3900 +3800 +FE00 +FE00 +FE00 +3800 +3800 +3800 +3E00 +3E00 +1E00 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +FE +38 +3E +3E +1E +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1CC0 +3F80 +3780 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3980 +7F80 +6700 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3F80 +3F80 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +7F00 +7F00 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +3180 +1F80 +0F00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +2100 +7380 +7F00 +1E00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +0E00 +1B00 +1900 +0F00 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +3F00 +3300 +3F00 +1E00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0CC0 +3B80 +3300 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0900 +1B80 +3B00 +6600 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 -5 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F80 +0400 +0C00 +0C00 +0F00 +0700 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 -5 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3F00 +0800 +1800 +1800 +1E00 +1E00 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +006000 +01F000 +03BC00 +010800 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +0180 +03C0 +0FF0 +0420 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0600 +0F80 +3DC0 +1080 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +0400 +1F00 +3B80 +3180 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 0 +BITMAP +19C0 +3DC0 +19C0 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 20 0 0 +BITMAP +0080 +01C0 +0780 +0600 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 19 0 0 +BITMAP +0700 +0700 +0700 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0C00 +1C00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 19 0 0 +BITMAP +08C0 +0F80 +0700 +0000 +7FF8 +7FF0 +7FF0 +01E0 +03C0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3FF8 +7FF8 +FFF8 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 15 0 0 +BITMAP +2100 +7380 +3F00 +1C00 +0000 +0000 +7F80 +7F80 +0F00 +0E00 +1E00 +3C00 +3800 +7F80 +FF80 +ENDCHAR +STARTCHAR 018F +ENCODING 399 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +0FC0 +3FF0 +7FF8 +3878 +103C +001C +001C +FFFC +FFFC +701C +701C +783C +3FF8 +1FF0 +07C0 +ENDCHAR +STARTCHAR 0192 +ENCODING 402 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 12 21 -3 -5 +BITMAP +00F0 +01F0 +03E0 +0380 +0780 +0780 +0700 +1FC0 +1FC0 +1FC0 +0700 +0F00 +0F00 +0E00 +0E00 +0E00 +0E00 +1E00 +7E00 +7C00 +F800 +ENDCHAR +STARTCHAR 01A0 +ENCODING 416 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 16 0 0 +BITMAP +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 01A1 +ENCODING 417 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 11 0 0 +BITMAP +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 01AF +ENCODING 431 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 17 1 0 +BITMAP +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 01B0 +ENCODING 432 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 11 1 0 +BITMAP +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01C4 +ENCODING 452 +SWIDTH 1215 0 +DWIDTH 27 0 +BBX 25 21 1 0 +BITMAP +00008400 +0001CE00 +0000FC00 +00003800 +00000000 +00000000 +FE07FF80 +FF87FF80 +FFC7FF00 +E3C01E00 +E1E01E00 +E0E03C00 +E0E03C00 +E0E07800 +E0E0F000 +E0E0F000 +E1E1E000 +E3C1E000 +FFC3FF80 +FF87FF80 +FE07FF80 +ENDCHAR +STARTCHAR 01C5 +ENCODING 453 +SWIDTH 1035 0 +DWIDTH 23 0 +BBX 22 15 1 0 +BITMAP +FE0210 +FF83B8 +FFC1F0 +E3C0E0 +E1E000 +E1E000 +E0E7FC +E0E7F8 +E0E070 +E0E0F0 +E1E1E0 +E3E1C0 +FFC3C0 +FF87FC +FE07FC +ENDCHAR +STARTCHAR 01C6 +ENCODING 454 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 22 16 0 0 +BITMAP +00E000 +00E210 +00E3B8 +00E1F0 +00E0E0 +00E040 +00E000 +1EE7FC +3FE7F8 +7FE070 +70E0F0 +F0E1E0 +70E1C0 +7FE3C0 +3FE7FC +1EE7FC +ENDCHAR +STARTCHAR 01C7 +ENCODING 455 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 18 15 1 0 +BITMAP +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E003C0 +E02380 +FFBF80 +FFBF80 +FF9E00 +ENDCHAR +STARTCHAR 01C8 +ENCODING 456 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 -5 +BITMAP +E00C +E01E +E01E +E00C +E000 +E000 +E01C +E01C +E01C +E01C +E01C +E01C +FF9C +FF9C +FF9C +001C +001C +007C +007C +00F8 +ENDCHAR +STARTCHAR 01C9 +ENCODING 457 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 21 1 -5 +BITMAP +E000 +E380 +E380 +E380 +E300 +E000 +E000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +0380 +0380 +0F80 +1F80 +1F00 +ENDCHAR +STARTCHAR 01CA +ENCODING 458 +SWIDTH 1125 0 +DWIDTH 25 0 +BBX 23 15 1 0 +BITMAP +F8381E +F8381E +FC381E +FC381E +EE381E +EE381E +E7381E +E7381E +E3B81E +E3B81E +E1F81E +E1F89E +E0F9FC +E0F9FC +E078F0 +ENDCHAR +STARTCHAR 01CB +ENCODING 459 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 20 20 1 -5 +BITMAP +F83860 +F838F0 +FC38F0 +FC3860 +EE3800 +EE3800 +E738F0 +E738F0 +E3B8F0 +E3B8F0 +E1F8F0 +E1F8F0 +E0F8F0 +E0F8F0 +E078F0 +0000F0 +0000F0 +0003E0 +0003E0 +0003C0 +ENDCHAR +STARTCHAR 01CC +ENCODING 460 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 20 1 -5 +BITMAP +0006 +000F +000F +0006 +0000 +0000 +EF0F +FF8F +F3CF +E1CF +E1CF +E1CF +E1CF +E1CF +E1CF +000F +000F +003F +003E +003C +ENDCHAR +STARTCHAR 01CE +ENCODING 462 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +1080 +19C0 +1F80 +0700 +0200 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 01D0 +ENCODING 464 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 7 15 -1 0 +BITMAP +84 +EE +7C +38 +10 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 01D2 +ENCODING 466 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +1080 +3980 +1F80 +0E00 +0400 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 01D4 +ENCODING 468 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +2100 +7380 +3F00 +0E00 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01D6 +ENCODING 470 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +7F80 +7F80 +0000 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01D8 +ENCODING 472 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +0400 +0E00 +1E00 +1800 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01DA +ENCODING 474 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +2100 +7380 +3F00 +0C00 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01DC +ENCODING 476 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +0800 +1C00 +1E00 +0600 +0000 +0000 +7380 +7380 +3300 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 01E6 +ENCODING 486 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0420 +07E0 +03C0 +0000 +07E0 +1FF8 +3FFC +7C3C +7810 +7000 +F000 +F0FE +70FE +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 01E7 +ENCODING 487 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 -5 +BITMAP +1080 +1DC0 +1F80 +0700 +0200 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +00E0 +20E0 +7FE0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 01EA +ENCODING 490 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 -5 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0080 +0180 +0180 +01E0 +00E0 +ENDCHAR +STARTCHAR 01EB +ENCODING 491 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0300 +0200 +0600 +07C0 +0380 +ENDCHAR +STARTCHAR 01FA +ENCODING 506 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 25 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0000 +0380 +06C0 +06C0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 01FB +ENCODING 507 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 1 +BITMAP +0300 +0700 +0E00 +0000 +0000 +0F00 +1F80 +1980 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 01FC +ENCODING 508 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 18 21 0 0 +BITMAP +000200 +000600 +000E00 +001C00 +000000 +000000 +01FFC0 +01FFC0 +03FFC0 +03F000 +07F000 +077000 +0F7FC0 +0E7FC0 +1E7FC0 +1C7000 +3FF000 +3FF000 +787FC0 +707FC0 +F07FC0 +ENDCHAR +STARTCHAR 01FD +ENCODING 509 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 15 1 0 +BITMAP +0080 +01C0 +03C0 +0780 +0200 +0000 +FC78 +FEFE +47CE +3BFF +FFFF +E780 +E7CC +FFFE +7C7C +ENDCHAR +STARTCHAR 01FE +ENCODING 510 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 1 +BITMAP +00C0 +01E0 +0380 +0200 +0000 +07E2 +1FFE +3FFC +3C3C +783E +706E +70CE +F18E +730E +760E +7C1E +3C3C +3FFC +7FF8 +C7E0 +ENDCHAR +STARTCHAR 01FF +ENCODING 511 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0800 +0000 +1F60 +3FC0 +7FC0 +73E0 +F5E0 +79E0 +7FC0 +7F80 +DF00 +ENDCHAR +STARTCHAR 0200 +ENCODING 512 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0880 +1DC0 +1EF0 +0630 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0201 +ENCODING 513 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +2100 +3380 +3BC0 +1CE0 +0400 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0202 +ENCODING 514 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0780 +0FC0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 0203 +ENCODING 515 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 13 0 0 +BITMAP +0F00 +1FC0 +39C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 0204 +ENCODING 516 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +4400 +EE00 +F780 +3180 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0205 +ENCODING 517 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +2200 +7300 +7B80 +1DC0 +0840 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0206 +ENCODING 518 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +3C00 +7E00 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 0207 +ENCODING 519 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1F00 +3F80 +7180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0208 +ENCODING 520 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 9 20 -2 0 +BITMAP +4200 +E700 +7780 +3980 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 0209 +ENCODING 521 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 9 15 -2 0 +BITMAP +4400 +E600 +F700 +3380 +1000 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR 020A +ENCODING 522 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 19 -1 0 +BITMAP +3C +7E +C6 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 020B +ENCODING 523 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 8 14 -2 0 +BITMAP +3C +7F +E7 +43 +00 +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR 020C +ENCODING 524 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +0840 +0CE0 +0EF0 +0738 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 020D +ENCODING 525 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +2200 +7380 +7BC0 +1DC0 +0840 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 020E +ENCODING 526 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +03C0 +07E0 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 020F +ENCODING 527 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +1F00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0210 +ENCODING 528 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 1 0 +BITMAP +4200 +7700 +7B80 +18C0 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0211 +ENCODING 529 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 15 0 0 +BITMAP +4400 +E600 +F700 +7B80 +1000 +0000 +7780 +7F00 +7F00 +7000 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 0212 +ENCODING 530 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1E00 +3F00 +3180 +0000 +FF00 +FF80 +FFC0 +E1C0 +E1C0 +E1C0 +E3C0 +FF80 +FF00 +EF00 +E700 +E780 +E380 +E3C0 +E1E0 +ENDCHAR +STARTCHAR 0213 +ENCODING 531 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 14 0 0 +BITMAP +3C00 +7E00 +E700 +C300 +0000 +7780 +7F00 +7F00 +7000 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 0214 +ENCODING 532 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +2100 +7380 +39C0 +0CC0 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0215 +ENCODING 533 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +4200 +6700 +7780 +39C0 +0000 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0216 +ENCODING 534 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0F00 +1F80 +3180 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 0217 +ENCODING 535 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1E00 +3F00 +7380 +6180 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0218 +ENCODING 536 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 21 0 -6 +BITMAP +0F80 +3FE0 +3FC0 +7840 +7800 +3C00 +3F00 +1FC0 +03E0 +01E0 +00E0 +70E0 +7FE0 +FFC0 +1F80 +0000 +0E00 +0E00 +0600 +0200 +0C00 +ENDCHAR +STARTCHAR 0219 +ENCODING 537 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 15 1 -7 +BITMAP +7E +FE +E2 +F8 +7E +0F +CF +FE +FC +00 +38 +38 +38 +08 +10 +ENDCHAR +STARTCHAR 021A +ENCODING 538 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 21 0 -7 +BITMAP +FFC0 +FFC0 +FFC0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0000 +0E00 +0E00 +0E00 +0400 +0C00 +ENDCHAR +STARTCHAR 021B +ENCODING 539 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 19 0 -7 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +3E +3E +1E +00 +1C +1C +1C +04 +08 +ENDCHAR +STARTCHAR 022A +ENCODING 554 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0FF0 +0FF0 +0000 +0660 +0E70 +0E70 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 022B +ENCODING 555 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 17 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +3980 +3BC0 +3980 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 022C +ENCODING 556 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 24 0 0 +BITMAP +07F0 +07F0 +0000 +0000 +0730 +07F0 +0FE0 +0000 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 022D +ENCODING 557 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +1CC0 +3F80 +3F80 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0230 +ENCODING 560 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0FF0 +0FF0 +0000 +0180 +03C0 +0180 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 0231 +ENCODING 561 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 0 +BITMAP +3F80 +3F80 +0000 +0000 +0600 +0E00 +0E00 +0000 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0232 +ENCODING 562 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +1FC0 +1FC0 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 0233 +ENCODING 563 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 18 0 -5 +BITMAP +3F80 +3F80 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 0237 +ENCODING 567 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 14 -1 -5 +BITMAP +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +3C +F8 +F8 +F0 +ENDCHAR +STARTCHAR 0259 +ENCODING 601 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +7E00 +FF00 +6780 +0380 +FFC0 +FFC0 +F380 +7F80 +3E00 +ENDCHAR +STARTCHAR 02BC +ENCODING 700 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 3 6 1 9 +BITMAP +E0 +E0 +E0 +E0 +C0 +40 +ENDCHAR +STARTCHAR 02C6 +ENCODING 710 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 7 4 2 11 +BITMAP +10 +78 +FE +C6 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 4 1 11 +BITMAP +42 +F7 +3E +1C +ENDCHAR +STARTCHAR 02C9 +ENCODING 713 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 8 2 1 11 +BITMAP +FF +FF +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 7 4 2 11 +BITMAP +C6 +C6 +FE +78 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 3 1 11 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 6 5 1 11 +BITMAP +78 +7C +CC +7C +78 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 5 5 1 -5 +BITMAP +60 +40 +C0 +F8 +70 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 3 1 11 +BITMAP +39 +7F +CE +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 5 2 10 +BITMAP +22 +37 +7E +CC +08 +ENDCHAR +STARTCHAR 0300 +ENCODING 768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 4 2 11 +BITMAP +80 +C0 +F0 +30 +ENDCHAR +STARTCHAR 0301 +ENCODING 769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 4 3 11 +BITMAP +10 +38 +F0 +C0 +ENDCHAR +STARTCHAR 0302 +ENCODING 770 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +10 +7C +EE +C6 +ENDCHAR +STARTCHAR 0303 +ENCODING 771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 3 2 11 +BITMAP +73 +FE +DE +ENDCHAR +STARTCHAR 0304 +ENCODING 772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 2 11 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 0306 +ENCODING 774 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +C6 +C6 +FE +3C +ENDCHAR +STARTCHAR 0307 +ENCODING 775 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 2 11 +BITMAP +C0 +E0 +E0 +ENDCHAR +STARTCHAR 0308 +ENCODING 776 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 3 1 11 +BITMAP +67 +F7 +67 +ENDCHAR +STARTCHAR 0309 +ENCODING 777 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 4 10 +BITMAP +F0 +F8 +18 +38 +70 +ENDCHAR +STARTCHAR 030A +ENCODING 778 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 2 11 +BITMAP +70 +F8 +98 +F8 +70 +ENDCHAR +STARTCHAR 030B +ENCODING 779 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 2 10 +BITMAP +22 +37 +76 +EC +ENDCHAR +STARTCHAR 030C +ENCODING 780 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 11 +BITMAP +86 +EE +7C +38 +ENDCHAR +STARTCHAR 030F +ENCODING 783 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 9 4 2 11 +BITMAP +8400 +CE00 +F700 +3380 +ENDCHAR +STARTCHAR 0311 +ENCODING 785 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 2 10 +BITMAP +78 +FE +C6 +C6 +ENDCHAR +STARTCHAR 0312 +ENCODING 786 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 5 1 10 +BITMAP +60 +40 +E0 +E0 +40 +ENDCHAR +STARTCHAR 031B +ENCODING 795 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 4 4 10 +BITMAP +38 +38 +F0 +E0 +ENDCHAR +STARTCHAR 0323 +ENCODING 803 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 2 -3 +BITMAP +40 +E0 +60 +ENDCHAR +STARTCHAR 0324 +ENCODING 804 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 3 2 -4 +BITMAP +CE +EE +CE +ENDCHAR +STARTCHAR 0326 +ENCODING 806 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 1 -7 +BITMAP +60 +F0 +70 +20 +60 +ENDCHAR +STARTCHAR 0327 +ENCODING 807 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 2 -5 +BITMAP +20 +70 +18 +F8 +F0 +ENDCHAR +STARTCHAR 0328 +ENCODING 808 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 2 -5 +BITMAP +40 +C0 +80 +F0 +E0 +ENDCHAR +STARTCHAR 032E +ENCODING 814 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 1 -4 +BITMAP +22 +E3 +7F +3E +ENDCHAR +STARTCHAR 0331 +ENCODING 817 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 2 -3 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 1E80 +ENCODING 7808 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +008000 +01C000 +01E000 +006000 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E81 +ENCODING 7809 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +0100 +0380 +03C0 +00E0 +0000 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E82 +ENCODING 7810 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 20 0 0 +BITMAP +001000 +003800 +007000 +00C000 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E83 +ENCODING 7811 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +0080 +01C0 +03C0 +0300 +0200 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E84 +ENCODING 7812 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 19 0 0 +BITMAP +039800 +03BC00 +039800 +000000 +F0E1E0 +70E1E0 +70F1E0 +78F1C0 +79F1C0 +79F1C0 +39FBC0 +39BBC0 +3BBB80 +3F9B80 +1F9F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 1E85 +ENCODING 7813 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 13 0 0 +BITMAP +0670 +0E70 +0660 +0000 +E18F +F3CF +73CE +73CE +77FE +3E7C +3E7C +3C7C +1C38 +ENDCHAR +STARTCHAR 1E9E +ENCODING 7838 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1FC0 +7FE0 +7FE0 +F1E0 +E3C0 +E780 +E700 +E7E0 +E7F0 +E0F0 +E070 +E070 +EFF0 +EFE0 +EFC0 +ENDCHAR +STARTCHAR 1EA0 +ENCODING 7840 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 -4 +BITMAP +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EA1 +ENCODING 7841 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 12 0 -3 +BITMAP +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EA2 +ENCODING 7842 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0780 +00C0 +01C0 +0380 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA3 +ENCODING 7843 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 0 0 +BITMAP +0E00 +0F00 +0180 +0300 +0700 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA4 +ENCODING 7844 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0008 +001C +0078 +0320 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA5 +ENCODING 7845 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0300 +0700 +0E00 +0800 +0000 +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA6 +ENCODING 7846 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0040 +00E0 +0070 +0310 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA7 +ENCODING 7847 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0400 +0E00 +0F00 +0380 +0100 +0000 +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EA8 +ENCODING 7848 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 25 0 0 +BITMAP +00E0 +01F0 +0030 +0030 +0070 +0340 +07C0 +0EE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EA9 +ENCODING 7849 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0E00 +0F00 +0180 +0300 +0700 +0000 +0200 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EAA +ENCODING 7850 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +0720 +0FE0 +1FC0 +0000 +0100 +0780 +0FE0 +0C60 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EAB +ENCODING 7851 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 0 +BITMAP +1CC0 +1FC0 +3380 +0000 +0000 +0600 +0F00 +1FC0 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EAC +ENCODING 7852 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 -4 +BITMAP +0300 +07C0 +1EE0 +0840 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EAD +ENCODING 7853 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 17 0 -3 +BITMAP +0600 +0F00 +1F80 +19C0 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EAE +ENCODING 7854 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +00C0 +01C0 +0380 +0200 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EAF +ENCODING 7855 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0300 +0780 +0E00 +0800 +0000 +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB0 +ENCODING 7856 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +0400 +0F00 +0780 +0100 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB1 +ENCODING 7857 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 19 0 1 +BITMAP +0C00 +0F00 +0780 +0100 +0000 +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB2 +ENCODING 7858 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 24 0 0 +BITMAP +07C0 +00C0 +01C0 +0100 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB3 +ENCODING 7859 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 20 0 0 +BITMAP +0F00 +0F00 +0180 +0300 +0600 +0000 +30C0 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB4 +ENCODING 7860 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 0 +BITMAP +0F60 +0FE0 +19C0 +0000 +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +ENDCHAR +STARTCHAR 1EB5 +ENCODING 7861 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 18 0 0 +BITMAP +1EC0 +1FC0 +3380 +0000 +0000 +38C0 +1FC0 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +ENDCHAR +STARTCHAR 1EB6 +ENCODING 7862 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 23 0 -4 +BITMAP +0C60 +0FC0 +0780 +0000 +0780 +07C0 +07C0 +0FC0 +0FE0 +0EE0 +1CE0 +1C70 +3C70 +3FF8 +3FF8 +7FF8 +703C +F01C +F01E +0000 +0300 +0380 +0100 +ENDCHAR +STARTCHAR 1EB7 +ENCODING 7863 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 17 0 -3 +BITMAP +1080 +39C0 +1F80 +0F00 +0000 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EB8 +ENCODING 7864 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 -4 +BITMAP +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1800 +1800 +0800 +ENDCHAR +STARTCHAR 1EB9 +ENCODING 7865 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 12 0 -3 +BITMAP +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0400 +0E00 +0C00 +ENDCHAR +STARTCHAR 1EBA +ENCODING 7866 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 1 0 +BITMAP +3E00 +0600 +0E00 +1C00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBB +ENCODING 7867 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0C00 +1F00 +0300 +0300 +0E00 +0400 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EBC +ENCODING 7868 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 19 1 0 +BITMAP +7B00 +7F00 +CE00 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBD +ENCODING 7869 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1CC0 +3F80 +3F00 +0000 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EBE +ENCODING 7870 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 23 1 0 +BITMAP +0060 +00E0 +03C0 +1900 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EBF +ENCODING 7871 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC0 +ENCODING 7872 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 23 1 0 +BITMAP +0200 +0700 +0380 +1880 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC1 +ENCODING 7873 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0800 +0C00 +1E00 +0700 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC2 +ENCODING 7874 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 25 1 0 +BITMAP +0700 +0F80 +0180 +0180 +0380 +1A00 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC3 +ENCODING 7875 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 0 0 +BITMAP +0C00 +1F00 +0300 +0300 +0E00 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC4 +ENCODING 7876 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 24 1 0 +BITMAP +3900 +7F00 +FE00 +0000 +0800 +3C00 +7F00 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 1EC5 +ENCODING 7877 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 19 0 0 +BITMAP +1CC0 +3F80 +3700 +0000 +0000 +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EC6 +ENCODING 7878 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 24 1 -4 +BITMAP +1800 +3E00 +7700 +6300 +0000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +E000 +E000 +E000 +FF80 +FF80 +FF80 +0000 +1800 +1800 +0800 +ENDCHAR +STARTCHAR 1EC7 +ENCODING 7879 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 17 0 -3 +BITMAP +0400 +1E00 +3F80 +3180 +0000 +1F00 +3F80 +71C0 +7FC0 +FFC0 +7000 +7980 +3FC0 +1F80 +0400 +0E00 +0C00 +ENDCHAR +STARTCHAR 1EC8 +ENCODING 7880 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 20 0 0 +BITMAP +F8 +18 +18 +30 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 1EC9 +ENCODING 7881 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +F0 +F8 +18 +30 +70 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR 1ECA +ENCODING 7882 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 19 1 -4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +60 +E0 +40 +ENDCHAR +STARTCHAR 1ECB +ENCODING 7883 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +E0 +F0 +F0 +60 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +60 +E0 +40 +ENDCHAR +STARTCHAR 1ECC +ENCODING 7884 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 21 0 -6 +BITMAP +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +0000 +0000 +0000 +0180 +0180 +ENDCHAR +STARTCHAR 1ECD +ENCODING 7885 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1ECE +ENCODING 7886 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +07C0 +06C0 +00C0 +01C0 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ECF +ENCODING 7887 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E00 +0400 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED0 +ENCODING 7888 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0004 +001E +003C +01B0 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED1 +ENCODING 7889 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0000 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED2 +ENCODING 7890 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 22 0 1 +BITMAP +0070 +0078 +0198 +03C0 +07E0 +0670 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED3 +ENCODING 7891 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 1 +BITMAP +0C00 +1E00 +0700 +0000 +0000 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED4 +ENCODING 7892 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 25 0 0 +BITMAP +0070 +00F8 +0018 +0018 +0030 +01A0 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED5 +ENCODING 7893 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E00 +0400 +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED6 +ENCODING 7894 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0730 +0FF0 +0CE0 +0000 +03C0 +07E0 +0E70 +0020 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR 1ED7 +ENCODING 7895 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 0 +BITMAP +1CC0 +3F80 +3780 +0000 +0000 +0400 +1F00 +3B80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1ED8 +ENCODING 7896 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 26 0 -6 +BITMAP +0180 +03C0 +07E0 +0660 +0000 +07E0 +1FF8 +3FFC +3C3C +781E +700E +700E +F00E +700E +700E +781E +3C3C +3FFC +1FF8 +07E0 +0000 +0000 +0000 +0000 +0180 +0180 +ENDCHAR +STARTCHAR 1ED9 +ENCODING 7897 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +0400 +0E00 +3F80 +3180 +0000 +1F00 +3F80 +7FC0 +71E0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1EDA +ENCODING 7898 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 1 +BITMAP +00C000 +01E000 +038000 +020000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDB +ENCODING 7899 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0200 +0700 +0F00 +1C00 +0830 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EDC +ENCODING 7900 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 1 +BITMAP +030000 +038000 +01E000 +004000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDD +ENCODING 7901 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0800 +0C00 +0E00 +0700 +0130 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EDE +ENCODING 7902 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 21 0 0 +BITMAP +038000 +07C000 +04C000 +00C000 +01C000 +010380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EDF +ENCODING 7903 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 15 0 0 +BITMAP +0E00 +1F00 +0300 +0300 +0E30 +0430 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EE0 +ENCODING 7904 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 20 0 0 +BITMAP +073000 +07F000 +0FE000 +000000 +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +ENDCHAR +STARTCHAR 1EE1 +ENCODING 7905 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 14 0 0 +BITMAP +1CC0 +3F80 +3F80 +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +ENDCHAR +STARTCHAR 1EE2 +ENCODING 7906 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 17 22 0 -6 +BITMAP +000380 +07E180 +1FFB80 +3FFF00 +3C3C00 +781E00 +700E00 +700E00 +F00E00 +700E00 +700E00 +781E00 +3C3C00 +3FFC00 +1FF800 +07E000 +000000 +000000 +000000 +018000 +018000 +018000 +ENDCHAR +STARTCHAR 1EE3 +ENCODING 7907 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 12 16 0 -5 +BITMAP +0030 +0030 +1F30 +3FF0 +7FC0 +71C0 +F1E0 +71E0 +7FC0 +3F80 +1F00 +0000 +0000 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 1EE4 +ENCODING 7908 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 19 1 -4 +BITMAP +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +0000 +0600 +0600 +0400 +ENDCHAR +STARTCHAR 1EE5 +ENCODING 7909 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 12 1 -3 +BITMAP +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 1EE6 +ENCODING 7910 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +1F00 +0300 +0300 +0600 +0000 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EE7 +ENCODING 7911 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3C00 +3E00 +0600 +0600 +0C00 +0000 +E1C0 +E1C0 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EE8 +ENCODING 7912 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 1 +BITMAP +0300 +0F00 +0C00 +0803 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EE9 +ENCODING 7913 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +0400 +0E00 +1E00 +180C +100C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEA +ENCODING 7914 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 1 +BITMAP +0C00 +0F00 +0300 +0103 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EEB +ENCODING 7915 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +0800 +1C00 +1E00 +060C +020C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEC +ENCODING 7916 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 21 1 0 +BITMAP +1E00 +1F00 +0300 +0303 +0603 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EED +ENCODING 7917 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 1 0 +BITMAP +3C00 +3E00 +0600 +060C +0C0C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EEE +ENCODING 7918 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 0 +BITMAP +1CC0 +3FC0 +3383 +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 1EEF +ENCODING 7919 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 14 1 0 +BITMAP +3980 +7F80 +670C +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +ENDCHAR +STARTCHAR 1EF0 +ENCODING 7920 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 16 20 1 -3 +BITMAP +0003 +0003 +E0FF +E0FE +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +E0F0 +F1E0 +7FE0 +3FC0 +1F00 +0400 +0E00 +0600 +ENDCHAR +STARTCHAR 1EF1 +ENCODING 7921 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 14 1 -3 +BITMAP +000C +000C +E1FC +E1F8 +E1C0 +E1C0 +E1C0 +E3C0 +FFC0 +7F80 +3E00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 1EF2 +ENCODING 7922 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0800 +1C00 +0E00 +0700 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF3 +ENCODING 7923 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +0800 +0C00 +0E00 +0700 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF4 +ENCODING 7924 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 -4 +BITMAP +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +0000 +0600 +0700 +0200 +ENDCHAR +STARTCHAR 1EF5 +ENCODING 7925 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 14 0 -5 +BITMAP +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1E00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF6 +ENCODING 7926 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0F00 +0180 +0380 +0700 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF7 +ENCODING 7927 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -5 +BITMAP +1E00 +1F00 +0300 +0300 +0600 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 1EF8 +ENCODING 7928 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 19 0 0 +BITMAP +1EC0 +1FC0 +3380 +0000 +F078 +F0F0 +78F0 +79E0 +3DE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR 1EF9 +ENCODING 7929 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -5 +BITMAP +1CC0 +3F80 +3780 +0000 +0000 +E0E0 +71E0 +71C0 +79C0 +3B80 +3B80 +1F00 +1F00 +1E00 +0E00 +1E00 +1C00 +3C00 +3800 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 10 3 0 4 +BITMAP +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 19 3 0 4 +BITMAP +FFFFE0 +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 1 8 +BITMAP +20 +40 +C0 +E0 +F0 +F0 +60 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 0 8 +BITMAP +60 +F0 +F0 +70 +30 +20 +40 +ENDCHAR +STARTCHAR 201A +ENCODING 8218 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 7 1 -3 +BITMAP +60 +F0 +F0 +F0 +20 +60 +C0 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 8 +BITMAP +3180 +6300 +4200 +F780 +F780 +F380 +7380 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 8 +BITMAP +6300 +F780 +F780 +F780 +2100 +6300 +4200 +ENDCHAR +STARTCHAR 201E +ENCODING 8222 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 7 1 -3 +BITMAP +6700 +F780 +F780 +F780 +2100 +6300 +C600 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 19 1 -3 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 19 1 -3 +BITMAP +38 +38 +38 +38 +FE +FE +FE +38 +38 +FE +FE +FE +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 6 7 3 3 +BITMAP +78 +FC +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 4 1 0 +BITMAP +6187 +F3CF +F3CF +6187 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 1125 0 +DWIDTH 25 0 +BBX 24 15 0 0 +BITMAP +1E0000 +3F0040 +6301C0 +638780 +730E00 +3F3800 +1E7000 +01C000 +07B83C +0E7E7E +38E667 +70C7E3 +C0C6E3 +007E7E +003C3C +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +10 +30 +70 +E0 +C0 +E0 +70 +38 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +E0 +60 +30 +38 +30 +60 +E0 +40 +ENDCHAR +STARTCHAR 2044 +ENCODING 8260 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 10 15 -3 0 +BITMAP +00C0 +00C0 +0180 +0180 +0300 +0300 +0600 +0C00 +0C00 +1800 +1800 +3000 +3000 +6000 +C000 +ENDCHAR +STARTCHAR 2074 +ENCODING 8308 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 4 6 0 9 +BITMAP +30 +70 +70 +F0 +F0 +30 +ENDCHAR +STARTCHAR 20A1 +ENCODING 8353 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 13 18 0 -2 +BITMAP +0068 +07F8 +1FF8 +3FF0 +39B0 +7BE0 +7360 +7360 +F6C0 +76C0 +7F80 +7D80 +7D90 +3FF0 +1FF0 +37E0 +3600 +3600 +ENDCHAR +STARTCHAR 20A3 +ENCODING 8355 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 0 0 +BITMAP +7F80 +7F80 +7F80 +7000 +7000 +7000 +7F80 +7F80 +7F80 +7000 +7000 +FE00 +FE00 +7000 +7000 +ENDCHAR +STARTCHAR 20A4 +ENCODING 8356 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 15 1 0 +BITMAP +1F00 +3FC0 +7FC0 +70C0 +7000 +7000 +7000 +FF00 +3800 +FF00 +1C00 +1800 +7EF0 +FFE0 +C3C0 +ENDCHAR +STARTCHAR 20A6 +ENCODING 8358 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 15 0 0 +BITMAP +7C1C +7C1C +7E1C +7E1C +771C +771C +FFFF +FFFF +71DC +71DC +70FC +70FC +707C +707C +703C +ENDCHAR +STARTCHAR 20A7 +ENCODING 8359 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 0 0 +BITMAP +7F80 +7FC0 +7FE0 +71E0 +FFF0 +FFF0 +71E0 +7FE0 +7FC0 +7E00 +7000 +7000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 20A9 +ENCODING 8361 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 19 15 0 0 +BITMAP +F0E1E0 +70E1E0 +70F1E0 +79F1C0 +79F1C0 +39FBC0 +FFFFE0 +FFFFE0 +3BBB80 +3F9F80 +1F1F80 +1F1F80 +1F1F00 +1F0F00 +1F0F00 +ENDCHAR +STARTCHAR 20AB +ENCODING 8363 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 19 0 -3 +BITMAP +00E0 +00E0 +07F0 +07F0 +00E0 +00E0 +00E0 +1EE0 +3FE0 +7FE0 +70E0 +F0E0 +70E0 +7FE0 +3FE0 +1EE0 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 14 15 0 0 +BITMAP +03F0 +0FFC +1FF8 +3F18 +3C00 +FFE0 +FFE0 +7800 +FFE0 +FFE0 +3C00 +3F18 +1FF8 +0FFC +03F0 +ENDCHAR +STARTCHAR 20AD +ENCODING 8365 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +70E0 +71E0 +73C0 +7380 +7780 +7F00 +FFF0 +FFF0 +7F00 +7780 +7380 +73C0 +71E0 +70E0 +70F0 +ENDCHAR +STARTCHAR 20B1 +ENCODING 8369 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 0 0 +BITMAP +7F80 +7FC0 +7FE0 +71E0 +FFF0 +70E0 +FFF0 +71E0 +71E0 +7FC0 +7F80 +7E00 +7000 +7000 +7000 +ENDCHAR +STARTCHAR 20B2 +ENCODING 8370 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 19 0 -3 +BITMAP +0380 +07E0 +1FF8 +3FFC +7FBC +7B90 +7380 +F380 +F3FE +73FE +738E +7B9E +3FBC +3FFC +1FF8 +07E0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 20B5 +ENCODING 8373 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 19 0 -3 +BITMAP +0380 +07E0 +1FF0 +3FF0 +3F90 +7B80 +7380 +7380 +F380 +7380 +7380 +7B80 +7F90 +3FF0 +1FF0 +07F0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR 20B9 +ENCODING 8377 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 10 15 2 0 +BITMAP +FFC0 +FFC0 +0F00 +0700 +FFC0 +FFC0 +0700 +0F00 +FE00 +F000 +F000 +7800 +3C00 +1E00 +0F00 +ENDCHAR +STARTCHAR 20BA +ENCODING 8378 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 15 0 0 +BITMAP +7000 +7000 +7100 +7700 +7F00 +FC00 +F100 +7F00 +FC00 +F0E0 +70E0 +71E0 +7FC0 +7F80 +7F00 +ENDCHAR +STARTCHAR 20BC +ENCODING 8380 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +0C00 +0C00 +3F80 +7FC0 +FFE0 +EDE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ECE0 +ENDCHAR +STARTCHAR 20BD +ENCODING 8381 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 15 -1 0 +BITMAP +3FC0 +3FE0 +3FF0 +38F0 +3870 +3870 +38F0 +FFF0 +FFE0 +3F00 +3800 +FE00 +FE00 +3800 +3800 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 1260 0 +DWIDTH 28 0 +BBX 26 15 1 0 +BITMAP +F8383E00 +F8387F00 +FC38FF80 +FC38E380 +EE39E3C0 +EE38E3C0 +E738E380 +E738FF80 +E3B87F00 +E3B81C00 +E1F80000 +E1F80000 +E0F8FFC0 +E0F8FFC0 +E078FFC0 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 9 5 0 10 +BITMAP +F900 +4D00 +4E80 +4A80 +4A80 +ENDCHAR +STARTCHAR 2212 +ENCODING 8722 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 3 1 6 +BITMAP +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 2215 +ENCODING 8725 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 17 1 -1 +BITMAP +0380 +0380 +0300 +0700 +0600 +0E00 +0E00 +0C00 +1C00 +1800 +3800 +3000 +7000 +7000 +6000 +E000 +C000 +ENDCHAR +STARTCHAR 2219 +ENCODING 8729 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 6 7 3 3 +BITMAP +78 +FC +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 8 1 1 +BITMAP +7CC0 +FFC0 +4780 +0000 +3800 +7FE0 +EFC0 +0780 +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 12 1 1 +BITMAP +0300 +0300 +FF80 +FF80 +FF80 +1800 +FF80 +FF80 +FF80 +6000 +C000 +C000 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +0060 +01E0 +07E0 +3F80 +7C00 +7800 +7E00 +1FC0 +07E0 +00E0 +0020 +0000 +FFE0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +8000 +F000 +FC00 +3F00 +0FC0 +03C0 +0FC0 +7F00 +F800 +E000 +8000 +0000 +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB01 +ENCODING 64257 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 16 0 0 +BITMAP +0F00 +1F70 +3E70 +3870 +3830 +3800 +3800 +FE70 +FE70 +FE70 +3870 +3870 +3870 +3870 +3870 +3870 +ENDCHAR +STARTCHAR FB02 +ENCODING 64258 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 16 0 0 +BITMAP +0F70 +1F70 +3E70 +3870 +3870 +3870 +3870 +FE70 +FE70 +FE70 +3870 +3870 +3870 +3870 +3870 +3870 +ENDCHAR +ENDFONT diff --git a/examples/uplot_integration_example.py b/examples/integration_example.py similarity index 75% rename from examples/uplot_integration_example.py rename to examples/integration_example.py index 2252395..b26b25c 100644 --- a/examples/uplot_integration_example.py +++ b/examples/integration_example.py @@ -5,8 +5,8 @@ import board from ulab import numpy as np from uhistogram import Histogram -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian # Setting Up the histogram data = [5, 4, 3, 2, 7, 5, 3, 3, 3, 3, 2, 9, 7, 6] @@ -17,7 +17,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Seeting some date to plot x = np.linspace(-4, 4, num=50) @@ -25,13 +25,10 @@ y = constant * np.exp((-(x**2)) / 2.0) # Plotting and showing the plot -ucartesian(plot, x, y) +Cartesian(plot, x, y) # Adding a circle plot.draw_circle(radius=8, x=120, y=120) # Showing in the screen -display.show(plot) - -while True: - pass +display.root_group = plot diff --git a/examples/uplot_lissajous_curves.py b/examples/lissajous_curves.py similarity index 82% rename from examples/uplot_lissajous_curves.py rename to examples/lissajous_curves.py index bbdf3c7..945f120 100644 --- a/examples/uplot_lissajous_curves.py +++ b/examples/lissajous_curves.py @@ -5,8 +5,8 @@ import math import board import displayio -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.cartesian import Cartesian # Inspired by Paul McWhorter Raspberry Pi Pico W LESSON 27: Creating Lissajous Patterns # on an OLED Display @@ -37,10 +37,10 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width // 2, display.height // 2, padding=1) -plot2 = Uplot(240, 0, display.width // 2, display.height // 2, padding=1) -plot3 = Uplot(0, 160, display.width // 2, display.height // 2, padding=1) -plot4 = Uplot(240, 160, display.width // 2, display.height // 2, padding=1) +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) g = displayio.Group() g.append(plot) g.append(plot2) @@ -48,7 +48,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): g.append(plot4) # Plotting and showing the plot -display.show(g) +display.root_group = g # Some Variables @@ -57,7 +57,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): # Creating the Plots x_number_list, y_number_list = create_curve(1, 2, 10) -ucartesian( +Cartesian( plot, x_number_list, y_number_list, @@ -67,7 +67,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(3, 2, 10) -ucartesian( +Cartesian( plot2, x_number_list, y_number_list, @@ -77,7 +77,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(3, 4, 10) -ucartesian( +Cartesian( plot3, x_number_list, y_number_list, @@ -87,7 +87,7 @@ def create_curve(a=1, b=2, mul_factor=10, delta=3.14 / 2): ) x_number_list, y_number_list = create_curve(5, 4, 10) -ucartesian( +Cartesian( plot4, x_number_list, y_number_list, diff --git a/examples/uplot_ulogging_animation.py b/examples/logging_animation.py similarity index 82% rename from examples/uplot_ulogging_animation.py rename to examples/logging_animation.py index 78ab5af..ad79397 100644 --- a/examples/uplot_ulogging_animation.py +++ b/examples/logging_animation.py @@ -2,24 +2,23 @@ # # SPDX-License-Identifier: MIT - import time import random import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY display.auto_refresh = False # Drawing the graph -my_plot = Uplot( - 140, - 60, - 200, - 200, - padding=1, +my_plot = Plot( + 5, + 5, + 480, + 300, + padding=20, show_box=True, box_color=color.WHITE, ) @@ -30,6 +29,7 @@ ticky_height=4, show_ticks=True, tickcolor=color.TEAL, + tickgrid=True, showtext=True, ) @@ -61,13 +61,13 @@ random_numbers = [19, 22, 35, 33, 24, 26, 28, 37] -display.show(my_plot) +display.root_group = my_plot display.refresh() dist = 1 # Creating the loggraph -my_loggraph = ulogging( +my_loggraph = Logging( my_plot, x[0:dist], y[0:dist], @@ -76,10 +76,11 @@ line_color=color.BLUE, ticksx=[25, 50, 75, 100, 125, 150, 175, 200], ticksy=[25, 50, 75, 100], + fill=False, ) # Showing the loggraph -while True: +for _ in range(20): if dist > len(x): y.pop(0) y.append(random.choice(random_numbers)) diff --git a/examples/uplot_logging_changing_values.py b/examples/logging_changing_values.py similarity index 84% rename from examples/uplot_logging_changing_values.py rename to examples/logging_changing_values.py index 0993c69..7d1858e 100644 --- a/examples/uplot_logging_changing_values.py +++ b/examples/logging_changing_values.py @@ -5,13 +5,13 @@ import time import displayio import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -28,7 +28,7 @@ g.append(t) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, @@ -48,10 +48,10 @@ g.append(plot_1) -display.show(g) +display.root_group = g display.refresh() -my_log = ulogging( +my_log = Logging( plot_1, x, temp_y, @@ -63,7 +63,7 @@ ) -while True: +for i in range(2): for i in range(len(x)): my_log.draw_points(plot_1, x[0:i], temp_y[0:i]) time.sleep(1) diff --git a/examples/uplot_logging_fill.py b/examples/logging_fill.py similarity index 85% rename from examples/uplot_logging_fill.py rename to examples/logging_fill.py index d74f7d9..10885fe 100644 --- a/examples/uplot_logging_fill.py +++ b/examples/logging_fill.py @@ -2,21 +2,21 @@ # # SPDX-License-Identifier: MIT +import time import displayio import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging # Setting up the display display = board.DISPLAY group = displayio.Group() - palette = displayio.Palette(1) palette[0] = 0x000000 -plot_1 = Uplot( +plot_1 = Plot( 0, 0, 150, @@ -32,7 +32,7 @@ tickx_height=4, ticky_height=4, show_ticks=True, tickcolor=color.BLACK ) -plot_2 = Uplot( +plot_2 = Plot( 0, 150, 300, @@ -51,7 +51,7 @@ x = [10, 20, 30, 40, 50] temp_y = [26, 25, 24, 23, 28] -ulogging( +Logging( plot_1, x, temp_y, @@ -62,7 +62,7 @@ ticksy=[15, 30, 45, 60], fill=True, ) -ulogging( +Logging( plot_2, x, temp_y, @@ -77,4 +77,6 @@ group.append(plot_1) group.append(plot_2) -display.show(group) +display.root_group = group + +time.sleep(10) diff --git a/examples/logging_limits.py b/examples/logging_limits.py new file mode 100644 index 0000000..0ccf9de --- /dev/null +++ b/examples/logging_limits.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: Copyright (c) Jose D. Montoya +# +# SPDX-License-Identifier: MIT + + +import time +import random +import board +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging + +# Setting up the display +display = board.DISPLAY +display.auto_refresh = False + +# Drawing the graph +my_plot = Plot( + 140, + 60, + 200, + 200, + show_box=True, + box_color=color.WHITE, +) + +# Setting the tick parameters +my_plot.tick_params( + tickx_height=4, + ticky_height=4, + show_ticks=True, + tickcolor=color.TEAL, + showtext=True, +) + +# Creating the x and y data +x = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + 170, + 180, + 190, +] +y = [26, 32, 34, 30, 28, 35, 46, 65, 37, 23, 40, 27, 26, 36, 44, 53, 69, 27, 26] + +# Creating the random numbers +random_numbers = [32, 34, 45, 65, 24, 40, 18, 27] + + +display.root_group = my_plot +display.refresh() + +dist = 1 + +# Creating the loggraph +my_loggraph = Logging( + my_plot, + x[0:dist], + y[0:dist], + rangex=[0, 210], + rangey=[0, 110], + line_color=color.BLUE, + ticksx=[25, 50, 75, 100, 125, 150, 175, 200], + ticksy=[25, 50, 75, 100], + limits=[30, 60], +) + +# Showing the loggraph +for i in range(45): + if dist > len(x): + y.pop(0) + y.append(random.choice(random_numbers)) + + my_loggraph.draw_points(my_plot, x[0:dist], y[0:dist]) + display.refresh() + dist += 1 + time.sleep(0.5) diff --git a/examples/uplot_ulogging.py b/examples/logging_simple_test.py similarity index 87% rename from examples/uplot_ulogging.py rename to examples/logging_simple_test.py index 7b9a428..cbd6a63 100644 --- a/examples/uplot_ulogging.py +++ b/examples/logging_simple_test.py @@ -2,17 +2,19 @@ # # SPDX-License-Identifier: MIT +import time import displayio import terminalio import board from adafruit_display_text import label -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging + # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) g = displayio.Group() DISPLAY_WIDTH = 200 @@ -38,7 +40,7 @@ text_humidity.anchored_position = 130, 0 g.append(text_humidity) -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, @@ -58,12 +60,12 @@ g.append(plot_1) -display.show(g) -display.refresh() +display.root_group = g + dist = 3 -ulogging( +Logging( plot_1, x[0:dist], temp_y[0:dist], @@ -75,3 +77,5 @@ ) text_temperature.text = "{}C".format(temp_y[dist]) + +time.sleep(5) diff --git a/examples/uplot_logging_table.py b/examples/logging_table.py similarity index 89% rename from examples/uplot_logging_table.py rename to examples/logging_table.py index aa1016c..5c997b8 100644 --- a/examples/uplot_logging_table.py +++ b/examples/logging_table.py @@ -11,8 +11,8 @@ import displayio import board from table import Table -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ulogging import ulogging +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging # Create a display object display = board.DISPLAY @@ -39,7 +39,7 @@ g = displayio.Group() # Create a plot object -plot_1 = Uplot( +plot_1 = Plot( 0, 50, 200, @@ -58,8 +58,8 @@ x = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] temp_y = [26, 25, 24, 23, 28, 24, 54, 76, 34, 23] -# Create a ulogging object -my_log = ulogging( +# Create a logging object +my_log = Logging( plot_1, x, temp_y, @@ -74,9 +74,9 @@ g.append(plot_1) g.append(my_table) # Show the group -display.show(g) +display.root_group = g -while True: +for _ in range(2): for i in range(len(x)): my_log.draw_points(plot_1, x[0:i], temp_y[0:i]) time.sleep(1) diff --git a/examples/logging_with_dial_gauge.py b/examples/logging_with_dial_gauge.py new file mode 100644 index 0000000..89389f6 --- /dev/null +++ b/examples/logging_with_dial_gauge.py @@ -0,0 +1,104 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import time +import random +import board +import displayio +from dial_gauge import DIAL_GAUGE +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.logging import Logging + + +# In order to run this example you need to install the following library: +# - CircuitPython_DIAL_GAUGE (from https://github.com/jposada202020/CircuitPython_DIAL_GAUGE) + +rangey_values = [0, 110] + +display = board.DISPLAY +display.auto_refresh = False +my_plot = Plot(0, 0, display.width // 2, display.height // 2) +plot2 = Plot(display.width // 2, 0, display.width // 2, display.height // 2) + +my_dial = DIAL_GAUGE(60, 50, 60, 40, range_values=rangey_values, color=color.BLUE) + +plot2.append(my_dial) + +g = displayio.Group() +g.append(my_plot) +g.append(plot2) +display.root_group = g + + +my_plot.tick_params( + tickx_height=4, + ticky_height=4, + show_ticks=True, + tickcolor=color.TEAL, + showtext=True, +) + +# Creating the x and y data +x = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + 170, + 180, + 190, +] +y = [] + +# Creating the random numbers +random_numbers = [32, 34, 45, 65, 24, 40, 18, 27] + + +# display.show(my_plot) +display.refresh() + +dist = 0 + +# Creating the loggraph +my_loggraph = Logging( + my_plot, + x[0:dist], + y[0:dist], + rangex=[0, 210], + rangey=rangey_values, + line_color=color.BLUE, + ticksx=[25, 50, 75, 100, 125, 150, 175, 200], + ticksy=[25, 50, 75, 100], + limits=[30, 60], +) + +# Showing the loggraph +for i in range(150): + if dist > len(x): + y.pop(0) + + update_value = random.choice(random_numbers) + y.append(update_value) + + my_loggraph.draw_points(my_plot, x[0:dist], y[0:dist]) + + if dist > len(x): + my_dial.update(update_value) + else: + my_dial.update(y[i]) + display.refresh() + dist += 1 + time.sleep(0.5) diff --git a/examples/uplot_umap.py b/examples/map.py similarity index 63% rename from examples/uplot_umap.py rename to examples/map.py index 7d04a8b..03c0d8f 100644 --- a/examples/uplot_umap.py +++ b/examples/map.py @@ -2,19 +2,18 @@ # # SPDX-License-Identifier: MIT -import time from random import choice import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.umap import umap +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.map import Map # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, show_box=False) +plot = Plot(0, 0, display.width, display.height, show_box=False) # Setting some date to plot x = np.linspace(-4, 4, num=100) @@ -23,10 +22,6 @@ y1 = np.array(b).reshape((10, 10)) # Plotting and showing the plot -umap(plot, y1, 0xFF0044, 0x4400FF) +Map(plot, y1, 0xFF0044, 0x4400FF) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_upie_example.py b/examples/pie_example.py similarity index 53% rename from examples/uplot_upie_example.py rename to examples/pie_example.py index be32246..b297610 100644 --- a/examples/uplot_upie_example.py +++ b/examples/pie_example.py @@ -2,26 +2,21 @@ # # SPDX-License-Identifier: MIT -import time import board -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.upie import upie +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.pie import Pie # Setting up the display display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.axs_params(axstype="box") a = [5, 2, 7, 3] -upie(plot, a) +Pie(plot, a) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_plot_example.py b/examples/plot_example.py similarity index 61% rename from examples/uplot_plot_example.py rename to examples/plot_example.py index 2c64ac8..b819e94 100644 --- a/examples/uplot_plot_example.py +++ b/examples/plot_example.py @@ -2,17 +2,16 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Creating some points to graph x = np.linspace(-4, 4, num=25) @@ -20,8 +19,6 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y) +Cartesian(plot, x, y) -display.show(plot) -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/plot_line_styles.py b/examples/plot_line_styles.py new file mode 100644 index 0000000..d0532ac --- /dev/null +++ b/examples/plot_line_styles.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, display.width, display.height) + +# Creating some points to graph +x = np.linspace(-4, 4, num=25) +constant = 1.0 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 2.0) + +# Drawing the graph +Cartesian( + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0xFF0000, + line_style="- -", +) + +# Creating some points to graph +x = np.linspace(-3, 3, num=50) +constant = 2.0 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 2.0) +Cartesian( + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0x00FF00, + line_style=".", +) + + +x = np.linspace(-4, 4, num=50) +constant = 2.5 / np.sqrt(2 * np.pi) +y = constant * np.exp((-(x**2)) / 6.5) +Cartesian( + plot, + x, + y, + rangex=[-5, 5], + rangey=[0, 1], + line_color=0x123456, + line_style="-.-", +) + +# Plotting and showing the plot +display.root_group = plot diff --git a/examples/uplot_simpletest.py b/examples/plot_simpletest.py similarity index 59% rename from examples/uplot_simpletest.py rename to examples/plot_simpletest.py index 80a2726..6f06270 100644 --- a/examples/uplot_simpletest.py +++ b/examples/plot_simpletest.py @@ -2,19 +2,15 @@ # # SPDX-License-Identifier: MIT -import time import board -from circuitpython_uplot.uplot import Uplot +from circuitpython_uplot.plot import Plot # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) plot.draw_circle(radius=8, x=120, y=120) -display.show(plot) - -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/polar_advanced.py b/examples/polar_advanced.py new file mode 100644 index 0000000..4e88491 --- /dev/null +++ b/examples/polar_advanced.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import ulab.numpy as np +import displayio +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.polar import Polar + + +# Setting up the display +display = board.DISPLAY +g = displayio.Group() + +# Drawing an Ellipse +theta = np.arange(0, 2 * np.pi, 0.01) +a = 2 +b = 1 +r = (a * b) / np.sqrt((a * np.sin(theta)) ** 2 + (b * np.cos(theta)) ** 2) + +plot = Plot(0, 0, 160, 160, padding=0, show_box=False) +Polar(plot, theta, r, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) +g.append(plot) + +# Drawing an Spiral +r2 = 2 * np.pi * theta + 4.5 +plot2 = Plot(0, 160, 160, 160, padding=0, show_box=False) +Polar(plot2, r2, theta, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) +g.append(plot2) + +# Drawing a Star +rhos = 2 + np.cos(5 * theta) +plot3 = Plot(160, 0, 160, 160, padding=0, show_box=False) +Polar( + plot3, + theta, + rhos, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot3) + +# Drawing a more dense Spiral +rhos = (np.pi / 2) * np.cos(3 * theta) +plot5 = Plot(320, 0, 160, 160, padding=0, show_box=False) +Polar( + plot5, + rhos, + theta, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot5) + +# Drawing a funky Shape +rhos = (np.pi / 2) * theta**2 +plot4 = Plot(160, 160, 160, 160, padding=0, show_box=False) +Polar( + plot4, + rhos, + theta, + rangex=[-4, 4], + rangey=[-4, 4], + line_color=color.ORANGE, + radius_ticks=[2.0, 4.0], +) +g.append(plot4) + +# Show the Display +display.root_group = g diff --git a/examples/polar_example.py b/examples/polar_example.py new file mode 100644 index 0000000..0e761a2 --- /dev/null +++ b/examples/polar_example.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import ulab.numpy as np +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.polar import Polar + +# Setting up the display +display = board.DISPLAY +plot = Plot(10, 10, 250, 250, padding=0, show_box=False) + +# Creating the data +r = np.arange(0, 2, 0.01) +theta = 2 * np.pi * r + +# Plotting and showing the plot +Polar(plot, theta, r, rangex=[-2, 2], rangey=[-2, 2], line_color=color.ORANGE) +display.root_group = plot diff --git a/examples/polar_plots.py b/examples/polar_plots.py new file mode 100644 index 0000000..3a8f4b2 --- /dev/null +++ b/examples/polar_plots.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +import displayio +import ulab.numpy as np +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.cartesian import Cartesian + +# Inspired by +# https://github.com/CodeDrome/polar-plots-python + +# pylint: disable=dangerous-default-value +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) +g = displayio.Group() +g.append(plot) +g.append(plot2) +g.append(plot3) +g.append(plot4) + +# Plotting and showing the plot +display.root_group = g + + +def rose_function(n=3, angle_range=[0, 360], radius=30): + """ + Rose function + :param int n: Node number. Defaults to 3 + :param list angle_range: angle range to be plot. Defaults to [0, 360] + :param int radius: radius of the rose function. Defatuls to 30 + """ + test = np.linspace(angle_range[0], angle_range[1], angle_range[1] - angle_range[0]) + radians = np.radians(test) + + return ( + np.cos(radians) * np.sin(radians * n) * radius, + np.sin(radians) * np.sin(radians * n) * radius, + ) + + +def spiral_function(a=1, b=3, angle_range=[0, 720]): + """ + Spiral Graph + :param int a: spiral's rotation. Defaults to 1 + :param int b: distance between the lines. Defaults to 3 + :param list angle_range: angle range to be plot. Defaults: [0, 720] + """ + + test = np.linspace(angle_range[0], angle_range[1], angle_range[1] - angle_range[0]) + radians = np.radians(test) + + distance = a + b * radians + + return np.cos(radians) * distance, np.sin(radians) * distance + + +def cardioid_function(angle_range=[0, 360], radius=35): + """ + Cardiod Function + :param list angle_range: angle range to be plot. Defaults: [0, 360] + :param int radius: Radius of the cardiod plot + + """ + test = np.linspace(angle_range[0], angle_range[1], angle_range[1] - angle_range[0]) + radians = np.radians(test) + distance = (1 + np.cos(radians)) * radius + + return np.cos(radians) * distance, np.sin(radians) * distance + + +def circle_function(angle_range=[0, 360], radius=35): + """ + Circle function + :param list angle_range: angle range to be plot. Defaults: [0, 360] + :param int radius: Radius of the cardiod plot + """ + test = np.linspace(angle_range[0], angle_range[1], angle_range[1] - angle_range[0]) + radians = np.radians(test) + return np.cos(radians) * radius, np.sin(radians) * radius + + +x, y = rose_function(n=3, angle_range=[0, 360], radius=35) +Cartesian(plot, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=0xE30B5D) + +x, y = spiral_function(a=1, b=3, angle_range=[0, 900]) +Cartesian(plot2, x, y, rangex=[-50, 50], rangey=[-50, 50], line_color=color.YELLOW) + +x, y = cardioid_function(angle_range=[0, 360], radius=35) +Cartesian(plot3, x, y, rangex=[-15, 75], rangey=[-50, 50], line_color=color.TEAL) + +x, y = circle_function(angle_range=[0, 360], radius=35) +Cartesian(plot4, x, y, rangex=[-40, 40], rangey=[-40, 40], line_color=color.ORANGE) diff --git a/examples/uplot_readme_example.py b/examples/readme_example.py similarity index 56% rename from examples/uplot_readme_example.py rename to examples/readme_example.py index 9115338..525b798 100644 --- a/examples/uplot_readme_example.py +++ b/examples/readme_example.py @@ -6,15 +6,15 @@ import board import displayio from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ubar import ubar -from circuitpython_uplot.uscatter import uscatter -from circuitpython_uplot.upie import upie -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.bar import Bar +from circuitpython_uplot.scatter import Scatter +from circuitpython_uplot.pie import Pie +from circuitpython_uplot.cartesian import Cartesian display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height, show_box=False) +plot = Plot(0, 0, display.width, display.height, show_box=False) group = displayio.Group() @@ -22,14 +22,14 @@ palette[0] = 0xFFFFFF -plot2 = Uplot(0, 0, 130, 130) +plot2 = Plot(0, 0, 130, 130) x = np.linspace(-4, 4, num=25) constant = 2.0 / np.sqrt(2 * np.pi) y = constant * np.exp((-(x**2)) / 4.0) -ucartesian(plot2, x, y, rangex=[-5, 5], rangey=[0, 1]) +Cartesian(plot2, x, y, rangex=[-5, 5], rangey=[0, 1]) plot.append(plot2) -plot3 = Uplot(130, 0, 160, 160) +plot3 = Plot(130, 0, 160, 160) # Setting up tick parameters plot3.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF00FF, tickgrid=True) @@ -40,55 +40,55 @@ y = constant * np.exp((-(x**2)) / 2.0) # Plotting and showing the plot -ucartesian(plot3, x, y, rangex=[-5, 5], rangey=[0, 0.5]) +Cartesian(plot3, x, y, rangex=[-5, 5], rangey=[0, 0.5]) plot.append(plot3) -plot4 = Uplot(290, 0, 150, 150) +plot4 = Plot(290, 0, 150, 150) # Setting up tick parameters plot4.axs_params(axstype="box") a = ["a", "b", "c", "d"] b = [3, 5, 1, 7] -ubar(plot4, a, b, 0xFF1000, fill=True) +Bar(plot4, a, b, 0xFF1000, fill=True) plot.append(plot4) -plot5 = Uplot(0, 180, 120, 120) +plot5 = Plot(0, 180, 120, 120) # Setting up tick parameters plot5.axs_params(axstype="cartesian") a = np.linspace(3, 98) b = [choice(a) for _ in a] -uscatter(plot5, a, b, rangex=[0, 102], rangey=[0, 102], radius=2) +Scatter(plot5, a, b, rangex=[0, 102], rangey=[0, 102], radius=2) plot.append(plot5) -plot6 = Uplot(130, 160, 150, 150) +plot6 = Plot(130, 160, 150, 150) # Setting up tick parameters plot6.axs_params(axstype="box") a = [5, 2, 7, 3] -upie(plot6, a, 0, 0) +Pie(plot6, a, 0, 0) plot.append(plot6) -plot7 = Uplot(290, 160, 150, 150) +plot7 = Plot(290, 160, 150, 150) # Creating some points to graph x = np.linspace(1, 10, num=10) y = [6, 7, 9, 6, 9, 7, 6, 6, 8, 9] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) y = [4, 3, 7, 8, 3, 9, 3, 2, 1, 2] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) y = [1, 4, 6, 3, 6, 6, 5, 0, 9, 2] -ucartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) +Cartesian(plot7, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) plot.append(plot7) # Plotting and showing the plot -display.show(plot) +display.root_group = plot diff --git a/examples/uplot_uscatter.py b/examples/scatter.py similarity index 65% rename from examples/uplot_uscatter.py rename to examples/scatter.py index c40e7f8..fb64566 100644 --- a/examples/uplot_uscatter.py +++ b/examples/scatter.py @@ -2,30 +2,25 @@ # # SPDX-License-Identifier: MIT -import time from random import choice import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.uscatter import uscatter +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # Setting up tick parameters plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) plot.axs_params(axstype="cartesian") a = np.linspace(1, 100) b = [choice(a) for _ in a] -uscatter(plot, a, b) +Scatter(plot, a, b) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/scatter_circle_radius.py b/examples/scatter_circle_radius.py new file mode 100644 index 0000000..fb043b9 --- /dev/null +++ b/examples/scatter_circle_radius.py @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +from random import choice +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width, display.height, padding=1) +plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0x939597, tickgrid=True) + +display.root_group = plot + +a = np.linspace(1, 200, 150) +z = [4, 5, 6, 7, 8] +radi = [choice(z) for _ in a] +b = [choice(a) for _ in a] +Scatter( + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0xF456F3, +) diff --git a/examples/scatter_pointers.py b/examples/scatter_pointers.py new file mode 100644 index 0000000..1c429aa --- /dev/null +++ b/examples/scatter_pointers.py @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + + +from random import choice +import displayio +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter, Pointer + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width // 2, display.height // 2, padding=1) +plot.tick_params(tickx_height=12, ticky_height=12, tickcolor=0xFF0008, tickgrid=True) +plot2 = Plot(240, 0, display.width // 2, display.height // 2, padding=1) +plot2.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x939597, tickgrid=True) +plot3 = Plot(0, 160, display.width // 2, display.height // 2, padding=1) +plot3.tick_params(tickx_height=6, ticky_height=6, tickcolor=0x939597, tickgrid=False) +plot4 = Plot(240, 160, display.width // 2, display.height // 2, padding=1) +g = displayio.Group() +g.append(plot) +g.append(plot2) +g.append(plot3) +g.append(plot4) +display.root_group = plot +# Setting up tick parameters + + +a = np.linspace(1, 100) +b = [choice(a) for _ in a] +Scatter(plot, a, b) +Scatter(plot2, a, b, pointer=Pointer.TRIANGLE, pointer_color=0x00FF00) +Scatter(plot3, a, b, pointer=Pointer.SQUARE, pointer_color=0xFFFFFF) +Scatter(plot4, a, b, pointer=Pointer.DIAMOND, pointer_color=0xFF32FF) diff --git a/examples/scatter_using_different_datasets.py b/examples/scatter_using_different_datasets.py new file mode 100644 index 0000000..4e88887 --- /dev/null +++ b/examples/scatter_using_different_datasets.py @@ -0,0 +1,69 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +from random import choice +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.scatter import Scatter, Pointer + + +# Setting up the display +display = board.DISPLAY + +# Adding the plot area +plot = Plot(0, 0, display.width, display.height, padding=25) +plot.tick_params( + tickx_height=12, + ticky_height=12, + tickcolor=0x939597, + tickgrid=True, + showtext=True, + decimal_points=0, +) + +display.root_group = plot + +a = np.linspace(4, 200, 50) +z = [4, 5, 6, 7, 8] +radi = [choice(z) for _ in a] +b = [choice(a) for _ in a] +Scatter( + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0xF456F3, +) +a = np.linspace(50, 170, 50) +radi = [choice(z) for _ in a] +b = [choice(a) for _ in a] +Scatter( + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + radius=radi, + pointer_color=0x00FF00, +) +a = np.linspace(50, 100, 25) +z = [ + 4, + 5, + 6, +] +radi = [choice(z) for _ in a] +b = [int(choice(a) / 1.2) for _ in a] +Scatter( + plot, + a, + b, + rangex=[0, 210], + rangey=[0, 210], + pointer=Pointer.TRIANGLE, + pointer_color=0x00FFFF, +) diff --git a/examples/uplot_shade_example.py b/examples/shade_example.py similarity index 85% rename from examples/uplot_shade_example.py rename to examples/shade_example.py index e6ec3e6..0ee113b 100644 --- a/examples/uplot_shade_example.py +++ b/examples/shade_example.py @@ -2,11 +2,10 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian from circuitpython_uplot.shade import shade # This example is based in the following Library @@ -19,7 +18,7 @@ display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height, padding=5) +plot = Plot(0, 0, display.width, display.height, padding=5) def heat_index(temp, humidity): @@ -97,8 +96,6 @@ def heat_index(temp, humidity): # Drawing the graphs for i in range(40, 110, 10): - ucartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) + Cartesian(plot, x, heat_index(x, i), rangex=[25, 50], rangey=[25, 60]) -display.show(plot) -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_sparkline.py b/examples/sparkline.py similarity index 86% rename from examples/uplot_sparkline.py rename to examples/sparkline.py index 2fd105e..caa86c7 100644 --- a/examples/uplot_sparkline.py +++ b/examples/sparkline.py @@ -6,14 +6,14 @@ import board from ulab import numpy as np from adafruit_display_shapes.sparkline import Sparkline -from circuitpython_uplot.uplot import Uplot, color +from circuitpython_uplot.plot import Plot, color # Setting up the display display = board.DISPLAY # Adding the plot area -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) # 500 linearly spaced numbers x = np.linspace(-10 * np.pi, 10 * np.pi, 500) @@ -37,7 +37,7 @@ plot.append(sparkline) # Plotting and showing the plot -display.show(plot) +display.root_group = plot for element in y: display.auto_refresh = False diff --git a/examples/stackplot.py b/examples/stackplot.py new file mode 100644 index 0000000..34d5b00 --- /dev/null +++ b/examples/stackplot.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya +# +# SPDX-License-Identifier: MIT +""" +Example to show how to draw stackplots +""" + +import board +from ulab import numpy as np +from circuitpython_uplot.plot import Plot +from circuitpython_uplot.cartesian import Cartesian + +# Setting up the display +display = board.DISPLAY +plot = Plot(0, 0, display.width, display.height) + +# Creating some points to graph +x = np.linspace(1, 10, num=10) + +y = [6, 7, 9, 6, 9, 7, 6, 6, 8, 9] +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) + +y = [4, 3, 7, 8, 3, 9, 3, 2, 1, 2] +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) + +y = [1, 4, 6, 3, 6, 6, 5, 0, 9, 2] +Cartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) + + +display.root_group = plot diff --git a/examples/svg_example.py b/examples/svg_example.py new file mode 100644 index 0000000..098dda0 --- /dev/null +++ b/examples/svg_example.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) Jose D. Montoya +# +# SPDX-License-Identifier: MIT + +import board +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.svg import SVG +from circuitpython_uplot.icons import FULL, Humidity, Temperature, Temperature2 + + +# Setting up the display +display = board.DISPLAY + +plot = Plot(0, 0, display.width, display.height) +SVG(plot, FULL, 50, 50, 2, color.YELLOW) +SVG(plot, Humidity, 150, 50, 2, color.TEAL) +SVG(plot, Temperature, 250, 50, 2, color.GREEN) + +SVG(plot, Temperature2, 300, 50, 0.25, color.BLUE) +display.root_group = plot diff --git a/examples/uplot_tickparameters.py b/examples/tickparameters.py similarity index 71% rename from examples/uplot_tickparameters.py rename to examples/tickparameters.py index 0d99895..f7c40ed 100644 --- a/examples/uplot_tickparameters.py +++ b/examples/tickparameters.py @@ -2,18 +2,17 @@ # # SPDX-License-Identifier: MIT -import time import board from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.ucartesian import ucartesian +from circuitpython_uplot.plot import Plot, color +from circuitpython_uplot.cartesian import Cartesian # Setting up the display display = board.DISPLAY # Setting up the plot area -plot = Uplot( +plot = Plot( 0, 0, display.width, @@ -30,11 +29,7 @@ y = constant * np.exp((-(x**2)) / 2.0) # Drawing the graph -ucartesian(plot, x, y, line_color=color.BLACK) +Cartesian(plot, x, y, line_color=color.BLACK) # Plotting and showing the plot -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) +display.root_group = plot diff --git a/examples/uplot_uboxplot.py b/examples/uboxplot_example.py similarity index 81% rename from examples/uplot_uboxplot.py rename to examples/uboxplot_example.py index 7f6ae46..246c744 100644 --- a/examples/uplot_uboxplot.py +++ b/examples/uboxplot_example.py @@ -2,17 +2,17 @@ # # SPDX-License-Identifier: MIT """ -Simple test to display boxplot using uplot +Simple test to display boxplot using plot """ import board -from uboxplot import Boxplot -from circuitpython_uplot.uplot import Uplot +from boxplot import Boxplot +from circuitpython_uplot.plot import Plot display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) +plot = Plot(0, 0, display.width, display.height) plot.tick_params(tickx_height=10, ticky_height=10, tickcolor=0x440008, tickgrid=True) @@ -66,7 +66,4 @@ plot.append(my_box) plot.append(my_box2) plot.append(my_box3) -display.show(plot) - -while True: - pass +display.root_group = plot diff --git a/examples/uplot_stackplot.py b/examples/uplot_stackplot.py deleted file mode 100644 index 4e03bb6..0000000 --- a/examples/uplot_stackplot.py +++ /dev/null @@ -1,34 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya -# -# SPDX-License-Identifier: MIT -""" -Example to show how to draw stackplots -""" - -import time -import board -from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ucartesian import ucartesian - -# Setting up the display -display = board.DISPLAY -plot = Uplot(0, 0, display.width, display.height) - -# Creating some points to graph -x = np.linspace(1, 10, num=10) - -y = [6, 7, 9, 6, 9, 7, 6, 6, 8, 9] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF0000, fill=True) - -y = [4, 3, 7, 8, 3, 9, 3, 2, 1, 2] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0xFF00FF, fill=True) - -y = [1, 4, 6, 3, 6, 6, 5, 0, 9, 2] -ucartesian(plot, x, y, rangex=[0, 11], rangey=[0, 12], line_color=0x4444FF, fill=True) - - -display.show(plot) - -while True: - time.sleep(1) diff --git a/examples/uplot_ufillbetween.py b/examples/uplot_ufillbetween.py deleted file mode 100644 index 6050c7f..0000000 --- a/examples/uplot_ufillbetween.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya -# -# SPDX-License-Identifier: MIT - -import time -import board -from ulab import numpy as np -from circuitpython_uplot.uplot import Uplot -from circuitpython_uplot.ufillbetween import ufillbetween - - -# Setting up the display -display = board.DISPLAY - -plot = Uplot(0, 0, display.width, display.height) - -x = np.linspace(0, 8, num=25) - -y1 = x**2 / 2 -y2 = 2 + x**2 + 3 * x - -ufillbetween(plot, x, y1, y2) - -display.show(plot) - -# Adding some wait time -while True: - time.sleep(1) diff --git a/examples/uplot_usvg_example.py b/examples/uplot_usvg_example.py deleted file mode 100644 index 33faeec..0000000 --- a/examples/uplot_usvg_example.py +++ /dev/null @@ -1,20 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) Jose D. Montoya -# -# SPDX-License-Identifier: MIT - -import board -from circuitpython_uplot.uplot import Uplot, color -from circuitpython_uplot.usvg import usvg -from circuitpython_uplot.icons import FULL, Humidity, Temperature, Temperature2 - - -# Setting up the display -display = board.DISPLAY - -plot = Uplot(0, 0, display.width, display.height) -usvg(plot, FULL, 50, 50, 2, color.YELLOW) -usvg(plot, Humidity, 150, 50, 2, color.TEAL) -usvg(plot, Temperature, 250, 50, 2, color.GREEN) - -usvg(plot, Temperature2, 300, 50, 0.25, color.BLUE) -display.show(plot) diff --git a/pyproject.toml b/pyproject.toml index cbabdd6..3478d03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,24 +3,19 @@ # SPDX-License-Identifier: MIT [build-system] -requires = [ - "setuptools", - "wheel", - "setuptools-scm", -] +requires = ["setuptools", "wheel", "setuptools-scm"] [project] name = "circuitpython-uplot" description = "framework to display different plots in displayio. similar to widget" version = "0.0.0+auto.0" readme = "README.rst" -authors = [ - {name = "JDM", email = "uplot@mailmeto.mozmail.com"} -] -urls = {Homepage = "https://github.com/jposada202020/CircuitPython_uplot"} +authors = [{ name = "JDM", email = "uplot@mailmeto.mozmail.com" }] +urls = { Homepage = "https://github.com/jposada202020/CircuitPython_uplot" } keywords = [ "circuitpython", "uplot", + "microplot", "bar", "stackplot", "fillbetween", @@ -41,7 +36,7 @@ keywords = [ "plot", "plotter", ] -license = {text = "MIT"} +license = { text = "MIT" } classifiers = [ "Intended Audience :: Developers", "Topic :: Software Development :: Libraries", @@ -56,5 +51,5 @@ dynamic = ["dependencies", "optional-dependencies"] packages = ["circuitpython_uplot"] [tool.setuptools.dynamic] -dependencies = {file = ["requirements.txt"]} -optional-dependencies = {optional = {file = ["optional_requirements.txt"]}} +dependencies = { file = ["requirements.txt"] } +optional-dependencies = { optional = { file = ["optional_requirements.txt"] } }