您当前的位置: 首页 >  ui

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

illustrator插件开发-AI插件-第一章 第四小节 Suites类-模块加载

插件开发 发布时间:2022-04-14 11:45:00 ,浏览量:1

文章目录
    • 1.Suites类
    • 2.作者答疑

1.Suites类

  在illustrator里,有许多不同的功能模块,这些模块在插件开发中如果需要使用,就必须先加载,或者初始化,获取其接口。这时必然使用到Suites这个类。头文件代码如下:

struct ImportSuite
{
	const char *name;
	int version;
	void *suite;//指针变量
};
const ASInt32 kStartOptionalSuites	= 'OPTS';
const ASInt32 kEndAllSuites			= 0;

// The fAcquiredCount field is not necessarily maintained across unload/reloads;
// in fact it probably isn't.  Whenever we first create a Suites object after
// being loaded or reloaded, it's important to call InitializeRefCount on it.

class Suites
{
public:
	Suites();
	~Suites();
	ASErr Error() { return fError; }

	void InitializeRefCount() { fAcquiredCount = 1; }
	void acquire_Optional_Suites();

private:
	static ASUInt16 fAcquiredCount;
	ASErr fError;
	ASUInt16		fOptionalSuitesTotalCount;
	ASUInt16		fRequiredSuitesCount;
	ASUInt16		fOptionalSuitesAcquiredCount;

	ASErr AcquireSuites();//获取模块组件
	ASErr ReleaseSuites(); //释放模块组件
	ASErr AcquireSuite(ImportSuite *suite);
	ASErr ReleaseSuite(ImportSuite *suite);
};

  初始化函数,代码如下:

Suites::Suites()
: fOptionalSuitesTotalCount(0), 
  fOptionalSuitesAcquiredCount(0),
  fRequiredSuitesCount(0)
{
	fError = AcquireSuites();//请求加载模块
	ASUInt16 i = 0;
	while( (gImportSuites[i++].name != nil)) 
	{ ++fRequiredSuitesCount; } // Skip all required suites.

	if(gImportSuites[i - 1].version == kStartOptionalSuites)//计算额外模块
	{
		while(gImportSuites[i++].name != nil) 
		{
			++fOptionalSuitesTotalCount;
		}
	}
	if(kNoErr == fError)
		acquire_Optional_Suites();
}

  单个模块的请求加载,代码如下:

ASErr Suites::AcquireSuite(ImportSuite *suite)
{
	ASErr result = kNoErr;

	if (suite->suite != nil) {
		result = sSPBasic->AcquireSuite(suite->name, 
									suite->version, 
									(const void **)suite->suite);
	}
	return result;
}

  单个模块的释放卸载,代码如下:

ASErr Suites::ReleaseSuite(ImportSuite *suite)
{
	ASErr result = kNoErr;

	if (suite->suite != nil) {
		void **s = (void **) suite->suite;
		if (*s != nil) {
			result = sSPBasic->ReleaseSuite(suite->name, suite->version);
			*s = nil;
		}
	}
	return result;
}

  多个模块的请求加载,代码如下:

ASErr Suites::AcquireSuites()
{
	ASErr result = kNoErr;
	ASUInt16 i;

	if (fAcquiredCount == 0)
	{
		//基础模块
		for (i = 0; i             
关注
打赏
1665481431
查看更多评论
0.1652s