From b113d3566c64e087beab51322633aae2319f6355 Mon Sep 17 00:00:00 2001 From: Russ Hughes Date: Thu, 12 Aug 2021 08:54:15 -0700 Subject: [PATCH] Sphinx source used to build docs --- .gitignore | 1 - docs/.buildinfo | 2 +- docs/_modules/index.html | 13 +- docs/_modules/st7789py.html | 26 +- docs/_sources/fonts.rst.txt | 16 +- docs/_static/basic.css | 85 +- docs/_static/doctools.js | 2 + docs/_static/searchtools.js | 2 +- ...erscore-1.12.0.js => underscore-1.13.1.js} | 151 +- docs/_static/underscore.js | 8 +- docs/examples.html | 1523 ++++++----------- docs/fonts.html | 251 +-- docs/genindex.html | 13 +- docs/index.html | 23 +- docs/objects.inv | Bin 681 -> 686 bytes docs/py-modindex.html | 13 +- docs/search.html | 13 +- docs/searchindex.js | 2 +- docs/st7789py.html | 105 +- lib/st7789py.py | 13 +- sphinx/Makefile | 26 + sphinx/requires.txt | 6 + sphinx/source/_static/vga1_16x16.png | Bin 0 -> 1065 bytes sphinx/source/_static/vga1_16x32.png | Bin 0 -> 1153 bytes sphinx/source/_static/vga1_8x16.png | Bin 0 -> 717 bytes sphinx/source/_static/vga1_8x8.png | Bin 0 -> 565 bytes sphinx/source/_static/vga1_bold_16x16.png | Bin 0 -> 1124 bytes sphinx/source/_static/vga1_bold_16x32.png | Bin 0 -> 1230 bytes sphinx/source/_static/vga2_16x16.png | Bin 0 -> 2416 bytes sphinx/source/_static/vga2_16x32.png | Bin 0 -> 2689 bytes sphinx/source/_static/vga2_8x16.png | Bin 0 -> 1656 bytes sphinx/source/_static/vga2_8x8.png | Bin 0 -> 1303 bytes sphinx/source/_static/vga2_bold_16x16.png | Bin 0 -> 2425 bytes sphinx/source/_static/vga2_bold_16x32.png | Bin 0 -> 2712 bytes sphinx/source/conf.py | 219 +++ sphinx/source/examples.rst | 72 + sphinx/source/fonts.rst | 152 ++ sphinx/source/index.rst | 24 + sphinx/source/romfont.py | 27 + sphinx/source/st7789py.rst | 5 + sphinx/source/truetype.py | 47 + 41 files changed, 1472 insertions(+), 1368 deletions(-) rename docs/_static/{underscore-1.12.0.js => underscore-1.13.1.js} (94%) create mode 100644 sphinx/Makefile create mode 100644 sphinx/requires.txt create mode 100644 sphinx/source/_static/vga1_16x16.png create mode 100644 sphinx/source/_static/vga1_16x32.png create mode 100644 sphinx/source/_static/vga1_8x16.png create mode 100644 sphinx/source/_static/vga1_8x8.png create mode 100644 sphinx/source/_static/vga1_bold_16x16.png create mode 100644 sphinx/source/_static/vga1_bold_16x32.png create mode 100644 sphinx/source/_static/vga2_16x16.png create mode 100644 sphinx/source/_static/vga2_16x32.png create mode 100644 sphinx/source/_static/vga2_8x16.png create mode 100644 sphinx/source/_static/vga2_8x8.png create mode 100644 sphinx/source/_static/vga2_bold_16x16.png create mode 100644 sphinx/source/_static/vga2_bold_16x32.png create mode 100644 sphinx/source/conf.py create mode 100644 sphinx/source/examples.rst create mode 100644 sphinx/source/fonts.rst create mode 100644 sphinx/source/index.rst create mode 100644 sphinx/source/romfont.py create mode 100644 sphinx/source/st7789py.rst create mode 100644 sphinx/source/truetype.py diff --git a/.gitignore b/.gitignore index 49eae98..79c1355 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .vscode .idea __pycache__ -sphinx *~ *.pyc *.o diff --git a/docs/.buildinfo b/docs/.buildinfo index 26e2102..c734010 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 78614e3006fc5cc56d2562d24941cf0c +config: db5947919316628e816682c8ca6bb96d tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_modules/index.html b/docs/_modules/index.html index a22a7e1..701b3bf 100644 --- a/docs/_modules/index.html +++ b/docs/_modules/index.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -82,7 +85,7 @@ -

Contents:

+

Contents:

diff --git a/docs/_modules/st7789py.html b/docs/_modules/st7789py.html index e080424..8558f29 100644 --- a/docs/_modules/st7789py.html +++ b/docs/_modules/st7789py.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -82,7 +85,7 @@ -

Contents:

+

Contents:

@@ -337,11 +340,11 @@ ST7789 driver class Args: - spi (spi): spi object - width (int): display width - height (int): display height + spi (spi): spi object **Required** + width (int): display width **Required** + height (int): display height **Required** reset (pin): reset pin - dc (pin): dc pin + dc (pin): dc pin **Required** cs (pin): cs pin backlight(pin): backlight pin rotation (int): display rotation @@ -350,7 +353,7 @@ - 2-Inverted Portrait - 3-Inverted Landscape """ - def __init__(self, spi, width, height, reset, dc, + def __init__(self, spi, width, height, reset=None, dc=None, cs=None, backlight=None, rotation=0): """ Initialize display. @@ -360,6 +363,9 @@ "Unsupported display. 320x240, 240x240 and 135x240 are supported." ) + if dc is None: + raise ValueError("dc pin is required.") + self._display_width = self.width = width self._display_height = self.height = height self.xstart = 0 diff --git a/docs/_sources/fonts.rst.txt b/docs/_sources/fonts.rst.txt index 939c607..c334f96 100644 --- a/docs/_sources/fonts.rst.txt +++ b/docs/_sources/fonts.rst.txt @@ -55,8 +55,8 @@ Example use: -8x8 Fonts ---------- +8x8 Rom Fonts +------------- .. figure:: _static/vga1_8x8.png :align: center @@ -72,8 +72,8 @@ Example use: | -8x16 Fonts ----------- +8x16 Rom Fonts +-------------- .. figure:: _static/vga1_8x16.png :align: center @@ -89,8 +89,8 @@ Example use: | -16x16 Fonts ------------ +16x16 Rom Fonts +--------------- .. figure:: _static/vga1_16x16.png :align: center @@ -120,8 +120,8 @@ Example use: | -16x32 Fonts ------------ +16x32 Rom Fonts +--------------- .. figure:: _static/vga1_16x32.png :align: center diff --git a/docs/_static/basic.css b/docs/_static/basic.css index b3bdc00..912859b 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -130,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -508,6 +508,63 @@ table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -634,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -770,8 +819,12 @@ div.code-block-caption code { table.highlighttable td.linenos, span.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -786,16 +839,6 @@ div.literal-block-wrapper { margin: 1em 0; } -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - code.xref, a code { background-color: transparent; font-weight: bold; diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index 61ac9d2..8cbf1b1 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -301,12 +301,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index 1a90152..e09f926 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -509,7 +509,7 @@ var Search = { var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); - var rv = $('
').text(excerpt); + var rv = $('

').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); diff --git a/docs/_static/underscore-1.12.0.js b/docs/_static/underscore-1.13.1.js similarity index 94% rename from docs/_static/underscore-1.12.0.js rename to docs/_static/underscore-1.13.1.js index 3af6352..ffd77af 100644 --- a/docs/_static/underscore-1.12.0.js +++ b/docs/_static/underscore-1.13.1.js @@ -1,19 +1,19 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define('underscore', factory) : - (global = global || self, (function () { + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { var current = global._; var exports = global._ = factory(); exports.noConflict = function () { global._ = current; return exports; }; }())); }(this, (function () { - // Underscore.js 1.12.0 + // Underscore.js 1.13.1 // https://underscorejs.org - // (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. // Current version. - var VERSION = '1.12.0'; + var VERSION = '1.13.1'; // Establish the root object, `window` (`self`) in the browser, `global` // on the server, or `this` in some virtual machines. We use `self` @@ -170,7 +170,7 @@ var isArray = nativeIsArray || tagTester('Array'); // Internal function to check whether `key` is an own property name of `obj`. - function has(obj, key) { + function has$1(obj, key) { return obj != null && hasOwnProperty.call(obj, key); } @@ -181,7 +181,7 @@ (function() { if (!isArguments(arguments)) { isArguments = function(obj) { - return has(obj, 'callee'); + return has$1(obj, 'callee'); }; } }()); @@ -268,7 +268,7 @@ // Constructor is a special case. var prop = 'constructor'; - if (has(obj, prop) && !keys.contains(prop)) keys.push(prop); + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); while (nonEnumIdx--) { prop = nonEnumerableProps[nonEnumIdx]; @@ -284,7 +284,7 @@ if (!isObject(obj)) return []; if (nativeKeys) return nativeKeys(obj); var keys = []; - for (var key in obj) if (has(obj, key)) keys.push(key); + for (var key in obj) if (has$1(obj, key)) keys.push(key); // Ahem, IE < 9. if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; @@ -318,24 +318,24 @@ // If Underscore is called as a function, it returns a wrapped object that can // be used OO-style. This wrapper holds altered versions of all functions added // through `_.mixin`. Wrapped objects may be chained. - function _(obj) { - if (obj instanceof _) return obj; - if (!(this instanceof _)) return new _(obj); + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); this._wrapped = obj; } - _.VERSION = VERSION; + _$1.VERSION = VERSION; // Extracts the result from a wrapped and chained object. - _.prototype.value = function() { + _$1.prototype.value = function() { return this._wrapped; }; // Provide unwrapping proxies for some methods used in engine operations // such as arithmetic and JSON stringification. - _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; - _.prototype.toString = function() { + _$1.prototype.toString = function() { return String(this._wrapped); }; @@ -370,8 +370,8 @@ // Internal recursive comparison function for `_.isEqual`. function deepEq(a, b, aStack, bStack) { // Unwrap any wrapped objects. - if (a instanceof _) a = a._wrapped; - if (b instanceof _) b = b._wrapped; + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; // Compare `[[Class]]` names. var className = toString.call(a); if (className !== toString.call(b)) return false; @@ -463,7 +463,7 @@ while (length--) { // Deep compare each member key = _keys[length]; - if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; } } // Remove the first object from the stack of traversed objects. @@ -642,15 +642,15 @@ // Normalize a (deep) property `path` to array. // Like `_.iteratee`, this function can be customized. - function toPath(path) { + function toPath$1(path) { return isArray(path) ? path : [path]; } - _.toPath = toPath; + _$1.toPath = toPath$1; // Internal wrapper for `_.toPath` to enable minification. // Similar to `cb` for `_.iteratee`. - function toPath$1(path) { - return _.toPath(path); + function toPath(path) { + return _$1.toPath(path); } // Internal function to obtain a nested property in `obj` along `path`. @@ -668,19 +668,19 @@ // `undefined`, return `defaultValue` instead. // The `path` is normalized through `_.toPath`. function get(object, path, defaultValue) { - var value = deepGet(object, toPath$1(path)); + var value = deepGet(object, toPath(path)); return isUndefined(value) ? defaultValue : value; } // Shortcut function for checking if an object has a given property directly on // itself (in other words, not on a prototype). Unlike the internal `has` // function, this public version can also traverse nested properties. - function has$1(obj, path) { - path = toPath$1(path); + function has(obj, path) { + path = toPath(path); var length = path.length; for (var i = 0; i < length; i++) { var key = path[i]; - if (!has(obj, key)) return false; + if (!has$1(obj, key)) return false; obj = obj[key]; } return !!length; @@ -703,7 +703,7 @@ // Creates a function that, when passed an object, will traverse that object’s // properties down the given `path`, specified as an array of keys or indices. function property(path) { - path = toPath$1(path); + path = toPath(path); return function(obj) { return deepGet(obj, path); }; @@ -747,12 +747,12 @@ function iteratee(value, context) { return baseIteratee(value, context, Infinity); } - _.iteratee = iteratee; + _$1.iteratee = iteratee; // The function we call internally to generate a callback. It invokes // `_.iteratee` if overridden, otherwise `baseIteratee`. function cb(value, context, argCount) { - if (_.iteratee !== iteratee) return _.iteratee(value, context); + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); return baseIteratee(value, context, argCount); } @@ -840,7 +840,7 @@ // By default, Underscore uses ERB-style template delimiters. Change the // following template settings to use alternative delimiters. - var templateSettings = _.templateSettings = { + var templateSettings = _$1.templateSettings = { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g, escape: /<%-([\s\S]+?)%>/g @@ -868,13 +868,20 @@ return '\\' + escapes[match]; } + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + // JavaScript micro-templating, similar to John Resig's implementation. // Underscore templating handles arbitrary delimiters, preserves whitespace, // and correctly escapes quotes within interpolated code. // NB: `oldSettings` only exists for backwards compatibility. function template(text, settings, oldSettings) { if (!settings && oldSettings) settings = oldSettings; - settings = defaults({}, settings, _.templateSettings); + settings = defaults({}, settings, _$1.templateSettings); // Combine delimiters into one regular expression via alternation. var matcher = RegExp([ @@ -903,8 +910,17 @@ }); source += "';\n"; - // If a variable is not specified, place data values in local scope. - if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + @@ -912,18 +928,17 @@ var render; try { - render = new Function(settings.variable || 'obj', '_', source); + render = new Function(argument, '_', source); } catch (e) { e.source = source; throw e; } var template = function(data) { - return render.call(this, data, _); + return render.call(this, data, _$1); }; // Provide the compiled source as a convenience for precompilation. - var argument = settings.variable || 'obj'; template.source = 'function(' + argument + '){\n' + source + '}'; return template; @@ -933,7 +948,7 @@ // is invoked with its parent as context. Returns the value of the final // child, or `fallback` if any child is undefined. function result(obj, path, fallback) { - path = toPath$1(path); + path = toPath(path); var length = path.length; if (!length) { return isFunction$1(fallback) ? fallback.call(obj) : fallback; @@ -959,7 +974,7 @@ // Start chaining a wrapped Underscore object. function chain(obj) { - var instance = _(obj); + var instance = _$1(obj); instance._chain = true; return instance; } @@ -993,7 +1008,7 @@ return bound; }); - partial.placeholder = _; + partial.placeholder = _$1; // Create a function bound to a given object (assigning `this`, and arguments, // optionally). @@ -1012,7 +1027,7 @@ var isArrayLike = createSizePropertyCheck(getLength); // Internal implementation of a recursive `flatten` function. - function flatten(input, depth, strict, output) { + function flatten$1(input, depth, strict, output) { output = output || []; if (!depth && depth !== 0) { depth = Infinity; @@ -1025,7 +1040,7 @@ if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { // Flatten current level of array or arguments object. if (depth > 1) { - flatten(value, depth - 1, strict, output); + flatten$1(value, depth - 1, strict, output); idx = output.length; } else { var j = 0, len = value.length; @@ -1042,7 +1057,7 @@ // are the method names to be bound. Useful for ensuring that all callbacks // defined on an object belong to it. var bindAll = restArguments(function(obj, keys) { - keys = flatten(keys, false, false); + keys = flatten$1(keys, false, false); var index = keys.length; if (index < 1) throw new Error('bindAll must be passed function names'); while (index--) { @@ -1057,7 +1072,7 @@ var memoize = function(key) { var cache = memoize.cache; var address = '' + (hasher ? hasher.apply(this, arguments) : key); - if (!has(cache, address)) cache[address] = func.apply(this, arguments); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); return cache[address]; }; memoize.cache = {}; @@ -1074,7 +1089,7 @@ // Defers a function, scheduling it to run after the current call stack has // cleared. - var defer = partial(delay, _, 1); + var defer = partial(delay, _$1, 1); // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run @@ -1420,7 +1435,7 @@ if (isFunction$1(path)) { func = path; } else { - path = toPath$1(path); + path = toPath(path); contextPath = path.slice(0, -1); path = path[path.length - 1]; } @@ -1562,7 +1577,7 @@ // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. var groupBy = group(function(result, value, key) { - if (has(result, key)) result[key].push(value); else result[key] = [value]; + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; }); // Indexes the object's values by a criterion, similar to `_.groupBy`, but for @@ -1575,7 +1590,7 @@ // either a string attribute to count by, or a function that returns the // criterion. var countBy = group(function(result, value, key) { - if (has(result, key)) result[key]++; else result[key] = 1; + if (has$1(result, key)) result[key]++; else result[key] = 1; }); // Split a collection into two arrays: one whose elements all pass the given @@ -1618,7 +1633,7 @@ keys = allKeys(obj); } else { iteratee = keyInObj; - keys = flatten(keys, false, false); + keys = flatten$1(keys, false, false); obj = Object(obj); } for (var i = 0, length = keys.length; i < length; i++) { @@ -1636,7 +1651,7 @@ iteratee = negate(iteratee); if (keys.length > 1) context = keys[1]; } else { - keys = map(flatten(keys, false, false), String); + keys = map(flatten$1(keys, false, false), String); iteratee = function(value, key) { return !contains(keys, key); }; @@ -1681,14 +1696,14 @@ // Flatten out an array, either recursively (by default), or up to `depth`. // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. - function flatten$1(array, depth) { - return flatten(array, depth, false); + function flatten(array, depth) { + return flatten$1(array, depth, false); } // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. var difference = restArguments(function(array, rest) { - rest = flatten(rest, true, true); + rest = flatten$1(rest, true, true); return filter(array, function(value){ return !contains(rest, value); }); @@ -1734,7 +1749,7 @@ // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. var union = restArguments(function(arrays) { - return uniq(flatten(arrays, true, true)); + return uniq(flatten$1(arrays, true, true)); }); // Produce an array that contains every item shared between all the @@ -1821,26 +1836,26 @@ // Helper function to continue chaining intermediate results. function chainResult(instance, obj) { - return instance._chain ? _(obj).chain() : obj; + return instance._chain ? _$1(obj).chain() : obj; } // Add your own custom functions to the Underscore object. function mixin(obj) { each(functions(obj), function(name) { - var func = _[name] = obj[name]; - _.prototype[name] = function() { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { var args = [this._wrapped]; push.apply(args, arguments); - return chainResult(this, func.apply(_, args)); + return chainResult(this, func.apply(_$1, args)); }; }); - return _; + return _$1; } // Add all mutator `Array` functions to the wrapper. each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { var method = ArrayProto[name]; - _.prototype[name] = function() { + _$1.prototype[name] = function() { var obj = this._wrapped; if (obj != null) { method.apply(obj, arguments); @@ -1855,7 +1870,7 @@ // Add all accessor `Array` functions to the wrapper. each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; - _.prototype[name] = function() { + _$1.prototype[name] = function() { var obj = this._wrapped; if (obj != null) obj = method.apply(obj, arguments); return chainResult(this, obj); @@ -1909,12 +1924,12 @@ clone: clone, tap: tap, get: get, - has: has$1, + has: has, mapObject: mapObject, identity: identity, constant: constant, noop: noop, - toPath: toPath, + toPath: toPath$1, property: property, propertyOf: propertyOf, matcher: matcher, @@ -1997,7 +2012,7 @@ tail: rest, drop: rest, compact: compact, - flatten: flatten$1, + flatten: flatten, without: without, uniq: uniq, unique: uniq, @@ -2011,17 +2026,17 @@ range: range, chunk: chunk, mixin: mixin, - 'default': _ + 'default': _$1 }; // Default Export // Add all of the Underscore functions to the wrapper object. - var _$1 = mixin(allExports); + var _ = mixin(allExports); // Legacy Node.js API. - _$1._ = _$1; + _._ = _; - return _$1; + return _; }))); -//# sourceMappingURL=underscore.js.map +//# sourceMappingURL=underscore-umd.js.map diff --git a/docs/_static/underscore.js b/docs/_static/underscore.js index 166240e..cf177d4 100644 --- a/docs/_static/underscore.js +++ b/docs/_static/underscore.js @@ -1,6 +1,6 @@ -!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n=n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ -// Underscore.js 1.12.0 +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.1 // https://underscorejs.org -// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. -var n="1.12.0",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,g=isFinite,d=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function $(n){return function(r){return null==r?void 0:r[n]}}var G=$("byteLength"),H=J(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:K(!1),Y=$("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Kn=Ln(Cn),Jn=Ln(_n(Cn)),$n=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),C))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=qn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=qn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Rn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Ir(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Wn(n.length-1)];var e=tr(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=Pr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),qr(n,e,t)}));function Wr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function zr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:Wr(n,n.length-r)}function Lr(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o=function(r,t){e=null,t&&(u=n.apply(r,t))},i=j((function(i){if(e&&clearTimeout(e),t){var a=!e;e=setTimeout(o,r),a&&(u=n.apply(this,i))}else e=or(o,r,this,i);return u}));return i.cancel=function(){clearTimeout(e),e=null},i},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:gr,lastIndexOf:dr,find:br,detect:br,findWhere:function(n,r){return br(n,Dn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(qn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,Dn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t + + @@ -29,6 +31,7 @@ + @@ -84,7 +87,7 @@ -

Contents:

+

Contents:

@@ -181,1039 +184,545 @@ locations. See

ttgo_lines.py

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
"""
-lines.py
-
-    Draws lines and rectangles in random colors at random locations on the
-    display.
-
-"""
-import random
-from machine import Pin, SoftSPI
-import st7789py as st7789
-
-
-def main():
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=0)
-
-    tft.fill(st7789.BLACK)
-
-    while True:
-        tft.line(
-            random.randint(0, tft.width),
-            random.randint(0, tft.height),
-            random.randint(0, tft.width),
-            random.randint(0, tft.height),
-            st7789.color565(
-                random.getrandbits(8),
-                random.getrandbits(8),
-                random.getrandbits(8)
-                )
-            )
-
-        width = random.randint(0, tft.width // 2)
-        height = random.randint(0, tft.height // 2)
-        col = random.randint(0, tft.width - width)
-        row = random.randint(0, tft.height - height)
-        tft.fill_rect(
-            col,
-            row,
-            width,
-            height,
-            st7789.color565(
-                random.getrandbits(8),
-                random.getrandbits(8),
-                random.getrandbits(8)
-            )
-        )
-
-
-main()
+
 1"""
+ 2lines.py
+ 3
+ 4    Draws lines and rectangles in random colors at random locations on the
+ 5    display.
+ 6
+ 7"""
+ 8import random
+ 9from machine import Pin, SoftSPI
+10import st7789py as st7789
+11
+12
+13def main():
+14    spi = SoftSPI(
+15        baudrate=20000000,
+16        polarity=1,
+17        phase=0,
+18        sck=Pin(18),
+19        mosi=Pin(19),
+20        miso=Pin(13))
+21
+22    tft = st7789.ST7789(
+23        spi,
+24        135,
+25        240,
+26        reset=Pin(23, Pin.OUT),
+27        cs=Pin(5, Pin.OUT),
+28        dc=Pin(16, Pin.OUT),
+29        backlight=Pin(4, Pin.OUT),
+30        rotation=0)
+31
+32    tft.fill(st7789.BLACK)
+33
+34    while True:
+35        tft.line(
+36            random.randint(0, tft.width),
+37            random.randint(0, tft.height),
+38            random.randint(0, tft.width),
+39            random.randint(0, tft.height),
+40            st7789.color565(
+41                random.getrandbits(8),
+42                random.getrandbits(8),
+43                random.getrandbits(8)
+44                )
+45            )
+46
+47        width = random.randint(0, tft.width // 2)
+48        height = random.randint(0, tft.height // 2)
+49        col = random.randint(0, tft.width - width)
+50        row = random.randint(0, tft.height - height)
+51        tft.fill_rect(
+52            col,
+53            row,
+54            width,
+55            height,
+56            st7789.color565(
+57                random.getrandbits(8),
+58                random.getrandbits(8),
+59                random.getrandbits(8)
+60            )
+61        )
+62
+63
+64main()
 
-
+

ttgo_hello.py

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
"""
-ttgo_hello.py
-
-    Writes "Hello!" in random colors at random locations on a
-    LILYGO® TTGO T-Display.
-
-    https://www.youtube.com/watch?v=atBa0BYPAAc
-
-"""
-import random
-from machine import Pin, SoftSPI
-import st7789py as st7789
-
-# Choose a font
-
-# from romfonts import vga1_8x8 as font
-# from romfonts import vga2_8x8 as font
-# from romfonts import vga1_8x16 as font
-# from romfonts import vga2_8x16 as font
-# from romfonts import vga1_16x16 as font
-# from romfonts import vga1_bold_16x16 as font
-# from romfonts import vga2_16x16 as font
-# from romfonts import vga2_bold_16x16 as font
-# from romfonts import vga1_16x32 as font
-# from romfonts import vga1_bold_16x32 as font
-# from romfonts import vga2_16x32 as font
-from romfonts import vga2_bold_16x32 as font
-
-
-def main():
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=0)
-
-    while True:
-        for rotation in range(4):
-            tft.rotation(rotation)
-            tft.fill(0)
-            col_max = tft.width - font.WIDTH*6
-            row_max = tft.height - font.HEIGHT
-
-            for _ in range(100):
-                tft.text(
-                    font,
-                    "Hello!",
-                    random.randint(0, col_max),
-                    random.randint(0, row_max),
-                    st7789.color565(
-                        random.getrandbits(8),
-                        random.getrandbits(8),
-                        random.getrandbits(8)),
-                    st7789.color565(
-                        random.getrandbits(8),
-                        random.getrandbits(8),
-                        random.getrandbits(8))
-                )
-
-
-main()
+
 1"""
+ 2ttgo_hello.py
+ 3
+ 4    Writes "Hello!" in random colors at random locations on a
+ 5    LILYGO® TTGO T-Display.
+ 6
+ 7    https://www.youtube.com/watch?v=atBa0BYPAAc
+ 8
+ 9"""
+10import random
+11from machine import Pin, SoftSPI
+12import st7789py as st7789
+13
+14# Choose a font
+15
+16# from romfonts import vga1_8x8 as font
+17# from romfonts import vga2_8x8 as font
+18# from romfonts import vga1_8x16 as font
+19# from romfonts import vga2_8x16 as font
+20# from romfonts import vga1_16x16 as font
+21# from romfonts import vga1_bold_16x16 as font
+22# from romfonts import vga2_16x16 as font
+23# from romfonts import vga2_bold_16x16 as font
+24# from romfonts import vga1_16x32 as font
+25# from romfonts import vga1_bold_16x32 as font
+26# from romfonts import vga2_16x32 as font
+27from romfonts import vga2_bold_16x32 as font
+28
+29
+30def main():
+31    spi = SoftSPI(
+32        baudrate=20000000,
+33        polarity=1,
+34        phase=0,
+35        sck=Pin(18),
+36        mosi=Pin(19),
+37        miso=Pin(13))
+38
+39    tft = st7789.ST7789(
+40        spi,
+41        135,
+42        240,
+43        reset=Pin(23, Pin.OUT),
+44        cs=Pin(5, Pin.OUT),
+45        dc=Pin(16, Pin.OUT),
+46        backlight=Pin(4, Pin.OUT),
+47        rotation=0)
+48
+49    while True:
+50        for rotation in range(4):
+51            tft.rotation(rotation)
+52            tft.fill(0)
+53            col_max = tft.width - font.WIDTH*6
+54            row_max = tft.height - font.HEIGHT
+55
+56            for _ in range(100):
+57                tft.text(
+58                    font,
+59                    "Hello!",
+60                    random.randint(0, col_max),
+61                    random.randint(0, row_max),
+62                    st7789.color565(
+63                        random.getrandbits(8),
+64                        random.getrandbits(8),
+65                        random.getrandbits(8)),
+66                    st7789.color565(
+67                        random.getrandbits(8),
+68                        random.getrandbits(8),
+69                        random.getrandbits(8))
+70                )
+71
+72
+73main()
 
-
+

ttgo_fonts.py

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
"""
-ttgo_fonts.py
-
-    Pages through all characters of four fonts on the LILYGO® TTGO T-Display.
-
-    https://www.youtube.com/watch?v=2cnAhEucPD4
-
-"""
-import utime
-from machine import Pin, SoftSPI
-import st7789py as st7789
-
-# Choose fonts
-
-# from romfonts import vga1_8x8 as font
-from romfonts import vga2_8x8 as font1
-# from romfonts import vga1_8x16 as font
-from romfonts import vga2_8x16 as font2
-# from romfonts import vga1_16x16 as font
-# from romfonts import vga1_bold_16x16 as font
-# from romfonts import vga2_16x16 as font
-from romfonts import vga2_bold_16x16 as font3
-# from romfonts import vga1_16x32 as font
-# from romfonts import vga1_bold_16x32 as font
-# from romfonts import vga2_16x32 as font
-from romfonts import vga2_bold_16x32 as font4
-
-
-def main():
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=0)
-
-    tft.vscrdef(40, 240, 40)
-
-    while True:
-        for font in (font1, font2, font3, font4):
-            tft.fill(st7789.BLUE)
-            line = 0
-            col = 0
-
-            for char in range(font.FIRST, font.LAST):
-                tft.text(font, chr(char), col, line, st7789.WHITE, st7789.BLUE)
-                col += font.WIDTH
-                if col > tft.width - font.WIDTH:
-                    col = 0
-                    line += font.HEIGHT
-
-                    if line > tft.height-font.HEIGHT:
-                        utime.sleep(3)
-                        tft.fill(st7789.BLUE)
-                        line = 0
-                        col = 0
-
-            utime.sleep(3)
-
-
-main()
+
 1"""
+ 2ttgo_fonts.py
+ 3
+ 4    Pages through all characters of four fonts on the LILYGO® TTGO T-Display.
+ 5
+ 6    https://www.youtube.com/watch?v=2cnAhEucPD4
+ 7
+ 8"""
+ 9import utime
+10from machine import Pin, SoftSPI
+11import st7789py as st7789
+12
+13# Choose fonts
+14
+15# from romfonts import vga1_8x8 as font
+16from romfonts import vga2_8x8 as font1
+17# from romfonts import vga1_8x16 as font
+18from romfonts import vga2_8x16 as font2
+19# from romfonts import vga1_16x16 as font
+20# from romfonts import vga1_bold_16x16 as font
+21# from romfonts import vga2_16x16 as font
+22from romfonts import vga2_bold_16x16 as font3
+23# from romfonts import vga1_16x32 as font
+24# from romfonts import vga1_bold_16x32 as font
+25# from romfonts import vga2_16x32 as font
+26from romfonts import vga2_bold_16x32 as font4
+27
+28
+29def main():
+30    spi = SoftSPI(
+31        baudrate=20000000,
+32        polarity=1,
+33        phase=0,
+34        sck=Pin(18),
+35        mosi=Pin(19),
+36        miso=Pin(13))
+37
+38    tft = st7789.ST7789(
+39        spi,
+40        135,
+41        240,
+42        reset=Pin(23, Pin.OUT),
+43        cs=Pin(5, Pin.OUT),
+44        dc=Pin(16, Pin.OUT),
+45        backlight=Pin(4, Pin.OUT),
+46        rotation=0)
+47
+48    tft.vscrdef(40, 240, 40)
+49
+50    while True:
+51        for font in (font1, font2, font3, font4):
+52            tft.fill(st7789.BLUE)
+53            line = 0
+54            col = 0
+55
+56            for char in range(font.FIRST, font.LAST):
+57                tft.text(font, chr(char), col, line, st7789.WHITE, st7789.BLUE)
+58                col += font.WIDTH
+59                if col > tft.width - font.WIDTH:
+60                    col = 0
+61                    line += font.HEIGHT
+62
+63                    if line > tft.height-font.HEIGHT:
+64                        utime.sleep(3)
+65                        tft.fill(st7789.BLUE)
+66                        line = 0
+67                        col = 0
+68
+69            utime.sleep(3)
+70
+71
+72main()
 
-
+

ttgo_scroll.py

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
"""
-ttgo_fonts.py
-
-    Smoothly scrolls all font characters up the screen on the LILYGO® TTGO
-    T-Display. Only works with fonts with heights that are even multiples of
-    the screen height, (i.e. 8 or 16 pixels high)
-
-"""
-import utime
-import random
-from machine import Pin, SoftSPI
-import st7789py as st7789
-
-# choose a font
-
-# from romfonts import vga1_8x8 as font
-# from romfonts import vga2_8x8 as font
-# from romfonts import vga1_8x16 as font
-# from romfonts import vga2_8x16 as font
-# from romfonts import vga1_16x16 as font
-# from romfonts import vga1_bold_16x16 as font
-# from romfonts import vga2_16x16 as font
-from romfonts import vga2_bold_16x16 as font
-
-
-def main():
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=0)
-
-    last_line = tft.height - font.HEIGHT
-    tfa = 40
-    tfb = 40
-    tft.vscrdef(tfa, 240, tfb)
-
-    tft.fill(st7789.BLUE)
-    scroll = 0
-    character = 0
-    while True:
-        tft.fill_rect(0, scroll, tft.width, 1, st7789.BLUE)
-
-        if scroll % font.HEIGHT == 0:
-            tft.text(
-                font,
-                '\\x{:02x}= {:s} '.format(character, chr(character)),
-                0,
-                (scroll + last_line) % tft.height,
-                st7789.WHITE,
-                st7789.BLUE)
-
-            character = character + 1 if character < 256 else 0
-
-        tft.vscsad(scroll + tfa)
-        scroll += 1
-
-        if scroll == tft.height:
-            scroll = 0
-
-        utime.sleep(0.01)
-
-
-main()
+
 1"""
+ 2ttgo_fonts.py
+ 3
+ 4    Smoothly scrolls all font characters up the screen on the LILYGO® TTGO
+ 5    T-Display. Only works with fonts with heights that are even multiples of
+ 6    the screen height, (i.e. 8 or 16 pixels high)
+ 7
+ 8"""
+ 9import utime
+10import random
+11from machine import Pin, SoftSPI
+12import st7789py as st7789
+13
+14# choose a font
+15
+16# from romfonts import vga1_8x8 as font
+17# from romfonts import vga2_8x8 as font
+18# from romfonts import vga1_8x16 as font
+19# from romfonts import vga2_8x16 as font
+20# from romfonts import vga1_16x16 as font
+21# from romfonts import vga1_bold_16x16 as font
+22# from romfonts import vga2_16x16 as font
+23from romfonts import vga2_bold_16x16 as font
+24
+25
+26def main():
+27    spi = SoftSPI(
+28        baudrate=20000000,
+29        polarity=1,
+30        phase=0,
+31        sck=Pin(18),
+32        mosi=Pin(19),
+33        miso=Pin(13))
+34
+35    tft = st7789.ST7789(
+36        spi,
+37        135,
+38        240,
+39        reset=Pin(23, Pin.OUT),
+40        cs=Pin(5, Pin.OUT),
+41        dc=Pin(16, Pin.OUT),
+42        backlight=Pin(4, Pin.OUT),
+43        rotation=0)
+44
+45    last_line = tft.height - font.HEIGHT
+46    tfa = 40
+47    tfb = 40
+48    tft.vscrdef(tfa, 240, tfb)
+49
+50    tft.fill(st7789.BLUE)
+51    scroll = 0
+52    character = 0
+53    while True:
+54        tft.fill_rect(0, scroll, tft.width, 1, st7789.BLUE)
+55
+56        if scroll % font.HEIGHT == 0:
+57            tft.text(
+58                font,
+59                '\\x{:02x}= {:s} '.format(character, chr(character)),
+60                0,
+61                (scroll + last_line) % tft.height,
+62                st7789.WHITE,
+63                st7789.BLUE)
+64
+65            character = character + 1 if character < 256 else 0
+66
+67        tft.vscsad(scroll + tfa)
+68        scroll += 1
+69
+70        if scroll == tft.height:
+71            scroll = 0
+72
+73        utime.sleep(0.01)
+74
+75
+76main()
 
-
+

toasters.py

Flying toasters sprite demo using bitmaps created from spritesheet using ImageMagick’s convert and imgtobitmap.py utility. See the maketoast script in the utils directory for details.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
"""
-toasters.py
-
-    An example using bitmap to draw sprites on the display.
-
-    Spritesheet from CircuitPython_Flying_Toasters
-    https://learn.adafruit.com/circuitpython-sprite-animation-pendant-mario-clouds-flying-toasters
-
-"""
-
-import random
-from machine import Pin, SoftSPI
-import st7789py as st7789
-import t1, t2, t3, t4, t5
-
-TOASTERS = [t1, t2, t3, t4]
-TOAST = [t5]
-
-
-class toast():
-    '''
-    toast class to keep track of a sprites locaton and step
-    '''
-    def __init__(self, sprites, x, y):
-        self.sprites = sprites
-        self.steps = len(sprites)
-        self.x = x
-        self.y = y
-        self.step = random.randint(0, self.steps-1)
-        self.speed = random.randint(2, 5)
-
-    def move(self):
-        if self.x <= 0:
-            self.speed = random.randint(2, 5)
-            self.x = 135 - 64
-
-        self.step += 1
-        self.step %= self.steps
-        self.x -= self.speed
-
-
-def main():
-    """
-    Initialize the display and draw flying toasters and toast
-    """
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=0)
-
-    tft.fill(st7789.BLACK)
-    # create toast spites in random positions
-    sprites = [
-        toast(TOASTERS, 135-64, 0),
-        toast(TOAST, 135-64*2, 80),
-        toast(TOASTERS, 135-64*4, 160)
-    ]
-
-    # move and draw sprites
-    while True:
-        for man in sprites:
-            bitmap = man.sprites[man.step]
-            tft.fill_rect(
-                man.x+bitmap.WIDTH-man.speed,
-                man.y,
-                man.speed,
-                bitmap.HEIGHT,
-                st7789.BLACK)
-
-            man.move()
-
-            if man.x > 0:
-                tft.bitmap(bitmap, man.x, man.y)
-            else:
-                tft.fill_rect(
-                    0,
-                    man.y,
-                    bitmap.WIDTH,
-                    bitmap.HEIGHT,
-                    st7789.BLACK)
-
-
-main()
+
 1"""
+ 2toasters.py
+ 3
+ 4    An example using bitmap to draw sprites on the display.
+ 5
+ 6    Spritesheet from CircuitPython_Flying_Toasters
+ 7    https://learn.adafruit.com/circuitpython-sprite-animation-pendant-mario-clouds-flying-toasters
+ 8
+ 9"""
+10
+11import random
+12from machine import Pin, SoftSPI
+13import st7789py as st7789
+14import t1, t2, t3, t4, t5
+15
+16TOASTERS = [t1, t2, t3, t4]
+17TOAST = [t5]
+18
+19
+20class toast():
+21    '''
+22    toast class to keep track of a sprites locaton and step
+23    '''
+24    def __init__(self, sprites, x, y):
+25        self.sprites = sprites
+26        self.steps = len(sprites)
+27        self.x = x
+28        self.y = y
+29        self.step = random.randint(0, self.steps-1)
+30        self.speed = random.randint(2, 5)
+31
+32    def move(self):
+33        if self.x <= 0:
+34            self.speed = random.randint(2, 5)
+35            self.x = 135 - 64
+36
+37        self.step += 1
+38        self.step %= self.steps
+39        self.x -= self.speed
+40
+41
+42def main():
+43    """
+44    Initialize the display and draw flying toasters and toast
+45    """
+46    spi = SoftSPI(
+47        baudrate=20000000,
+48        polarity=1,
+49        phase=0,
+50        sck=Pin(18),
+51        mosi=Pin(19),
+52        miso=Pin(13))
+53
+54    tft = st7789.ST7789(
+55        spi,
+56        135,
+57        240,
+58        reset=Pin(23, Pin.OUT),
+59        cs=Pin(5, Pin.OUT),
+60        dc=Pin(16, Pin.OUT),
+61        backlight=Pin(4, Pin.OUT),
+62        rotation=0)
+63
+64    tft.fill(st7789.BLACK)
+65    # create toast spites in random positions
+66    sprites = [
+67        toast(TOASTERS, 135-64, 0),
+68        toast(TOAST, 135-64*2, 80),
+69        toast(TOASTERS, 135-64*4, 160)
+70    ]
+71
+72    # move and draw sprites
+73    while True:
+74        for man in sprites:
+75            bitmap = man.sprites[man.step]
+76            tft.fill_rect(
+77                man.x+bitmap.WIDTH-man.speed,
+78                man.y,
+79                man.speed,
+80                bitmap.HEIGHT,
+81                st7789.BLACK)
+82
+83            man.move()
+84
+85            if man.x > 0:
+86                tft.bitmap(bitmap, man.x, man.y)
+87            else:
+88                tft.fill_rect(
+89                    0,
+90                    man.y,
+91                    bitmap.WIDTH,
+92                    bitmap.HEIGHT,
+93                    st7789.BLACK)
+94
+95
+96main()
 
-
+

chango.py

Test for font2bitmap converter for the driver. See the font2bitmap program in the utils directory.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
"""
-chango.py
-
-    Test for font2bitmap converter for the driver.
-    See the font2bitmap program in the utils directory.
-"""
-
-from machine import Pin, SoftSPI
-import st7789py as st7789
-import gc
-from truetype import chango_16 as font_16
-from truetype import chango_32 as font_32
-from truetype import chango_64 as font_64
-
-gc.collect()
-
-
-def main():
-    # enable display and clear screen
-    spi = SoftSPI(
-        baudrate=20000000,
-        polarity=1,
-        phase=0,
-        sck=Pin(18),
-        mosi=Pin(19),
-        miso=Pin(13))
-
-    tft = st7789.ST7789(
-        spi,
-        135,
-        240,
-        reset=Pin(23, Pin.OUT),
-        cs=Pin(5, Pin.OUT),
-        dc=Pin(16, Pin.OUT),
-        backlight=Pin(4, Pin.OUT),
-        rotation=1)
-
-    tft.fill(st7789.BLACK)
-
-    row = 0
-    tft.write(font_16, "abcdefghijklmnopqrst", 0, row, st7789.RED)
-    row += font_16.HEIGHT
-
-    tft.write(font_32, "abcdefghij", 0, row, st7789.GREEN)
-    row += font_32.HEIGHT
-
-    tft.write(font_64, "abcd", 0, row, st7789.BLUE)
-    row += font_64.HEIGHT
-
-
-main()
+
 1"""
+ 2chango.py
+ 3
+ 4    Test for font2bitmap converter for the driver.
+ 5    See the font2bitmap program in the utils directory.
+ 6"""
+ 7
+ 8from machine import Pin, SoftSPI
+ 9import st7789py as st7789
+10import gc
+11from truetype import chango_16 as font_16
+12from truetype import chango_32 as font_32
+13from truetype import chango_64 as font_64
+14
+15gc.collect()
+16
+17
+18def main():
+19    # enable display and clear screen
+20    spi = SoftSPI(
+21        baudrate=20000000,
+22        polarity=1,
+23        phase=0,
+24        sck=Pin(18),
+25        mosi=Pin(19),
+26        miso=Pin(13))
+27
+28    tft = st7789.ST7789(
+29        spi,
+30        135,
+31        240,
+32        reset=Pin(23, Pin.OUT),
+33        cs=Pin(5, Pin.OUT),
+34        dc=Pin(16, Pin.OUT),
+35        backlight=Pin(4, Pin.OUT),
+36        rotation=1)
+37
+38    tft.fill(st7789.BLACK)
+39
+40    row = 0
+41    tft.write(font_16, "abcdefghijklmnopqrst", 0, row, st7789.RED)
+42    row += font_16.HEIGHT
+43
+44    tft.write(font_32, "abcdefghij", 0, row, st7789.GREEN)
+45    row += font_32.HEIGHT
+46
+47    tft.write(font_64, "abcd", 0, row, st7789.BLUE)
+48    row += font_64.HEIGHT
+49
+50
+51main()
 
-
+

noto_fonts.py

Test for font2bitmap converter for the driver. See the font2bitmap program in the utils directory.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
"""
-noto_fonts Writes the names of three Noto fonts centered on the display
-    using the font. The fonts were converted from True Type fonts using
-    the font2bitmap utility.
-"""
-
-from machine import SoftSPI, Pin
-import st7789py as st7789
-
-from truetype import NotoSans_32 as noto_sans
-from truetype import NotoSerif_32 as noto_serif
-from truetype import NotoSansMono_32 as noto_mono
-
-
-def main():
-
-    def center(font, string, row, color=st7789.WHITE):
-        screen = tft.width                        # get screen width
-        width = tft.write_width(font, string)     # get the width of the string
-        if width and width < screen:              # if the string < display
-            col = tft.width // 2 - width // 2     # find the column to center
-        else:                                     # otherwise
-            col = 0                               # left justify
-
-        tft.write(font, string, col, row, color)  # and write the string
-
-    try:
-        spi = SoftSPI(
-            baudrate=20000000,
-            polarity=1,
-            phase=0,
-            sck=Pin(18),
-            mosi=Pin(19),
-            miso=Pin(13))
-
-        tft = st7789.ST7789(
-            spi,
-            135,
-            240,
-            reset=Pin(23, Pin.OUT),
-            cs=Pin(5, Pin.OUT),
-            dc=Pin(16, Pin.OUT),
-            backlight=Pin(4, Pin.OUT),
-            rotation=1)
-
-        # enable display and clear screen
-        tft.fill(st7789.BLACK)
-
-        row = 16
-
-        # center the name of the first font, using the font
-        center(noto_sans, "NotoSans", row, st7789.RED)
-        row += noto_sans.HEIGHT
-
-        # center the name of the second font, using the font
-        center(noto_serif, "NotoSerif", row, st7789.GREEN)
-        row += noto_serif.HEIGHT
-
-        # center the name of the third font, using the font
-        center(noto_mono, "NotoSansMono", row, st7789.BLUE)
-        row += noto_mono.HEIGHT
-
-    finally:
-        # shutdown spi
-        if 'spi' in locals():
-            spi.deinit()
-
-
-main()
+
 1"""
+ 2noto_fonts Writes the names of three Noto fonts centered on the display
+ 3    using the font. The fonts were converted from True Type fonts using
+ 4    the font2bitmap utility.
+ 5"""
+ 6
+ 7from machine import SoftSPI, Pin
+ 8import st7789py as st7789
+ 9
+10from truetype import NotoSans_32 as noto_sans
+11from truetype import NotoSerif_32 as noto_serif
+12from truetype import NotoSansMono_32 as noto_mono
+13
+14
+15def main():
+16
+17    def center(font, string, row, color=st7789.WHITE):
+18        screen = tft.width                        # get screen width
+19        width = tft.write_width(font, string)     # get the width of the string
+20        if width and width < screen:              # if the string < display
+21            col = tft.width // 2 - width // 2     # find the column to center
+22        else:                                     # otherwise
+23            col = 0                               # left justify
+24
+25        tft.write(font, string, col, row, color)  # and write the string
+26
+27    try:
+28        spi = SoftSPI(
+29            baudrate=20000000,
+30            polarity=1,
+31            phase=0,
+32            sck=Pin(18),
+33            mosi=Pin(19),
+34            miso=Pin(13))
+35
+36        tft = st7789.ST7789(
+37            spi,
+38            135,
+39            240,
+40            reset=Pin(23, Pin.OUT),
+41            cs=Pin(5, Pin.OUT),
+42            dc=Pin(16, Pin.OUT),
+43            backlight=Pin(4, Pin.OUT),
+44            rotation=1)
+45
+46        # enable display and clear screen
+47        tft.fill(st7789.BLACK)
+48
+49        row = 16
+50
+51        # center the name of the first font, using the font
+52        center(noto_sans, "NotoSans", row, st7789.RED)
+53        row += noto_sans.HEIGHT
+54
+55        # center the name of the second font, using the font
+56        center(noto_serif, "NotoSerif", row, st7789.GREEN)
+57        row += noto_serif.HEIGHT
+58
+59        # center the name of the third font, using the font
+60        center(noto_mono, "NotoSansMono", row, st7789.BLUE)
+61        row += noto_mono.HEIGHT
+62
+63    finally:
+64        # shutdown spi
+65        if 'spi' in locals():
+66            spi.deinit()
+67
+68
+69main()
 
-
+
diff --git a/docs/fonts.html b/docs/fonts.html index 3575f16..19c5fba 100644 --- a/docs/fonts.html +++ b/docs/fonts.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -83,7 +86,7 @@ -

Contents:

+

Contents:

@@ -193,61 +196,35 @@ character is 256 pixels or less. They are written using the write method.

Sample converted romfont font module.
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
"""converted from vga_8x8.bin """
-
-# font width
-WIDTH = 8
-
-# font height
-HEIGHT = 8
-
-# first character in front
-FIRST = 0x20
-
-# last character in font
-LAST = 0x7f
-
-# bitmap of each character from FIRST to LAST
-_FONT =\
-b'\x00\x00\x00\x00\x00\x00\x00\x00'\
-b'\x18\x3c\x3c\x18\x18\x00\x18\x00'\
-b'\x66\x66\x24\x00\x00\x00\x00\x00'\
-
-... many more lines of data...
-
-b'\x70\x18\x18\x0e\x18\x18\x70\x00'\
-b'\x76\xdc\x00\x00\x00\x00\x00\x00'\
-b'\x00\x10\x38\x6c\xc6\xc6\xfe\x00'\
-
-FONT = memoryview(_FONT)
+
 1"""converted from vga_8x8.bin """
+ 2
+ 3# font width
+ 4WIDTH = 8
+ 5
+ 6# font height
+ 7HEIGHT = 8
+ 8
+ 9# first character in front
+10FIRST = 0x20
+11
+12# last character in font
+13LAST = 0x7f
+14
+15# bitmap of each character from FIRST to LAST
+16_FONT =\
+17b'\x00\x00\x00\x00\x00\x00\x00\x00'\
+18b'\x18\x3c\x3c\x18\x18\x00\x18\x00'\
+19b'\x66\x66\x24\x00\x00\x00\x00\x00'\
+20
+21... many more lines of data...
+22
+23b'\x70\x18\x18\x0e\x18\x18\x70\x00'\
+24b'\x76\xdc\x00\x00\x00\x00\x00\x00'\
+25b'\x00\x10\x38\x6c\xc6\xc6\xfe\x00'\
+26
+27FONT = memoryview(_FONT)
 
-
+
@@ -264,105 +241,59 @@ the negative glyph.left fix from peterhinch’s font conversion program
Sample converted TrueType font module.
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
# -*- coding: utf-8 -*-
-# Converted from Chango-Regular.ttf using:
-#     ./font2bitmap.py Chango-Regular.ttf 16 -c 0x20-0x7f
-
-# Maps the order of the character data
-MAP = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
-
-# Number of color bits per pixel, currently only 1 is used but could be
-# increased to support antialiased or smoothed fonts in the future.
-BPP = 1
-
-# Font height
-HEIGHT = 17
-
-# Font max width
-MAX_WIDTH = 24
-
-# one byte per character table of widths in the same order as the MAP string
-_WIDTHS = \
-    b'\x06\x08\x0a\x0e\x0d\x18\x10\x06\x08\x08\x0a\x0d\x06\x08\x06\x0b'\
-
-    ... more lines of data...
-
-    b'\x0d\x0d\x0b\x0a\x0b\x0e\x0c\x12\x0d\x0c\x0b\x09\x06\x09\x0e\x0b'
-
-# OFFSET_WIDTH bytes per character in the same order as the MAP string
-# to the start of each character in bits.
-OFFSET_WIDTH = 2
-_OFFSETS = \
-    b'\x00\x00\x00\x66\x00\xee\x01\x98\x02\x86\x03\x63\x04\xfb\x06\x0b'\
-
-    ... more lines of data...
-
-    b'\x49\x94\x4a\x71\x4b\x3d\x4b\xf8\x4c\x91\x4c\xf7\x4d\x90\x4e\x7e'
-
-# character bitmaps per character in the same order as the MAP string.
-# Note: character data may not start on byte boundaries
-_BITMAPS =\
-    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61'\
-
-    ... many more lines of data...
-
-    b'\x3d\xe3\xfc\x00\x00\x00\x00\x00'
-
-WIDTHS = memoryview(_WIDTHS)
-OFFSETS = memoryview(_OFFSETS)
-BITMAPS = memoryview(_BITMAPS)
+
 1# -*- coding: utf-8 -*-
+ 2# Converted from Chango-Regular.ttf using:
+ 3#     ./font2bitmap.py Chango-Regular.ttf 16 -c 0x20-0x7f
+ 4
+ 5# Maps the order of the character data
+ 6MAP = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
+ 7
+ 8# Number of color bits per pixel, currently only 1 is used but could be
+ 9# increased to support antialiased or smoothed fonts in the future.
+10BPP = 1
+11
+12# Font height
+13HEIGHT = 17
+14
+15# Font max width
+16MAX_WIDTH = 24
+17
+18# one byte per character table of widths in the same order as the MAP string
+19_WIDTHS = \
+20    b'\x06\x08\x0a\x0e\x0d\x18\x10\x06\x08\x08\x0a\x0d\x06\x08\x06\x0b'\
+21
+22    ... more lines of data...
+23
+24    b'\x0d\x0d\x0b\x0a\x0b\x0e\x0c\x12\x0d\x0c\x0b\x09\x06\x09\x0e\x0b'
+25
+26# OFFSET_WIDTH bytes per character in the same order as the MAP string
+27# to the start of each character in bits.
+28OFFSET_WIDTH = 2
+29_OFFSETS = \
+30    b'\x00\x00\x00\x66\x00\xee\x01\x98\x02\x86\x03\x63\x04\xfb\x06\x0b'\
+31
+32    ... more lines of data...
+33
+34    b'\x49\x94\x4a\x71\x4b\x3d\x4b\xf8\x4c\x91\x4c\xf7\x4d\x90\x4e\x7e'
+35
+36# character bitmaps per character in the same order as the MAP string.
+37# Note: character data may not start on byte boundaries
+38_BITMAPS =\
+39    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61'\
+40
+41    ... many more lines of data...
+42
+43    b'\x3d\xe3\xfc\x00\x00\x00\x00\x00'
+44
+45WIDTHS = memoryview(_WIDTHS)
+46OFFSETS = memoryview(_OFFSETS)
+47BITMAPS = memoryview(_BITMAPS)
 
-
-
-

8x8 Fonts

+
+
+

8x8 Rom Fonts

_images/vga1_8x8.png

vga1_8x8.py: 128 Character 8x8 Font

@@ -378,8 +309,8 @@ the negative glyph.left fix from peterhinch’s font conversion program

-
-

8x16 Fonts

+
+

8x16 Rom Fonts

_images/vga1_8x16.png

vga1_8x16.py: 128 Character 8x16 Font

@@ -396,7 +327,7 @@ the negative glyph.left fix from peterhinch’s font conversion program
-

16x16 Fonts

+

16x16 Rom Fonts

_images/vga1_16x16.png

vga1_16x16.py: 128 Character 16x16 Thin Font

@@ -426,8 +357,8 @@ the negative glyph.left fix from peterhinch’s font conversion program

-
-

16x32 Fonts

+
+

16x32 Rom Fonts

_images/vga1_16x32.png

vga1_16x32.py: 128 Character 16x32 Thin Font

diff --git a/docs/genindex.html b/docs/genindex.html index c736913..868647b 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -82,7 +85,7 @@ -

Contents:

+

Contents:

diff --git a/docs/index.html b/docs/index.html index 0da4ed6..c16c21a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -83,7 +86,7 @@ -

Contents:

+

Contents:

@@ -181,7 +184,7 @@ bit wide bitmap fonts with heights that are multiples of 8. Included are 12 bitmap fonts derived from classic pc text mode fonts.

-

Contents:

+

Contents:

diff --git a/docs/objects.inv b/docs/objects.inv index 2af6bad38255ffe8f62079f088aac88adc0b567b..851c2c2462ad57b08350454fc989d42f2b9e32b7 100644 GIT binary patch delta 576 zcmV-G0>AyK1+E2~MNPT*)G(SinUy1F4%hFZy3x??fp^JXubsK&JD3{Dy zvbtbyh?j4|Rjh6|0#|B24wAy{-VQ|pW+GV#DQ6%%1G$^Xm4D1|&smrZN}*sPBh(R$ z6Dq(fuX7$WLGZi_`DEraohC?x(vW!oJ z-i>fDhuOUg?#i)buBA4Q>&Kuk4k~ZEeT!JFo7I{aU6Dd7XT5?yOZMickghOi{v`q2_Kd=4jE0fan#7qKDMyHOkNIcFot=&;`)Z| zp?|Z}$`0P=25f~17;ddmJGR0E^jDXb Oatw(|ME?Ug_J-}3Ss`@* delta 571 zcmV-B0>u5U1*rv)d4G@FAP|P{`4vdrD^b&Gv+iE|A@xux+RZ&8W*j47uz+Npe_!xm z$4;{G$ITwzX9niQVC!C9k{{)nl;_t%^P>dvmDm_u=B|)mFif8aU9WaA|Uhah}SXmbWmuo%_lEUrw$1DRgk<5gYGmxEu)J^1aW`DTnEKCNaP%x1Z>IB9L zt#;m+sql2VXDqUr!jC=OL$*hDek-|)D& zBfDsPzH3#SS0_)irN}QM{9(E9$HSeZ<(W1Ei2cL+4}bG3?eq@U@z|{(M4!>IPTGNb zo3sCDRKKjzMcqA;>gJsPw6$Ja7p5KUo99Er$nu)s{3_tRhu=kbo?8+L&9YwdQn z_k~`X`v(3}29O_XkW!BUYhecrH_@nywXg&F>qtvEhD0Tz J{{bsxcZ?oUDFFZg diff --git a/docs/py-modindex.html b/docs/py-modindex.html index c9b9849..5159367 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -89,7 +92,7 @@ -

Contents:

+

Contents:

diff --git a/docs/search.html b/docs/search.html index 79425f5..cd34c25 100644 --- a/docs/search.html +++ b/docs/search.html @@ -13,6 +13,8 @@ + + @@ -30,6 +32,7 @@ + @@ -85,7 +88,7 @@ -

Contents:

+

Contents:

diff --git a/docs/searchindex.js b/docs/searchindex.js index 7429627..df0e5a6 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["examples","fonts","index","st7789py"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["examples.rst","fonts.rst","index.rst","st7789py.rst"],objects:{"":{st7789py:[3,0,0,"-"]},"st7789py.ST7789":{bitmap:[3,2,1,""],blit_buffer:[3,2,1,""],fill:[3,2,1,""],fill_rect:[3,2,1,""],hard_reset:[3,2,1,""],hline:[3,2,1,""],inversion_mode:[3,2,1,""],line:[3,2,1,""],pixel:[3,2,1,""],rect:[3,2,1,""],rotation:[3,2,1,""],sleep_mode:[3,2,1,""],soft_reset:[3,2,1,""],text:[3,2,1,""],vline:[3,2,1,""],vscrdef:[3,2,1,""],vscsad:[3,2,1,""],write:[3,2,1,""],write_width:[3,2,1,""]},st7789py:{ST7789:[3,1,1,""],color565:[3,3,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"0123456789":1,"0123456789abcedf":1,"02x":0,"0x20":1,"0x7f":1,"100":0,"127":1,"128":1,"135":0,"135x240":3,"160":0,"16x16":2,"16x32":2,"16x6":1,"20000000":0,"2019":3,"2020":3,"2021":3,"240":[0,3],"240x240":3,"255":3,"256":[0,1],"280":3,"2cnaheucpd4":0,"320x240":3,"565":3,"8x16":2,"8x8":2,"byte":[1,3],"char":[0,1],"class":[0,1,3],"const":3,"default":3,"final":0,"import":0,"int":3,"long":1,"return":3,"true":[0,2,3],"try":0,"while":0,AND:3,BUT:3,FOR:3,NOT:3,THE:3,The:[0,1,3],There:3,These:0,USE:3,Use:1,WITH:3,__init__:0,_bitmap:1,_font:1,_offset:1,_width:1,abcd:0,abcdefghij:0,abcdefghijklmnopqrst:0,abcdefghijklmnopqrstuvwxyz:1,abov:3,action:3,adafruit:0,add:3,added:2,address:3,after:3,all:[0,1,3],ani:[1,3],anim:0,antialias:1,area:3,aris:3,associ:3,atba0bypaac:0,author:3,avail:[0,1],background:3,backlight:[0,3],bader:1,base:[2,3],baudrat:0,belokobylskii:3,bfa:3,bin:1,bio:[1,3],bit:[1,2,3],bitmap:[0,1,2,3],bitmap_modul:3,black:[0,3],blit_buff:3,blog:1,blue:[0,3],bold:1,bool:3,bottom:3,boundari:1,bpp:1,buffer:3,can:1,center:0,chang:3,chango:[1,2],chango_16:0,chango_32:0,chango_64:0,charact:[0,1,3],charg:3,choos:0,chr:0,circuitpython:0,circuitpython_flying_toast:0,claim:3,classic:[2,3],clear:0,cloud:0,code:1,col:0,col_max:0,collect:0,color565:[0,3],color:[0,1,3],column:[0,3],com:[0,1,2,3],compil:1,condit:3,connect:3,contain:[1,3],contract:3,convers:2,convert:[0,1,3],coordin:3,copi:3,copyright:3,corner:3,could:[1,3],cover:3,creat:0,current:1,damag:3,dan:1,data:[1,3],dbader:1,deal:3,def:0,defin:3,definit:3,deinit:0,demo:0,deriv:[2,3],detail:[0,1],devbi:[2,3],directori:[0,1],disabl:3,displai:[0,2,3],distribut:3,document:3,draw:[0,2,3],driver:[0,1,3],each:1,els:0,enabl:[0,3],encod:3,end:3,entir:3,even:0,event:3,exampl:[1,2,3],express:3,fals:3,file:[1,3],fill:[0,3],fill_rect:[0,3],find:0,first:[0,1,3],fit:3,fix:[1,3],fly:0,follow:3,font1:0,font2:0,font2bitmap:[0,1],font3:0,font4:0,font:[0,2,3],font_16:0,font_32:0,font_64:0,font_from_romfont:1,foreground:3,format:0,four:0,frame:3,framebuff:3,free:3,freetyp:1,from:[0,1,2,3],front:1,furnish:3,futur:1,get:0,getrandbit:0,github:[0,1,2,3],given:3,glyph:1,grant:3,green:[0,3],handl:1,hard:3,hard_reset:3,hardwar:3,height:[0,1,2,3],hello:0,herebi:3,high:0,hline:3,holder:3,horizont:3,http:[0,1,2,3],hugh:3,imag:1,imagemagick:0,imgtobitmap:0,impli:3,includ:[1,2,3],incorpor:3,increas:1,index:3,inform:0,initi:0,input:1,invers:3,inversion_mod:3,invert:3,ivan:3,justifi:0,keep:0,kind:3,landscap:3,last:[0,1,3],last_lin:0,learn:0,left:[0,1,3],len:0,length:3,less:1,liabil:3,liabl:3,licens:3,lilygo:0,limit:[1,3],line:[0,1,3],local:0,locat:[0,3],locaton:0,machin:0,mai:1,main:0,maketoast:0,man:0,mani:1,map:1,mario:0,max:1,max_width:1,measur:3,memori:[1,3],memoryview:1,merchant:3,merg:3,method:1,micropython:[1,2,3],miso:0,mit:3,mode:[2,3],modifi:3,modul:[1,2,3],monochrom:1,more:[0,1,3],mosi:0,move:0,mpy:1,multipl:[0,2,3],name:0,neg:1,none:3,noninfring:3,note:1,notic:3,noto:0,noto_font:2,noto_mono:0,noto_san:0,noto_serif:0,notosan:[0,1],notosans_32:0,notosansmono:0,notosansmono_32:0,notoserif:0,notoserif_32:0,number:1,object:3,obtain:3,off:3,offset:1,offset_width:1,one:1,onli:[0,1],option:[1,3],order:1,org:1,other:3,otherwis:[0,3],out:[0,3],output:1,page:0,paramet:3,particular:3,pendant:0,per:1,permiss:3,permit:3,person:3,peterhinch:1,phase:0,pin:[0,3],pixel:[0,1,3],point:3,polar:0,portion:3,portrait:3,posit:0,post:1,pre:1,program:[1,2],proport:1,provid:3,publish:3,purpos:3,python:1,ram:3,randint:0,random:0,rang:[0,3],rect:3,rectangl:[0,3],red:[0,3],reduc:1,refer:2,regular:1,render:1,repo:1,requir:1,reset:[0,3],restrict:3,right:3,rom:2,romfont:[0,1],rotat:[0,2,3],row:[0,3],row_max:0,run:0,russ:3,same:[1,3],sampl:1,sck:0,screen:0,script:0,scroll:[0,2,3],second:0,see:[0,1],self:0,sell:3,set:[1,3],shall:3,should:3,shown:3,shutdown:0,significantli:1,singl:3,size:[1,3],sleep:[0,3],sleep_mod:3,smooth:1,smoothli:0,soft:3,soft_reset:3,softspi:0,softwar:3,sourc:3,spacerac:1,specifi:[1,3],speed:0,spi:[0,3],spite:0,sprite:0,spritesheet:0,st7789:[0,2,3],st7789py:0,st7789py_mpi:[2,3],start:[1,3],step:0,str:3,string:[0,1,3],subject:3,sublicens:3,substanti:3,support:[1,2,3],tabl:1,term:3,test:0,text:[0,1,2,3],tfa:[0,3],tfb:0,tft:[0,2,3],thei:1,them:3,thi:[1,3],thin:1,third:0,three:0,through:0,toast:0,toaster:2,top:3,tort:3,track:0,truetyp:[0,1,3],ttf:1,ttgo:0,ttgo_font:2,ttgo_hello:2,ttgo_lin:2,ttgo_scrol:2,two:1,type:[0,2,3],under:3,use:[1,3],used:1,uses:1,using:[0,1,2,3],usual:0,utf:1,util:[0,1],utim:[0,3],valu:3,vertic:3,vga1_16x16:[0,1],vga1_16x32:[0,1],vga1_8x16:[0,1],vga1_8x8:[0,1],vga1_bold_16x16:[0,1],vga1_bold_16x32:[0,1],vga2_16x16:[0,1],vga2_16x32:[0,1],vga2_8x16:[0,1],vga2_8x8:[0,1],vga2_bold_16x16:[0,1],vga2_bold_16x32:[0,1],vga_8x8:1,view:3,vline:3,vsa:3,vscrdef:[0,3],vscsad:[0,3],vssa:3,warranti:3,watch:0,were:0,whether:3,which:3,white:[0,3],whom:3,wide:[2,3],widest:1,width:[0,1,3],without:3,work:[0,3],write:[0,1,3],write_width:[0,3],written:[1,3],www:0,x00:1,x01:1,x02:1,x03:1,x04:1,x06:1,x08:1,x09:1,x0a:1,x0b:1,x0c:1,x0d:1,x0e:1,x10:1,x12:1,x18:1,x24:1,x38:1,x3c:1,x3d:1,x49:1,x4a:1,x4b:1,x4c:1,x4d:1,x4e:1,x61:1,x63:1,x66:1,x6c:1,x70:1,x71:1,x76:1,x7e:1,x86:1,x90:1,x91:1,x94:1,x98:1,xc6:1,xdc:1,xe3:1,xee:1,xf7:1,xf8:1,xfb:1,xfc:1,xfe:1,xinyuan:0,you:3,youtub:0},titles:["Example Programs","Fonts","st7789py Driver","st7789py Reference"],titleterms:{"16x16":1,"16x32":1,"8x16":1,"8x8":1,"true":1,chango:0,content:2,convers:1,driver:2,exampl:0,font:1,index:2,noto_font:0,program:0,refer:3,rom:1,st7789py:[2,3],toaster:0,ttgo_font:0,ttgo_hello:0,ttgo_lin:0,ttgo_scrol:0,type:1}}) \ No newline at end of file +Search.setIndex({docnames:["examples","fonts","index","st7789py"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["examples.rst","fonts.rst","index.rst","st7789py.rst"],objects:{"":{st7789py:[3,0,0,"-"]},"st7789py.ST7789":{bitmap:[3,2,1,""],blit_buffer:[3,2,1,""],fill:[3,2,1,""],fill_rect:[3,2,1,""],hard_reset:[3,2,1,""],hline:[3,2,1,""],inversion_mode:[3,2,1,""],line:[3,2,1,""],pixel:[3,2,1,""],rect:[3,2,1,""],rotation:[3,2,1,""],sleep_mode:[3,2,1,""],soft_reset:[3,2,1,""],text:[3,2,1,""],vline:[3,2,1,""],vscrdef:[3,2,1,""],vscsad:[3,2,1,""],write:[3,2,1,""],write_width:[3,2,1,""]},st7789py:{ST7789:[3,1,1,""],color565:[3,3,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"0":[0,3],"01":[0,3],"0123456789":1,"0123456789abcedf":1,"02x":0,"0x20":1,"0x7f":1,"1":[0,1,3],"100":0,"12":[2,3],"127":1,"128":1,"13":0,"135":0,"135x240":3,"16":[0,1,2,3],"160":0,"16x16":2,"16x32":2,"16x6":1,"17":1,"18":0,"19":0,"2":[0,1,3],"20000000":0,"2019":3,"2020":3,"2021":3,"23":0,"24":1,"240":[0,3],"240x240":3,"255":3,"256":[0,1],"280":3,"2cnaheucpd4":0,"3":[0,3],"32":1,"320x240":3,"4":0,"40":[0,3],"5":0,"565":3,"6":0,"64":0,"8":[0,1,2,3],"80":0,"8x16":2,"8x8":2,"byte":[1,3],"char":[0,1],"class":[0,1,3],"const":3,"default":3,"do":3,"final":0,"import":0,"int":3,"long":1,"return":3,"true":[0,2,3],"try":0,"while":0,A:3,AND:3,AS:3,BE:3,BUT:3,FOR:3,IN:3,IS:3,NO:3,NOT:3,OF:3,OR:3,THE:3,TO:3,The:[0,1,3],There:3,These:0,To:3,WITH:3,_:[0,1],__init__:0,_bitmap:1,_font:1,_offset:1,_width:1,abcd:0,abcdefghij:0,abcdefghijklmnopqrst:0,abcdefghijklmnopqrstuvwxyz:1,abov:3,action:3,ad:2,adafruit:0,add:3,address:3,after:3,all:[0,1,3],an:[0,3],ani:[1,3],anim:0,antialias:1,ar:[0,1,2,3],area:3,aris:3,associ:3,atba0bypaac:0,author:3,avail:[0,1],b:1,background:3,backlight:[0,3],bader:1,base:[2,3],baudrat:0,belokobylskii:3,bfa:3,bg:3,bin:1,bio:[1,3],bit:[1,2,3],bitmap:[0,1,2,3],bitmap_modul:3,black:[0,3],blit_buff:3,blog:1,blue:[0,3],bold:1,bool:3,bottom:3,boundari:1,bpp:1,buffer:3,c:[1,3],can:1,center:0,chang:3,chango:[1,2],chango_16:0,chango_32:0,chango_64:0,charact:[0,1,3],charg:3,choos:0,chr:0,circuitpython:0,circuitpython_flying_toast:0,claim:3,classic:[2,3],clear:0,cloud:0,code:1,col:0,col_max:0,collect:0,color565:[0,3],color:[0,1,3],column:[0,3],com:[0,1,2,3],compil:1,condit:3,connect:3,contain:[1,3],contract:3,convers:2,convert:[0,1,3],coordin:3,copi:3,copyright:3,corner:3,could:[1,3],cover:3,creat:0,cs:[0,3],current:1,damag:3,dan:1,data:[1,3],dbader:1,dc:[0,3],deal:3,def:0,defin:3,definit:3,deinit:0,demo:0,deriv:[2,3],detail:[0,1],devbi:[2,3],directori:[0,1],disabl:3,displai:[0,2,3],distribut:3,document:3,draw:[0,2,3],driver:[0,1,3],e:0,each:1,els:0,enabl:[0,3],encod:3,end:3,entir:3,even:0,event:3,exampl:[1,2,3],express:3,f:1,fals:3,fg:3,file:[1,3],fill:[0,3],fill_rect:[0,3],find:0,first:[0,1,3],fit:3,fix:[1,3],fly:0,follow:3,font1:0,font2:0,font2bitmap:[0,1],font3:0,font4:0,font:[0,2,3],font_16:0,font_32:0,font_64:0,font_from_romfont:1,foreground:3,format:0,four:0,frame:3,framebuff:3,free:3,freetyp:1,from:[0,1,2,3],front:1,furnish:3,futur:1,gc:0,get:0,getrandbit:0,github:[0,1,2,3],given:3,glyph:1,grant:3,green:[0,3],h:[1,3],handl:1,hard:3,hard_reset:3,hardwar:3,height:[0,1,2,3],hello:0,herebi:3,high:0,hline:3,holder:3,horizont:3,http:[0,1,2,3],hugh:3,i:[0,1,2],imag:1,imagemagick:0,imgtobitmap:0,impli:3,includ:[1,2,3],incorpor:3,increas:1,index:3,inform:0,initi:0,input:1,invers:3,inversion_mod:3,invert:3,ivan:3,justifi:0,keep:0,kind:3,l:1,landscap:3,last:[0,1,3],last_lin:0,learn:0,left:[0,1,3],len:0,length:3,less:1,liabil:3,liabl:3,licens:3,lilygo:0,limit:[1,3],line:[0,1,3],local:0,locat:[0,3],locaton:0,machin:0,mai:1,main:0,maketoast:0,man:0,mani:1,map:1,mario:0,max:1,max_width:1,measur:3,memori:[1,3],memoryview:1,merchant:3,merg:3,method:1,micropython:[1,2,3],miso:0,mit:3,mode:[2,3],modifi:3,modul:[1,2,3],monochrom:1,more:[0,1,3],mosi:0,move:0,mpy:1,multipl:[0,2,3],name:0,neg:1,none:3,noninfring:3,note:1,notic:3,noto:0,noto_font:2,noto_mono:0,noto_san:0,noto_serif:0,notosan:[0,1],notosans_32:0,notosansmono:0,notosansmono_32:0,notoserif:0,notoserif_32:0,number:1,o:1,object:3,obtain:3,off:3,offset:1,offset_width:1,one:1,onli:[0,1],option:[1,3],order:1,org:1,other:3,otherwis:[0,3],out:[0,3],output:1,page:0,paramet:3,particular:3,pc:[1,2,3],pendant:0,per:1,permiss:3,permit:3,person:3,peterhinch:1,phase:0,pin:[0,3],pixel:[0,1,3],point:3,polar:0,portion:3,portrait:3,posit:0,post:1,pre:1,program:[1,2],proport:1,provid:3,publish:3,purpos:3,py:[1,2],python:1,ram:3,randint:0,random:0,rang:[0,3],rect:3,rectangl:[0,3],red:[0,3],reduc:1,refer:2,regular:1,render:1,repo:1,requir:[1,3],reset:[0,3],restrict:3,right:3,rom:2,romfont:[0,1],rotat:[0,2,3],row:[0,3],row_max:0,run:0,russ:3,s:[0,1,3],same:[1,3],sampl:1,sck:0,screen:0,script:0,scroll:[0,2,3],second:0,see:[0,1],self:0,sell:3,set:[1,3],shall:3,should:3,shown:3,shutdown:0,significantli:1,singl:3,size:[1,3],sleep:[0,3],sleep_mod:3,smooth:1,smoothli:0,so:3,soft:3,soft_reset:3,softspi:0,softwar:3,sourc:3,spacerac:1,specifi:[1,3],speed:0,spi:[0,3],spite:0,sprite:0,spritesheet:0,st7789:[0,2,3],st7789py:0,st7789py_mpi:[2,3],start:[1,3],step:0,str:3,string:[0,1,3],subject:3,sublicens:3,substanti:3,support:[1,2,3],t1:0,t2:0,t3:0,t4:0,t5:0,t:0,tabl:1,term:3,test:0,text:[0,1,2,3],tfa:[0,3],tfb:0,tft:[0,2,3],thei:1,them:3,thi:[1,3],thin:1,third:0,three:0,through:0,toast:0,toaster:2,top:3,tort:3,track:0,truetyp:[0,1,3],ttf:1,ttgo:0,ttgo_font:2,ttgo_hello:2,ttgo_lin:2,ttgo_scrol:2,two:1,type:[0,2,3],under:3,up:0,us:[0,1,2,3],usual:0,utf:1,util:[0,1],utim:[0,3],v:0,valu:3,vertic:3,vga1_16x16:[0,1],vga1_16x32:[0,1],vga1_8x16:[0,1],vga1_8x8:[0,1],vga1_bold_16x16:[0,1],vga1_bold_16x32:[0,1],vga2_16x16:[0,1],vga2_16x32:[0,1],vga2_8x16:[0,1],vga2_8x8:[0,1],vga2_bold_16x16:[0,1],vga2_bold_16x32:[0,1],vga_8x8:1,view:3,vline:3,vsa:3,vscrdef:[0,3],vscsad:[0,3],vssa:3,w:3,wa:3,warranti:3,watch:0,were:0,whether:3,which:3,white:[0,3],whom:3,wide:[2,3],widest:1,width:[0,1,3],without:3,work:[0,3],write:[0,1,3],write_width:[0,3],written:[1,3],www:0,x00:1,x01:1,x02:1,x03:1,x04:1,x06:1,x08:1,x09:1,x0:3,x0a:1,x0b:1,x0c:1,x0d:1,x0e:1,x10:1,x12:1,x18:1,x1:3,x24:1,x38:1,x3c:1,x3d:1,x49:1,x4a:1,x4b:1,x4c:1,x4d:1,x4e:1,x61:1,x63:1,x66:1,x6c:1,x70:1,x71:1,x76:1,x7e:1,x86:1,x90:1,x91:1,x94:1,x98:1,x:[0,3],xc6:1,xdc:1,xe3:1,xee:1,xf7:1,xf8:1,xfb:1,xfc:1,xfe:1,xinyuan:0,y0:3,y1:3,y:[0,3],you:3,youtub:0},titles:["Example Programs","Fonts","st7789py Driver","st7789py Reference"],titleterms:{"16x16":1,"16x32":1,"8x16":1,"8x8":1,"true":1,chango:0,content:2,convers:1,driver:2,exampl:0,font:1,index:2,noto_font:0,program:0,py:0,refer:3,rom:1,st7789py:[2,3],toaster:0,ttgo_font:0,ttgo_hello:0,ttgo_lin:0,ttgo_scrol:0,type:1}}) \ No newline at end of file diff --git a/docs/st7789py.html b/docs/st7789py.html index dd0a363..943673b 100644 --- a/docs/st7789py.html +++ b/docs/st7789py.html @@ -13,6 +13,8 @@ + + @@ -29,6 +31,7 @@ + @@ -84,7 +87,7 @@ -

Contents:

+

Contents:

@@ -210,23 +213,23 @@ BIOS text mode fonts.

  • Drawing converted bitmaps

  • -
    -st7789py.color565(red, green=0, blue=0)[source]
    +
    +st7789py.color565(red, green=0, blue=0)[source]

    Convert red, green and blue values (0-255) into a 16-bit 565 encoding.

    -
    -class st7789py.ST7789(spi, width, height, reset, dc, cs=None, backlight=None, rotation=0)[source]
    +
    +class st7789py.ST7789(spi, width, height, reset=None, dc=None, cs=None, backlight=None, rotation=0)[source]

    ST7789 driver class

    Parameters
      -
    • spi (spi) – spi object

    • -
    • width (int) – display width

    • -
    • height (int) – display height

    • +
    • spi (spi) – spi object Required

    • +
    • width (int) – display width Required

    • +
    • height (int) – display height Required

    • reset (pin) – reset pin

    • -
    • dc (pin) – dc pin

    • +
    • dc (pin) – dc pin Required

    • cs (pin) – cs pin

    • backlight (pin) – backlight pin

    • rotation (int) – display rotation @@ -238,20 +241,20 @@ BIOS text mode fonts.

    -
    -hard_reset()[source]
    +
    +hard_reset()[source]

    Hard reset display.

    -
    -soft_reset()[source]
    +
    +soft_reset()[source]

    Soft reset display.

    -
    -sleep_mode(value)[source]
    +
    +sleep_mode(value)[source]

    Enable or disable display sleep mode.

    Parameters
    @@ -264,8 +267,8 @@ BIOS text mode fonts.

    -
    -inversion_mode(value)[source]
    +
    +inversion_mode(value)[source]

    Enable or disable display inversion mode.

    Parameters
    @@ -278,8 +281,8 @@ BIOS text mode fonts.

    -
    -rotation(rotation)[source]
    +
    +rotation(rotation)[source]

    Set display rotation.

    Parameters
    @@ -295,8 +298,8 @@ BIOS text mode fonts.

    -
    -vline(x, y, length, color)[source]
    +
    +vline(x, y, length, color)[source]

    Draw vertical line at the given location and color.

    Parameters
    @@ -311,8 +314,8 @@ BIOS text mode fonts.

    -
    -hline(x, y, length, color)[source]
    +
    +hline(x, y, length, color)[source]

    Draw horizontal line at the given location and color.

    Parameters
    @@ -327,8 +330,8 @@ BIOS text mode fonts.

    -
    -pixel(x, y, color)[source]
    +
    +pixel(x, y, color)[source]

    Draw a pixel at the given location and color.

    Parameters
    @@ -342,8 +345,8 @@ BIOS text mode fonts.

    -
    -blit_buffer(buffer, x, y, width, height)[source]
    +
    +blit_buffer(buffer, x, y, width, height)[source]

    Copy buffer to display at the given location.

    Parameters
    @@ -359,8 +362,8 @@ BIOS text mode fonts.

    -
    -rect(x, y, w, h, color)[source]
    +
    +rect(x, y, w, h, color)[source]

    Draw a rectangle at the given location, size and color.

    Parameters
    @@ -376,8 +379,8 @@ BIOS text mode fonts.

    -
    -fill_rect(x, y, width, height, color)[source]
    +
    +fill_rect(x, y, width, height, color)[source]

    Draw a rectangle at the given location, size and filled with color.

    Parameters
    @@ -393,8 +396,8 @@ BIOS text mode fonts.

    -
    -fill(color)[source]
    +
    +fill(color)[source]

    Fill the entire FrameBuffer with the specified color.

    Parameters
    @@ -404,8 +407,8 @@ BIOS text mode fonts.

    -
    -line(x0, y0, x1, y1, color)[source]
    +
    +line(x0, y0, x1, y1, color)[source]

    Draw a single pixel wide line starting at x0, y0 and ending at x1, y1.

    Parameters
    @@ -421,8 +424,8 @@ BIOS text mode fonts.

    -
    -vscrdef(tfa, vsa, bfa)[source]
    +
    +vscrdef(tfa, vsa, bfa)[source]

    Set Vertical Scrolling Definition.

    To scroll a 135x240 display these values should be 40, 240, 40. There are 40 lines above the display that are not shown followed by @@ -441,8 +444,8 @@ changing the TFA, VSA and BFA values.

    -
    -vscsad(vssa)[source]
    +
    +vscsad(vssa)[source]

    Set Vertical Scroll Start Address of RAM.

    Defines which line in the Frame Memory will be written as the first line after the last line of the Top Fixed Area on the display

    @@ -460,8 +463,8 @@ utime.sleep(0.01)

    -
    -text(font, text, x0, y0, color=micropython.const, background=micropython.const)[source]
    +
    +text(font, text, x0, y0, color=micropython.const, background=micropython.const)[source]

    Draw text on display in specified font and colors. 8 and 16 bit wide fonts are supported.

    @@ -479,8 +482,8 @@ fonts are supported.

    -
    -bitmap(bitmap, x, y, index=0)[source]
    +
    +bitmap(bitmap, x, y, index=0)[source]

    Draw a bitmap on display at the specified column and row

    Parameters
    @@ -496,8 +499,8 @@ module

    -
    -write(font, string, x, y, fg=micropython.const, bg=micropython.const)[source]
    +
    +write(font, string, x, y, fg=micropython.const, bg=micropython.const)[source]

    Write a string using a converted true-type font on the display starting at the specified column and row

    @@ -515,8 +518,8 @@ at the specified column and row

    -
    -write_width(font, string)[source]
    +
    +write_width(font, string)[source]

    Returns the width in pixels of the string if it was written with the specified font

    diff --git a/lib/st7789py.py b/lib/st7789py.py index 23c9f9e..072836f 100644 --- a/lib/st7789py.py +++ b/lib/st7789py.py @@ -164,11 +164,11 @@ class ST7789(): ST7789 driver class Args: - spi (spi): spi object - width (int): display width - height (int): display height + spi (spi): spi object **Required** + width (int): display width **Required** + height (int): display height **Required** reset (pin): reset pin - dc (pin): dc pin + dc (pin): dc pin **Required** cs (pin): cs pin backlight(pin): backlight pin rotation (int): display rotation @@ -177,7 +177,7 @@ class ST7789(): - 2-Inverted Portrait - 3-Inverted Landscape """ - def __init__(self, spi, width, height, reset, dc, + def __init__(self, spi, width, height, reset=None, dc=None, cs=None, backlight=None, rotation=0): """ Initialize display. @@ -187,6 +187,9 @@ class ST7789(): "Unsupported display. 320x240, 240x240 and 135x240 are supported." ) + if dc is None: + raise ValueError("dc pin is required.") + self._display_width = self.width = width self._display_height = self.height = height self.xstart = 0 diff --git a/sphinx/Makefile b/sphinx/Makefile new file mode 100644 index 0000000..85b43a1 --- /dev/null +++ b/sphinx/Makefile @@ -0,0 +1,26 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +update: + # Update documentation on my webserver using rsync over ssh + # /usr/bin/rsync --progress --delete -e 'ssh -i ~/.ssh/id_rsa' -avz build/html/ penfold.owt.com:/htdocs/st7789py/ + # update docs directory of this repo using rsync + /usr/bin/rsync --progress --delete -avz build/html/ ../docs/ + \ No newline at end of file diff --git a/sphinx/requires.txt b/sphinx/requires.txt new file mode 100644 index 0000000..d5b9a8e --- /dev/null +++ b/sphinx/requires.txt @@ -0,0 +1,6 @@ +# additional sphinx plug-ins, install using pip3 +sphinx-prompt +sphinxcontrib.napoleon +sphinxcontrib.napoleon +sphinxcontrib.globalsubs +sphinx_rtd_theme diff --git a/sphinx/source/_static/vga1_16x16.png b/sphinx/source/_static/vga1_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..053c26e767f882097a3f43476a491a2b2ecdef36 GIT binary patch literal 1065 zcmV+^1lIeBP)zwe4WcWl=;Cz|^!WriK{03X337s2_ymEMUKs9t)E_5u)4l;7 z(3t_spokOyLQ)?o$|d@?Z~J%5F;UaT%l-qT=>)O^k?xv~di@dPc=rmALA6b%+S?!% z^my7hW=(?0cljnS5Yf;1vE8r>2#LH5FHpFF5U!=5y9B9zf%*zU;=Mg5$j^QzlD`E` zQ1jY!Jgq$~i^$MPwc&Z4QzZuyKWP%EUY()J)9%&mC0x--b@JzG$PR8Vi5JBaM71?- z{aLL(-?h6H{36p(*A8}Q20!b;k9yEUywOWux{ue6RfkS-YG7#|b};!~gi)$OY<-rHma4EfSlCiV-q2hpim&4LS|2Y0dnMA@CZmfqQ!z4@)KGvHQf#^LZKNr zkn=;+A@Mop8a?EudvJ~H5r^Lyq~9X#>O9uv2S52q4{St#3>bRe zu*to}PWPe^dJ3h&dxFpt$HU&F-l8B)V&V&syho^KdU-kEQ-mI8#}P;nCFl=S;m5@n z=;_2MR0VBYrl<46=?0Q^W8-^|Abu{;<7szZAV1xBI$XmA!p+FI; zR_CGwfDRdwURvvfKIRB*vQBoA#FOGoNpXce<0n8x@&Ay$o0<1a_xU2N%wjr0BNt@# zMkW=I!Ia}CYlJOYAlZ3ZWk%~i*1uBZ)mdMfX+1uN1I#}C3I!0w)$BvL4 zHkQX6Q_o%bP@wb!soDyXdHrjM*3g}B*ux`QWz@4BRcptGF?vD;56`~8sveu)87U5% zy@?Qd0n>?HsfL~N=!s_(C#a8*VDX%}N=&giFU zJH=sW74!sBvCo2i^n0*M!m2W<+)Qw7;kAQN_H)#)HB zOVH1^YdDHS45R1aA~RDjiD#3<3#7X3Q98+Gofb#{M)mRBIyJ4VLACf7A}U@%wXAoh j!+XfQhraFGzSjN*?Cs17O=PrF00000NkvXXu0mjfVB__k literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga1_16x32.png b/sphinx/source/_static/vga1_16x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e5076358d6f8011ff1d314694dfece423fdec9 GIT binary patch literal 1153 zcmV-{1b+L8P)gB>frk^$;1;n`4CRWG5l` zeTFNb=C$c?oG*7aYz=gft$UuE;Oy)oh=q)KP=cXrx9BP;8S_( zY|I?K5fW8ULfh+OIXfkvgH?p2o=!236PGE%aDr7V+Hh+AP@k~lIp^f z-XV{)up^Z)R}MW;p%AX=(Fw49(~&W!V484;RK$v)M`*ZN0Nq@ZNn0{yT8_k}bT5Lo z1Svk}MELWl<8{S~`x1AihA-1=p9aWE-gPA50@w`Hv%1{x6pgac&l^@C=`iu}I{eHXA z0OgS5QlZ0(ApQ)HNAdEqrK56aHvtA9LLx%{P)L6}*(&JifKllyXx*ZCIzAq1AueC2 zt+%AEoiemLJRIvFJHA_Pdr{nJJk>xuMlL3JXH0@#Y9J>9bmbNZ4kl<@1991zhYD3# z4A3gaQwd~7Hf9W86ft}yH4i%ybdK>7=mk_3PyuRc+kN=P5Y$6zKyAVpN}E1pD2HzyBrcC2ekn!JFXZj*v!FjCpSMfp zkvh}`ZdyZrZlkXU+9HS#G8BKn$#e_EBlRaiVh(+vcp+p4Dj0*B%phAcJPu(wO04a( z_2&>Sfc{;M zw|&`e=I*@#;>QVmW~Rg)kaFb^jgS+So^d^fu}|}skkd3mDG`bwN}D`n@hC|H1dos_ zzVs}3ZYzh<28khFN_jeTdAWMX3=C=aaFm^L?2-t5f2)94aS?_r8fYF*JVL6oF_RQQ zY|ISFZoTKC11VJMAO?`qyXnl>v}{+|+9`%_J#-Z_9}NLFLi$E%kwq3+4z!6aZk6L6a~U-(WKJ2Z#+tX<(b1DJnLL%?sbnxp z^`yJxQqw}4X3H}ccOSaDr+3e?QXld60lxwY*;i9gk#g3|&|_p3EzGX=pW=EQgEjT+ ztdhzDJ7o>ZJl!4_$#jLhkQqtCw$Rf`<(7|-P1CILx%n=ndaq((oW-1!oP&a4y8T_J zB-KKcgvdcvERL1C-mqTD?DMKiu;$CY%44N6hC|e1Pjw8Veq&OP@ zpN>aEE6LtKC9AV$U@c|PP%jMHXtqLjWf~15m3y_-MqoBv$kZo_xmBhMB1^rpC9iiZ z%Aex==pS?T>@W5QW~moB#E6KcA{ZX_wKx&icy+a|lz&uW9Ps*jC=^4^LOZ4b`+mq^ z`motm%5~O`h4@>WRVb9#0V%eZqP8rzuY^~P29_iO3SlE+N%ioBeZS8w)psn*DLEOA zbfi_uhcSEQqYyH3Beu7OC;D0>;+-AZZ?aG*J-~#<-Zvs9S7_rr*qcUyqp1Yex`|K= z5d^y&X;bRLF-KV2#Yj6L_fQ6_8y#p*p3Wot?9Y5#gE?K+;?>#HzZOiwo)V~gwJe`| z(D!c2A(ZcB>3IFp^g^FyXL+W+FWK8Jx&^}bZGGD&a^yaBpd)0gl_nfgwh2M^uxXSE z4ZoxKLY%k~PSg=~)YIPUy=R>DmywP6b)-}3WzT&>bko7udkeVPPBc~)W_$jOFHWLN00000NkvXXu0mjfXEap> literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga1_8x8.png b/sphinx/source/_static/vga1_8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..8af6ec75a59a5d5660fb17d8306efc1e7e930553 GIT binary patch literal 565 zcmV-50?Pe~P)c_4ZsM>fwBEh%g1AUqzC{A{AW7)(n59C8ZQX?Llr#? z%9_`#va%~`+D_`46;^?muqvqq3d;2%(4a(-(a(2&Rv+vrrEPO9B{3C}6mmqq1R?@3 z$`T_2tz#)h5M&UmN7(whEReF)GSIWEZkjCVt|%x162G!!xK{3(F1NHx$)*v272&Qe zmE7Vlt$Fgh`Aj6fC?dxF9tjMFKePCHAuRaxR2aq3{&v(-!Er1N%oy6so2&ytjr-$4 zP$8)mxK>5vP8p3Pisx_S$GNSFcVbD4&-{R}`QkqdLawzUvcb43vOkza{KdPBy&*~f zL`Ubrf)PO#C>lW#9<1r>SK)vN6dM6ry`poPy-zNZZ~l{CU2OjI^xEfkQd{NK3G~Tb zFODz6D3trSP1%fzBMi}Lgx^!|(I8d2)B$vahTT}gQuz)M^a#flRn96Qp`7s*4O1G@ z*~}hif5bQQy6_#}+35zJhj)mtX_6UE!<3gQGt7*XG=Oy|w(@Z3`!j4*>?kBbPOcD? znBZpg*BV>Q4>uIddD#v;FP&LYH5uXVw!QmH{V?$l=u`p{5hqn*00000NkvXXu0mjf DKS=`$ literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga1_bold_16x16.png b/sphinx/source/_static/vga1_bold_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1df216b2a8effec4fe8f37f177576e49fe3d42be GIT binary patch literal 1124 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 literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga2_8x16.png b/sphinx/source/_static/vga2_8x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c76c26b1d7f99acca8aa95fdc95ebe0709b14a37 GIT binary patch literal 1656 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 N002ovPDHLkV1g%tcTfNT literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga2_bold_16x16.png b/sphinx/source/_static/vga2_bold_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc37b04f8224c709b275f5569bdae8fc9577531 GIT binary patch literal 2425 zcmV-<35NEGP)000RPcTRDNoFCSfmt=iHwd(QTLK0K zS_szEUqw=qV|UW&?uUMFnu2Xv`cy0yi^U>sV}6xi<%gDG(AQfa-}@e)RZ}%1RJV3m z9SijFYIAg9vE|FLKpPjVbqW#ZAt%IEw+r@TjOjNfqck2RWi`zIF6O!-DnqJX& zmzZzzg0CvJzj*7$m?ay|`hk1YWNV!iZUJ%Q?O|_?n&Aw@J;-(fR7JJf2raf7^-bSY zJ*s0#RH_qc%bTiEGaDamf+jlgDH)==U3Cgc1+4f4@&h+Rx;nW^mQ+ovOOoI~Go30? zeALMg%bU^&Z5`j<8}c%0d@(9qXlAF1b@BtOR9yDC#aXA`4;L(cV%p37_kGKYnh<5k zUX}r@L-(KIkV2tB%0((y@NuM?@Z?10%B{)-WO_*pH3WN^e4h=4f zR)k29ZpI13)$xV8QD}7Gq90VgzO7kdyHjX$gxlg(B;w@y)&%YUxg^$b22s5Y-KkD9 zyRqWzjUkxQI>nrsNpisv^`_VfSJ}*S2q7AZXNylGAz8h{Vr1 zxQHW@BykC;AMRvk<7?4~HstiaMRnQv^6s|0@1q3fNya#!jod@(w+Uf=OIf$ljA!vhS#GmS#4*74By8G869xt^jX$BD&%qVg&auiJE@EwkJtJ+rJfZ9MEo%K^qL$8AOQw0wGa0JcC*@nL(X& zoh=YMbKpr0bIb^_FS%93s8Ztos(M%S1>ClLEkw|1~Dq7(818?(iyU3C45 zZv0Z&d_~gzDxY~3geZ%((1H^O$)n|}m-AVX8Hs%diLKb0W;OZAE_HhaIkPZo-=t`44jIfI_^1M7^e9ck~)i7haqF`JD{`iiDb-{k$b+_7VmZY zMd(i}X@!yt)-MLx;;d9NXwf2lpzZ{!XHZ$cG_Qb?6H~0k;+u{_kldDCrq7T~(*|)? z$CDpxAke$t5rRC+UGzr$7!Y?Y!f1v#2X-cANi&GuSD^bHLXaYW{4iF>eF_LcjAN#= zr|V%3IXnPZryT{PN$-BIIe}L@jSvq6-`H-!9<|saiW_d7T6_kb*!B4~0ejT`_-4J=2NS!wuLdYG_%YYVU`f*^Q8uMSa?_;nl`I-`mubiKtfdJ5Te+;==fVHq!F9C0Uw`>QY2 zX%O3|hoA>M>7MgetzIChxCAjHSuc8Tv*QJL)L0@*_?AKSajafR(tF)c<=IMn+FGuo zghR^Ey+BxZ^6=@&^VrEcjZj$2cVt5dDSu3Qk+M!$`a)8wpc?9SwA0>-CuJyQOwrgE z6W(gLyp8xxrK;Y)KOD4^)hcQoycex*Za#nZ{srjgmNW=7Gy~rrdU?MjNjAP^7CIwo zzyS#=31>KO&PcMP@7ZmWtaStvHry zK*{frqcUcarqa|mvxk@D|L+dvp`Ct8p~=sW_!$1`5Kj0e`+$D?q9k4Pos}exG}r-> ztbS?KyOb;Twv<0rHx6n4U(oj~{-`fG@3H@1Njf`QCn5*W*}P^65(%!YDO)DC6DWU+ zn$&W+B~vzEka%p4viIbyB+Ehmp&&~pmCwsaW-TJ2T6+4?&(cv)N z=qRPnS+9KK+;_Ipkfk4Ir)lG+K$Gh6gNGamO4TtmpMn|_ZHmA){}+TIn*IxdvuC0N zQ9nYlDUkfWk|b%eExIr?G!sdADUqwgSug6(AnpBWbu@?ac&nO2Gd9|uO4=Ote-BgW r!uCxy?}kgz*~>o)`c;0FZ!Z4>f_$UFa?o$O00000NkvXXu0mjfbPbbb literal 0 HcmV?d00001 diff --git a/sphinx/source/_static/vga2_bold_16x32.png b/sphinx/source/_static/vga2_bold_16x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e527303609d785ec24e1867d14e4d246da1d4883 GIT binary patch literal 2712 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 SmZ&xW0000?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + +# Number of color bits per pixel, currently only 1 is used but could be +# increased to support antialiased or smoothed fonts in the future. +BPP = 1 + +# Font height +HEIGHT = 17 + +# Font max width +MAX_WIDTH = 24 + +# one byte per character table of widths in the same order as the MAP string +_WIDTHS = \ + b'\x06\x08\x0a\x0e\x0d\x18\x10\x06\x08\x08\x0a\x0d\x06\x08\x06\x0b'\ + + ... more lines of data... + + b'\x0d\x0d\x0b\x0a\x0b\x0e\x0c\x12\x0d\x0c\x0b\x09\x06\x09\x0e\x0b' + +# OFFSET_WIDTH bytes per character in the same order as the MAP string +# to the start of each character in bits. +OFFSET_WIDTH = 2 +_OFFSETS = \ + b'\x00\x00\x00\x66\x00\xee\x01\x98\x02\x86\x03\x63\x04\xfb\x06\x0b'\ + + ... more lines of data... + + b'\x49\x94\x4a\x71\x4b\x3d\x4b\xf8\x4c\x91\x4c\xf7\x4d\x90\x4e\x7e' + +# character bitmaps per character in the same order as the MAP string. +# Note: character data may not start on byte boundaries +_BITMAPS =\ + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61'\ + + ... many more lines of data... + + b'\x3d\xe3\xfc\x00\x00\x00\x00\x00' + +WIDTHS = memoryview(_WIDTHS) +OFFSETS = memoryview(_OFFSETS) +BITMAPS = memoryview(_BITMAPS)