1
2
3 #include "stdfx.h"
4 #include "tfxparam.h"
5 #include "ttzpimagefx.h"
6
7 //===================================================================
8
9 class PaletteFilterFx final : public TStandardRasterFx {
10 FX_PLUGIN_DECLARATION(PaletteFilterFx)
11
12 TRasterFxPort m_input;
13 TStringParamP m_string;
14 TIntEnumParamP m_keep;
15 TIntEnumParamP m_type;
16
17 public:
PaletteFilterFx()18 PaletteFilterFx()
19 : m_string(L"1,2,3")
20 , m_type(new TIntEnumParam(0, "Lines & Areas"))
21 , m_keep(new TIntEnumParam(0, "Delete"))
22
23 {
24 addInputPort("Source", m_input);
25 bindParam(this, "indexes", m_string);
26 bindParam(this, "keep", m_keep);
27 bindParam(this, "type", m_type);
28 m_type->addItem(1, "Lines");
29 m_type->addItem(2, "Areas");
30 m_type->addItem(3, "Lines & Areas (No Gap)");
31 m_type->addItem(4, "Lines (Delete All Areas)");
32 m_type->addItem(5, "Areas (Delete All Lines)");
33
34 m_keep->addItem(1, "Keep");
35 }
36
~PaletteFilterFx()37 ~PaletteFilterFx(){};
38
doGetBBox(double frame,TRectD & bBox,const TRenderSettings & info)39 bool doGetBBox(double frame, TRectD &bBox,
40 const TRenderSettings &info) override {
41 if (m_input.isConnected()) {
42 bool ret = m_input->doGetBBox(frame, bBox, info);
43 return ret;
44 } else {
45 bBox = TRectD();
46 return false;
47 }
48 }
49
50 void doDryCompute(TRectD &rect, double frame,
51 const TRenderSettings &info) override;
52 void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
53
canHandle(const TRenderSettings & info,double frame)54 bool canHandle(const TRenderSettings &info, double frame) override {
55 return true;
56 }
57
allowUserCacheOnPort(int port)58 bool allowUserCacheOnPort(int port) override { return false; }
59 };
60
61 //-------------------------------------------------------------------
62
doDryCompute(TRectD & rect,double frame,const TRenderSettings & info)63 void PaletteFilterFx::doDryCompute(TRectD &rect, double frame,
64 const TRenderSettings &info) {
65 if (!m_input.isConnected()) return;
66
67 std::vector<std::string> items;
68 std::string indexes = ::to_string(m_string->getValue());
69 parseIndexes(indexes, items);
70 TRenderSettings ri2(info);
71 PaletteFilterFxRenderData *PaletteFilterData = new PaletteFilterFxRenderData;
72 insertIndexes(items, PaletteFilterData);
73 PaletteFilterData->m_keep = (bool)(m_keep->getValue() == 1);
74 switch (m_type->getValue()) {
75 case 0:
76 PaletteFilterData->m_type = eApplyToInksAndPaints;
77 break;
78 case 1:
79 PaletteFilterData->m_type = eApplyToInksKeepingAllPaints;
80 break;
81 case 2:
82 PaletteFilterData->m_type = eApplyToPaintsKeepingAllInks;
83 break;
84 case 3:
85 PaletteFilterData->m_type = eApplyToInksAndPaints_NoGap;
86 break;
87 case 4:
88 PaletteFilterData->m_type = eApplyToInksDeletingAllPaints;
89 break;
90 case 5:
91 PaletteFilterData->m_type = eApplyToPaintsDeletingAllInks;
92 break;
93 default:
94 assert(false);
95 }
96
97 ri2.m_data.push_back(PaletteFilterData);
98 ri2.m_userCachable = false;
99 m_input->dryCompute(rect, frame, ri2);
100 }
101
102 //-------------------------------------------------------------------
103
doCompute(TTile & tile,double frame,const TRenderSettings & ri)104 void PaletteFilterFx::doCompute(TTile &tile, double frame,
105 const TRenderSettings &ri) {
106 if (!m_input.isConnected()) return;
107
108 std::vector<std::string> items;
109 std::string indexes = ::to_string(m_string->getValue());
110 parseIndexes(indexes, items);
111 TRenderSettings ri2(ri);
112 PaletteFilterFxRenderData *PaletteFilterData = new PaletteFilterFxRenderData;
113 insertIndexes(items, PaletteFilterData);
114 PaletteFilterData->m_keep = (bool)(m_keep->getValue() == 1);
115 switch (m_type->getValue()) {
116 case 0:
117 PaletteFilterData->m_type = eApplyToInksAndPaints;
118 break;
119 case 1:
120 PaletteFilterData->m_type = eApplyToInksKeepingAllPaints;
121 break;
122 case 2:
123 PaletteFilterData->m_type = eApplyToPaintsKeepingAllInks;
124 break;
125 case 3:
126 PaletteFilterData->m_type = eApplyToInksAndPaints_NoGap;
127 break;
128 case 4:
129 PaletteFilterData->m_type = eApplyToInksDeletingAllPaints;
130 break;
131 case 5:
132 PaletteFilterData->m_type = eApplyToPaintsDeletingAllInks;
133 break;
134 default:
135 assert(false);
136 }
137
138 ri2.m_data.push_back(PaletteFilterData);
139 ri2.m_userCachable = false;
140 m_input->compute(tile, frame, ri2);
141 }
142
143 FX_PLUGIN_IDENTIFIER(PaletteFilterFx, "paletteFilterFx");
144