xref: /haiku/src/libs/icon/transformer/CompoundStyleTransformer.cpp (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2023, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Zardshard
7  */
8 
9 
10 #include "CompoundStyleTransformer.h"
11 
12 #include <string.h>
13 
14 
15 _USING_ICON_NAMESPACE
16 
17 
18 CompoundStyleTransformer::CompoundStyleTransformer(
19 		StyleTransformer** transformers, int32 count)
20 	:
21 	fTransformers(transformers),
22 	fCount(count)
23 {
24 }
25 
26 
27 CompoundStyleTransformer::~CompoundStyleTransformer()
28 {
29 	for (int i = 0; i < fCount; i++)
30 		delete fTransformers[i];
31 	delete[] fTransformers;
32 }
33 
34 
35 void
36 CompoundStyleTransformer::transform(double* x, double* y) const
37 {
38 	for (int i = 0; i < fCount; i++) {
39 		if (fTransformers[i] != NULL)
40 			fTransformers[i]->transform(x, y);
41 	}
42 }
43 
44 
45 void
46 CompoundStyleTransformer::Invert()
47 {
48 	// reverse order of pipeline
49 	StyleTransformer* oldOrder[fCount];
50 	memcpy(oldOrder, fTransformers, fCount * sizeof(StyleTransformer*));
51 	for (int i = 0; i < fCount; i++) {
52 		fTransformers[fCount-i-1] = oldOrder[i];
53 	}
54 
55 	// invert individual transformations
56 	for (int i = 0; i < fCount; i++) {
57 		if (fTransformers[i] != NULL)
58 			fTransformers[i]->Invert();
59 	}
60 }
61 
62 
63 bool
64 CompoundStyleTransformer::IsLinear()
65 {
66 	bool linear = true;
67 	for (int i = 0; i < fCount; i++) {
68 		if (fTransformers[i] != NULL)
69 			linear &= fTransformers[i]->IsLinear();
70 	}
71 	return linear;
72 }
73