# Changelog¶

We try to maintain changelog in way outlined by the keep a changelog project.

## v0.9.0 2018-11-11¶

• New stylo.math module! Currently it contains a lerp function to do linear implementation between two values a and b

• New stylo.design module! This is the start of the “next level” in styo’s API abstracting away from the lower level objects such as shapes and colormaps.

• This module adds the notion of a parameter group, this is a collection of values that can be passed into functions as a single object using the dictionary unpacking syntax (**params)

Parameter groups are defined using the define_parameter_group function and taking a name and a comma separated string of parameter names. There is also define_time_dependent_parameter_group that can be used to define a parameter group that depends on time.

Currently there are two pre-defined paramters groups, Position and Trajectory. They both combine the x and y values into a single object, with the second being the time dependent version of the first.

Finally there are two built-in implementations of these parameter groups. StaticPosition and ParametricPosition the first takes two values and returns them. The second takes two functions in time and calls them at each supplied time value.

## v0.8.0 - 2018-11-07¶

• New Timeline system! This finally introduces explicit support for animations to stylo.

## v0.7.0 - 2018-10-25¶

• New Line shape!
• New ImplicitXY shape! Draw any curve that is implicitly defined by a function $$f(x, y)$$

### Changed¶

• The Circle and Ellipse shapes now take more arguments. By default the shapes will now draw an outline rather than a filled in shape.

## v0.6.1 - 2018-10-20¶

• New preview keyword argument to images, set this to False if you don’t want a matplotlib figure returned.
• New encode keyword argument to images, setting this to True will return a base64 encoded string representation of the image in PNG format.

### Fixed¶

• Preview images are no longer displayed twice in jupyter notebooks
• Preview images no longer display the x and y axis numbers.

## v0.6.0 - 2018-10-07¶

#### Users¶

• New Triangle shape
• Shapes can now be inverted using the ~ operator.

#### Contributors¶

• Added new shape InvertedShape which handles the inversion of a shape behind the scenes.
• Tests for all the composite shapes and operators.
• More documentation on how to get involved

### Changed¶

#### Users¶

• Shapes now have defined __repr__ methods, including shapes that have been combined, where a representation of a tree will be produced showing how the various shapes have been combined together.
• Preview images in Jupyter notebooks are now larger by default

This release of stylo was brought to you thanks to contributions from the following awesome people!

## v0.5.0 - 2018-09-27¶

#### Users¶

• New Image object LayeredImage object that can now draw more than one object
• Added an introductory tutorial for first time users to the documentation
• Functions from the stylo.domain.transform package can now be applied to shapes, meaning that most images can now be made without handling domains directly.

#### Contributors¶

• Added a Drawable class, this allows a domain, shape and colormap to be treated as a single entity.
• Added a render_drawable function that takes a drawable and some existing image data and applies it to the data.
• Added a get_real_domain function that given a width, height and scale returns a RectangularDomain with appropriate aspect ratio, $$(0, 0)$$ at the centre of the image and the scale corresponding to the interval $$[ymin, ymax]$$
• We now make use of the [scripts] section of Pipfile so running common commands is now easier to remember
• pipenv run test: to run the test suite
• pipenv run lint: to lint the codebase
• pipenv run docs: to run a full build of the documentation
• pipenv run docs_fast: to run a less complete but faster build of the documentation.

### Changed¶

#### Users¶

• Altered SimpleImage to no longer take a domain, reducing the cognitive load on first time users. It now instead takes an optional scale variable to control the size of the domain underneath. This also means that the domain now automatically matches the aspect ratio of the image so no more distortion in non-square images.

#### Contributors¶

• The tests now take advantage of multi-core machines and should now run much faster
• Building the docs now takes advantage of multi-core machines and should now run much faster.

### Fixed¶

#### Contributors¶

• Fixed crashes in exampledoc.py and apidoc.py for first time users
• Fixed issue with sed on a Mac for people running the devenv-setup.sh script

This release of stylo was brought to you thanks to contributions from the following awesome people!

## v0.4.2 - 2018-09-17¶

• Image objects can now take a size keyword argument to adjust the size of the matplotlib preview plots

## v0.4.1 - 2018-09-17¶

### Fixed¶

• Fixed an issue with setup.py that meant most of the code wasn’t published to PyPi!

## v0.4.0 - 2018-09-16¶

Out of the ashes of the previous version rises the biggest release to date! Stylo has been rewritten from the ground up and should now be easier to use, more modular and easier to extend!

None (or very little) of the original code remains and not everything has been reimplemented yet so some of the features listed below may not be available in this version. There is a lot more work to be done particularly in the tests and docs departments however core functionality is now in place and it’s been long enough since the previous release.

I’m hoping that from now on releases will be smaller and more frequent as what is now here is refined and tested to create a stable base from which Stylo can be extended.

#### Users¶

One of the main ideas behind the latest incarnation of stylo is the idea of interfaces borrowed from Java. Where you have an object such as Shape and all shapes have certain behaviors in common represented by methods on an interface. Then there are a number of implementations that provide the details specific to each shape.

In stylo this is modelled by having a number of abstract classes that define the interfaces that represent different parts of the stylo image creation process. Then regular classes inherit from these to provide the details.

With that in mind this release provides the following “interfaces”.

• New RealDomain and RealDomainTransform interfaces, these model the mapping of a continuous mathematical domain $$D \subset \mathbb{R}^2$$ onto a discrete grid of pixels.
• New Shape interface this models the mapping of the grid of values generated by a domain into a boolean numpy array representing which pixels are a part of the shape.
• New ColorSpace system this currently doesn’t do much but should allow support for the use of different color representations. Current only 8-bit RGB values are supported.
• New ColorMap interface, this represents the mapping of the boolean numpy array generated by the Shape interface into a numpy array containing the color values that will be eventually interpreted as an image.
• New Image interface. Implementations of this interface will implement common image creation workflows as well as providing a unified way to preview and save images to a file.

With the main interfaces introduced here is a (very) brief introduction to each of the implementations provided in this release

RealDomain

• RectangularDomain: Models a rectangular subset of the :mathxy-plane $$[a, b] \times [c, d] \subset \mathbb{R}^2$$
• SquareDomain: Similar to above but in the cases where $$c = a$$ and $$d = b$$
• UnitSquare: Similar to above but the case where $$a = 0$$ and $$b = 1$$

RealDomainTransform

• HorizontalShear: Given a domain this applies a horizontal shear to it
• Rotation: Given a domain this rotates it by a given angle
• Translation: Given a domain this applies a translation to it
• VerticalShear: Given a domain this applies a vertical shear to it

Shape

• Square
• Rectangle
• Circle
• Ellipse

ColorSpace

• RGB8: 8-bit RGB valued colors

ColorMap

• FillColor: Given a background and a foreground color. Color all False pixels with the background color and color all the True pixels the foreground color.

Image

• SimpleImage: Currently the only image implementation, this implements one of the simplest workflows that can result in an interesting image. Take a Domain, pass it to a Shape and then apply a ColorMap to the result.

#### Extenders/Contributors¶

From the beginning this new attempt at stylo has been designed with extensibility in mind so included in the library are also a number of utilities aimed to help you develop your own tools that integrate well with the rest of stylo.

Domains and DomainTransforms

While stylo only currently ships with RealDomain and RealDomainTransform interfaces it is developed in a way to allow the addition of new “families” of domain. If you want to create your own stylo provides the following functions:

• define_domain: This will write your base domain class (like the RealDomain) just give it a name and a list of parameters.
• define_domain_transform: The will write the DomainTransform base class for you.

In addition to defining new families stylo provides a few helper classes to help you write your own domains and transforms for the existing RealDomain family

• PolarConversion: If your domain is only “interesting” in cartesian coordinates this helper class will automatically write the conversion to polar coordinates for you.
• CartesianConversion: If your domain is only “interesting” in polar coordinates this helper class will automatically write the conversion to cartesian coordinates for you.

stylo.testing

stylo also comes with a testing package that provides a number of utilities to help you ensure that any extensions you write will integrate well with the rest of stylo

• BaseRealDomainTest: This is a class that you can base your test case on for any domains in the RealDomain family to ensure that they function as expected.
• define_domain_test: Similar to the define_domain and define_domain_transform functions this defines a base test class to ensure that domains in your new family work as expected.
• BaseShapeTest Basing your test case on this for any new shapes will ensure that your shapes will function as expected by the rest of stylo
• define_benchmarked_example: This is for those of you wishing to contribute an example to the documentation, using this function with your example code will ensure that your example is automatically included in the documentation when it is next built.

stylo.testing.strategies

This module defines a number of hypothesis strategies for common data types in stylo. Using these (and hypothesis) in your test cases where possible will ensure that your objects will work with the same kind of data as stylo itself.

### Removed¶

Everything mentioned below.

## v0.3.0 - 2017-12-09¶

• New Domain class, it is responsible for generating the grids of numbers passed to Drawables when they are mapped onto Images. It replaces most of the old decorators.
• Drawables are now classes! Any drawable is now a class that inherits from Drawable, it brings back much of the old Puppet functionality with some improvements.
• More tests!

### Changed¶

• ANDing Images (a & b) has been reimplemented so that it hopefully makes more sense. The alpha value of b is used to scale the color values of a.
• Along with the new Domain system mapping Drawables onto Images has been reworked to hopefully make coordinate calculations faster

### Removed¶

• stylo/coords.py has been deleted, this means the following functions and decorators no longer exist + mk_domain - Domains are now a class + cartesian (now built into the new Domain object) + polar (now built into the new Domain object) + extend_periocally (now the .repeat() method on the new Domain object) + translate (now the .transform() method on the new Domain object) + reflect (not yet implemented in the new system)

## v0.2.3 - 2017-11-15¶

• Image objects can now be added together, this is simply the sum of the color values at each pixel
• Image objects can now be subtracted, which is simply the difference of the colour values at each pixel

### Changed¶

• Renamed hex_to_rgb to hexcolor. It now also can cope with rgb and rgba arguments, with the ability to promote rgb to rgba colors

## v0.2.2 - 2017-10-30¶

• Keyword argument ‘only’ to the ‘polar’ decorator which allows you to ignore the x and y variables if you dont need them

### Fixed¶

• Forgot to expose the objects from interpolate.py to the top level stylo import
• Examples in the documentation and enabled doctests for them

## v0.2.1 - 2017-10-29¶

### Fixed¶

• Stylo should now also work on python 3.5

### Removed¶

• Deleted stylo/motion.py as its something better suited to a plugin
• Deleted Pupptet, PuppetMaster and supporting functions as they are broken and better to be rewritten from scratch

## v0.2.0 - 2017-10-27¶

• Sampler object which forms the basis of the new Driver implementations
• Channel object which can manage many Sampler-like objects to form a single ‘track’ of animation data
• A very simple Driver object which allows you to collect multiple Channel objects into a single place

#### Docs¶

• Added the following reference pages
• Image
• Drawable
• Primitive
• Sampler
• A How-To section
• How-To invert the colours of an Image

### Changed¶

• Image.__and__() now uses a new method which produces better results with colour images

### Fixed¶

• Numpy shape error in Image.__neg__()

### Removed¶

• stylo.prims.thicken was redundant so it has been removed

Initial Release