# Boolean Operation

## Boolean Operation

The **Boolean Operation** in **Incari** provides similar functionality as its equivalent in *Figma*. It acts as *parent* to its *child* **Objects**. Any visual aspects are controlled completely by the **Boolean Operation**; the visual properties of the *children* do not have any precendent, such as a *child's* `Fill`.

![Boolean Operation.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-93dc58acdd27a42e2d1ea8be251cc24edbebb907%2Fbooleanoperationimage120232.png?alt=media)

There are several **Attributes** which allow the user heightened customizability and control.

* [**Transformation**](#transformation)
* [**Blending**](#blending)
* [**Fill**](#fill)
* [**Stroke**](#stroke)
* [**Mask**](#mask)
* [**Operation**](#operation)
* [**Tag**](#tag)

## Attributes

### Transformation

![Transformation Attributes.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-2c61d9a83c0cb34306d8df159bfa7da93c0f0bd8%2Fbuttonattstransformation.png?alt=media)

The `Transformation` **Attributes** deal with placement, rotation, and size in *XY* space. More information can be found [here](https://docs.incari.com/incari-studio/2023.2/objects-and-types/attributes/common-attributes/transformation).

### Blending

![Blending Attributes.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-92bbd8340c3ab7405f748d42bd01992a7c9ec2a4%2Ffigmablendingattribute.png?alt=media)

This **Attribute** lets the user set a `Blend Mode` as a base property of the **Ellipse**. These are established on common formulas, examples of each can be accessed [here](http://www.simplefilter.de/en/basics/mixmods.html). An **Object's** `Blend Mode` can also be set with the [**Set Blend Mode Node**](https://docs.incari.com/incari-studio/2023.2/toolbox/incari/object2d/setblendmode).

### Fill

The `Fill` **Attributes** consist of different items called `Elements`. Each `Element` contains a `Type`. This can be either `Solid` or `Image` and changes some of the available **Attributes** under this category.

If there is more than one `Fill Element`, the most recent one will take precedent over the others (unless some `Blend Mode` is applied).

#### Solid

![Fill Attributes with Type Solid.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-50708bd3bff5b5fea6140772a60d9a86f8f3fd1a%2Fbooleanoperationfill20232.png?alt=media)

When `Solid` is selected, `Color` is visible.

* `Color` is a color selector that lets the user pick the `Fill's` color.
* Similar to the base property described previously, `Blend Mode` here affects the `Fill Elements` only. These are established on common formulas, examples of each can be accessed [here](http://www.simplefilter.de/en/basics/mixmods.html). It can also be set with the [**Set Blend Mode Node**](https://docs.incari.com/incari-studio/2023.2/toolbox/incari/object2d/setblendmode).
* `Opacity` refers to how opaque or transparent the `Fill` appears. This is represented by an integer between 0 and 1.

#### Image

![Fill Attributes with Type Image.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-740546c12bdb08d58c7df56323b76bab3260f679%2Ffigmafillimageatts.png?alt=media)

When `Image` is selected, `Image` and `Fit Mode` are visible.

* `Image` is the desired **Texture** file.
* `Fit Mode` determines how the **Texture** is displayed. These can be `Fill`, `Fit`, `Crop`, and `Tile`. `Tile` has the additional **Attribute** of `Scale Factor`, which augments the tesselation.
* Similar to the base property described previously, `Blend Mode` here affects the `Fill Elements` only. These are established on common formulas, examples of each can be accessed [here](http://www.simplefilter.de/en/basics/mixmods.html). It can also be set with the [**Set Blend Mode Node**](https://docs.incari.com/incari-studio/2023.2/toolbox/incari/object2d/setblendmode).
* `Opacity` refers to how opaque or transparent the `Fill` appears. This is represented by an integer between 0 and 1.

### Stroke

The `Stroke` **Attributes** consist of different items called `Elements`. Each `Element` contains a `Type`. This can be either `Solid` or `Image` and changes some of the available **Attributes** under this category. There are also two fixed **Attributes** outside of the `Elements`. These are:

* `Width`, which is how wide (in pixels) each `Stroke` will appear. This applies to each `Stroke Element`.
* `Position`, which determines what part of the outline identifies the outside of the **Object**. For example, if `Inner` is selected, then the outside of the `Stroke` is the outside of the **Object**. If `Center` is selected, then the `Stroke's` center is the outside of the **Object**. If `Outer` is selected, then the inside of the `Stroke` is the outside of the **Object**.

#### Solid

![Stroke Attributes with Type Solid.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-07da3627c47128c9249c2895730d086764b4c07e%2Fbooleanoperationstroke20232.png?alt=media)

When `Solid` is selected, `Color` is visible.

* `Color` is a color selector that lets the user pick the `Stroke's` color.
* Similar to the base property described previously, `Blend Mode` here affects the `Stroke Elements` only. These are established on common formulas, examples of each can be accessed [here](http://www.simplefilter.de/en/basics/mixmods.html). It can also be set with the [**Set Blend Mode Node**](https://docs.incari.com/incari-studio/2023.2/toolbox/incari/object2d/setblendmode).
* `Opacity` refers to how opaque or transparent the `Stroke` appears. This is represented by an integer between 0 and 1.

#### Image

![Stroke Attributes with Type Image.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-be82531f390672f345f57298dc20515cc48acfea%2Ffigmastrokeimage.png?alt=media)

When `Image` is selected, `Image` and `Fit Mode` are visible.

* `Image` is the desired **Texture** file.
* `Fit Mode` determines how the **Texture** is displayed. These can be `Fill`, `Fit`, `Crop`, and `Tile`. `Tile` has the additional **Attribute** of `Scale Factor`, which augments the tesselation.
* Similar to the base property described previously, `Blend Mode` here affects the `Stroke Elements` only. These are established on common formulas, examples of each can be accessed [here](http://www.simplefilter.de/en/basics/mixmods.html). It can also be set with the [**Set Blend Mode Node**](https://docs.incari.com/incari-studio/2023.2/toolbox/incari/object2d/setblendmode).
* `Opacity` refers to how opaque or transparent the `Fill` appears. This is represented by an integer between 0 and 1.

### Mask

A **Mask** is an **Object** that shows a certain area of another **Object** while concealing the rest. Any **Object** (e.g., an **Ellipse**, **Rectangle**, **Frame**, **Group**, or **Text**) can be used as a **Mask**.

For easier visualization, think of the **Mask** as a cookie cutter while the masked **Object** is the dough: the cookie cutter shows only a part and discards the rest.

![Mask Attributes.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-3522d2bf131b5d03d6f9dff4d1c31b27f52c646f%2Ffigmamaskattsreal.png?alt=media)

The `Type` **Attribute** has three options:

* `None` - nothing is applied.
* `Alpha` - the **Mask** has an opacity level (alpha channel) determining with which level of opacity (or transparency) the masked **Object** is revealed: 0% opacity reveals nothing, 100% opacity is equivalent to a **Mask** with `Vector` type.
* `Vector` - only modifies the shape outline of the masked **Object**
* `Luminance` - allows the user to utilize brightness to determine the effect of the **Mask**; the brighter the area of a **Mask**, the more that is revealed and the darker the area, the less that is revealed.

`Object` allows the user to select what should be the masked **Object**.

`Apply Mask` is a toggle that applies the **Mask** when set to on, and disables the **Mask** when set to off.

### Operation

The `Operation` **Attribute** implements the four functions:

* [Exclude](#exclude)
* [Intersect](#intersect)
* [Subtract](#subtract)
* [Union](#union)

Thie *child* **Objects** form the shape that will be the core of what is displayed throught the different operations. The *base* **Object** is always the last *child* **Object** in the **Scene Outliner**. In the image below, the *base* **Object** is the **Rectangle**.

![](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-97e39b8dc66806db1974963c906e023e42a100fb%2Fbooleanoperationsceneoutliner.png?alt=media)

#### Exclude

![](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-05e566a18133c59531043eb9aefbe310913c4004%2Fbooleanoperationexclude.png?alt=media)

`Exclude` displays all *child* **Objects** but removes any overlapping parts of other *children* from the *base* **Object**. Since the **Rectangle** is the base **Object** in the example above, the overlapping section of the **Ellipse** (the other *child* **Object**) is removed.

#### Intersect

![](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-c5c715851873416ae2c00df531a5ff2237c3fdf3%2Fbooleanoperationintersect.png?alt=media)

`Intersect` displays *only* the parts of the other *children* **Objects** which overlap with the *base* **Object**. Here, the top-left quadrant of the **Ellipse** (which is represented by the right bounding box) overlaps with the **Rectangle** (which is represented by the left bounding box). Their intersection remains visible.

#### Subtract

![](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-39b5e11e409ad5f9f33c2e1511e84cd7e6761132%2Fbooleanoperationsubtract.png?alt=media)

`Subtract` removes the *base* **Object** completely, even the parts which overlap with the other *children*. Since the **Rectangle** is the *base* **Object** in the example above and it's bottom-right quarter overlaps the **Ellipse**, this is removed as well.

#### Union

![](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-5dde26bbb19b55072d93b56e7e94eca09a21a2c1%2Fbooleanoperationunion.png?alt=media)

`Union` combines all *children* as a single **Object**. In this example, there are only two **Objects**: an **Ellipse** and a **Rectangle**. There are no separating lines anymore and both take the color given to the **Boolean Operation** (in this case, red).

### Tag

![Tag Attributes.](https://2561100106-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff6JZovzOqBctA4C1o76u%2Fuploads%2Fgit-blob-dc4f375e34ce9bdd2bebc3e93ff34c8680ab55bb%2Fbuttonattstag.png?alt=media)

This **Attribute** manages the *tags* for the **Button**. See more on *tags* [here.](https://docs.incari.com/incari-studio/2023.2/objects-and-types/attributes/common-attributes/tag)
