119
Synfig developers docs Synfig developers May 26, 2021

Synfig developers docs - Read the Docs

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Synfig developers docs - Read the Docs

Synfig developers docs

Synfig developers

May 26, 2021

Page 2: Synfig developers docs - Read the Docs
Page 3: Synfig developers docs - Read the Docs

Contents:

1 Contributing guidelines 31.1 Ways to contribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Contributing code changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Thank You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Setting up your preferred IDE 72.1 Setting up Netbeans IDE for Synfig Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Setting up QtCreator IDE for Synfig development . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Code structure 173.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.2 synfig-core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4 Building Synfig using command line 254.1 Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.2 Preparing Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.3 Building Synfig using Autotools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.4 Building Synfig Using CMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

5 Packaging Synfig for distribution 335.1 Packaging using Autotools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2 Packaging using CMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

6 Tutorials 376.1 Adding a Render progress bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.2 Adding a Sound notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426.3 Creating a custom widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.4 How to add new Dock Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

7 Release procedure 497.1 Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497.2 Apply latest translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497.3 Update NEWS files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497.4 Update version number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507.5 Build packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507.6 Write press release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507.7 Finish repository changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

i

Page 4: Synfig developers docs - Read the Docs

7.8 Publish packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.9 Update flatpak and snap packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.10 Publish announcement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.11 Close related bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

8 Roadmap 538.1 Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.2 Bones system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.3 Animation tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.4 Sound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548.5 Other . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

9 Google Summer of Code 559.1 Google Summer of Code 2019 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559.2 Google Summer of Code 2020 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639.3 Google Summer of Code 2021 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

10 Projects 8110.1 Control handling exported values during copy-pasting [IN PROGRESS] . . . . . . . . . . . . . . . . 8110.2 Google Season of Docs [DECLINED] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.3 Export for web via Lottie [IN PROGRESS] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8310.4 Better Shortcuts [DRAFT] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10410.5 Skeleton Tool (GSoC-2020) [IN PROGRESS] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

11 List of hotkeys 10711.1 Global hotkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10711.2 Local hotkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

12 Random notes 10912.1 Building Synfig for production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10912.2 How to login to docker image? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

13 Code of Conduct 11113.1 Values we Appreciate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.2 Our Pledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.3 Our Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.4 Our Responsibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.5 Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.6 Enforcement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11313.7 Attribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

14 Indices and tables 115

ii

Page 5: Synfig developers docs - Read the Docs

Synfig developers docs

Note: IMPORTANT Please have a look at our contributing guidelines here

Contents: 1

Page 6: Synfig developers docs - Read the Docs

Synfig developers docs

2 Contents:

Page 7: Synfig developers docs - Read the Docs

CHAPTER 1

Contributing guidelines

Hi there! Interested in contributing to Synfig? We’d love your help. Synfig is an open source project, built onecontribution at a time by users like you. Please read these guidelines carefully, it will help you and us to save precioustime later.

As you prepare to join our community, you should find out what this project is about - if you didn’t do this already. Wehighly recommend to become familiar with existing Synfig functionality before you start any coding. You can startwith beginner’s tutorials. Also, you can request a free access to our video training course, which allow you to grab allbasics in the shortest time.

Note:

• Download Synfig -> https://www.synfig.org/download-stable/

• Join Synfig Forum -> https://forums.synfig.org/

• We use GitHub to manage our repository. If you’re not familiar with git/GitHub, we strongly recommendfollowing a tutorial, such as this one .

1.1 Ways to contribute

Whether you’re a developer, a designer, or just a Synfig devotee, there are lots of ways to contribute. Here’s a fewideas:

• Install Synfig on your computer and kick the tires. Does it work? Does it do what you’d expect? If not, open anissue and let us know.

• Comment on some of the project’s open issues. Have you experienced the same problem? Know a work around?Do you have a suggestion for how the feature could be better?

• Read through the documentation, and ask the community(on forum or GitHub), any time you see somethingconfusing, or have a suggestion for something that could be improved.

3

Page 8: Synfig developers docs - Read the Docs

Synfig developers docs

• Browse through the Synfig discussion forum, and lend a hand answering questions. There’s a good chanceyou’ve already experienced what another user is experiencing.

• Find an open issue (especially those labeled help wanted/good first issue), mention yourself in the commentwith the interest to work on the issue and submit a proposed fix. If it’s your first pull request, we promise wewon’t bite, and are glad to answer any questions.

• Help evaluate open pull requests, by testing the changes locally and reviewing what’s proposed.

• Open an issue if you found something that needs a fix (Please don’t forget to mentioned if you want to workon the issue you opened or have started working for a fix!)

Note:

• Synfig issue tracker -> https://github.com/synfig/synfig/issues

• Some beginner issue to ensure you can use synfig..

• Want easy projects? Check out our list of “good first issues” .

1.2 Contributing code changes

1.2.1 1. Get code and prepare your working tree

Warning:

• Before you start working on any issue kindly ensure that someone else is not already working on it bylooking at comments.

• If no one is working on that issue drop a comment to let everyone know you will be working on it.

• We know your time is precious :)

Fork the project by clicking “Fork” in the top right corner of synfig/synfig. Clone the repository locally

git clone https://github.com/<you-username>/synfig

Create a new, descriptively named branch to contain your change

git checkout -b my-awesome-feature

1.2.2 2. Making code changes

Learn how to build Synfig here - https://synfig-docs-dev.readthedocs.io/en/latest/common/building.html

Make sure to read about code structure - https://synfig-docs-dev.readthedocs.io/en/latest/common/structure.html

Don’t forget to configure IDE. We recommend to use NetBeans. Here are video instructions on how to configure it -https://www.youtube.com/watch?v=SNkdiSxBV_s

Now, have fun, hack away.

• make sure to follow the code style used in the module you are contributing to

4 Chapter 1. Contributing guidelines

Page 9: Synfig developers docs - Read the Docs

Synfig developers docs

• before committing and pushing the changes, test the code both manually and automatically with the automatedtest suite if applicable

1.2.3 3. Commit message style guidelines

When done, commit your changes.

• commits should be descriptive in nature

• the message should explain the nature of the change

1.2.4 4. Submitting a pull request

• The smaller the proposed change, the better. If you’d like to propose two unrelated changes, submit two pullrequests.

• The more information, the better. Make judicious use of the pull request body. Describe what changes weremade, why you made them, and what impact they will have for users.

• If this is your first pull request, it may help to understand GitHub Flow.

Push the branch (you have created it) to your GitHub fork:

git push origin my-awesome-feature

Create a pull request (from now on we will shorten it often to just PR) by visiting https://github.com/<your-username>/synfig and following the instructions at the top of the screen:

• from your forked repository of the project select your branch and click “New Pull Request”

• check the changes tab and review the changes again to ensure everything is correct

• write a concise description of the PR, if an issue exists for

Note: While creating the PR please mention the issue number. For example, to close an issue numbered 123, youcould use the phrase “Closes #123” or “Closes: #123” in your pull request description or commit message. Once thebranch is merged into the default branch, the issue will close.

• after submitting your PR, check back again whether your PR has passed our required tests

• if the tests fail for some reason, try to fix them and if you get stuck ask for help.

• if the tests pass, maintainers will review the PR and may ask you to improve details or changes, please be patient:creating a good quality open source project takes a bit of sweat and effort; ensure to follow up with this type ofoperations

• once everything is fine with us we’ll merge your PR

1.2.5 5. Avoiding unnecessary changes

• while making changes to the required files, then saving it and comitting it, different contributors often find thatthere occur same changes that they have not made and those changes gets committed with the desired changethat the person wants to make

• these unnecessary changes should be evaluated first before the commit should be made

1.2. Contributing code changes 5

Page 10: Synfig developers docs - Read the Docs

Synfig developers docs

• these changes generally occur due to different settings and customizations of your editor that you are workingwith. These changes are produced on their own as soon as you save a file. Examples are - Introducing new lines,removing and adding spaces, etc

• to avoid such changes please check your editor settings first. If this sort of behaviour persists please use anycommand line editor like VIM, etc

1.3 Thank You

If you follow these guidelines closely your contribution will have a very positive impact on the Synfig project.

Thanks a lot for your patience.

6 Chapter 1. Contributing guidelines

Page 11: Synfig developers docs - Read the Docs

CHAPTER 2

Setting up your preferred IDE

Integrated Development Environment (or just IDE) is a powerful tool for programmers to maximize their codingproductivity. One can debug and test while at the same time utilize all the cool editing features provided by an IDE.

Since most modern IDEs are equipped with CMake support out of the box or installed as extensions/plugins, fortu-nately, Synfig has a working CMake build script. That means you can literally configure any of those CMake supportedIDEs for Synfig development.

Choose your preferred IDE for Synfig development:

2.1 Setting up Netbeans IDE for Synfig Development

2.1.1 Prerequisites

1. Clone synfig repo

2. Execute 1-setup-<your-os>.sh script to install build tools and dependencies

3. Install Oracle’s Java 8 or Open JDK v8

Note: TL;DR You can also refer to this video tutorial -> https://youtu.be/op-PShrJTCM

2.1.2 Installation

The Apache Netbeans IDE is recommended for Synfig Studio development. The Installer automatically preparesthe IDE so that it comes with all required plug-ins, the correct workspace encoding settings, pre-configured codeformatters and more. Simply follow these steps:

• Download the Netbeans Installer.

• Launch the Netbeans IDE and go to tools -> plugins.

7

Page 12: Synfig developers docs - Read the Docs

Synfig developers docs

• Go to Settings tab and enable Netbeans 8.2 plugins portal:

• Go to Available plugins and click on check for newest.

• Now select and install C/C++ plugin:

2.1.3 Setup New Synfig Project

IDE Installation is now completed so let’s configure our new synfig project.

• Click file -> new project

8 Chapter 2. Setting up your preferred IDE

Page 13: Synfig developers docs - Read the Docs

Synfig developers docs

• Select C/C++ and C/C++ Project with Existing Source:

• Select your synfig source file directory

• Under Select configuration mode select custom and press next:

• Click next and skip the Pre Build Action(do not check any option).

2.1. Setting up Netbeans IDE for Synfig Development 9

Page 14: Synfig developers docs - Read the Docs

Synfig developers docs

• Under Build Action uncheck the clean and build after finish and click next:

• Now click next on step 5 and step 6 without making any changes.

• Click finish:

10 Chapter 2. Setting up your preferred IDE

Page 15: Synfig developers docs - Read the Docs

Synfig developers docs

2.1.4 Setting up make configuration

Now we will configure make settings for our synfig project.

• Right click on project(Synfig) and select properties:

• Under Build -> make section change Build result so that it points to “_debug/build/bin/synfigstudio”:

• Press apply and ok.

Yay! your Netbeans IDE is now configured and you can use all the functionalities including debugging etc.

2.1. Setting up Netbeans IDE for Synfig Development 11

Page 16: Synfig developers docs - Read the Docs

Synfig developers docs

2.2 Setting up QtCreator IDE for Synfig development

2.2.1 Prerequisites

1. Clone synfig repo

2. Execute 1-setup-<your-os>.sh script to install build tools and dependencies

2.2.2 Installation

For Linux users, you can install qtcreator using your distribution’s package management tool.

For Windows and Mac users, you can download and install open source version of qtcreator from Qt’s official website.

2.2.3 Setup new Synfig project

• Select Open project

• Browse and select CMakeLists.txt

12 Chapter 2. Setting up your preferred IDE

Page 17: Synfig developers docs - Read the Docs

Synfig developers docs

• Manage your kit

For most users, you can select and use the default kit usually named Desktop.

But if you want to use another generator (say Ninja) and not the one provided by the default kit(Makefiles), you can create your own kit and name it Synfig or any other name of your choice.

• Manage your build path

QtCreator tends to generate build directory above our source directory. If that’s OK with you thanyou can skip this part and proceed with Configure Project.

But if you’re someone who has multiple projects inside your preferred root project directory, QtCre-ator generating build directories in our root directory might become messy later in the future becauseyou’d have to deal with multiple directories as your project lists grows. Once you’re done, selectConfigure Project.

2.2. Setting up QtCreator IDE for Synfig development 13

Page 18: Synfig developers docs - Read the Docs

Synfig developers docs

2.2.4 Setup make configuration

• Set processor count

Depending on your generated build files, the build system might utilize parallelism during buildprocess or it might run only on one CPU. If you want to control the number of CPUs to be utilized byCMake during build process you can set it from Projects > Build > CMake arguments. For instance,if you’ve a quad-core processor, you can use -j 4

• Change run configuration

QtCreator, by default, sets synfig_bin to be run as our output but usually we are testing the GUIfrontend so change it to synfigstudio from Projects > Run > Run configuration

2.2.5 File browser

• File system

To browse your project files, change File System sub-menu from Computer to synfig-studio. Thatway you’ll be able to see all the source files, resources, translation files, etc as it is in your file system.

14 Chapter 2. Setting up your preferred IDE

Page 19: Synfig developers docs - Read the Docs

Synfig developers docs

2.2. Setting up QtCreator IDE for Synfig development 15

Page 20: Synfig developers docs - Read the Docs

Synfig developers docs

2.2.6 Source code indentation

• Use tab character

Synfig source files mainly C++ and CMake use tab character for indentation. QtCreator might usespaces by default depending on platforms or versions. Change C++ code style settings to Tabs Only.You could also duplicate built-in settings and make changes to preserve default settings.

You’re all done :) Happy hacking!

16 Chapter 2. Setting up your preferred IDE

Page 21: Synfig developers docs - Read the Docs

CHAPTER 3

Code structure

3.1 Overview

Synfig is divided into three components: ETL, synfig-core and synfig-studio.

• ETL is a template library that implements reference counting, portable threading and other low-level stuff.Every part of the Synfig project uses ETL in some way. It is like the C++ STL.

• synfig-core is Synfig’s backend. It renders scenes and knows how to read and write Synfig XML files. Thisdirectory contains the Synfig library and the Synfig command-line tool.

• synfig-studio is the graphical editor. It uses the GTK+ widget library. If you want to hack on the interface, thisis what you should look at.

The structure of synfig-core is:

• synfig-core/src/synfig/ - Code of “libsynfig” library. This is actually the main part of synfig-core.It contains code of render engine and routines for reading/writing Synfig’s files. The libsynfig library is used byall other Synfig’s components.

• synfig-core/src/modules/ - Functionality of libsynfig can be extended with modules and this directory is a place for them. A module can do following things:

– Add support for importing specific file format(s). Examples:

* synfig-core/src/modules/mod_png/mptr_png.cpp

* synfig-core/src/modules/mod_bmp/mptr_bmp.cpp

– Add support for exporting (rendering) to specific file format(s). Examples:

* synfig-core/src/modules/mod_png/trgt_png.cpp

* synfig-core/src/modules/mod_gif/trgt_gif.cpp

– Implement a layer type(s). Examples:

* synfig-core/src/modules/mod_geometry/circle.cpp - Circle Layer

* synfig-core/src/modules/lyr_freetype/lyr_freetype.cpp - Text Layer

17

Page 22: Synfig developers docs - Read the Docs

Synfig developers docs

* synfig-core/src/modules/mod_noise/distort.cpp - Noise Distort Layer

– Implement a valuenode (see below on valuenodes). Example:

* synfig-core/src/modules/mod_noise/valuenode_random.cpp

• synfig-core/src/tool/ - Code of synfig command-line tool (binary is simply called synfig). It useslibsynfig to read Synfig files and render them in any supported format.

Main components of synfig-studio:

• synfig-studio/src/synfigapp/ - Code of libsynfigapp library. This is a layer between GUI andlibsynfig (from synfig-core). It contains code for actions - operations that transform loaded Synfig’s file insome way. When user makes some change to Synfig file in GUI, then an action is called that does the actualmodification.

• synfig-studio/src/gui/ - Code of GUI written in GTKmm. This defines how application looks andbehave.

So, we have following structure:

gui ---> libsynfigapp -------> libsynfig

synfig-cli -------> libsynfig

3.2 synfig-core

3.2.1 Layers

The basic building block in Synfig is Layer.

Note: synfig-core/src/synfig/layer.cpp

Layer either displays some graphical information on the screen (circle, line, text, etc.) or does some transformation ofgraphic information under it - i.e. acts as filter (blur, translation, noise distortion, etc.).

Note:

Built-in layers:

• synfig-core/src/synfig/layers/

Layers as modules:

• synfig-core/src/modules/lyr_std

• synfig-core/src/modules/lyr_freetype

• synfig-core/src/modules/mod_example

• synfig-core/src/modules/mod_geometry

• synfig-core/src/modules/mod_gradient

• synfig-core/src/modules/mod_noise

• synfig-core/src/modules/mod_particle

18 Chapter 3. Code structure

Page 23: Synfig developers docs - Read the Docs

Synfig developers docs

Layers are placed in particular order.

- Layer 3- Layer 2- Layer 1

Layers are rendered from bottom to top.

3.2.2 Context and Blend Methods

All graphics information under particular layer is called its Context.

In example above Layer 2 together with Layer 1 are context of Layer 3.

If Layer 3 is a graphic layer, then it displays some graphic information, which is composed with its context (Layer1 and Layer 2). The way how Layer 3 composed with its context is defined by layer’s Blend Method.

Note: synfig-core/src/synfig/color/

TODO: Add link to list of available blend methods

If Layer 3 is a filter layer, then it transforms graphic information created by Layer 1 and Layer 2.

3.2.3 Canvas

A structure which stores a list of layers is called Canvas.

Note: synfig-core/src/synfig/canvas.cpp

A canvas can also store other canvases. This is how layers organized into hierarchy.

In GUI canvases represented by Groups, but in code they are called Paste Canvases. Past Canvas is a special type oflayers, which holds Canvas of other layers.

Note: synfig-core/src/synfig/layers/layer_pastecanvas.cpp

Every Synfig file has a Root Canvas, which contains all layers. Also it can have several Exported canvases - a separatecanvases that are outside of Root Canvas.

Paste Canvas can be inline (i.e. include all its content in itself) or linked (i.e. reference content from exported canvasesor other Synfig files).

Note: Loading Synfig file: synfig-core/src/synfig/loadcanvas.cpp

Saving Synfig file: synfig-core/src/synfig/savecanvas.cpp

3.2. synfig-core 19

Page 24: Synfig developers docs - Read the Docs

Synfig developers docs

3.2.4 ValueNodes

Every layer has a set of Parameters, which define how layer is rendered (and what it is rendering).

In simplest case layer parameter can be defined by a value of particular type - ValueBase (Integer, Real, Bool, Color,etc).

Note: synfig-core/src/synfig/base_types.cpp

In complex case parameter can be defined by ValueNode. ValueNode is a formula that produces a value from somecalculations. Each ValueNode has parameters that define input data for formula. Parameters of ValueNode can alsobe represented by ValueBases (static value) or ValueNodes (calculated value), so it is possible to construct nestedformulas.

Note: synfig-core/src/synfig/valuenodes/

synfig-core/src/modules/mod_noise/valuenode_random.cpp

It is possible to link ValueNodes and ValueBases among different parameters (and among different layers).

I.e. for two circle layers A and B we can link their Radius parameters (both static values, ValueBase). In this case,changing radius of one circle will change radius of another (see https://wiki.synfig.org/Doc:Getting_Started#Linking).

In more complex case we can have Radius parameter of circle A defined by Scale ValueNode. The Scale ValueNodehave two parameters - “Link” and “Scalar”. If “scalar” parameter is set to static value 2.0 and “Link” parameter islinked to “Radius” value of circle B, then circle A will always have a radius twice bigger than circle B.

TODO: Make an illustration of layers sharing same ValueNodes/ValueBases

Among all different ValueNodes there is a special ValueNode, which deserves a special attention - it is called “Ani-mated”.

Note: synfig-core/src/synfig/valuenodes/valuenode_animated.cpp

synfig-core/src/synfig/valuenodes/valuenode_animated.h

synfig-core/src/synfig/valuenodes/valuenode_animatedinterface.cpp

synfig-core/src/synfig/valuenodes/valuenode_animatedinterface.h

This ValueNode stores multiple values of parameter for different moments of time and calculates interpolated valuesbetween them.

3.2.5 Rendering process

When Synfig needs to render a frame it starts by evaluating parameters of layers. If a parameter is ValueNode (calcu-lated value), then it evaluates its parameters. This process works recursively, going all the way down to the leaf nodes,calculating their value, then calculating the value of their parent, and so on until reaching the root of the node tree.

Since ValueNodes can be animated (meaning that they can change value at different points of time), so the entire treeneeds to be evaluated on each frame.

Once a layer has the values for it’s parameters, it renders the intended shape or effect onto a raster. A raster is anarray of pixels, each pixel with its color/opacity. It doesn’t carry any information about the vector shapes that it’srepresenting, only their pixel data.

20 Chapter 3. Code structure

Page 25: Synfig developers docs - Read the Docs

Synfig developers docs

Then comes blending. The raster result of the previous layers is combined with the current one according to the setblending method. Some layers (transforms, distortions, etc) just modify the raster result of the previous layers andpass that on to the next layer, instead of blending.

Note that a layer sees all the layers underneath as a single combined raster. That layer cannot distinguish the pixel datathat comes from the next layer that’s underneath, from pixel data from any other layer that’s underneath.

On diagram: “V” stands for ValueNodes, “L” for layers, “BL” for blank layer (completely transparent layer defaultbackground), “BM” for blend method.

3.2.6 Render engine

Now, let’s talk about render engines.

In fact there are two of them now.

The new one (called “Cobra”) is the our latest development and it is the future of Synfig.

And there is an old one (without a name). As of version 1.2.0 it is deactivated. But some layers are still use its code,in case if they are not ported to Cobra yet (Synfig fallbacks to old render engine). This generally works much slowercomparing to case when layer’s code is ported to Cobra.

If you examine code of any layer, you will see a function called accelerated_render() - this is a code of oldrender engine.

Old rendering engine examines stack of layers in two passes.

First, it is going from top to bottom and applies required transformations (when possible). Also, it defines requiredcontext for rendering each layer. On second pass it goes from bottom to top. It is doing actual rendering for each layerand mixing it according to Blend Method with previous layers (context).

I.e., if we have Stretch Layer on top of Shape Layer, then on first pass Synfig goes down and applies stretch to allvertices of Shape Layer, thus eliminating Stretch from operations. Then on rendering stage it renders Shape Layeronly (as stretch is already applied on first pass).

3.2. synfig-core 21

Page 26: Synfig developers docs - Read the Docs

Synfig developers docs

On the other hand, if we have Blur Layer between Stretch Layer and Shape Layer, then it is not possible to applyStretch (because Blur is a raster-based effect). So it doesn’t eliminates Stretch on first pass. On second pass it rendersall 3 layers - Shape, then blurs it and finally stretches result.

Now, let’s talk about Cobra engine, which is more advanced.

Note: The code of Cobra render engine is located in /synfig-core/src/synfig/rendering

Its main concepts are: Task, Queue, Optimizer, Sub-Engine and Renderer.

Task is the main primitive of Cobra render engine that does something. This is like Layer in Synfig’s concept, but evenmore simple/low-level. I.e. there is a task for blending, task for drawing filled region, task for affine transformation,etc.

For example, Outline and Region Layers are executed by the same task - the one that drawing filled region (TaskContour).

Note: synfig-core/src/synfig/rendering/common/task/

synfig-core/src/synfig/rendering/software/task/

synfig-core/src/synfig/rendering/opengl/task/

So, why we need both Tasks and Layers? How do both concepts relate to each other? Layers are good for user(they help to construct and organize animation document) and Tasks are good for render engine (they are not good forediting, but allow to render animation document as fast as possible). Tasks describe user’s animation document in alow-level form, in a language that is suitable for render engine.

In a very simple view Cobra render engine also works in two passes. In first pass it takes a tree of Layers, andconstructs a Queue of Tasks. In second pass it executes tasks in Queue (does rendering).

Note: synfig-core/src/synfig/rendering/renderqueue.cpp

Queue is a linear list, but Tasks can have dependencies. I.e. task A can depend on task B and C. That means whenrender engine processes Queue, it skips task A unless tasks B and C are ready. The task A is executed in next pass,after B and C are done. This allows to organize parallel (multi-threaded) rendering.

When Cobra does its first pass (transforms Layers to Queue of Tasks) it applies Optimizers.

Optimizers are analyzing list of tasks and re-organizing it to speedup rendering process.

Note: synfig-core/src/synfig/rendering/common/optimizer/

For example, there is an optimizer that looks for a sequences of Region/Outline Layers which could be merged intoone task and thus rendered in single pass (without intermediate blending functions).

Now let’s get to Sub-Engines.

It is clear there is a possibility to implement one particular task in different ways. For example, we can draw a vectorregion using straight-forward CPU calculations (software method), or activate OpenGL and use its functions to drawthe same shape using videocard (hardware-accelerated).

In the same fashion, we can do Gaussian blur operation with straight-forward CPU calculations, or utilize hardware-accelerated methods.

So, all tasks are grouped by implementation method, forming a Sub-Engines.

22 Chapter 3. Code structure

Page 27: Synfig developers docs - Read the Docs

Synfig developers docs

Currently we have 2 sub-engines - “software” (the main one, all tasks done with calculations on CPU) and “OpenGL”(all tasks are hardware-accelerated using OpenGL, it is currently broken).

• Software Sub-Engine - `synfig-core/src/synfig/rendering/software/`

• Tasks of Software Sub-Engine - `synfig-core/src/synfig/rendering/software/task/`

• OpenGL Sub-Engine - `synfig-core/src/synfig/rendering/opengl/`

• Tasks of OpenGL Sub-Engine - `synfig-core/src/synfig/rendering/opengl/task/

Generally, it is possible one Sub-Engine can use tasks from other Sub-Engine. I.e., when OpenGL Sub-Engine isactive and there is some task missing, then it can be replaced by task from Software Sub-Engine.

Each Sub-Engine can have several configurations with different set of Optimizers. We call those configurations Ren-derers - and this is what user actually see when choosing renderer via “Edit” -> “Preferences. . . ” -> “Render”.

For example, “Draft” and “LowRes” rendering modes are just Renderers of Software Sub-Engine.

Note:

• Default Software Renderer - synfig-core/src/synfig/rendering/software/renderersw.cpp

• Safe-mode Software Renderer (not uses Optimizers) - synfig-core/src/synfig/rendering/software/renderersafe.cpp

• Draft Software Renderer - synfig-core/src/synfig/rendering/software/rendererdraftsw.cpp

• LowRes Software Renderer - synfig-core/src/synfig/rendering/software/rendererlowressw.cpp

3.2. synfig-core 23

Page 28: Synfig developers docs - Read the Docs

Synfig developers docs

Now, let’s get back to Layers.

We already know how Layers define their rendering for old render engine. But how this done for Cobra render engine?

If layer is ported to Cobra engine, then you will see build_rendering_task_vfunc() orbuild_composite_task_vfunc() or build_composite_fork_task_vfunc() functions. So, inCobra engine layers just use tasks as building blocks to construct structures which produce required output.

24 Chapter 3. Code structure

Page 29: Synfig developers docs - Read the Docs

CHAPTER 4

Building Synfig using command line

4.1 Dependencies

List of dependencies required for building Synfig:

• autoconf (build-time)

• automake (build-time)

• adwaita-icon-theme

• boost (system module)

• fftw3

• gettext

• glibmm-2.4

• gtkmm-3.0

• imagemagick (optional)

• intltool (build-time)

• JACK (optional, Linux-only)

• Magick++ (optional)

• libxml++-2.6

• libsigc++-2.0

• mlt++

• pango

• pkg-config (build-time)

• SDL2_mixer

• zlib

25

Page 30: Synfig developers docs - Read the Docs

Synfig developers docs

4.2 Preparing Environment

Building Synfig requires many dependent libraries installed for your system. For full list of libraries please refer tothis page.

Below you will find instructions how to install them on various operating systems.

4.2.1 Linux

First of all make sure you have “git” installed. Use it to fetch Synfig’s sources:

$ git clone https://github.com/synfig/synfig.git ~/synfig.git

Then navigate to sources directory:

$ cd ~/synfig.git

Now you need to install all required dependencies. This is easy to do by running a special script shipped with Synfig’ssources:

$ ./1-setup-linux-native.sh

Wait till the script finish installing dependencies and you’re ready to build.

4.2.2 OSX

We will be running all commands in terminal, so start by launching Terminal app.

First you need to install Xcode Command Line Tools with the following command:

$ xcode-select --install

Follow instructions on the screen to complete installation.

Next, get Synfig’s sources:

$ git clone https://github.com/synfig/synfig.git ~/synfig.git

When download finishes, navigate to sources directory:

$ cd ~/synfig.git

Now we can install all required libraries via HomeBrew. There is a special script included with sources:

Warning: It is NOT recommended to use this method on OSX version < 10.11 with already working Homebrew- with almost 100% probablility your Homebrew installation will be damaged. You’ve been warned.

For more details about this issue see here - https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/1-setup-osx-brew.sh#L34-L37

$ ./1-setup-osx-brew.sh

26 Chapter 4. Building Synfig using command line

Page 31: Synfig developers docs - Read the Docs

Synfig developers docs

Depending on version of your system the process of installing dependencies might take some time. When it completesyou are ready to build Synfig!

Note: If you are having problems with slow download speed of brew packages, check to see if your ISP is blockingsome IP addresses. For example, in Russia Roskomnadzor blocks some IP addresses (https://isitblockedinrussia.com/?host=54.192.98.189) used by the Homebrew CDN (they use Cloudfront servers). This leads to long connectiontimeouts. To fix this, you can restrict the curl connect-timeout parameter. This is how I fixed it:

$ echo "--connect-timeout 1" >> ~/.curlrc$ export HOMEBREW_CURLRC=1

P.S. Quick hack if you certificates outdated, and brew can’t download packages:

$ echo "--insecure" >> ~/.curlrc$ export HOMEBREW_CURLRC=1

4.2.3 Windows

Note: For compiling Synfig on Windows we use MinGW installation in MSYS2 environment.

Alternative for that approach could be to build using MSVC and Microsoft vcpkg (https://github.com/microsoft/vcpkg), but we haven’t digged into that yet. Any help on this matter is appreciated here - https://github.com/synfig/synfig/issues/860.

Download and install MSYS2, following instructions here - http://www.msys2.org/.

Make sure to select the correct MSYS as per your needs.

4.2. Preparing Environment 27

Page 32: Synfig developers docs - Read the Docs

Synfig developers docs

Always use the proper shell:

• MinGW32 for compiling 32-bit Synfig.

• MinGW64 for compiling 64-bit Synfig.

• Never use the MSYS shell for compiling Synfig.

After picking the needed MSYS Shell.

$ pacman -S git

Next, get Synfig’s sources:

$ git clone https://github.com/synfig/synfig.git ~/synfig.git

When download finishes, navigate to sources directory:

$ cd ~/synfig.git

Now you need to install all required dependencies. Run a special script shipped with Synfig’s sources:

$ ./1-setup-windows-msys2.sh

Wait till the script finish installing dependencies. Now install CMake and Ninja with:

• For MINGW32:

$ pacman -S mingw-w64-i686-cmake mingw-w64-i686-ninja

28 Chapter 4. Building Synfig using command line

Page 33: Synfig developers docs - Read the Docs

Synfig developers docs

• For MINGW64:

$ pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja

When it completes you are ready to build Synfig!

4.3 Building Synfig using Autotools

4.3.1 Things to know before you start

Synfig is divided into three components: ETL, synfig-core and synfig-studio.

• ETL - the extended template library.

• synfig-core - contains the render engine and core/command-line tool (cli)

• synfig-studio - gui for the application.

All those three components are included with the main source repository of Synfig - https://github.com/synfig/synfig.git.

ETL is required for synfig-core and synfig-core is required for building synfig-studio.

So, first builds ETL, then synfig-core, and then synfig-studio.

4.3.2 First build

We have a special script, which carries all build routines for you. In fact, there are two of them - “2-build-debug.sh”and “2-build-production.sh”.

As you might guess, the first one is for building development version with debug symbols (useful for developmentitself) and the second one is without debug symbols (useful for production).

Another difference is that first script places result of the build in “_debug/build” subdirectory, and with second scriptthe result will reside in “_production/build”.

In all other aspects both scripts work exactly the same and accept the same arguments.

I will assume that your intention is to develop Synfig, so let’s continue with first script - “2-build-debug.sh”.

You can build everything by simply executing the script:

$ ./2-build-debug.sh

The script will build and install ETL, then synfig-core and finally - synfig-studio.

When building is done, you can launch Synfig by executing

$ ~/synfig.git/_debug/build/bin/synfigstudio

4.3.3 Re-building your changes

Of course it is not very efficient to run a full rebuild process on every change. So, the script provides a set of argumentsthat allow you to execute particular stages of the build:

The syntax is:

4.3. Building Synfig using Autotools 29

Page 34: Synfig developers docs - Read the Docs

Synfig developers docs

$ ./2-build-debug.sh [package] [phase]

where

• [package] can have following values:

– all - builds all three packages (default).

– etl - builds ETL only.

– core - builds synfig-core only.

– studio - builds synfig-studio only.

• [phase] allows you to choose particular phase to execute for given package:

– clean - does “make clean” operation.

– configure - running “./configure” script with all necessary options.

– make - running “make” command and “make install”.

– build - executes “configure” and “make” phases (default).

– full - executes all phases: “clean”, “configure” and “make” (exactly in that order).

You might ask: why execute those commands/phases from a script , while it is possible to call “./configure” and“make” commands by hand in particular directories? Well, for “make” this would work and is desirable for manycases. But for “./configure” you have to specify many parameters, such as prefix, and locations of some dependentlibraries. So it is more convenient to call “./configure” using this helper script.

Examples:

1. Configure and (re)build synfig-core (executes “./configure”, “make” and “make install”):

./2-build-debug.sh core

equivalent to:

./2-build-debug.sh core build

2. Do a full clean build of synfig-core (executes “make clean”, “./configure”, “make” and “make install”):

./2-build-debug.sh core full

3. Quick rebuild of synfig-core (without executing “./configure”):

./2-build-debug.sh core make

Since “make” doesn’t require any parameters, the same result can be achieved by executing:

cd ~/synfig.git/_debug/synfig-core/make install

4. Quick rebuild of of everything - ETL, synfig-core and synfig-studio (without executing “./configure”):

./2-build-debug.sh all make

Here are some recommendations when to call particular phases:

Considering the structure of Synfig (see first chapter of this article), we have following dependency chain:

synfig-studio -> synfig-core -> ETL

30 Chapter 4. Building Synfig using command line

Page 35: Synfig developers docs - Read the Docs

Synfig developers docs

So, you should follow this logic:

• when change is made to ETL, then rebuild everything - ETL, synfig-core and synfig-studio;

• when change is made to synfig-core, then you need to rebuild synfig-core and synfig-studio only;

• when change is made to synfig-studio, then you have to to rebuild synfig-studio only;

You might notice that if you rebuild simply by running “make install” that takes considerably less time than when youdo a ful-cycle rebuild with “./configure” and then “make install”.

So, when it is safe to skip “./configure”?

The answer is: if you edited .h and .cpp files only, then it is safe to skip. In all other cases it is safer to re-start./configure on rebuilding.

Let’s suppose you made changes in synfig-studio (only .h and .cpp files) and want to rebuild it. The followingcommand is enough:

./2-build-debug.sh studio make

And finally a quick note about “build.conf.sample” file in the root of source repository.

With this file you can tweak the number of threads used by the build scripts. Just copy “~/synfig.git/build.conf.sample”to “~/synfig.git/build.conf” and adjust its contents according to your needs.

4.4 Building Synfig Using CMake

The usual process of building with CMake is pretty much the same as the standard one, but despite that, this part willcover that so you can follow along and get the same results.

Below you will find instructions how to build Synfig on various operating systems.

4.4.1 Linux

You need to make a directory where Synfig will be built.

$ mkdir cmake-build && cd cmake-build

Once you’re in your build folder, this is the part where you can configure and set different CMake flags according toyour need. For the purpose of this documentation, the default build will be followed.

$ cmake ..

When it completes, you need to build Synfig using make command.

$ make

Once this is complete, you will find the build present in /output folder of your build directory. You can run Synfig byusing

$ ./output/bin/synfigstudio

You can also specify a target if you want to build that specific target.

$ make build_images

4.4. Building Synfig Using CMake 31

Page 36: Synfig developers docs - Read the Docs

Synfig developers docs

If you wish to install Synfig to /usr/local/, make sure you have root privileges (or write permissions to those threedirectories), and simply type

$ make install

4.4.2 OSX

Building on OSX follows the same steps as that of Linux. You need to make a build folder first.

$ mkdir cmake-build && cd cmake-build

Once that’s done, you can run the CMake command along with passing any flags as required.

$ cmake ..

When it completes, you need to build Synfig using make command.

$ make

Once this is complete, you will find the build present in /output folder of your build directory. You can run Synfig byusing

$ ./output/bin/synfigstudio

4.4.3 Windows

Synfig is shipped with this special script to build it on Windows (MSYS2). All you need to do is run that script.

$ ./2-build-msys-cmake.sh

Once this is completed successfully, you can run Synfig by.

$ ./cmake-build-msys/output/bin/synfigstudio.exe

32 Chapter 4. Building Synfig using command line

Page 37: Synfig developers docs - Read the Docs

CHAPTER 5

Packaging Synfig for distribution

5.1 Packaging using Autotools

5.1.1 OSX

You can build OSX package by executing following 3 scripts from Synfig’s source root:

$ ./1-setup-osx-brew.sh$ ./2-build-production.sh$ ./3-package-osx-dmg.sh

Please refer to https://synfig-docs-dev.readthedocs.io/en/latest/common/building.html for details.

5.1.2 Windows and Linux

We have a set of scripts that allow to build Windows installers and Linux Appimages in isolated Docker environment.Both types of packages are built on Linux platform (Windows binaries are built using cross-compilation).

TL;DR;

1. Fetch builder repository:

$ git clone https://github.com/morevnaproject/morevna-builds$ cd morevna-builds

2. Run builder:

$ ./build-synfigstudio.sh

This will fetch Docker image, and build packages for Windows and Linux, 64bit and 32bit. This process involvesbuilding all required libraries, so it will take a very long time.

33

Page 38: Synfig developers docs - Read the Docs

Synfig developers docs

After build finishes grab packages from “publish” directory.

Resolving problems

It might happen that compilation fails at some stage. This could be for various reasons.

One very common reason could be that updates to builder scripts conflicting with what you already have built before(when using previous versions of this builder). Unfortunately, such cases are hard to track and the easiest workaroundis to completely remove “docker-builder-data/build/packet” directory and re-run build script. This will build everythingfrom scratch.

If the problem persists, please submit error message to https://github.com/morevnaproject/morevna-builds/issues

You can also try to fix problem by yourself by jumping into Docker’s build environment of particular package (the onethat failing). Depending on the platform and architecture you do that with specific command:

1. For Linux 64-bit:

$ ./docker/debian-7-64bit/run.sh PACKAGENAME shell

2. For Linux 32-bit:

$ ./docker/debian-7-32bit/run.sh PACKAGENAME shell

3. For Windows 64-bit:

$ ./docker/debian-7-64bit/win64.sh PACKAGENAME shell

4. For Windows 32-bit:

$ ./docker/debian-7-64bit/win32.sh PACKAGENAME shell

Make sure to replace PACKAGENAME with actual package name (script name from docker-builder-data/build/script/packet, without “.sh” at the end).

Directory structure

• “docker-builder-data/build/packet” - directory where build files stored.

• “docker-builder-data/build/script/packet” - script files, which tell how to build each particular package.

• “docker/debian-7-32bit” - 32-bit Docker environment configuration and scripts.

• “docker/debian-7-64bit” - 64-bit Docker environment configuration and scripts.

5.2 Packaging using CMake

As an optional step you might wish to build a package/installer for distribution.

Synfig can be packaged for different operating systems using CPack which comes with CMake.

First important thing to know is that you need a production build for that (for obvious reason it is very unlikely youwant to distribute a build with debug symbols).

So, make sure to get production build first by passing the flag at cmake step:

34 Chapter 5. Packaging Synfig for distribution

Page 39: Synfig developers docs - Read the Docs

Synfig developers docs

$ cmake .. -D CMAKE_BUILD_TYPE=Release

Most of the configuration are already set so no extra flags need to be set for Synfig.

Below you will find instructions how to package Synfig for various operating systems.

5.2.1 Linux

A .deb package for Synfig can be made by using the following code.

$ cpack -G DEB

5.2.2 Windows

A .exe installer for synfig can be made by using the following code.

$ cpack -G NSIS

5.2. Packaging using CMake 35

Page 40: Synfig developers docs - Read the Docs

Synfig developers docs

36 Chapter 5. Packaging Synfig for distribution

Page 41: Synfig developers docs - Read the Docs

CHAPTER 6

Tutorials

6.1 Adding a Render progress bar

Now let’s implement a Render Progress Bar!

It has been requested several time:

• Indication needed that rendering is in progress. #383

• Feature request: Give feedback when rendering is happening and complete #626

• also in Default render parameter are bad #464

Summary

• 1 Things to take into account

• 1.1 Where to place the Progress Bar?

• 1.2 How does really a render work?

• 1.3 Where to do calls and implementation?

• 2 Implementation

• 2.1 synfig-studio/src/gui/docks/dock_info.h

• 2.2 synfig-studio/src/gui/docks/dock_info.cpp

• 2.3 synfig-studio/src/gui/docks/app.h

• 2.4 synfig-studio/src/gui/docks/app.cpp

• 2.5 synfig-studio/src/gui/docks/render.cpp

• 2.6 synfig-studio/src/gui/docks/asyncrender.cpp

37

Page 42: Synfig developers docs - Read the Docs

Synfig developers docs

6.1.1 Things to take into account

Where to place the Progress Bar?

I chose to implement it in the Dock_Info panel.

After all, this is a kind of information!

How does really a render work?

App (.h .cpp) is the root of everything and used to store globals.

But we start in fact from CanvasView (.h .cpp) which contains the call to display the RenderSettings Dialog (.h .cpp).

Then we press on render button which leads to execute an AsyncRenderer (.h .cpp) (or 2, sequentially, if we have asecond pass for Alpha extraction).

AsyncRenderer can have 4 types of targets:

• AsyncTarget_Cairo

• AsyncTarget_Cairo_Tile

• AsyncTarget_Scanline

• AsyncTarget_Tile

Only AsyncTarget_Cairo and AsyncTarget_Scanline have a frame_ready() function that we will use to implement ourcall to update to the Render ProgressBar.

Note that we can have 2 passes, this has to be considered when displaying the percents of accomplished render.

The render itself is done writing the data to the target, then the selected codec is fed through a pipe (for exampleffmpeg).

Where to do calls and implementation?

In different files, as it is a “multi-level” task.

The details are described in each file touched in the next section.

6.1.2 Implementation

synfig-studio/src/gui/docks/dock_info.h

Declare the components and members

• In #include section:

#include <gtkmm/progressbar.h>In private section:

Gtk::ProgressBar render_progress;

//! Number of passes request - 1 or 2 (if alpha)int n_passes_requested;

(continues on next page)

38 Chapter 6. Tutorials

Page 43: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

//! Number of passes pending - 2,1,0int n_passes_pending;

• In public section:

//! Current render progress - 0.0 to 1.0// depends on n_passes_requested and current_passvoid set_render_progress (float value);void set_n_passes_requested(int value);void set_n_passes_pending (int value);

synfig-studio/src/gui/docks/dock_info.cpp

Here we will implement the UI and members

• In #include section:

#include "app.h"#include <gtkmm/progressbar.h>

It will permit to access our App::dock_info_ as a static from anywhere in the application

• In Dock_Info(), at the end: just before table->show_all();

//Render Progress Bartable->attach(*manage(new Gtk::Label(_("Render Progress: "))),0,1,5,6,→˓Gtk::EXPAND|Gtk::FILL,Gtk::SHRINK|Gtk::FILL);table->attach(render_progress, 0,5,6,7,→˓Gtk::EXPAND|Gtk::FILL,Gtk::SHRINK|Gtk::FILL);render_progress.set_show_text(true);render_progress.set_text(strprintf("%.1f%%", 0.0));render_progress.set_fraction(0.0);//Another spacertable->attach(*manage(new Gtk::Label),0,5,7,8);

and after add(*table);

//Render progressset_n_passes_requested(1); //Defaultset_n_passes_pending (0); //Defaultset_render_progress (0.0); //Default, 0.0%

• Then at the end of the file, we add these 3 functions:

void studio::Dock_Info::set_n_passes_requested(int value){

n_passes_requested = value;}

void studio::Dock_Info::set_n_passes_pending(int value){

n_passes_pending = value;}

void studio::Dock_Info::set_render_progress(float value){

(continues on next page)

6.1. Adding a Render progress bar 39

Page 44: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

float coeff = (1.000 / (float)n_passes_requested); //% of fraction for 1→˓pass if more than 1 passfloat already_done = coeff * (float)(n_passes_requested - n_passes_pending -1);float r = ( coeff * value ) + already_done;

render_progress.set_text( strprintf( "%.1f%%", r*100 ));render_progress.set_fraction(r);

}

The 2 first ones are obvious, the last one does the calculation for the display of the current percents of the WHOLETASK.

If we have only 1 pass, value will be reflected directly.

In case of 2 (or more, who knows what will be implemented later!), each pass will still continue to send its progressas if it was the only one in the world; we will do the adjustments here.

• 100% of pass 1 while be displayed as 50%.

• 100% of pass 2 while be displayed as 100%.

• If we had 3 passes, it would be 33.3%, 66.6% and 100.0%

synfig-studio/src/gui/docks/app.h

Lets add our static dock_info_. A studio::dock_info is already defined in the .cpp but we need to access it asApp::dock_info_!

• Inside the static declarations:

static Dock_Info* dock_info_; //For Render ProgressBar

synfig-studio/src/gui/docks/app.cpp

Let’s declare the static

• Inside the declare of statics

Dock_Info* App::dock_info_ = 0;

• At the end of the constructor App()

App::dock_info_ = dock_info;

It looks like some kind of alias!

synfig-studio/src/gui/docks/render.cpp

Here the things start to become serious

• In the #include section:

#include "docks/dockmanager.h"#include "docks/dock_info.h"

• In RenderSettings::on_render_pressed

40 Chapter 6. Tutorials

Page 45: Synfig developers docs - Read the Docs

Synfig developers docs

Just before submit_next_render_pass();

App::dock_info_->set_n_passes_requested(render_passes.size());App::dock_info_->set_n_passes_pending(render_passes.size());App::dock_info_->set_render_progress(0.0);App::dock_manager->find_dockable("info").present(); //Bring Dock_Info to front

We initialized our ProgressBar with its default parameters to display 0.0%

Note that the Dock_Info will be brought to front to show the progression. . . It’s its goal!

• In RenderSettings::submit_next_render_pass()

Just after render_passes.pop_back();

App::dock_info_->set_n_passes_pending(render_passes.size()); //! Decrease until 0App::dock_info_->set_render_progress(0.0); //For this pass

We reinitialized the parameters for this specific pass!

Doing tests I noticed that with extract alpha option on, we have 2 passes and therefore the render done soundwas played 2 times!

Let’s correct this bad behaviour In RenderSettings::on_finished(), around submit_next_render_pass();

bool really_finished = (render_passes.size() == 0); //Must be checked BEFORE submit_→˓next_render_pass();submit_next_render_pass();

//Sound effect - RenderDone (-1 : play on first free channel, 0 : no repeat)if (App::use_render_done_sound) Mix_PlayChannel( -1, App::gRenderDone, 0 );if (really_finished) { //Because of multi-pass render

if (App::use_render_done_sound) Mix_PlayChannel( -1, App::gRenderDone, 0 );App::dock_info_->set_render_progress(1.0);

}

This way, it will play only once the full render has occured!

synfig-studio/src/gui/docks/asyncrender.cpp

Now the deepest part

• In #include section:

#include <docks/dock_info.h>In the beginning of *AsyncRenderer::start()*

App::dock_info_->set_render_progress(0.0);

• In void frame_ready() of both AsyncTarget_Cairo and AsyncTarget_Scanline

After ready_next=true;

int n_total_frames_to_render = warm_target->desc.get_frame_end() //120- warm_target->desc.get_frame_start() //0+ 1; //->121

int current_rendered_frames_count = warm_target->curr_frame_- warm_target->desc.get_frame_start();

float r = (float) current_rendered_frames_count

(continues on next page)

6.1. Adding a Render progress bar 41

Page 46: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

/ (float) n_total_frames_to_render;App::dock_info_->set_render_progress(r);

Here the current progress is calculated according the starting, ending and current frame, in a range of 0.0 to 1.0

The pass (or target) thinks it is the only one in the world but it is compensated in the display :)

Hoping this will help you to come and join the effort in development of Synfig :)

6.2 Adding a Sound notification

After the implementation of #648 - GUI: Play a sound when rendering is done,

it could be useful to keep a track of the way to implement a new sound notification in SynfigStudio

This tutorial will be divided in 2 parts:

• Adding the sound notification

• Adding an option to Preferences dialog

6.2.1 Adding the sound notification

synfig-studio/sounds/

• Add your sample in this directory in your source tree.

• Add a notice about the license of your sample in readme.txt (the asset should have a permissive license)

• Add your sound sample to the list in Makefile.am

synfig-studio/src/gui/app.h

Declare the sound (Mix_Chunk*) as a static member.

//The sound effects that will be usedstatic Mix_Chunk* gRenderDone;

You could add a bool declared as a static member for an option to play the sound (to be defined in Preferences dialog).

static bool use_render_done_sound;

synfig-studio/src/gui/app.cpp

• Initialize the sound (Mix_Chunk*) to NULL.

You could find the gRenderDone and add it after.

Mix_Chunk* App::gRenderDone = NULL;

42 Chapter 6. Tutorials

Page 47: Synfig developers docs - Read the Docs

Synfig developers docs

As well you may initialize the bool for allow to play the sound; this will be connected later in the Preferences dialog

bool App::use_render_done_sound = true;

• Locate this part (at the end of the constructor App::App )

path_to_sounds += ETL_DIRECTORY_SEPARATOR;

and load your sound as follow (the volume is set at 50% if success)

//Load sound effectsApp::gRenderDone = Mix_LoadWAV( (path_to_sounds + "renderdone.wav").c_str() );if ( App::gRenderDone == NULL ) {

synfig::error( _("SDL_mixer could not load gRenderDone : %s\n"), Mix_GetError() );} else {

Mix_VolumeChunk(App::gRenderDone, MIX_MAX_VOLUME/2);}

• Finally, free the sound in the destructor App::~App (and NULL the pointer)

//<!- ----- SDL2 - Sound effects -----//Free the sound effectsMix_FreeChunk( App::gRenderDone );App::gRenderDone = NULL;

synfig-studio/src/gui/<yourSource>.cpp

You should add

#include <SDL2/SDL.h>#include <SDL2/SDL_mixer.h>

Add your sound effect play where it should be (end of an event for example)

You have 2 possibilities after this

1) Play directly without control in the preferences

//Sound effect - RenderDone (-1 : play on first free channel, 0 : no repeat)Mix_PlayChannel( -1, App::gRenderDone, 0 );

or

2) Play according the preferences

//Sound effect - RenderDone (-1 : play on first free channel, 0 : no repeat)if (App::use_render_done_sound) Mix_PlayChannel( -1, App::gRenderDone, 0 );

6.2.2 Adding an option to Preferences dialog

In the first part we added use_render_done_sound to prepare a preference option.

It will be a toggle toggle_play_sound_on_render_done in Preferences/Render tab

6.2. Adding a Sound notification 43

Page 48: Synfig developers docs - Read the Docs

Synfig developers docs

synfig-studio/src/gui/dialogs/dialog_setup.h

• In class Dialog_Setup

add the declaration of the “changed” handler

void on_play_sound_on_render_done_changed();

and the corresponding Switch control

Gtk::Switch toggle_play_sound_on_render_done;

synfig-studio/src/gui/dialogs/dialog_setup.cpp

• Find in which page and which position you will add your option (named toggle_play_sound_on_render_done,here in Dialog_Setup::create_render_page(PageInfo pi))

// Render - Render Done soundattach_label(pi.grid, _("Chime on render done"), ++row);pi.grid->attach(toggle_play_sound_on_render_done, 1, row, 1, 1);toggle_play_sound_on_render_done.set_halign(Gtk::ALIGN_START);toggle_play_sound_on_render_done.set_hexpand(false);toggle_play_sound_on_render_done.set_tooltip_text(_("A chime is played when render→˓has finished."));toggle_play_sound_on_render_done.property_active()

.signal_changed()

.connect(sigc::mem_fun(*this, &Dialog_Setup::on_play_→˓sound_on_render_done_changed));

• In Dialog_Setup::on_apply_pressed()

// Set the use of a render done soundApp::use_render_done_sound = toggle_play_sound_on_render_done.get_active();

• Create the handler

voidDialog_Setup::on_play_sound_on_render_done_changed(){

App::use_render_done_sound = toggle_play_sound_on_render_done.get_active();}

• In Dialog_Setup::refresh()

// Refresh the status of the render done sound flagtoggle_play_sound_on_render_done.set_active(App::use_render_done_sound);

synfig-studio/src/gui/app.cpp

• In class Preferences,

among the saving parts

44 Chapter 6. Tutorials

Page 49: Synfig developers docs - Read the Docs

Synfig developers docs

if(key=="use_render_done_sound"){

value=strprintf("%i",(int)App::use_render_done_sound);return true;

}

and among the loading parts

if(key=="use_render_done_sound"){

int i(atoi(value.c_str()));App::use_render_done_sound=i;return true;

}

• In the ret.push_back part, add

ret.push_back("use_render_done_sound");

• In restore_default_settings(),

add a default value

synfigapp::Main::settings().set_value("use_render_done_sound", "1");

Don’t forget that some parts have been done in the first section

Hoping it will be sufficient to understand the whole system :)

6.3 Creating a custom widget

For creating its graphical user interface, Synfig Studio uses gtkmm, the official C++ binding for the Gtk. This toolkitprovides a lot of widgets, but sometimes they don’t exactly fulfill our needs. In those situations, we have/opt to createour custom widgets, and that’s what this page is about.

For creating custom gtkmm widgets, first be sure you properly understand gtkmm. You can study it by reading itsofficial documentation. They do explain how to create custom widgets and custom signals. Of course, they have theirAPI reference, split in the Gtk modules. Sometimes, however, it may be somehow. . . lacking. You can always checkthe Gtk docs, instead of gtkmm’s, to check some confusing info. Both API reference are also available on Linux viadevhelp app.

6.3.1 Checklist

• the class should be named Widget_* Examples: Widget_Link, Widget_Timetrack.

• its files should be placed in synfig-studio/gui/widgets folder

• if a file contains translatable text, it should be mentioned in synfig-studio/po/POTFILES.in

• signal slots (event callbacks) should be named like on_[signal_name] oron_[child_widget_name]_[signal_name]

• the user-interaction callbacks, like on_key_press_event() and on_draw(), if used, should catch all exceptions,specially if there is any of synfig:: or synfigapp:: API call in the method implementation, even indirectly. Itshould be done by macros SYNFIG_EXCEPTION_GUARD_*

6.3. Creating a custom widget 45

Page 50: Synfig developers docs - Read the Docs

Synfig developers docs

• it should support Gtk::Builder and be available for Glade

• it should have properties defined via Glib::Property (for better support for Glade editor)

• if it’s a widget that uses time as horizontal axis, like for Widget_SoundWave, Widget_Timetrack and Wid-get_Curves, it could use Widget_TimeGraphBase as a parent class, for useful methods.

• please document it :P

6.4 How to add new Dock Window

Child windows in Synfig is called docks. This is because thay are dockable. To add new dock window to Synfig followthis steps:

• Move to synfig-studio/src/gui/docks;

• Add 2 files yourclass_dock.h and yourclass_dock.cpp (_dock in filename is not necessary, but recommended);

• Add your class to /synfig-studio/src/gui/app.h (if you want to call it from other classes)

• Register your dock (best way to do this inside app.cpp)

Step-by-step:

Your window must be inherited from Dockable class and be inside studio namespace. Here the basic code for my-dock_dock.h:

#ifndef __SYNFIG_STUDIO_LAYERS_DOCK_H#define __SYNFIG_STUDIO_LAYERS_DOCK_H

#include "docks/dockable.h"#include <gtkmm.h>

namespace studio {

class MyDock : public Dockable{

public:MyDock(const std::string& name,const std::string& local_name, Gtk::StockID

→˓stock_id_=Gtk::StockID(" ")): Dockable(name,local_name,stock_id_) {};

};

}; // END of namespace studio

#endif

Adding your class to app.h

class MyDock;

Registering your class (in app.cpp)

#include "docks/mydock_dock.h"

studio::MyDock* my_dock;

// add this lines inside App::App constructor

(continues on next page)

46 Chapter 6. Tutorials

Page 51: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

studio_init_cb.task(_("Init MyDock..."));my_dock = new studio::MyDock();dock_manager->register_dockable(*my_dock);

Add your files inside Make_insert and CMakeLists.txt (as for now we supporting both build systems).

Now is time to rebuild our makefile (otherwise make will say it can’t find your class).

To do this, first you need to know where you building synfig. If you not using non-standard prefix then you can just:* move to synfigstudio folder and run: * ./bootstrap.sh * ./configure * make install

If you are using custom build prefix (for example you are building Synfig to your home folder), then: * look insideconfig.log file and find ./configure keys. * run bootstrap.sh * set PKG_CONFIG_PATH environment variable to/path_where_you_build_synfig/lib/pkgconfig * run ./configure with keys you got from config.log ealier.

Or otherwise you can just do full build using linux_build script.

6.4. How to add new Dock Window 47

Page 52: Synfig developers docs - Read the Docs

Synfig developers docs

48 Chapter 6. Tutorials

Page 53: Synfig developers docs - Read the Docs

CHAPTER 7

Release procedure

7.1 Preparation

All release procedures are done from “testing” branch. So, switch to “testing” branch first and then set it to the lastcommit you want to release from.

Before you start procedure, you have to make sure that current content of “testing” branch builds succesfully on allsupported platforms - Windows, Linux and OSX.

Also, make sure that source tarball generation script executes without errors:

$ ./autobuild/synfigstudio-release.sh

7.2 Apply latest translations

1. Install transifex-client (‘dnf install transifex-client’ on Fedora)

2. Run ‘bash ./autobuild/transifex-pull-translations.sh’

3. Fix lines marked as “TODO” in synfig-studio/src/languages.inc.c (if any)

4. Update and push translation template to transifex ‘bash ./autobuild/transifex-push-template.sh’

5. Commit changes.

7.3 Update NEWS files

Summarize all changes in NEWS files.

49

Page 54: Synfig developers docs - Read the Docs

Synfig developers docs

7.4 Update version number

If you are doing (major) stable release, then make sure to edit following files:

• synfig-core/src/synfig/version.h

• synfig-core/src/synfig/releases.h

• synfig-studio/src/gui/app.cpp

Make sure the release number is correct. If it is not, then execute ‘version-bump.sh’ script from the root dir of synfigrepository:

$ ./version-bump.sh <VERSION_NUMBER>

i.e.:

$ ./version-bump.sh 1.4.0

This will update all files and commit changes.

Next, execute ‘version-release.sh’ script:

$ ./version-release.sh

It will add neccesary tags and

7.5 Build packages

1. Build source tarballs - ‘./autobuild/synfigstudio-release.sh’

2. Build MacOS package and upload to deploy server.

3. Wait when build bot will finish building packages for Linux and Windows.

7.6 Write press release

Carefully examine commits history and write press release.

Example - https://www.synfig.org/2018/06/25/synfig-studio-1-3-9-released/

7.7 Finish repository changes

Merge branch ‘testing’ into ‘master’:

git checkout mastergit merge testinggit push upstream

. . . And bump version number, so it will be next development release:

$ ./version-bump.sh 1.5.0

50 Chapter 7. Release procedure

Page 55: Synfig developers docs - Read the Docs

Synfig developers docs

7.8 Publish packages

Login to deploy server and upload packages to

• GitHub

• FossHub

• SourceForge

Update Paddle products.

7.9 Update flatpak and snap packages

flatpak

git clone --recursive https://github.com/flathub/org.synfig.SynfigStudio.git# edit org.synfig.SynfigStudio.yaml and update packagesflatpak-builder --user --install build-dir org.synfig.SynfigStudio.yaml# test build locallyflatpak run org.synfig.SynfigStudio# make pull request with your changes

snap

git clone https://github.com/synfig/synfig.gitcd autobuild/snap-stable/# edit snapcraft.yaml and update packages# remote build using launchpad.net serverssnapcraft remote-build# install snap and test itsnap install --dangerous ./synfigstudio_1.4.0_amd64.snap# upload to snapcraft storesnapcraft upload --release=candidate synfigstudio_1.4.0_amd64.snap# after test move it from candidate to release channel# make pull request with your changes

7.10 Publish announcement

• Publish press release

• Patreon

• Notify subscribers via email newsletter

• VK

• Udemy

– Announcement

– Update required version in description/video/link (if needed)

• Indiegogo

• LWN.net

7.8. Publish packages 51

Page 56: Synfig developers docs - Read the Docs

Synfig developers docs

7.11 Close related bugs

Visit https://github.com/synfig/synfig/projects/1 and move all bugs related to release in “Released” column.

Comment on those bugs about new release.

52 Chapter 7. Release procedure

Page 57: Synfig developers docs - Read the Docs

CHAPTER 8

Roadmap

8.1 Rendering

• Rendering cache

• Resolution-based rendering

• Live response for control point modifications

• Port all layers to new render engine

8.2 Bones system

• Fix critical bugs (copy-pasting, deleting)

• Skeleton Tool

• Allow to see list of bones

• Proxy bones

• IK

8.3 Animation tools

• Editable animation curves in Graphs Panel (issue #267).

• Waypoint editing tools: multiple selection, move, scale (issue #266).

• Onion skin function rework (issue #600).

• Ghost waypoints.

• Multiple timelines. Timeline mixer. (?)

53

Page 58: Synfig developers docs - Read the Docs

Synfig developers docs

8.4 Sound

• Waveform display

• Sound export

8.5 Other

• Simple rendering dialogue

• Rewrite Text Layer

54 Chapter 8. Roadmap

Page 59: Synfig developers docs - Read the Docs

CHAPTER 9

Google Summer of Code

GSoC is a global program focused on bringing more student developers into open source software development.Students work with an open source organization on a 3 month programming project during their break from school.

9.1 Google Summer of Code 2019

9.1.1 Application

Synfig GSoC application 2019

Why does your org want to participate in Google Summer of Code?

We would like to allow our student contributors to dedicate their full time to work on Synfig during summer 2019.

How many potential mentors have agreed to participate?

2

How will you keep mentors engaged with their students?

The student opens GitHub’s issue, which is coresponding to his project and there provides weekly public reports abouthis progress. Every mentor should follow reports and provide on-time feedback and consultation to student via publicdiscussion in relevant GitHub’s issue or privately via email. Also, every mentor is required to contact student at leasttwice a week.

Administrator of the project also watches reports and ensures that feedback provided by mentors on time.

How will you help your students stay on schedule to complete their projects?

Every student is required to write a short report about his progress every week, answering those questions:

• How was the last week? What did you accomplish?

• What is the #1 thing slowing you down?

• What do you want to have done by the end of next week?

55

Page 60: Synfig developers docs - Read the Docs

Synfig developers docs

How will you get your students involved in your community during GSoC?

In general, we require students to be involved into our community BEFORE GSoC starts and their participation activityinfluences if their GSoC idea get accepted as a project or not. All participating students are advised to subscribe (watch)our main repository at GitHub (https://github.com/synfig/synfig) to receive notifications about discussions.

How will you keep students involved with your community after GSoC?

Considering that there are no mechanics to 100% guarantee student involvement after the program, we aim to create acommunity with a special attitude, where a student can have a home-like feeling, where he know his work is valued andappreciated by community other members and creative people from all around the world. This is the main motivationto contribute for all current project members.

Given that we put initial student motivation in the first place, we understand that there are situations where a massiveand long-term contribution effort it not possible without monetary reward. So, thanks to a regular income of donationswe can afford to pay a small grants for implementing some features, for students who proven their abilities and skill tocarry and complete projects. The money for such grants are collected via continuous crowdfunding and other means(see https://www.synfig.org/donate/ for details).

Has your org been accepted as a mentoring org in Google Summer of Code before?

No.

If your org has applied for GSoC before but not been accepted, select the years:

2008, 2010, 2012

Do you have any GSoC participant who can vouch for your project?

Information hidden.

What year was your project started?

2006

Where does your source code live?

https://github.com/synfig/synfig/

Organization Profile

Website URL

https://www.synfig.org/

Tagline (up to 80 symbols)

Open-source 2D animation software

Primary OpenSource License

GPLv3

Technology tags (Enter keywords for the primary specific technologies your organization uses. Examples:Python, Javascript, MySQL, Hadoop, OpenGL, Arduino)

c++, gtk, GTKmm

Topic Tags (Enter keywords for general topics that describe your organization. Examples: Vision, Robotics,Cloud, Graphics, Web, Real time )

vector graphics, animation

Ideas List https://synfig-docs-dev.readthedocs.io/en/latest/gsoc/2019/ideas.html#projects-ideas

Short Description

56 Chapter 9. Google Summer of Code

Page 61: Synfig developers docs - Read the Docs

Synfig developers docs

Synfig is a 2D open-source animation software which allows to create motion graphics and cut-out animations forproduct explanation videos, tutorial videos, etc.

Long Description

About=====Synfig is a 2D open-source animation software. It is capable to produce vector→˓artwork and also can work with bitmap images.

The main concept of Synfig is "tweening" - you can define object positions or shapes→˓of vector objects at certain points of time and program will interpolate in-between→˓frames automatically. You can also use bones to control your animation on higher→˓level.

With Synfig you can easily create motion graphics and cut-out animations for product→˓explanation videos, tutorial videos, and more.

Main features===========

**- Vector tweening**Transform any vector shape into another! Synfig gives you powerful tools to control→˓every vertex of your vector artwork. Just set the key positions and inbetween→˓frames will be calculated automatically.

**- Layers and Filters**Synfig provides 50+ layers to create artwork and animation of any complexity. Choose→˓from various layer types: geometric, gradients, filters, distortions,→˓transformations, fractals and others.

**- Bones**A bone system allows to create cutout animation using bitmap images or control your→˓vector artwork. With an additional Skeleton Distortion layer it is possible to→˓apply complex deformations to bitmap artwork.

**- Linking elements**You can link parameters of various layers - directly or through mathematical→˓expressions. This allows you to create advanced character puppets and other dynamic→˓structures.

Examples of works created with Synfig==============================

* [Morevna Episode 3](https://www.youtube.com/watch?v=ecVv2IB7f5k)

* [Polar Detective](https://www.youtube.com/watch?v=lSL-NdoOLQc)

* [Synfig Promo Video](https://www.youtube.com/watch?v=N8SF_-gJ0_w)

* [Demo Reel by VanChatto](https://www.youtube.com/watch?v=fWAxFc9FPwA)

* [The Deadline](https://www.youtube.com/watch?v=3dVamedBYq8)

* [Pluto takes life](https://www.youtube.com/watch?v=cgSI3IcyXhs)

Proposal Process / Application Instructions

Before applying, please make sure to read [getting started page](https://synfig-docs-→˓dev.readthedocs.io/en/latest/gsoc/2019/getting-started.html).

Application Template====================

(continues on next page)

9.1. Google Summer of Code 2019 57

Page 62: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

**Name**

Please provide your full name

**Email / Social / Web**

Where can we contact you? If you have a web page you'd like us to know about, please→˓include it. Make sure to mention your Facebook, Twitter or other identities.

**Synopsis**

A short description of your planned GSoC project.

**Benefits**

Describe how your project will benefit Synfig. Will it benefit artists using Synfig?→˓Will it be an aid for future Synfig development?

**Deliverables**

Provide a user-level summary of the final output or results of your project. How does→˓it integrate in Synfig, and how does it cooperate with the rest of Synfig's→˓features? Note that end-user documentation should be one of the deliverables as→˓well.

**Project Details**

A more detailed description.

**Project Schedule**

How long will the project take? When can you begin work?Include an estimated timeline of the project with mini-milestones.Do you have any possible school or work conflicts with your schedule?

** Short Bio**

Please let us know who are you, what are you studying (and where), and what→˓activities do you enjoy? What is your experience using Synfig or animation or other→˓computer graphics programs? What code development projects you've participated in?→˓What makes you the best person to work on this project? If you have any history→˓submitting bug fixes or patches to our issue tracker at GitHub, please indicate→˓what you have done.

Proposal Tags

feature, improvement, bugfix, infrastructure

Contacts Methods:

Mailing List: https://forums.synfig.org/c/development

General Email: contact -AT- synfig -DOT- org

Links

Twitter: https://twitter.com/synfig

Blog: https://www.synfig.org/news/

58 Chapter 9. Google Summer of Code

Page 63: Synfig developers docs - Read the Docs

Synfig developers docs

9.1.2 Getting Started

When applying for a Google Summer of Code grant to work with the Synfig, your application must follow our appli-cation template below (much of which we have borrowed from the Blender Foundation, with gratitude).

Before applying, please check with our ideas page for our requirements for acceptance.

Also, please make sure to read the following tips:

Application FAQs

Q: What will most help my odds of acceptance?

A: There are a number of things you can do to help your odds

1. A quality proposal - a well thought out proposal that shows you understand what you want to do and havereasonable expectations about what can be accomplished in the time you will have available.

2. Show evidence of past experience or achievements related to the proposal.

3. We require you to have 1-2 useful contributions to Synfig before the program starts - this show that you cansuccessfully read, edit, and compile our code.

4. Discuss your application with us and get some feedback. The best way to do so is to open an issue on GitHubwith description of your proposal (make sure to specify in title that is is GSoC-related).

Q: Is there some place that tells me the process of compiling Synfig?

A: See this documentation.

Q: Where can I learn basics of Synfig’s functionality?

A: We recommend to become familiar with existing Synfig functionality before you start any coding. You can startwith beginner’s tutorials. Also, you can request a free access to our video training course, which allow you to grab allbasicsin the shortest time. Just mail us via contact page letting us know that you are aspiring GSoC student - and wewill send you a link for free access.

After watching the course we recommend to get familiar with Synfig’s code by reading this page.

Application Template

Name

Please provide your full name

Email / Social / Web

Where can we contact you? If you have a web page you’d like us to know about, please include it. Make sure tomention your Facebook, Twitter or other identities.

Synopsis

A short description of your planned GSoC project.

Benefits

Describe how your project will benefit Synfig. Will it benefit artists using Synfig? Will it be an aid for future Synfigdevelopment?

Deliverables

9.1. Google Summer of Code 2019 59

Page 64: Synfig developers docs - Read the Docs

Synfig developers docs

Provide a user-level summary of the final output or results of your project. How does it integrate in Synfig, and howdoes it cooperate with the rest of Synfig’s features? Note that end-user documentation should be one of the deliverablesas well.

Project Details

A more detailed description.

Project Schedule

How long will the project take? When can you begin work? Include an estimated timeline of the project with mini-milestones. Do you have any possible school or work conflicts with your schedule?

Short Bio

Please let us know who are you, what are you studying (and where), and what activities do you enjoy? What is yourexperience using Synfig or animation or other computer graphics programs? What code development projects you’veparticipated in? What makes you the best person to work on this project? If you have any history submitting bug fixesor patches to our issue tracker at GitHub, please indicate what you have done.

9.1.3 Ideas List

This year we plan to apply to Google Summer of Code. Currently we are looking for project ideas. If you are a student,you are welcome to explore existing project ideas towards the GSoC application phase. There are ways to reach out tomentors, and many projects have lists of newcomer friendly issues you can start from. Students are also welcome topropose their own project ideas.

Propose Project

If you have a project idea, edit the “Project Ideas” section below by filling the required details and sending a pullrequest (this page is editable at https://github.com/synfig/synfig-docs-dev/blob/master/docs/gsoc/2019/ideas.rst), evenif you could not mentor (we will find a mentor).

Required information for project proposal

A descriptive title~~~~~~~~~~~~~~~~~~~

**- Description**

A brief description about the project

**- Expected Results**

What benefit this deliver?

**- Difficulty** Easy | Medium | High

**- Skills required*** Knowledge Prerequisite

**- Mentor(s)** Put your name if you are willing to mentor + other mentors.

Please mention the following as comment on your proposal pr

Your name :)

Your profile github | linkedin | etc

Your role I am a making this proposal as a <student | mentor | community member | contributor | etc>

60 Chapter 9. Google Summer of Code

Page 65: Synfig developers docs - Read the Docs

Synfig developers docs

Projects Ideas

Export for Web

- Description

Allow to export animation for web through Lottie export format (http://airbnb.io/lottie/). See this page for details -https://github.com/synfig/synfig/issues/704

- Expected Results

Synfig becomes a platform for creating animated web content.

- Difficulty Medium

- Skills required C++ or Python,

- Mentor(s) Konstantin Dmitriev (https://github.com/morevnaproject)

Editable animation curves in Graphs Panel

- Description

A possibility to edit animation curves in Graphs Panel, in the same way as we can do that with bezier curves onworkarea. See this page for details - https://github.com/synfig/synfig/issues/267

- Expected Results

Editing animation curves is a must-have feature for professional animators. Implementing this will get Synfig closerto professional animation tool.

- Difficulty Easy

- Skills required C++, GTKmm

- Mentor(s) Ivan Mahonin (https://github.com/blackwarthog)

Skeleton Tool

- Description

Currently the skeleton is created by adding a Skeleton Layer (via “Layer”->”New Layer”->”Other”->”Skeleton”) andadding bones one-by-one through context menu. This is tedious and non-intuitive. It would be better to constructSkeleton in the same way as we can construct splines (using Spline Tool). So the proposal is to add Skeleton Tool,which allows user to “draw” bones and set their parent-child relationships.

- Expected Results

Simpler and faster Skeleton construction. Creating bones will be intuitively visible for new users (exposed as tool inToolbox).

- Difficulty Medium

- Skills required C++, GTKmm

- Mentor(s) Ivan Mahonin (https://github.com/blackwarthog)

9.1. Google Summer of Code 2019 61

Page 66: Synfig developers docs - Read the Docs

Synfig developers docs

Vectorization of bitmaps

- Description

Allow to convert bitmap images to vector data with a single command, through integration with Potrace(http://potrace.sourceforge.net/). Alternative - instead of Potrace, use an algorithm of vectorization from OpenToonz(https://opentoonz.readthedocs.io/ja/latest/drawing_animation_levels.html#converting-raster-drawings-to-vectors),which works better.

- Expected Results

User can quickly convert any bitmap image to vector and get resolution-independent image, available for edit.

- Difficulty Easy (Potrace) - Medium (OpenToonz)

- Skills required C++

- Mentor(s) Ivan Mahonin (https://github.com/blackwarthog)

Implement generic waypoint editing operations

- Description

Allow user to manipulate multiple waypoints in TimeTrack Panel. See this page for details - https://github.com/synfig/synfig/issues/266

- Expected Results

This will greatly simplify process of tweaking animation for user.

- Difficulty Medium

- Skills required C++

- Mentor(s) Ivan Mahonin (https://github.com/blackwarthog)

Simplify building process by utilizing Conan C++ package manager

- Description

Integrate Conan C/C++ package manager (https://conan.io/) to provide all required dependencies for building Synfigon any platform. See this page for details - https://github.com/synfig/synfig/issues/666

- Expected Results

Developers can easily set up build environment on any platform and any toolchain.

- Difficulty Easy

- Skills required CMake, Autotools, MSYS2

- Mentor(s) Konstantin Dmitriev (https://github.com/morevnaproject)

OpenToonz importer

- Description

Synfig at its current status is not good for frame-by-frame animations. But it is good for morphing vectors, cut-outand motion design. With the ability to import OpenToonz files (which is good for vector frame-by-frame animation),Synfig users can get best of two worlds and use those applications together.

62 Chapter 9. Google Summer of Code

Page 67: Synfig developers docs - Read the Docs

Synfig developers docs

- Expected Results

Synfig users will be able to use frame-by-frame animations created in OpenToonz.

- Difficulty High

- Skills required C++ (and maybe Python)

- Mentor(s) Konstantin Dmitriev (https://github.com/morevnaproject)

Text Layer rewrite

- Description

Current implementation of Text Layer uses old rendering engine, which makes it really slow. The task is to rewrite theText Tool for new rendering engine, with consideration of solving its current issues - https://github.com/synfig/synfig/labels/Text

- Expected Results

A usable Text Tool in Synfig.

- Difficulty High

- Skills required C++, Freetype

- Mentor(s) Ivan Mahonin (https://github.com/blackwarthog)

Contacts

https://www.synfig.org/contact/

9.2 Google Summer of Code 2020

9.2.1 Application

Synfig GSoC application 2020

Why does your org want to participate in Google Summer of Code?

GSoC gives us an opportunity to grow our community of contributors. With GSoC students can work on Synfig fulltime for 3 months and that’s a great advancement to our project. But that’s not all - the fact of participation in GSoCattracts attention to our project: before GSoC coding period starts, we get many contributions from aspiring students,who wish to proof their skills to be selected for participation. That’s also a great boost for our project.

How many potential mentors have agreed to participate?

1-5

How will you keep mentors engaged with their students?

The student opens GitHub’s issue, which is corresponding to his project and there provides weekly public reports abouthis progress. Every mentor should follow reports and provide on-time feedback and consultation to student via publicdiscussion in relevant GitHub’s issue or privately via email/IM. Also, every mentor is required to contact student atleast twice a week to check for the progress.

Administrator of the project also watches reports and ensures that feedback provided by mentors on time.

How will you help your students stay on schedule to complete their projects?

9.2. Google Summer of Code 2020 63

Page 68: Synfig developers docs - Read the Docs

Synfig developers docs

Every student is required to write a short report about his progress every week, answering those questions:

• How was the last week? What did you accomplish?

• What is the #1 thing slowing you down?

• What do you want to have done by the end of next week?

These weekly blog posts will allow the student’s mentors and org admins to notice if a student is falling behind rightaway.

How will you get your students involved in your community during GSoC?

In general, we require students to be involved into our community BEFORE GSoC starts and their participationactivity influences if their GSoC idea gets accepted as a project or not. All participating students are advised tosubscribe (watch) our main repository at GitHub (https://github.com/synfig/synfig) and Forums (https://forums.synfig.org/c/development) to receive notifications about discussions.

How will you keep students involved with your community after GSoC?

Considering that there are no mechanics to 100% guarantee student involvement after the program, we aim to main-tain a community with a special attitude, where a student can have a home-like feeling, where he know his work isvalued and appreciated by community other members and creative people from all around the world. This is the mainmotivation to contribute for all current project members.

Given that we put initial student motivation in the first place, we understand that there are situations where a massiveand long-term contribution effort it not possible without monetary reward. So, thanks to a regular income of donationswe can afford to pay a small grants for implementing some features, for students who have proven their abilities andskill to carry and complete projects. The money for such grants are collected via continuous crowdfunding and othermeans (see https://www.synfig.org/donate/ for details).

Has your org been accepted as a mentoring org in Google Summer of Code before?

Yes.

Which years did your org participate in GSoC? [Checkboxes]

2019

For each year your organization has participated, provide the counts of successful and total students. (e.g. 2016:3/4) [500 characters]

2019: 2/2

If your org has applied for GSoC before but not been accepted, select the years:

2008, 2010, 2012

Do you have any GSoC participant who can vouch for your project?

What year was your project started?

2006

Where does your source code live?

https://github.com/synfig/synfig/

Organization Profile

Website URL

https://www.synfig.org/

64 Chapter 9. Google Summer of Code

Page 69: Synfig developers docs - Read the Docs

Synfig developers docs

Tagline (up to 80 symbols)

Open-source 2D animation software

Primary OpenSource License

GPLv3

Technology tags (Enter keywords for the primary specific technologies your organization uses. Examples:Python, Javascript, MySQL, Hadoop, OpenGL, Arduino)

c++, gtk, GTKmm, python

Topic Tags (Enter keywords for general topics that describe your organization. Examples: Vision, Robotics,Cloud, Graphics, Web, Real time )

vector graphics, animation, 2d/3d graphics

Ideas List https://synfig-docs-dev.readthedocs.io/en/latest/gsoc/2020/ideas.html#projects-ideas

Short Description

Synfig is a 2D open-source animation software which allows to create motion graphics and cut-out animations forproduct explanation videos, tutorial videos, etc.

Long Description

About=====Synfig is a 2D open-source animation software. It is capable to produce vector→˓artwork and also can work with bitmap images.

The main concept of Synfig is "tweening" - you can define object positions or shapes→˓of vector objects at certain points of time and program will interpolate in-between→˓frames automatically. You can also use bones to control your animation on higher→˓level.

With Synfig you can easily create motion graphics and cut-out animations for product→˓explanation videos, tutorial videos, and more.

Main features===========

**- Vector tweening**Transform any vector shape into another! Synfig gives you powerful tools to control→˓every vertex of your vector artwork. Just set the key positions and inbetween→˓frames will be calculated automatically.

**- Layers and Filters**Synfig provides 50+ layers to create artwork and animation of any complexity. Choose→˓from various layer types: geometric, gradients, filters, distortions,→˓transformations, fractals and others.

**- Bones**A bone system allows to create cutout animation using bitmap images or control your→˓vector artwork. With an additional Skeleton Distortion layer it is possible to→˓apply complex deformations to bitmap artwork.

**- Linking elements**You can link parameters of various layers - directly or through mathematical→˓expressions. This allows you to create advanced character puppets and other dynamic→˓structures.

(continues on next page)

9.2. Google Summer of Code 2020 65

Page 70: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

Examples of works created with Synfig==============================

* [Morevna Episode 3](https://www.youtube.com/watch?v=ecVv2IB7f5k)

* [Polar Detective](https://www.youtube.com/watch?v=lSL-NdoOLQc)

* [Synfig Promo Video](https://www.youtube.com/watch?v=N8SF_-gJ0_w)

* [Demo Reel by VanChatto](https://www.youtube.com/watch?v=fWAxFc9FPwA)

* [The Deadline](https://www.youtube.com/watch?v=3dVamedBYq8)

* [Pluto takes life](https://www.youtube.com/watch?v=cgSI3IcyXhs)

Proposal Process / Application Instructions

Before applying, please make sure to read [getting started page](https://synfig-docs-→˓dev.readthedocs.io/en/latest/gsoc/2020/getting-started.html).

Application Template====================

**Name**

Please provide your full name

**Email / Social / Web**

Where can we contact you? If you have a web page you'd like us to know about, please→˓include it. Make sure to mention your Facebook, Twitter or other identities.

**Synopsis**

A short description of your planned GSoC project.

**Benefits**

Describe how your project will benefit Synfig. Will it benefit artists using Synfig?→˓Will it be an aid for future Synfig development?

**Deliverables**

Provide a user-level summary of the final output or results of your project. How does→˓it integrate in Synfig, and how does it cooperate with the rest of Synfig's→˓features? Note that end-user documentation should be one of the deliverables as→˓well.

**Project Details**

A more detailed description.

**Project Schedule**

How long will the project take? When can you begin work?Include an estimated timeline of the project with mini-milestones.Do you have any possible school or work conflicts with your schedule?

** Short Bio**

Please let us know who are you, what are you studying (and where), and what→˓activities do you enjoy? What is your experience using Synfig or animation or other→˓computer graphics programs? What code development projects you've participated in?→˓What makes you the best person to work on this project? If you have any history→˓submitting bug fixes or patches to our issue tracker at GitHub, please indicate→˓what you have done.

(continues on next page)

66 Chapter 9. Google Summer of Code

Page 71: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

Proposal Tags

feature, improvement, bugfix, infrastructure

Contacts Methods:

Mailing List: https://forums.synfig.org/c/development

General Email: contact -AT- synfig -DOT- org

Links

Twitter: https://twitter.com/synfig

Blog: https://www.synfig.org/news/

9.2.2 Getting Started

When applying for a Google Summer of Code grant to work with the Synfig, your application must follow our appli-cation template below (much of which we have borrowed from the Blender Foundation, with gratitude).

Before applying, please check with our ideas page for our requirements for acceptance.

Also, please make sure to read the following tips:

Application FAQs

Q: What will most help my odds of acceptance?

A: There are a number of things you can do to help your odds

1. A quality proposal - a well thought out proposal that shows you understand what you want to do and havereasonable expectations about what can be accomplished in the time you will have available.

2. Show evidence of past experience or achievements related to the proposal.

3. We require you to have 1-2 useful contributions to Synfig before the program starts - this show that you cansuccessfully read, edit, and compile our code.

4. Discuss your application with us and get some feedback. The best way to do so is to open an issue on GitHubwith description of your proposal (make sure to specify in title that is is GSoC-related).

Q: Is there some place that tells me the process of compiling Synfig?

A: See this documentation.

Q: Where can I learn basics of Synfig’s functionality?

A: We recommend to become familiar with existing Synfig functionality before you start any coding. You can startwith beginner’s tutorials. Also, you can request a free access to our video training course, which allow you to grab allbasicsin the shortest time. Just mail us via contact page letting us know that you are aspiring GSoC student - and wewill send you a link for free access.

After watching the course we recommend to get familiar with Synfig’s code by reading this page.

9.2. Google Summer of Code 2020 67

Page 72: Synfig developers docs - Read the Docs

Synfig developers docs

Application Template

Name

Please provide your full name

Email / Social / Web

Where can we contact you? If you have a web page you’d like us to know about, please include it. Make sure tomention your Facebook, Twitter or other identities.

Synopsis

A short description of your planned GSoC project.

Benefits

Describe how your project will benefit Synfig. Will it benefit artists using Synfig? Will it be an aid for future Synfigdevelopment?

Deliverables

Provide a user-level summary of the final output or results of your project. How does it integrate in Synfig, and howdoes it cooperate with the rest of Synfig’s features? Note that end-user documentation should be one of the deliverablesas well.

Project Details

A more detailed description.

Project Schedule

How long will the project take? When can you begin work? Include an estimated timeline of the project with mini-milestones. Do you have any possible school or work conflicts with your schedule?

Short Bio

Please let us know who are you, what are you studying (and where), and what activities do you enjoy? What is yourexperience using Synfig or animation or other computer graphics programs? What code development projects you’veparticipated in? What makes you the best person to work on this project? If you have any history submitting bug fixesor patches to our issue tracker at GitHub, please indicate what you have done.

9.2.3 Ideas List

This year we plan to apply to Google Summer of Code. Currently we are looking for project ideas. If you are a student,you are welcome to explore existing project ideas towards the GSoC application phase. There are ways to reach out tomentors, and many projects have lists of newcomer friendly issues you can start from. Students are also welcome topropose their own project ideas.

Propose Project

If you have a project idea, edit the “Project Ideas” section below by filling the required details and sending a pullrequest (this page is editable at https://github.com/synfig/synfig-docs-dev/blob/master/docs/gsoc/2020/ideas.rst), evenif you could not mentor (we will find a mentor).

Required information for project proposal

68 Chapter 9. Google Summer of Code

Page 73: Synfig developers docs - Read the Docs

Synfig developers docs

A descriptive title~~~~~~~~~~~~~~~~~~~

**- Description**

A brief description about the project

**- Expected Results**

What benefit this deliver?

**- Difficulty** Easy | Medium | High

**- Skills required*** Knowledge Prerequisite

**- Mentor(s)** Put your name if you are willing to mentor + other mentors.

Please mention the following as comment on your proposal pr

Your name :)

Your profile github | linkedin | etc

Your role I am a making this proposal as a <student | mentor | community member | contributor | etc>

Projects Ideas

Improvements for Lottie exporter plugin

- Description

This project will improve plugin which helps to export animation for web through Lottie export format (http://airbnb.io/lottie/). See this page for details - https://forums.synfig.org/t/google-summer-of-code-2020/10545/4?u=anishg

- Expected Results

This will allow users to export animations which use advanced features of Synfig, such as advanced outline layer,convert methods etc.

- Difficulty Medium

- Skills required C++, Python

- Mentor(s) Anish Gulati (https://github.com/AnishGG)

Enhancements for Vectorization of bitmaps

- Description

This project involves enhancements for vectorization feature. Currently the vectorization feature uses Opentoonzcenterline method (see https://github.com/synfig/synfig/issues/735) for vectorization, this project involve implementa-tion/porting outline vectorization method from Opentoonz to synfig.

- Expected Results

Provide outline and centerline methods to users, for converting any bitmap image to vector and get resolution-independent image, available for edit.

- Difficulty Medium

- Skills required C++

9.2. Google Summer of Code 2020 69

Page 74: Synfig developers docs - Read the Docs

Synfig developers docs

- Mentor(s) Ankit Kumar Dwivedi (https://github.com/ankit-kumar-dwivedi)

Skeleton Tool

- Description

Currently the skeleton is created by adding a Skeleton Layer (via “Layer”->”New Layer”->”Other”->”Skeleton”) andadding bones one-by-one through context menu. This is tedious and non-intuitive. It would be better to constructSkeleton in the same way as we can construct splines (using Spline Tool). So the proposal is to add Skeleton Tool,which allows user to “draw” bones and set their parent-child relationships.

- Expected Results

Simpler and faster Skeleton construction. Creating bones will be intuitively visible for new users (exposed as tool inToolbox).

- Difficulty Medium

- Skills required C++, GTKmm

- Mentor(s) Konstantin Dmitriev (https://github.com/morevnaproject)

Simplify building process by utilizing Conan C++ package manager

- Description

Integrate Conan C/C++ package manager (https://conan.io/) to provide all required dependencies for building Synfigon any platform. See this page for details - https://github.com/synfig/synfig/issues/666

- Expected Results

Developers can easily set up build environment on any platform and any toolchain.

- Difficulty Easy

- Skills required CMake, Autotools, MSYS2

- Mentor(s) Konstantin Dmitriev (https://github.com/morevnaproject)

CMake build system

- Description

Current implementation of CMake build scripts is not full. Synfig builded by CMake still can be run by using somehacks. The task is to complete CMake build system scripts and fix some parts of Synfig code (mainly image andlibrary search algorithms)

- Expected Results

Synfig can be built using CMake. Installers can be built using CMake (CPack).

- Difficulty Medium

- Skills required CMake, C++

- Mentor(s) Artem Konoplin (https://github.com/ice0)

70 Chapter 9. Google Summer of Code

Page 75: Synfig developers docs - Read the Docs

Synfig developers docs

Text Layer rewrite

- Description

Current implementation of Text Layer uses old rendering engine, which makes it really slow. The task is to rewrite theText Tool for new rendering engine, with consideration of solving its current issues - https://github.com/synfig/synfig/labels/Text

- Expected Results

A usable Text Tool in Synfig.

- Difficulty High

- Skills required C++, Freetype

- Mentor(s) Artem Konoplin (https://github.com/ice0)

Scripting

- Description

Expose/Port synfigapp API and its basic data structures to Python scripting language.

- Expected Results

Provide a way to user automate actions and to developers create plugins easier, like Blender does.

- Difficulty Medium

- Skills required* C, C++, Python

- Mentor(s) Rodolfo Ribeiro Gomes (https://github.com/rodolforg)

Replacement of deprecated Gtk classes

- Description

• get rid of deprecated Gtk::StockId (since before 2013)

• convert deprecated Gtk::Action to Gio::Action (since 2016)

• convert/get rid of deprecated Gtk::UIManager to Gtk::Builder (since 2013)

• (possibly) convert deprecated Gtk::Main 2 to Gtk::Application (since 2012)

- Expected Results

Let Synfig Studio code avoid unmantained code, as they can led to stability and security issues. Besides, it will easeporting of Synfig Studio to upcoming Gtk 4, that deletes all currently deprecated classes and methods.

- Difficulty Easy

- Skills required* C++, Gtkmm

- Mentor(s) Rodolfo Ribeiro Gomes (https://github.com/rodolforg)

9.2. Google Summer of Code 2020 71

Page 76: Synfig developers docs - Read the Docs

Synfig developers docs

Performance enhancements

- Description

Improve the speed of Synfig export to files and rendering speed.

If you want to learn about how to find bottlenecks in an application, especially in a complicated one like Synfig, andfix them - select this project :)

This project is only for Linux (Linux has the necessary tools)

- Expected Results

Improved Synfig rendering speed, allowing users to work faster and create more complex animations.

- Difficulty Medium

- Skills required C++ (perf optional)

- Mentor(s) Artem Konoplin (https://github.com/ice0), Konstantin Dmitriev (https://github.com/morevnaproject)

Cloud rendering platform

- Description

Sometimes time is running out and you need to do your rendering as fast as possible.

Synfig have console tool which can be run inside a container, and it allows you to choose which part of animationyou want to render. We want to create a service which can distribute rendering job across a number of containers andmerge final output to video file.

This service must allow to: - Upload your rendering data to the cloud; - Run distributed rendering; - Re-run failed jobs(if container will stay unavailable); - Get completed images and pipe it thru FFMPEG to get the final avi/mp4 file; -Download images and/or final avi/mp4 file; - Have an API connector;

- Expected Results Simple web-page for upload/download data and run/stop/view process status.

- Difficulty Medium

- Skills required Python, Docker, Kubernetes (JS/HTML optional)

- Mentor(s) Sagar Utekar (https://github.com/Sagar2366), Artem Konoplin (https://github.com/ice0)

Contacts

https://www.synfig.org/contact/

9.3 Google Summer of Code 2021

9.3.1 Application

Synfig GSoC application 2021

Why does your org want to participate in Google Summer of Code?

GSoC gives us an opportunity to grow our community of contributors. With GSoC students can work on Synfig fulltime for 175 hours and that’s a great advancement to our project. But that’s not all - the fact of participation in GSoC

72 Chapter 9. Google Summer of Code

Page 77: Synfig developers docs - Read the Docs

Synfig developers docs

attracts attention to our project: before GSoC coding period starts, we get many contributions from aspiring students,who wish to proof their skills to be selected for participation. That’s also a great boost for our project.

What would your org consider to be a successful summer?

This summer we plan to help newcomers to the open source world and attract new contributors.

How many potential mentors have agreed to participate?

1-5

How will you keep mentors engaged with their students?

The student opens GitHub’s issue, which is corresponding to his project and there provides weekly public reports abouthis progress. Every mentor should follow reports and provide on-time feedback and consultation to student via publicdiscussion in relevant GitHub’s issue or privately via email/IM. Also, every mentor is required to contact student atleast twice a week to check for the progress.

Administrator of the project also watches reports and ensures that feedback provided by mentors on time.

How will you help your students stay on schedule to complete their projects?

Every student is required to write a short report about his progress every week, answering those questions:

• How was the last week? What did you accomplish?

• What is the #1 thing slowing you down?

• What do you want to have done by the end of next week?

These weekly blog posts will allow the student’s mentors and org admins to notice if a student is falling behind rightaway.

How will you get your students involved in your community during GSoC?

In general, we require students to be involved into our community BEFORE GSoC starts and their participationactivity influences if their GSoC idea gets accepted as a project or not. All participating students are advised tosubscribe (watch) our main repository at GitHub (https://github.com/synfig/synfig) and Forums (https://forums.synfig.org/c/development) to receive notifications about discussions.

How will you keep students involved with your community after GSoC?

Considering that there are no mechanics to 100% guarantee student involvement after the program, we aim to main-tain a community with a special attitude, where a student can have a home-like feeling, where he know his work isvalued and appreciated by community other members and creative people from all around the world. This is the mainmotivation to contribute for all current project members.

Given that we put initial student motivation in the first place, we understand that there are situations where a massiveand long-term contribution effort it not possible without monetary reward. So, thanks to a regular income of donationswe can afford to pay a small grants for implementing some features, for students who have proven their abilities andskill to carry and complete projects. The money for such grants are collected via continuous crowdfunding and othermeans (see https://www.synfig.org/donate/ for details).

Has your org been accepted as a mentoring org in Google Summer of Code before?

Yes.

Which years did your org participate in GSoC? [Checkboxes]

• 2019

• 2020

How many students did your org accept for 2020?

3

9.3. Google Summer of Code 2021 73

Page 78: Synfig developers docs - Read the Docs

Synfig developers docs

How many of your org’s 2020 students have been active in your community in the past 60 days?

0

For each year your organization has participated, provide the counts of successful and total students. (e.g. 2016:3/4) [500 characters]

2019: 2/2 2020: 2/3

If your org has applied for GSoC before but not been accepted, select the years:

2008, 2010, 2012

Do you have any GSoC participant who can vouch for your project?

What year was your project started?

2006

Where does your source code live?

https://github.com/synfig/synfig/

Organization Profile

Website URL

https://www.synfig.org/

Tagline (up to 80 symbols)

Open-source 2D animation software

Primary OpenSource License

GPLv3

Technology tags (Enter keywords for the primary specific technologies your organization uses. Examples:Python, Javascript, MySQL, Hadoop, OpenGL, Arduino)

c++, gtk, GTKmm, python

Topic Tags (Enter keywords for general topics that describe your organization. Examples: Vision, Robotics,Cloud, Graphics, Web, Real time )

vector graphics, animation, 2d/3d graphics

Ideas List https://synfig-docs-dev.readthedocs.io/en/latest/gsoc/2021/ideas.html#projects-ideas

Short Description

Synfig is a 2D open-source animation software which allows to create motion graphics and cut-out animations forproduct explanation videos, tutorial videos, etc.

Long Description

About=====Synfig is a 2D open-source animation software. It is capable to produce vector→˓artwork and also can work with bitmap images.

The main concept of Synfig is "tweening" - you can define object positions or shapes→˓of vector objects at certain points of time and program will interpolate in-between→˓frames automatically. You can also use bones to control your animation on higher→˓level. (continues on next page)

74 Chapter 9. Google Summer of Code

Page 79: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

With Synfig you can easily create motion graphics and cut-out animations for product→˓explanation videos, tutorial videos, and more.

Main features===========

**- Vector tweening**Transform any vector shape into another! Synfig gives you powerful tools to control→˓every vertex of your vector artwork. Just set the key positions and inbetween→˓frames will be calculated automatically.

**- Layers and Filters**Synfig provides 50+ layers to create artwork and animation of any complexity. Choose→˓from various layer types: geometric, gradients, filters, distortions,→˓transformations, fractals and others.

**- Bones**A bone system allows to create cutout animation using bitmap images or control your→˓vector artwork. With an additional Skeleton Distortion layer it is possible to→˓apply complex deformations to bitmap artwork.

**- Linking elements**You can link parameters of various layers - directly or through mathematical→˓expressions. This allows you to create advanced character puppets and other dynamic→˓structures.

Examples of works created with Synfig==============================

* [Morevna Episode 3](https://www.youtube.com/watch?v=ecVv2IB7f5k)

* [Polar Detective](https://www.youtube.com/watch?v=lSL-NdoOLQc)

* [Synfig Promo Video](https://www.youtube.com/watch?v=N8SF_-gJ0_w)

* [Demo Reel by VanChatto](https://www.youtube.com/watch?v=fWAxFc9FPwA)

* [The Deadline](https://www.youtube.com/watch?v=3dVamedBYq8)

* [Pluto takes life](https://www.youtube.com/watch?v=cgSI3IcyXhs)

Proposal Process / Application Instructions

Before applying, please make sure to read [getting started page](https://synfig-docs-→˓dev.readthedocs.io/en/latest/gsoc/2021/getting-started.html).

Application Template====================

**Name**

Please provide your full name

**Email / Social / Web**

Where can we contact you? If you have a web page you'd like us to know about, please→˓include it. Make sure to mention your Facebook, Twitter or other identities.

**Synopsis**

A short description of your planned GSoC project.(continues on next page)

9.3. Google Summer of Code 2021 75

Page 80: Synfig developers docs - Read the Docs

Synfig developers docs

(continued from previous page)

**Benefits**

Describe how your project will benefit Synfig. Will it benefit artists using Synfig?→˓Will it be an aid for future Synfig development?

**Deliverables**

Provide a user-level summary of the final output or results of your project. How does→˓it integrate in Synfig, and how does it cooperate with the rest of Synfig's→˓features? Note that end-user documentation should be one of the deliverables as→˓well.

**Project Details**

A more detailed description.

**Project Schedule**

How long will the project take? When can you begin work?Include an estimated timeline of the project with mini-milestones.Do you have any possible school or work conflicts with your schedule?

** Short Bio**

Please let us know who are you, what are you studying (and where), and what→˓activities do you enjoy? What is your experience using Synfig or animation or other→˓computer graphics programs? What code development projects you've participated in?→˓What makes you the best person to work on this project? If you have any history→˓submitting bug fixes or patches to our issue tracker at GitHub, please indicate→˓what you have done.

Proposal Tags

improvement, bugfix, infrastructure

Contacts Methods:

Mailing List: https://forums.synfig.org/c/development

General Email: contact -AT- synfig -DOT- org

Links

Twitter: https://twitter.com/synfig

Blog: https://www.synfig.org/news/

9.3.2 Getting Started

When applying for a Google Summer of Code grant to work with the Synfig, your application must follow our appli-cation template below (much of which we have borrowed from the Blender Foundation, with gratitude).

Before applying, please check with our ideas page for our requirements for acceptance.

Also, please make sure to read the following tips:

76 Chapter 9. Google Summer of Code

Page 81: Synfig developers docs - Read the Docs

Synfig developers docs

Application FAQs

Q: What will most help my odds of acceptance?

A: There are a number of things you can do to help your odds

1. A quality proposal - a well thought out proposal that shows you understand what you want to do and havereasonable expectations about what can be accomplished in the time you will have available.

2. Show evidence of past experience or achievements related to the proposal.

3. We require you to have 1-2 useful contributions to Synfig before the program starts - this show that you cansuccessfully read, edit, and compile our code.

4. Discuss your application with us and get some feedback. The best way to do so is to open an issue on GitHubwith description of your proposal (make sure to specify in title that is is GSoC-related).

Q: Is there some place that tells me the process of compiling Synfig?

A: See this documentation.

Q: Where can I learn basics of Synfig’s functionality?

A: We recommend to become familiar with existing Synfig functionality before you start any coding. You can startwith beginner’s tutorials. Also, you can request a free access to our video training course, which allow you to grab allbasicsin the shortest time. Just mail us via contact page letting us know that you are aspiring GSoC student - and wewill send you a link for free access.

After watching the course we recommend to get familiar with Synfig’s code by reading this page.

Application Template

Name

Please provide your full name

Email / Social / Web

Where can we contact you? If you have a web page you’d like us to know about, please include it. Make sure tomention your Facebook, Twitter or other identities.

Synopsis

A short description of your planned GSoC project.

Benefits

Describe how your project will benefit Synfig. Will it benefit artists using Synfig? Will it be an aid for future Synfigdevelopment?

Deliverables

Provide a user-level summary of the final output or results of your project. How does it integrate in Synfig, and howdoes it cooperate with the rest of Synfig’s features? Note that end-user documentation should be one of the deliverablesas well.

Project Details

A more detailed description.

Project Schedule

How long will the project take? When can you begin work? Include an estimated timeline of the project with mini-milestones. Do you have any possible school or work conflicts with your schedule?

9.3. Google Summer of Code 2021 77

Page 82: Synfig developers docs - Read the Docs

Synfig developers docs

Short Bio

Please let us know who are you, what are you studying (and where), and what activities do you enjoy? What is yourexperience using Synfig or animation or other computer graphics programs? What code development projects you’veparticipated in? What makes you the best person to work on this project? If you have any history submitting bug fixesor patches to our issue tracker at GitHub, please indicate what you have done.

9.3.3 Ideas List

This year we plan to apply to Google Summer of Code. Currently we are looking for project ideas. If you are a student,you are welcome to explore existing project ideas towards the GSoC application phase. There are ways to reach out tomentors, and many projects have lists of newcomer friendly issues you can start from. Students are also welcome topropose their own project ideas.

Propose Project

If you have a project idea, edit the “Project Ideas” section below by filling the required details and sending a pullrequest (this page is editable at https://github.com/synfig/synfig-docs-dev/blob/master/docs/gsoc/2020/ideas.rst), evenif you could not mentor (we will find a mentor).

Required information for project proposal

A descriptive title~~~~~~~~~~~~~~~~~~~

**- Description**

A brief description about the project

**- Expected Results**

What benefit this deliver?

**- Difficulty** Easy | Medium | High

**- Skills required** Knowledge Prerequisite

**- Mentor(s)** Put your name if you are willing to mentor + other mentors.

Please mention the following as comment on your proposal pr

Your name :)

Your profile github | linkedin | etc

Your role I am a making this proposal as a <student | mentor | community member | contributor | etc>

Projects Ideas

Move ETL library code to synfig-core

- Description

ETL is an Extended Template Library, like an extension of STL (Standard Template Library) For those who don’tknow. Synfig began to be developed in the early 2000s, when there was no C++11, multithreaded programming, andother things that had already become part of the standard (std). The current task is to understand the logic of classes inETL and replace them with an analogue from std, or if there are no analogs, transfer these classes as-is to synfig-core.

78 Chapter 9. Google Summer of Code

Page 83: Synfig developers docs - Read the Docs

Synfig developers docs

- Expected Results

From 3 packages (ETL, synfig-core, synfig-studio) 2 remains (synfig-core, synfig-studio)

- Difficulty Medium

- Skills required C++

- Mentor(s) Artem Konoplin (https://github.com/ice0), Ankit Kumar Dwivedi (https://github.com/ankit-kumar-dwivedi), Ayush Chamoli (https://github.com/ayesdie)

Replacement of deprecated Gtk classes

- Description

• get rid of deprecated Gtk::StockId (since before 2013)

• convert deprecated Gtk::Action to Gio::Action (since 2016)

• convert/get rid of deprecated Gtk::UIManager to Gtk::Builder (since 2013)

• (possibly) convert deprecated Gtk::Main 2 to Gtk::Application (since 2012)

- Expected Results

Let Synfig Studio code avoid unmantained code, as they can led to stability and security issues. Besides, it will easeporting of Synfig Studio to upcoming Gtk 4, that deletes all currently deprecated classes and methods.

Synfig compiles with the -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED flags on Ubuntu16.04 and Ubuntu 20.04

- Difficulty Easy

- Skills required* C++, Gtkmm

- Mentor(s) Rodolfo Ribeiro Gomes (https://github.com/rodolforg), Ankit Kumar Dwivedi (https://github.com/ankit-kumar-dwivedi)

Performance enhancements

- Description

Improve the speed of Synfig export to files and rendering speed.

If you want to learn about how to find bottlenecks in an application, especially in a complicated one like Synfig, andfix them - select this project :)

This project is only for Linux (Linux has the necessary tools)

- Expected Results

Improved Synfig rendering speed, allowing users to work faster and create more complex animations.

- Difficulty Medium

- Skills required C++ (perf optional)

- Mentor(s) Artem Konoplin (https://github.com/ice0), Konstantin Dmitriev (https://github.com/morevnaproject)

Contacts

https://www.synfig.org/contact/

9.3. Google Summer of Code 2021 79

Page 84: Synfig developers docs - Read the Docs

Synfig developers docs

80 Chapter 9. Google Summer of Code

Page 85: Synfig developers docs - Read the Docs

CHAPTER 10

Projects

This is a page for in-development projects

10.1 Control handling exported values during copy-pasting [INPROGRESS]

Note: Currently in progress here - https://github.com/synfig/synfig/pull/2086

In Synfig user can export any parameter of any layer - this way parameter is linked to exported value. When usercopy-pasting such layer from one file into another, the exported values are not copied (they are referenced/linked).This creates problems.

I suggest to show a dialog, which is listing all exported values (ones which pasted layer has). In this dialog user canselect which exported values should be copied and which should be linked from old file (default behavior is to copyvalues).

What if target file already has exported values with the same name?

I think the dialog should show icons for values marked to copy, which indicate if such exported value already exists intarget document. If its type is different, then there should be alarm icon, and dialog should allow to rename exportedvalues.

Here is a prototype:

81

Page 86: Synfig developers docs - Read the Docs

Synfig developers docs

synfig-dialog.kra

Explanation:

(1) If checkbox is enabled, to exported value will be copied into targed document. Default value for checkbox:enabled.

(2) User can uncheck checkboxes, that makes the value will be linked (referenced) from source file.

(3) Clicking this checkbox allows to enable/disable all checkboxes.

(4) This value is copied to target document (see checkbox enabled), but the target document has exported value withthe same name and different type. So, that creates conflict.

(5) This value is copied to target document (see checkbox enabled), and the target document has exported valuewith the same name and same type. No problem here, icon indicates that this value will be linked to existingexported value in target document.

(6) If value is not copied to target document (checkbox disabled), then a path displayed to file where it is referencedfrom.

(7) OK button is not active if there is at least one conflict - see (4).

(8) For values which are marked to be copied into target document (checkbox enabled) user can click on their nameand edit it (type other text). In any value is renamed then icons - (4) and (5) should updated automatically.

10.2 Google Season of Docs [DECLINED]

10.2.1 Application

What previous experience has your organization had in documentation or collaborating with tech-nical writers?

Since 2008 we have been used MediaWiki for writing documentation - https://wiki.synfig.org/User_Documentation.There were a lot of volunteer community contributors since then. We have coordinated documentation writing viaforums (https://forums.synfig.org/) and wiki’s talk pages. Also, we had a guidelines for contributors - https://wiki.synfig.org/Writer_Documentation

Initially the development of our documentation was mostly chaotic, as everyone contributed “what he could”. Butat some points we made several efforts to re-structurize documentation. The workflow was following: a personresponsible for documentation planning (it is similar to “mentor” role) created a structure of empty (stub) pages. Thenothers were filling them. We plan to stick the same plan during Season of Docs.

There are a lot of documentation pages were written, but many of them got outdated by this moment.

Also, as our practice shows, MediaWIki is not fits well for documentation - it is hard to maintain and not easy totrack contributions (lots of chaotic noise coming). So, as part of Season of Docs we would like to migrate ourdocumentation to Sphinx pages hosted on GitHub (ReadTheDocs). We already have positive experience in using it forwriting Developer’s documentation - https://synfig-docs-dev.readthedocs.io/

What previous experience has your organization had mentoring individuals?

Our organization participated in Google Summer of Code in 2019. We had 2 students, both completed projectssuccessfully, results of their work are merged into our project’s master branch and shipped for users with binaryrelease. This year we are participating in Google Summer of Code again, got 3 slots granted.

82 Chapter 10. Projects

Page 87: Synfig developers docs - Read the Docs

Synfig developers docs

10.2.2 Ideas List

Organization name: Synfig

Organization description: Synfig is a 2D open-source animation software which allows to create motion graphicsand cut-out animations for product explanation videos, tutorial videos, etc.

Website: https://www.synfig.org/

GitHub repository: https://github.com/synfig/synfig/

Announcement: This year, with the release of Synfig 1.4.0 we are taking an effort to update Synfig documentation.This includes complete re-structurization and migration to modern ReadTheDocs platform, which will make furthermaintaining and development easier. To assist with this process we are applying for Google Season of Docs.

Project ideas

With the release of major stable version 1.4.0 we have a single top-priority project this year.

Project name: Re-structurize and update documentation for Synfig 1.4.0.

Description: The goal is to refactor and update documentation for new version 1.4.0. As part of this process thedocumentation will be migrated from MediaWiki to ReadTheDocs (Sphinx) format.

Related material:

• Project Website: https://www.synfig.org/

• Old documentation: https://wiki.synfig.org/Category:Manual

• New documentation (structure): https://synfig.readthedocs.io/en/latest/index.html

• Discussion thread for new documentation: https://forums.synfig.org/t/new-documentation/10931

• Links to similar documentation projects: https://docs.blender.org/manual/en/latest/, https://docs.krita.org/en/

10.3 Export for web via Lottie [IN PROGRESS]

This page contains the mappings from .sif format to lottie format.

10.3.1 Mappings from .sif to lottie format

Blur Layer

Property in .sif Path to Property in lottieZ_depth Depends on ordering of layers in lottie formatAmount Not SupportedBlend Method Not SupportedSize “ef” -> “v” -> properties/[value.json OR valueKeyframed.json]Type All types are defaulted to Gaussian Blur

10.3. Export for web via Lottie [IN PROGRESS] 83

Page 88: Synfig developers docs - Read the Docs

Synfig developers docs

Important points

• For all types of blur layer, they are defaulted to Gaussian Blur, since this is the only blur type supported byLottie.

• Rendering time increases as you increase the number of images to blur.

• Amount and Blend Method is not supported for blur in Lottie.

Circle Layer

Property in .sif Path to Property in lottieZ_depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend Method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonRadius Calculation of layers/solid.json -> helpers/mask.json -> “pt”Origin Calculation of layers/solid.json -> helpers/mask.json -> “pt”Invert layers/solid.json -> helpers/mask.json -> “inv”Antialiasing This property is always present(true) in lottieFeather Not supported

Important points

• Instead of directly using the shapes layer from Lottie, a solid region layer is used and is masked(using masks)to draw a circle. This is done to support the invert parameter from Synfig.

• The mask is drawn according to: https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/synfig-core/src/modules/mod_geometry/circle.cpp

Group Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/preComp.json -> “ks” -> helpers/transform.json -> “o”Blend_method layers/preComp.json -> “bm” -> helpers/blendMode.jsonOrigin layers/preComp.json -> “ks” -> helpers/transform.json -> “p”/”a”Transformation layers/preComp.json -> “ks” -> helpers/transform.jsonCanvas sources/preComp.jsonSpeed layers/preComp.json -> “tm”(time remapping)Time Offset layer/preComp.json -> “tm”(time remapping)Lock selection Not neededOutline Grow Global parameter -> settings.OUTLINE_GROWZ Range Opacity of layers in canvas is modified accordinglyZ Range Position Opacity of layers in canvas is modified accordinglyZ Range Depth Opacity of layers in canvas is modified accordinglyZ Range Blur Not Supported

84 Chapter 10. Projects

Page 89: Synfig developers docs - Read the Docs

Synfig developers docs

Important points

• In Lottie, all the parts of shapes/elements lying outside a precomposition are cut off and never displayed. Hencethe over all size of a pre-comp is increased by some amount as a precaution. Some part which is outside a pre-comp might come inside the overall canvas after some transformations(rotation/translation/scale). This increaseis given by: ADDITIONAL_PRECOMP_WIDTH and ADDITIONAL_PRECOMP_HEIGHT

Import Image Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/fill.json -> “o” -> properties/[value.json OR valueKeyframed.json]Blend_method layers/shape.json -> “bm” -> helpers/blendMode.jsonTop Left Used in calculation of Origin parameter in lottieBottom Right Used in calculation of Origin parameter in lottieInterpolation Not SupportedGamma Adjustment Not SupportedFilename refId -> sources/image.jsonTime Offset Not Supported

Linear Gradient Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/shape.json -> “ef” -> shapes/gFill.json -> effects/opacity.jsonBlend_method Partially supportedGradient layers/shape.json -> “ef” -> shapes/gfill.jsonp1 layers/shape.json -> “ef” -> shapes/gFill.json -> “s”p2 layers/shape.json -> “ef” -> shapes/gFill.json -> “e”Loop Not supportedZigzag Not supported

Important points

• p1 and p2 parameters are used to calculate the gradient start point -> “s” and the gradient end point -> “e”respectively.

• Since, only gradient fill is supported in Lottie and not gradient ramp, to create the Linear Gradient layer, Iintroduced two parameters point1 and point2 which are used to create a rectangle layer first which fills thewhole canvas in which gradient fill is used.

10.3. Export for web via Lottie [IN PROGRESS] 85

Page 90: Synfig developers docs - Read the Docs

Synfig developers docs

Outline Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonOrigin Added to vertex list of the polygonInvert layers/solid.json -> helpers/mask.json -> “inv”Antialiasing This property is always present(true) in lottie.Feather Not SupportedType of Feather Not supportedWinding Style Not supportedVertices layers/solid.json -> helpers/mask.json -> “pt”Outline Width Manipulation of verticesExpand Manipulation of verticesSharp cusps Manipulation of verticesRounded Begin Manipulation of verticesRounded End Manipulation of verticesLoopyness Not requiredHomogeneous Manipulation of vertices

Important points

• Instead of directly using the shapes layer from Lottie, a solid color layer is used and is masked(using masks) todraw an outline. This is done to support the invert parameter from Synfig.

• The mask is drawn according to: https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/synfig-core/src/modules/mod_geometry/outline.cpp

• It is possible to export outlines without variable widths. To do so you need to use Outline width as the widthfor all vertices, upon doing so you can export the outlines without variable widths by choosing the same optionfrom the Export menu.

• In exporting without variable widths, the rounded edges cannot be animated.

Polygon Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonOrigin Added to vertex list of the polygonInvert layers/solid.json -> helpers/mask.json -> “inv”Antialiasing This property is always present(true) in lottie.Feather Not SupportedType of Feather Not supportedWinding Style Not supportedVertices List layers/solid.json -> helpers/mask.json -> “pt”

86 Chapter 10. Projects

Page 91: Synfig developers docs - Read the Docs

Synfig developers docs

Important points

• Instead of directly using the shapes layer from Lottie, a solid color layer is used and is masked(using masks) todraw a polygon. This is done to support the invert parameter from Synfig.

Radial Gradient Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/shape.json -> “ef” -> shapes/gFill.json -> effects/opacity.jsonBlend_method Partially supportedGradient layers/shape.json -> “ef” -> shapes/gfill.jsonCenter layers/shape.json -> “ef” -> shapes/gFill.json -> “s”Radius layers/shape.json -> “ef” -> shapes/gFill.json -> “e”Loop Not supportedZigzag Not supported

Important points

• Since the lottie format requires both Gradient start point and Gradient end point, Center parameter is used as thegradient start point and for the gradient end point, I have used the radius and added it to the x-axis componentof the center paramter to get the x-axis component and used the y-axis component from center parameter for they-axis component. Therefore, the expression for gradient end point is (start[0] + radius, start[1]).

• Since, only gradient fill is supported in Lottie and not gradient ramp, to create the Radial Gradient layer, Iintroduced two parameters point1 and point2 which are used to create a rectangle layer first which fills thewhole canvas in which gradient fill is used.

Rectangle Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonPoint 1 Calculation of layers/solid.json -> helpers/mask.json -> “pt”Point 2 Calculation of layers/solid.json -> helpers/mask.json -> “pt”Expand Calculation of layers/solid.json -> helpers/mask.json -> “pt”Invert layers/solid.json -> helpers/mask.json -> “inv”Feather X Not supportedFeather Y Not supportedBevel Calculation of layers/solid.json -> helpers/mask.json -> “pt”Keep Bevel Circular Calculation of layers/solid.json -> helpers/mask.json -> “pt”

Important points

• Instead of directly using the shapes layer from Lottie, a solid region layer is used and is masked(using masks)to draw a rectangle. This is done to support the invert parameter from Synfig.

10.3. Export for web via Lottie [IN PROGRESS] 87

Page 92: Synfig developers docs - Read the Docs

Synfig developers docs

• The mask is drawn according to: https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/synfig-core/src/modules/mod_geometry/rectangle.cpp

Region Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonOrigin Added to vertex list of the polygonInvert layers/solid.json -> helpers/mask.json -> “inv”Antialiasing This property is always present(true) in lottie.Feather Not SupportedType of Feather Not supportedWinding Style Not supportedVertices layers/solid.json -> helpers/mask.json -> “pt”

Important points

• Instead of directly using the shapes layer from Lottie, a solid region layer is used and is masked(using masks)to draw a region. This is done to support the invert parameter from Synfig.

• The mask is drawn according to: https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/synfig-core/src/modules/mod_geometry/region.cpp

Rotate Layer

Property Path to Property in lottieOrigin layers/preComp.json -> “ks” -> helpers/transform.json -> “p”/”a”Amount layers/preComp.json -> “ks” -> helpers/transform.json -> “r”

Important points

• In Lottie, all the parts of shapes/elements lying outside a precomposition are cut off and never displayed. Hencethe over all size of a pre-comp is increased by some amount as a precaution. Some part which is outside a pre-comp might come inside the overall canvas after some transformations(rotation/translation/scale). This increaseis given by: ADDITIONAL_PRECOMP_WIDTH and ADDITIONAL_PRECOMP_HEIGHT

Scale Layer

Property Path to Property in lottieOrigin layers/preComp.json -> “ks” -> helpers/transform.json -> “p”/”a”Amount layers/preComp.json -> “ks” -> helpers/transform.json -> “s”

88 Chapter 10. Projects

Page 93: Synfig developers docs - Read the Docs

Synfig developers docs

Important points

• In Lottie, all the parts of shapes/elements lying outside a precomposition are cut off and never displayed. Hencethe over all size of a pre-comp is increased by some amount as a precaution. Some part which is outside a pre-comp might come inside the overall canvas after some transformations(rotation/translation/scale). This increaseis given by: ADDITIONAL_PRECOMP_WIDTH and ADDITIONAL_PRECOMP_HEIGHT

Simple Circle Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount shapes/fill.json -> “o” -> properties/[value.json OR valueKeyframed.json]Blend_methodlayers/shape.json -> “bm” -> helpers/blendMode.jsonColor shapes/fill.json -> “ty” = “fl”Radius shapes/ellipse.json -> “s” -> properties/[multiDimensional.json OR multiDimenstion-

alKeyframed.json]Center layers/shape.json -> “it” -> shapes/ellipse.json -> “p” -> properties/[multiDimensional.json OR mul-

tiDimensionalKeyframed.json]

Note: “it” is used for shapes within groups. When only a single shape is there, “shapes” will be used “ty” = “fl”describes that the type of shape used is ‘fill’.

Solid Color Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.json

10.3. Export for web via Lottie [IN PROGRESS] 89

Page 94: Synfig developers docs - Read the Docs

Synfig developers docs

Star Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/solid.json -> “ef” -> effects/fill.json -> effects/opacity.jsonBlend_method layers/solid.json -> “bm” -> helpers/blendMode.jsonColor layers/solid.json -> “ef” -> effects/fill.json -> effects/color.jsonOrigin Calculation of layers/solid.json -> helpers/mask.json -> “pt”Invert layers/solid.json -> helpers/mask.json -> “inv”Antialiasing This property is always present(true) in lottieFeather Not SupportedType of Feather Not supportedWinding Style Not supportedOuter Radius Calculation of layers/solid.json -> helpers/mask.json -> “pt”Inner Radius Calculation of layers/solid.json -> helpers/mask.json -> “pt”Angle Calculation of layers/solid.json -> helpers/mask.json -> “pt”Points Calculation of layers/solid.json -> helpers/mask.json -> “pt”Regular Polygon Calculation of layers/solid.json -> helpers/mask.json -> “pt”

Important points regarding conversion

• Ordering of Z_depth is .sif format is opposite from lottie format. The first layer in the .sif format will be thefarthest or deepest from the observer whereas the first layer in lottie format will be the closest to the observer.

• Instead of directly using the shapes layer from Lottie, a solid region layer is used and is masked(using masks)to draw a star/polygon. This is done to support the invert parameter from Synfig.

• The mask is drawn according to: https://github.com/synfig/synfig/blob/678cc3a7b1208fcca18c8b54a29a20576c499927/synfig-core/src/modules/mod_geometry/star.cpp

Switch Group Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/preComp.json -> “ks” -> helpers/transform.json -> “o”Blend_method layers/preComp.json -> “bm” -> helpers/blendMode.jsonOrigin layers/preComp.json -> “ks” -> helpers/transform.json -> “p”/”a”Transformation layers/preComp.json -> “ks” -> helpers/transform.jsonCanvas sources/preComp.jsonSpeed layers/preComp.json -> “tm”(time remapping)Time Offset layer/preComp.json -> “tm”(time remapping)Lock selection Not neededOutline Grow Global parameter -> settings.OUTLINE_GROWActive Layer Name Opacity of layers in canvas is modified according to the active layer

Important points

• In Lottie, all the parts of shapes/elements lying outside a precomposition are cut off and never displayed. Hencethe over all size of a pre-comp is increased by some amount as a precaution. Some part which is outside a pre-

90 Chapter 10. Projects

Page 95: Synfig developers docs - Read the Docs

Synfig developers docs

comp might come inside the overall canvas after some transformations(rotation/translation/scale). This increaseis given by: ADDITIONAL_PRECOMP_WIDTH and ADDITIONAL_PRECOMP_HEIGHT

Text Layer

Property Path to Property in lottieZ depth Depends on ordering of layers in lottie formatAmount layers/text.json -> “t” -> “a” -> “o” -> properties/[value.json OR valueKeyframed.json]Blend_method layers/text.json -> “bm” -> helpers/blendMode.jsonText layers/text.json -> “t” -> “d” -> “k” -> “s”-> “t”Color layers/text.json -> “t” -> “a” -> “fc“ -> effects/color.jsonFamily animation.json -> “fonts” -> “list” -> “fFamily”Style animation.json -> “fonts” -> “list” -> “fStyle”Weight animation.json -> “fonts” -> “list” -> “fWeight”Compress layers/text.json -> “t” -> “a” -> “t” -> properties/[value.json OR valueKeyframed.json]VCompress layers/text.json -> “t” -> “d” -> “k” -> “s”-> “t”Size layers/text.json -> “ks” ->helpers/transform.json -> “s”Orient layers/text.json -> “ks” ->helpers/transform.json -> “a”Origin layers/text.json -> “ks” ->helpers/transform.json -> “p”Use_Kerning Not SupportedGrid_fit Not SupportedInvert Not Supported

Important points regarding Text Layer

• On checking the overlap between fonts supported by Lottie and fonts used by Synfig, the following fonts havebeen included and are ready to be used : “Sans Serif” ,”Times New Roman”, “Calibria”, “Arial”, “Courier”,“Comic Sans”. More fonts will be added later as and when Lottie adds support for more fonts.

• Vertical Compression is only available for integer values due to a lack of support for non-integer values.

Transform Layer

Property Path to Property in lottieOrigin layers/preComp.json -> “ks” -> helpers/transform.json -> “p”

Important points

• In Lottie, all the parts of shapes/elements lying outside a precomposition are cut off and never displayed. Hencethe over all size of a pre-comp is increased by some amount as a precaution. Some part which is outside a pre-comp might come inside the overall canvas after some transformations(rotation/translation/scale). This increaseis given by: ADDITIONAL_PRECOMP_WIDTH and ADDITIONAL_PRECOMP_HEIGHT

• Anchor point is always set to zero. But it is bound to change when the width and height of the pre-compositionare changed

10.3. Export for web via Lottie [IN PROGRESS] 91

Page 96: Synfig developers docs - Read the Docs

Synfig developers docs

10.3.2 Miscellaneous

Synfig Coordinate System

• Origin that is [0, 0] is placed in the center of the canvas. Positive x-axis is towards the right of origin andpositive y-axis is towards the upside of origin as demonstrated in the figure.

• Rotation is measured starting from positive x-axis towards the anti-clockwise direction.

92 Chapter 10. Projects

Page 97: Synfig developers docs - Read the Docs

Synfig developers docs

Lottie Coordinate System

• Origin that is [0, 0] is placed at the upper left corner of the canvas. Positive x-axis is towards the right oforigin and positive y-axis is towards the downside of origin as demonstrated in the figure.

• Rotation is measured starting from negative y-axis towards the clockwise direction.

Value of unit in pixels

1 u = 𝑖𝑚𝑎𝑔𝑒 𝑤𝑖𝑑𝑡ℎ 𝑖𝑛 𝑝𝑖𝑥𝑒𝑙𝑠𝑖𝑚𝑎𝑔𝑒 𝑎𝑟𝑒𝑎 𝑤𝑖𝑑𝑡ℎ px

Origin conversion

x_lottie = 1𝑢 * 𝑥_𝑠𝑖𝑓 + 𝑖𝑚𝑎𝑔𝑒 𝑤𝑖𝑑𝑡ℎ 𝑖𝑛 𝑝𝑖𝑥𝑒𝑙𝑠2

y_lottie = −1𝑢 * 𝑦_𝑠𝑖𝑓 + 𝑖𝑚𝑎𝑔𝑒 ℎ𝑒𝑖𝑔ℎ𝑡 𝑖𝑛 𝑝𝑖𝑥𝑒𝑙𝑠2

10.3. Export for web via Lottie [IN PROGRESS] 93

Page 98: Synfig developers docs - Read the Docs

Synfig developers docs

Interpolation conversion

• Green Tangents: Lottie format tangents

• Red Tangents : Synfig format tangents

• Internally the interpolations are calculated using Bezier curves by Synfig.

• In Tangents for the formats differ in direction. They are exactly opposite of each other.

• Length of tangents differ by a multiple TANGENT_FACTOR, which is a constant.

Unit conversion

• Opacity, referred to as amount: Amount(lottie) = Amount(.sif) * 100

• angle_lottie = (90 - angle_sif) % 360 + shift*360

where shift = -[theta / 360]

10.3.3 Supported Features

94 Chapter 10. Projects

Page 99: Synfig developers docs - Read the Docs

Synfig developers docs

Star Layer

Property Name Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Origin

Invert

Antialiasing

Feather

Type of Feather

Winding Style

Outer Radius

Inner Radius

Angle

Points

Regular Polygon

10.3. Export for web via Lottie [IN PROGRESS] 95

Page 100: Synfig developers docs - Read the Docs

Synfig developers docs

Circle Layer

Property Name Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Radius

Origin

Invert

Feather

Rectangle Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Point 1

Point 2

Expand

Invert

Feather X

Feather Y

Bevel

Keep Bevel Circular

96 Chapter 10. Projects

Page 101: Synfig developers docs - Read the Docs

Synfig developers docs

Simple Circle Layer

Property Name Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Radius

Center

Solid Color Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Import Image Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Top Left

Bottom Right

Interpolation

Gamma AdjustmentFilename .lst files not supported .lst files not supported

Time Offset

10.3. Export for web via Lottie [IN PROGRESS] 97

Page 102: Synfig developers docs - Read the Docs

Synfig developers docs

Region Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Origin

Invert

Antialiasing

Feather

Type of Feather

Winding Style

Vertices

• Animation of Addition/Deletion of vertices is not yet supported

Polygon Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Origin

Invert

Antialiasing

Feather

Type of Feather

Winding Style

Vertices List Partially Supported

98 Chapter 10. Projects

Page 103: Synfig developers docs - Read the Docs

Synfig developers docs

• Animation of Addition/Deletion of vertices in Vertices List is not yet supported

Outline Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Color TCB and Clamped interpolation not supported

Origin

Invert

Antialiasing

Feather

Type of Feather

Winding Style

Vertices

Outline width

Expand

Sharp cusps

Rounded Begin

Rounded EndLoopyness Not required Not required

Homogeneous

• Animation of Addition/Deletion of vertices is not yet supported

Rotate Layer

Property Value Type(Animation)

Origin

Amount

10.3. Export for web via Lottie [IN PROGRESS] 99

Page 104: Synfig developers docs - Read the Docs

Synfig developers docs

Scale Layer

Property Value Type(Animation)

Origin

Amount

Translate Layer

Property Value Type(Animation)

Origin

Group Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Origin

Transformation

Canvas

Speed

Time OffsetLock Selection Not needed Not needed

Outline Grow

Z Range Not needed

Z Range Position

Z Range Depth

Z Range Blur

100 Chapter 10. Projects

Page 105: Synfig developers docs - Read the Docs

Synfig developers docs

Switch Group Layer

Property Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Origin

Transformation

Canvas

Speed

Time OffsetLock Selection Not needed Not needed

Outline Grow

Active Layer Name

10.3. Export for web via Lottie [IN PROGRESS] 101

Page 106: Synfig developers docs - Read the Docs

Synfig developers docs

Text Layer

Property Name Value Type(Animation)

Z depth

AmountBlend_method Partially supported

Text

Color TCB and Clamped interpolation not supported

Family

Style

Weight

Compress

VCompress

Size

Orient

Origin

Use_Kerning

Grid_fit

Invert

102 Chapter 10. Projects

Page 107: Synfig developers docs - Read the Docs

Synfig developers docs

Linear Gradient Layer

Property Value Type(Animation)

Z depth

OpacityBlend_method Partially supported

p1

p2

Gradient

Loop

Zigzag

Radial Gradient Layer

Property Value Type(Animation)

Z depth

OpacityBlend_method Partially supported

Gradient

Center

Radius

Loop

Zigzag

10.3. Export for web via Lottie [IN PROGRESS] 103

Page 108: Synfig developers docs - Read the Docs

Synfig developers docs

Blur Layer

Property Value Type(Animation)

Z_depth

Amount

Blend Method

Size

Type

Blend Methods

• The blend methods supported are: Composite, Difference, Multiply, Hard light, Luminance, Saturation, Hue,Color, Darken, Brighten, Overlay, Screen.

• These methods have somewhat different implementations in Lottie and Synfig, hence the blend methods tend toshow different behaviour when a layer is blended over a transparent background.

Convert Methods

• The convert methods supported by Lottie Exporter plugin are : Add, aTan2, Average, Bone, Bone Link, BoneRoot, Composite, Cos, Dot Product, Exponential, Integer, Linear, Logarithm, Power, Radial Composite, Recip-rocal, Scale, Sine, Subtract, Switch, Vector Angle, VectorX, VectorY, Weighted Average

10.4 Better Shortcuts [DRAFT]

This project is a resolution for discussion in issue 1336.

10.4.1 Single key shortcuts compatible with Inkscape

Seamless experience for Inkscape and Synfig users.

104 Chapter 10. Projects

Page 109: Synfig developers docs - Read the Docs

Synfig developers docs

Keystrokes Toolss Transformm Smooth moveh Mirror horizontalv Mirror verticale Circler Rectangle* Starg Gradientb Splineu Bucketd Eyedropt Text+ Zoom in- Zoom out

10.4.2 Single key shortcuts not compatible with Inkscape

These shortcuts are due to the reason that Inkscape and Synfig tools slightly vary. Or maybe some synfig tools don’texist in Inkscape.

Keystrokes Toolsp Drawc Cutoutw Widthk Sketch. Scale[ Rotateo Polygon

10.5 Skeleton Tool (GSoC-2020) [IN PROGRESS]

10.5.1 Implementation Plan

The Main functions of the tool are:

• Create and Transform Bones:

– Single-click on an empty space in the workarea would add a default bone with all the handles.

– Mouse-Down and Drag will add bone between the points dragged.

– The handles will have their usual functions for transforming the bones.

• Set Parent-Child Relations:

– I’d like to propose “Active bone” for this. This can be set by Clicking on a bone. Active Bone can bedifferentiated by adding a red outline or a blue highlight.

– Newly created bone is set as a child to the “Active bone”. The newly created bone will then be set to“Active”.

10.5. Skeleton Tool (GSoC-2020) [IN PROGRESS] 105

Page 110: Synfig developers docs - Read the Docs

Synfig developers docs

– For changing relations, we’ll add an option “Set as child to current Active Bone” in the context menuof the bone. The meaning is self-explanatory.

• If time allows,

– In the tool options, we can show current active bone and it’s child bones so that, when we set rootbone to “Active”, we get an idea of the structure of the skeleton

– Find a way to also add linking bones to the layers. (Hard)

10.5.2 Milestones

• From June 1st to June 29th: (Eat- Sleep – Code -Repeat)

– Get the basic “click to set Active Bone” and “drag-click to draw bone” working.

• From June 29th to July 27th:

– Implement the remaining features.

– Adding the option “Make child to Current Active Bone” and make it work.

• From July 27th to August 24th:

– Extensive testing and implementing missing features (if any).

– Polishing the UI.

• From August 24th to August 31st:

– Wrapping up the project

106 Chapter 10. Projects

Page 111: Synfig developers docs - Read the Docs

CHAPTER 11

List of hotkeys

Little description:

As for developer there is a reason to split global hotkeys and content-aware hotkeys. They will have different imple-mentation, so we need a place to check is any conflicts between hotkeys. Also in the future this will be part of userdocumentation.

11.1 Global hotkeys

Hotkey ActionCtrl+N NewCtrl+O OpenCtrl+S SaveShift+Ctrl+S Save as. . .Ctrl+I ImportF11 PreviewF9 RenderCtrl+W Close documentCtrl+Q Quit‘ Maximize active window

11.2 Local hotkeys

Hotkey ActionArrows

• Navigation inside tree window• Move object (Animation window)

Space Start/Stop animation (All windows except input edits)

107

Page 112: Synfig developers docs - Read the Docs

Synfig developers docs

P.S. Note about markdown. That is strange, because CommonMarkup renders this text correctly, but Spinx is not. Willtry to check this later.

108 Chapter 11. List of hotkeys

Page 113: Synfig developers docs - Read the Docs

CHAPTER 12

Random notes

12.1 Building Synfig for production

Base dependency to run Synfig on Linux systems is glibc. It has backward compatibility, but not forward. So if youbuild Synfig on newer OS like Debian 9 it will not start on older OS like Debian 7. To do that we use Debian 7 dockerimage for building Synfig for production. For testing/debug purposes or for own usage you can build Synfig on anypreferred OS. glibc versions (obtained by using ldd –version): * Debian 7.11 - 2.13 * Debian 8.10 - 2.19

12.2 How to login to docker image?

sudo docker run -it debian/wheezy-backports /bin/bash -l

109

Page 114: Synfig developers docs - Read the Docs

Synfig developers docs

110 Chapter 12. Random notes

Page 115: Synfig developers docs - Read the Docs

CHAPTER 13

Code of Conduct

13.1 Values we Appreciate

These are the values to which people in the community should aspire.

• Be friendly and welcoming

• Be patient

– Remember that people have varying communication styles and that not everyone is using their nativelanguage. (Meaning and tone can be lost in translation.)

• Be thoughtful

– Productive communication requires effort. Think about how your words will be interpreted.

• Be respectful

– In particular, respect differences of opinion.

• Be charitable

– Interpret the arguments of others in good faith, do not seek to disagree.

– When we do disagree, try to understand why.

• Avoid destructive behavior:

– Derailing: stay on topic; if you want to talk about something else, start a new conversation.

– Unconstructive criticism: don’t merely decry the current state of affairs; offer—or at least so-licit—suggestions as to how things may be improved.

– Snarking (pithy, unproductive, sniping comments)

– Discussing potentially offensive or sensitive issues; this all too often leads to unnecessary conflict.

– Microaggressions: brief and commonplace verbal, behavioral and environmental indignities that com-municate hostile, derogatory or negative slights and insults to a person or group.

111

Page 116: Synfig developers docs - Read the Docs

Synfig developers docs

People are complicated. You should expect to be misunderstood and to misunderstand others; when this inevitablyoccurs, resist the urge to be defensive or assign blame. Try not to take offense where no offense was intended. Givepeople the benefit of the doubt. Even if the intent was to provoke, do not rise to it. It is the responsibility of all partiesto de-escalate conflict when it arises.

13.2 Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to makingparticipation in our project and our community a harassment-free experience for everyone, regardless of age, bodysize, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race,religion, or sexual identity and orientation.

13.3 Our Standards

Examples of behavior that contributes to creating a positive environment include:

• Using welcoming and inclusive language

• Being respectful of differing viewpoints and experiences

• Gracefully accepting constructive criticism

• Focusing on what is best for the community

• Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

• The use of sexualized language or imagery and unwelcome sexual attention or advances

• Trolling, insulting/derogatory comments, and personal or political attacks

• Public or private harassment

• Publishing others’ private information, such as a physical or electronic address, without explicit permission

• Other conduct which could reasonably be considered inappropriate in a professional setting

13.4 Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appro-priate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently anycontributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

13.5 Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing theproject or its community. Examples of representing a project or community include using an official project e-mailaddress, posting via an official social media account, or acting as an appointed representative at an online or offlineevent. Representation of a project may be further defined and clarified by project maintainers.

112 Chapter 13. Code of Conduct

Page 117: Synfig developers docs - Read the Docs

Synfig developers docs

13.6 Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project teamat [email protected]. All complaints will be reviewed and investigated and will result in a response that is deemednecessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regardto the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanentrepercussions as determined by other members of the project’s leadership.

13.7 Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/ and values are adapted from Golang conduct .

13.6. Enforcement 113

Page 118: Synfig developers docs - Read the Docs

Synfig developers docs

114 Chapter 13. Code of Conduct

Page 119: Synfig developers docs - Read the Docs

CHAPTER 14

Indices and tables

• search

115