Starting at 0.5.0, all notable changes to Coldtype will be described here (briefly). Edit: looks like I forgot this existed, so we're starting again at 0.5.16
coldtype.fx.skiaSkiaImage(subclass ofDATImage, which has been moved tocoldtype.imgmodule)
.phototype/.color_phototypemethods onDATPen— these are now "chainable" methods in the coldtype.fx.skia module, and can be applied by importing alafrom coldtype.fx.skia import phototypeand then chaining to a pen,.ch(phototype(...))
- Minor improvements to the self-rasterizing/drawbot-renderer, to support transparent backgrounds
@drawbot_scriptand@drawbot_animationfrom the global import; now reside and can be imported fromcoldtype.drawbotmodule
- Quoting paths in
blend_frame
unicodedata2from primary installation requirements, in order to make blender installation smoother (i.e. not require Include header-copying from python source tarball) — thanks @colinmford!
- New features for managing meshes in BlenderPen
- embedded profiles, so
-p b3dshould now work globally
durationkeyword for@animation, since it’s redundant totimeline=<int>shortcut
- Support for
kpandtuinGlyphwise
- Support for single-char
Glyphwise Glyphwisenow returnsDATPens, notDraftingPens
- Support for multi-return styler fn for
Glyphwise - Coldtype panel for
@b3d_sequencer
- Better MIDI primitives
coldtype midimidi viewer
- Better axidraw primitives in new
coldtype.axidrawnamespace, demonstrated intest/visuals/test_axidraw.png - New
numpadspecial variable that can handle up to 9 special actions, triggerable from the numpad with the viewer enabled
- Dependency on
PyOpenGL-acceleratein the[viewer]extra — not really sure why that was there to begin with.
- Restored some audio capabilities, via
audio=keywords and the newConfigOption.EnableAudio/KeyboardShortcut.EnableAudio
- General tidying, particularly for use in
[notebook]
- Dependency on
noisein[viewer]
- Support for configurable
BLENDER_APP_PATH - Better support for Windows-Blender workflow
- Support for gif export in
@notebook_animation.show
strip=kwarg on StSt (defaulting toTrue) so incoming text is automatically stripped (but can be overriden as in theGlyphwiseuse ofStSt)coldtype.blender.fluentexperimental chainable interface for direct manipulation of blender objects
- Support for lineTo's in
distribute_on_path - More
coldtype.blender.fluentinterface - Ability to exit from renderer with -1 in
prenormalize_filepath
@uidecorator idea, to be used/tested in Goodhertz plugin-builder
.depth,.split,.wordPens,.walkpîandïforindexandindices, also both of those onDraftingPennow, since they shadow functionality ofmod_contourandmap_pointsutagin walk.data- camelCase throughout examples, headed towards standardizing on that
.getifor time-based fetch inAsciiTimeline
style=on precomposed/@renderable-cached
MidiTimelineto replaceMidiReader(MidiTimelineuses standardTimelinecapabilities rather than Midi-specifi classes)AsciiTimelineimprovements and changed api, old[]-style access replaced by.ki; keyframe support also added, via.kf; many new examples inexamples/animations/ascii_*Easeableclass to encapsulate all easing functionality, i.e. aTimeablebound to a frame value, meaning frame values can now be implied on all@animation-bound timelines (viaTimeline.hold)- Generic lyric-video sentence building on timelines, available contextually as
.wordson a timeline (example inexamples/animations/ascii_words.py) (adapted from olderSequenceclass (not recommended for use), originally developed for lyric video animation in Premiere, though works better now with Blender) - Automatic timeline viewer, available with
-tv 1command-line arg or toggleable withVkey in viewer app - A lot more examples
- Normalized behavior of
point=handling in.scale/.rotate/.skew - Manual-drive
BlenderTimeline
- Implicit
BlenderTimelineon@b3d_animationand@b3d_sequencer .progressmethod (in favor of newEaseableapis)
.enow defaults toloops=1, rather thanloops=0
- Audio support via
pyaudio
- Error where windows can't watch non-existent file
- Error where windows barfs on os.uname
coldtype.runon.runonabstraction for chained/fluent method calling on nested listscoldtype.runon.pathi.e.Pas a drop-in replacement forDATPen/DATPens(should be fully backwards compatible), which extendscoldtype.runon.runon
- File watching on windows
watchdogdependency (usingstat().st_mtimepolling instead now since we’re already running an event loop out of necessity for the viewer)
memory=keyword for renderables (attempting some kind of support for processing-style live-coded animations)fvar_<x>generic style for addressing sorted variable font axesxkey for xray modegkey for grid modepkey to print renderable content
- support for platform-specific config files,
.coldtype.mac.py,.coldtype.win.py,.coldtype.lin.py - minor Blender improvements for 3D workflow
Cas valid alias forCXon xalign
filterContourscopy before modify- Orphan-deletion in Blender
bake=Truefor a@b3d_animation
- Spelling mistakes [h/t @HaydenBL]
- Tons of experimental additional functionality for more direct-style scripting of blender and forthcoming coldtype-based blender typography addon (all in fluent.py, with some supporting tweaks in other coldtyper.blender infrastructure)
- New transparency background when
bgnot specified render_bgnow defaults toTrue, since that seems to be the most common use-caseufo2ftin[blender]optional requirements- simple
gifskiwrapper importable fromcoldtyper.renderable.animation
- Better error message when trying to "release" via ffmpeg but no files have been rendered
- New arg
round_resultonSkiaImage.align, to fix jaggy image aligning; defaults to True but is disableable
glyph_to_uniin packaged mode
Runon.attach
- Explicit include of ufoLib2 for blender
P.spreadas horizontal-only counterpart toP.stack(paired withP.trackandP.leadrespectively, funny that they rhyme oppositely whoops)
- Default
"."in ALL_FONT_DIRS for linux (so colab notebooks search in their uploaded files by default)
Easeable.ecas easing-cumulative (to help with partial rotations, as in the new truchet animation examples, and examples/animations/ec.py)
P.gridlayer,Runon.mapvch,Runon.mapvrc
.upas canonical form of.ups- Argument-less boolean operation methods for plural
P - Automatic _-prefixed versions of all P methods, to get clojure-style "phrase"-commenting
VERSIONS=support for macro-like reversioning of a single animationFont.LibraryFindandFont.LibraryListto search font registry (mac-only, windows is excruciatingly difficult)Font.namesto get style and family name of font via fontTools
Mondrian->Scaffoldth&tv(true-horizontal & true-vertical) have been renamed to potential confusion (sincethcould be taken to meantrue-height) — these are nowtxandtyrespectively
- The Blender integration now inlines your local venv into Blender, meaning you no longer need to install any python packages into Blender's embedded python.
-rar(--render-and-release) command-line option to render-and-release(-and-then-quit)
Scaffold.cssgridnow supports arbitrary regex keys in a dictionary arg for targeting multiple children at once (shown in test_scaffold.py)
Runon.pathandRunon.match(taken fromScaffold) as new generic features, to regex-match on nested/slashed tags (i.e. paths)
.ufofont-reading on Windows
- Font issue with
coldtype demo
b3denvrequirement, to help get default blender app path
b3denvassumes Blender exists, which is wrong
P.to_code(for a Goodhertz project that used the legacyDATPen(s).to_code)
- Experimental support for reading control changes (cc messages) from midi files, via
MidiTimeline.cimethod
- CycleVersionForward/CycleVersionBackward
- Support for _version.py-style sidecar versioning
- Support for special
__initials__function to allow setting state from source file
Rect.contains/Rect.__contains__/inoperator for RectEandWsupported onpair_to_edges<as parent ref inScaffold.find- Support
vertas feature (without needing to specifyfeatures=) RestartCountconcept in rendererFont.Fontmakefor full font compilation to a tmp file
coldtype.fx.skia.freezefor in-memory "freezing" of vectors (to avoid recalculation)Runon.collapseoncefor shallow collapsing
- Support for skia-python 87.6 on python3.12
- Fix for >= m87 skia-python with glfw gl-version setting (https://www.glfw.org/faq#macos / skia-python/skia-python#214)
- Support for custom global hotkeys via
custom_hotkeyfunction in source files
- High quality filter support for skia > m87
- Spec <=0.4.2 for python-bidi since 0.5.0 is beefed
use_skia_pathops_draw=Falsekwarg override forP.removeOverlapto make sure we don't get all-off-curve+None quadratics in situations where we don't know how to convert that to cubics (i.e. in Blender)
Rect.fit_aspectfor easily getting an aspect inscribed by a rect- version lock on python-bidi
Huge update, attempting to future proof things
- External dependency on coldtype/fontgoggles fork (instead of out-of-date inlined fontgoggles fork)
- Gonna be honest — fixed lots of stuff, should’ve been writing down what I was fixing!
- Make sure coldtype.drawbot does not require skia-python (via incorrect import)
- try/except for filmjitter in coldtype.raster
- Don’t enable audio if audio can’t be enabled (print instructions on enabling audio instead)
Font.instancesto get variable font instance informationcoldtype instances font=<font-search>toolººBLENDERINGººvariable to quickly know if your code is running in blender or as a blender-rendererP.trim_startandP.trim_endto quickly drop points from either end of a curve
P.boxCurveTofactor=keyword now expects float, not int
- Updated coldtype-fontgoggles to latest to avoid Windows thinking it could do objc
- Experimental support for limited keyboard layout remapping via command line -kl argument
ViewerSoloFirstandViewerSoloLastshortcuts
VIEWER_SOLOis now a config option, not a one-off cli arg in renderer
set_709onanimation.export/FFMPEGExport(so you can use olderffmpegreleases to export animations)
- better support for custom output with ct viewseq
- experimental support for
Themeclass to set multiple color styles from a single object
- blender venv-inlining now look for a "src" directory if it exists (to match new pyproject.toml-enforced directory structure)
- base dependencies for coldtype (i.e. coldtype installed without any extra) no longer support "extended" font formats (woff, ufo, etc.), though [viewer] extra does still provide support for these; mido requirement has also been moved out of base into viewer; the point of this is to reduce the complexity of a "minimal" coldtype installation (i.e. when embedded as a backend service in another python application or a Blender extension, e.g.)
- refinements to Coldtype 2D panel in Blender for timeline workflow
- ability to set workarea in coldtype 2d panel (blender)
- memory bug in harfbuzz bounding box calculation by downgrading to <0.47
- Update to b3denv for Blender 5 compatibility
- Use
showinfilemanagerfor cross-platform showing-in-"finder"
demoblenderin addition to todemoforuv run coldtype demoblender -p b3dlo
- Blender 5 fcurves utility
coldtypeis now a metapackage that wrapscoldtype-core, meaning"coldtype[viewer]"is no longer necessary, you can just douv add coldtypeoruvx coldtype <source-file>.pyand it should work
- Soundfiles are now opened with "r" instead of "r+" which I think was totally extraneous (h/t #185)
<and>support forRectbased on combo ofwandhFont.metricsfor quickly-accessing somewhat normalized font metrics datacharstool
- Moved source for glyphs.py to
tools(as a new tools directory)