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