222 lines
6.7 KiB
C++
222 lines
6.7 KiB
C++
|
|
|
|
|
|
#ifndef OFXH_IMAGE_EFFECT_API_H
|
|
#define OFXH_IMAGE_EFFECT_API_H
|
|
|
|
#include "ofxhPluginAPICache.h"
|
|
#include "ofxhPluginCache.h"
|
|
#include <string>
|
|
#include <map>
|
|
#include <set>
|
|
#include <memory>
|
|
#include <utility>
|
|
|
|
#include "ofxCore.h"
|
|
#include "ofxImageEffect.h"
|
|
#include "ofxhImageEffect.h"
|
|
#include "ofxhHost.h"
|
|
|
|
|
|
|
|
|
|
namespace OFX::Host::ImageEffect {
|
|
|
|
class PluginCache;
|
|
|
|
/// subclass of Plugin representing an ImageEffect plugin. used to store API-specific
|
|
/// data
|
|
class ImageEffectPlugin : public Plugin {
|
|
|
|
PluginCache &_pc;
|
|
|
|
// this comes off Descriptor's property set after a describe
|
|
// context independent
|
|
Descriptor *_baseDescriptor; /// NEEDS TO BE MADE WITH A FACTORY FUNCTION ON THE HOST!!!!!!
|
|
|
|
/// map to store contexts in
|
|
std::map<std::string, std::unique_ptr<Descriptor>> _contexts;
|
|
|
|
mutable std::set<std::string> _knownContexts;
|
|
mutable bool _madeKnownContexts;
|
|
|
|
std::unique_ptr<PluginHandle> _pluginHandle;
|
|
|
|
void addContextInternal(const std::string &context) const;
|
|
|
|
public:
|
|
ImageEffectPlugin(PluginCache &pc, PluginBinary *pb, int pi, OfxPlugin *pl);
|
|
|
|
ImageEffectPlugin(PluginCache &pc,
|
|
PluginBinary *pb,
|
|
int pi,
|
|
const std::string &api,
|
|
int apiVersion,
|
|
const std::string &pluginId,
|
|
const std::string &rawId,
|
|
int pluginMajorVersion,
|
|
int pluginMinorVersion);
|
|
|
|
~ImageEffectPlugin() override;
|
|
|
|
/// return the API handler this plugin was constructed by
|
|
APICache::PluginAPICacheI &getApiHandler() override;
|
|
|
|
|
|
/// get the base image effect descriptor
|
|
Descriptor &getDescriptor();
|
|
|
|
/// get the base image effect descriptor, const version
|
|
const Descriptor &getDescriptor() const;
|
|
|
|
/// get the image effect descriptor for the context
|
|
Descriptor *getContext(const std::string &context);
|
|
|
|
void addContext(const std::string &context);
|
|
void addContext(const std::string &context, std::unique_ptr<Descriptor> ied);
|
|
|
|
virtual void saveXML(std::ostream &os);
|
|
|
|
const std::set<std::string>& getContexts() const;
|
|
|
|
PluginHandle *getPluginHandle();
|
|
|
|
void unload();
|
|
|
|
/// this is called to make an instance of the effect
|
|
/// the client data ptr is what is passed back to the client creation function
|
|
ImageEffect::Instance* createInstance(const std::string &context, void *clientDataPtr);
|
|
|
|
};
|
|
|
|
class MajorPlugin {
|
|
std::string _id;
|
|
int _major;
|
|
|
|
public:
|
|
MajorPlugin(std::string id, int major) : _id(std::move(id)), _major(major) {
|
|
}
|
|
|
|
explicit MajorPlugin(ImageEffectPlugin *iep) : _id(iep->getIdentifier()), _major(iep->getVersionMajor()) {
|
|
}
|
|
|
|
[[nodiscard]] const std::string &getId() const {
|
|
return _id;
|
|
}
|
|
|
|
[[nodiscard]] int getMajor() const {
|
|
return _major;
|
|
}
|
|
|
|
bool operator<(const MajorPlugin &other) const {
|
|
if (_id < other._id)
|
|
return true;
|
|
|
|
if (_id > other._id)
|
|
return false;
|
|
|
|
if (_major < other._major)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
/// implementation of the specific Image Effect handler API cache.
|
|
class PluginCache : public APICache::PluginAPICacheI {
|
|
public:
|
|
|
|
private:
|
|
/// all plugins
|
|
std::vector<ImageEffectPlugin *> _plugins;
|
|
|
|
/// latest version of each plugin by ID
|
|
std::map<std::string, ImageEffectPlugin *> _pluginsByID;
|
|
|
|
/// latest minor version of each plugin by (ID,major)
|
|
std::map<MajorPlugin, ImageEffectPlugin *> _pluginsByIDMajor;
|
|
|
|
/// xml parsing state
|
|
ImageEffectPlugin *_currentPlugin;
|
|
/// xml parsing state
|
|
Property::Property *_currentProp;
|
|
|
|
Descriptor *_currentContext;
|
|
Param::Descriptor *_currentParam;
|
|
ClipDescriptor *_currentClip;
|
|
|
|
/// pointer to our image effect host
|
|
OFX::Host::ImageEffect::Host* _host;
|
|
|
|
public:
|
|
|
|
explicit PluginCache(OFX::Host::ImageEffect::Host &host);
|
|
|
|
~PluginCache() override;
|
|
|
|
/// get the plugin by id. vermaj and vermin can be specified. if they are not it will
|
|
/// pick the highest found version.
|
|
ImageEffectPlugin *getPluginById(const std::string &id, int vermaj=-1, int vermin=-1);
|
|
|
|
/// get the plugin by label. vermaj and vermin can be specified. if they are not it will
|
|
/// pick the highest found version.
|
|
ImageEffectPlugin *getPluginByLabel(const std::string &label, int vermaj=-1, int vermin=-1);
|
|
|
|
OFX::Host::ImageEffect::Host *getHost() {
|
|
return _host;
|
|
}
|
|
|
|
[[nodiscard]] const std::vector<ImageEffectPlugin *>& getPlugins() const;
|
|
|
|
[[nodiscard]] const std::map<std::string, ImageEffectPlugin *>& getPluginsByID() const;
|
|
|
|
[[nodiscard]] const std::map<MajorPlugin, ImageEffectPlugin *>& getPluginsByIDMajor() const
|
|
{
|
|
return _pluginsByIDMajor;
|
|
}
|
|
|
|
/// handle the case where the info needs filling in from the file. runs the "describe" action on the plugin.
|
|
void loadFromPlugin(Plugin *p) const override;
|
|
|
|
/// handler for preparing to read in a chunk of XML from the cache, set up context to do this
|
|
void beginXmlParsing(Plugin *p) override;
|
|
|
|
/// XML handler : element begins (everything is stored in elements and attributes)
|
|
void xmlElementBegin(const std::string &el, std::map<std::string, std::string> map) override;
|
|
|
|
void xmlCharacterHandler(const std::string &) override;
|
|
|
|
void xmlElementEnd(const std::string &el) override;
|
|
|
|
void endXmlParsing() override;
|
|
|
|
void saveXML(Plugin *ip, std::ostream &os) const override;
|
|
|
|
void confirmPlugin(Plugin *p) override;
|
|
|
|
bool pluginSupported(Plugin *p, std::string &reason) const override;
|
|
|
|
Plugin *newPlugin(PluginBinary *pb,
|
|
int pi,
|
|
OfxPlugin *pl) override;
|
|
|
|
Plugin *newPlugin(PluginBinary *pb,
|
|
int pi,
|
|
const std::string &api,
|
|
int apiVersion,
|
|
const std::string &pluginId,
|
|
const std::string &rawId,
|
|
int pluginMajorVersion,
|
|
int pluginMinorVersion) override;
|
|
|
|
void dumpToStdOut();
|
|
};
|
|
|
|
} // ImageEffect
|
|
|
|
// Host
|
|
|
|
// OFX
|
|
|
|
#endif
|