コード例 #1
0
ファイル: main.cpp プロジェクト: xmoeproject/X-moe
	/**
	 * レイヤデータの読み出し
	 * @param layer 読み出し先レイヤ
	 * @param no レイヤ番号
	 */
	void getLayerData(tTJSVariant layer, int no) {
		if (!layer.AsObjectNoAddRef()->IsInstanceOf(0, 0, 0, L"Layer", NULL)) {
			TVPThrowExceptionMessage(L"not layer");
		}
		checkLayerNo(no);

		psd_layer_record *lay = context->layer_records + no;
		if (lay->layer_type != psd_layer_type_normal) {
			TVPThrowExceptionMessage(L"invalid layer type");
		}

		int width  = lay->width;
		int height = lay->height;

		if (width <= 0 || height <= 0) {
			// サイズ0のレイヤはロードできない
			return;
		}

		ncbPropAccessor obj(layer);
		SETPROP(obj, lay, left);
		SETPROP(obj, lay, top);
		obj.SetValue(L"width",  width);
		obj.SetValue(L"height", height);
		obj.SetValue(L"type",   convBlendMode(lay->blend_mode));
		SETPROP(obj, lay, opacity);
		SETPROP(obj, lay, visible);
		obj.SetValue(L"imageLeft",  0);
		obj.SetValue(L"imageTop",   0);
		obj.SetValue(L"imageWidth",  width);
		obj.SetValue(L"imageHeight", height);
		obj.SetValue(L"name", layname(lay));

		// 画像データのコピー
		psd_argb_color *src = lay->image_data;
		int srclen = width * 4;
		unsigned char *buffer = (unsigned char*)obj.GetValue(L"mainImageBufferForWrite", ncbTypedefs::Tag<tjs_int>());
		int pitch = obj.GetValue(L"mainImageBufferPitch", ncbTypedefs::Tag<tjs_int>());
		for (int y=0;y<height;y++) {
			memcpy(buffer, (unsigned char*)src, srclen);
			src    += width;
			buffer += pitch;
		}
	}
コード例 #2
0
/**
 * レイヤ情報の取得
 * @param no レイヤ番号
 * @return レイヤ情報が格納された辞書
 */
tTJSVariant
PSD::getLayerInfo(int no)
{
	checkLayerNo(no);
	psd::LayerInfo &lay = layerList[no];
	tTJSVariant result;	
	ncbDictionaryAccessor dict;
	if (dict.IsValid()) {
#define SETPROP(dict, obj, prop) dict.SetValue(L ## #prop, obj.prop)
		SETPROP(dict, lay, top);
		SETPROP(dict, lay, left);
		SETPROP(dict, lay, bottom);
		SETPROP(dict, lay, right);
		SETPROP(dict, lay, width);
		SETPROP(dict, lay, height);
		SETPROP(dict, lay, opacity);
		bool mask = false;
		for (std::vector<psd::ChannelInfo>::iterator i = lay.channels.begin();
				 i != lay.channels.end();
				 i++) {
			if (i->isMaskChannel()) {
				mask = true;
				break;
			}
		}
		dict.SetValue(L"mask", mask);
		dict.SetValue(L"type",       convBlendMode(lay.blendMode));
		dict.SetValue(L"layer_type", lay.layerType);
		dict.SetValue(L"blend_mode", lay.blendMode);
		dict.SetValue(L"visible",    lay.isVisible());
		dict.SetValue(L"name",       layname(lay));

		// additional information
		SETPROP(dict, lay, clipping);
		dict.SetValue(L"layer_id", lay.layerId);
		dict.SetValue(L"obsolete", lay.isObsolete());
		dict.SetValue(L"transparency_protected", lay.isTransparencyProtected());
		dict.SetValue(L"pixel_data_irrelevant",  lay.isPixelDataIrrelevant());

		// レイヤーカンプ
		if (lay.layerComps.size() > 0) {
			ncbDictionaryAccessor compDict;
			if (compDict.IsValid()) {
				for (std::map<int, psd::LayerCompInfo>::iterator it = lay.layerComps.begin();
						 it != lay.layerComps.end(); it++)	{
					ncbDictionaryAccessor tmp;
					if (tmp.IsValid()) {
						psd::LayerCompInfo &comp = it->second;
						tmp.SetValue(L"id",         comp.id);
						tmp.SetValue(L"offset_x",   comp.offsetX);
						tmp.SetValue(L"offset_y",   comp.offsetY);
						tmp.SetValue(L"enable",     comp.isEnabled);
						compDict.SetValue((tjs_int32)comp.id, tmp.GetDispatch());
					}
				}
				dict.SetValue(L"layer_comp", compDict.GetDispatch());
			}
		}

		// SETPROP(dict, lay, adjustment_valid); // 調整レイヤーかどうか?レイヤタイプで判別可能
		// SETPROP(dict, lay, fill_opacity);
		// SETPROP(dict, lay, layer_name_id);
		// SETPROP(dict, lay, layer_version);
		// SETPROP(dict, lay, blend_clipped);
		// SETPROP(dict, lay, blend_interior);
		// SETPROP(dict, lay, knockout);
		// SETPROP(dict, lay, transparency); // lspf(protection)のもの
		// SETPROP(dict, lay, composite);
		// SETPROP(dict, lay, position_respectively);
		// SETPROP(dict, lay, sheet_color);
		// SETPROP(dict, lay, reference_point_x); // 塗りつぶしレイヤ(パターン)のオフセット
		// SETPROP(dict, lay, reference_point_y); // 塗りつぶしレイヤ(パターン)のオフセット
		// SETPROP(dict, lay, transparency_shapes_layer);
		// SETPROP(dict, lay, layer_mask_hides_effects);
		// SETPROP(dict, lay, vector_mask_hides_effects);
		// SETPROP(dict, lay, divider_type);
		// SETPROP(dict, lay, divider_blend_mode);

		// group layer はスクリプト側では layer_id 参照で引くようにする
		if (lay.parent != NULL)
			dict.SetValue(L"group_layer_id", lay.parent->layerId);

		result = dict;
	}

	return result;
}
コード例 #3
0
ファイル: os.c プロジェクト: shidasan/konoha2
void knh_System_initPath(CTX)
{
	CWB_t cwbbuf, *cwb = CWB_open(_ctx, &cwbbuf);
	kDictMap *sysprops = ctx->share->props;
	kbytes_t home = {{NULL}, 0}, user = {{NULL}, 0};

	// current working directory
	knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, STEXT("."));
	KSETv(ctx->share->rootks->path, new_Path(_ctx, knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos)));

	home.text = (const char*)knh_getenv("KONOHAHOME");
#if defined(K_KONOHAHOME)
	if(home.text == NULL) {
		home.text = K_KONOHAHOME;
	}
#endif
	if(home.text != NULL) {
		home.len = knh_strlen(home.text);
		SETPROP("konoha.home.path", new_T(home.text));
	}
#if defined(K_USING_WINDOWS_)
	{
		char buf[K_PATHMAX];
		int bufsiz = K_PATHMAX;
		HMODULE h = LoadLibrary(NULL);
		GetModuleshortnameA(h, buf, bufsiz);
		CWB_clear(cwb, 0);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, B(buf));
		SETPROP("konoha.bin.path", knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos));
		if(home.text == NULL) {
			kString *s;
			CWB_clear(cwb, 0);
			knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, B(buf));
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '\\');
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '\\');
			knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha"));
			s = CWB_newString(_ctx, cwb, 0);
			SETPROP("konoha.home.path", s);
			home = S_tobytes(s);
		}
	}
#elif defined(K_USING_LINUX_)
	// @url(http://shinh.skr.jp/binary/b2con.html)
	// http://doc.trolltech.com/3.3/qapplication.html#applicationDirPath
	{
		char buf[K_PATHMAX];
		int bufsiz = K_PATHMAX;
		ssize_t size = readlink("/proc/self/exe", buf, bufsiz);
		CWB_clear(cwb, 0);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, new_bytes2(buf, size));
		SETPROP("konoha.bin.path", knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos));
		if(home.text == NULL) {
			kString *s;
			CWB_clear(cwb, 0);
			knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, new_bytes2(buf, size));
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/');
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/');
			knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha"));
			s = CWB_newString(_ctx, cwb, 0);
			SETPROP("konoha.home.path", s);
			home = S_tobytes(s);
		}
	}
#elif defined(K_USING_MACOSX_)
	{
		kString *binpath;
		CWB_clear(cwb, 0);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, B(_dyld_get_image_name(0)));
		binpath = knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos);
		SETPROP("konoha.bin.path", binpath);
		if(home.text == NULL) {
			CWB_clear(cwb, 0);
			knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, S_tobytes(binpath));
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/');
			knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/');
			knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha"));
			kString *s = CWB_newString(_ctx, cwb, 0);
			SETPROP("konoha.home.path", s);
			home = S_tobytes(s);
		}
	}
#else
	home = STEXT("/opt/konoha");
	SETPROP("konoha.home.path", new_T("/opt/konoha"));
#endif
	DBG_ASSERT(home.utext != NULL);

	/* $konoha.package.path {$konoha.home.path}/package */
	CWB_clear(cwb, 0);
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, home);
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("package"));
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION));
	SETPROP("konoha.package.path", CWB_newString(_ctx, cwb, 0));

	/* $konoha.script.path {$konoha.home.path}/script */
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, home);
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("script"));
	knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION));
	SETPROP("konoha.script.path", CWB_newString(_ctx, cwb, 0));

#if defined(K_USING_WINDOWS_)
	user.text = knh_getenv("USERPROFILE");
#else
	user.text = knh_getenv("HOME");
#endif
	if(user.text != NULL) {
		/* $user.path */
		user.len = knh_strlen(user.text);
		knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, user);
		knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1, STEXT(K_KONOHAFOLDER));
		SETPROP("user.path", CWB_newString(_ctx, cwb, 0));
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, user);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1, STEXT(K_KONOHAFOLDER));
		knh_buff_mkdir(_ctx, cwb->ba, cwb->pos);
		CWB_clear(cwb, 0);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, user);
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(K_KONOHAFOLDER));
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("package"));
		knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION));
		SETPROP("user.package.path", CWB_newString(_ctx, cwb, 0));
	}
	CWB_close(_ctx, cwb);
}
コード例 #4
0
ファイル: main.cpp プロジェクト: xmoeproject/X-moe
	/**
	 * レイヤ情報の取得
	 * @param no レイヤ番号
	 * @return レイヤ情報が格納された辞書
	 */
	tTJSVariant getLayerInfo(int no) {
		checkLayerNo(no);
		psd_layer_record *lay = context->layer_records + no;
		tTJSVariant result;	
		ncbDictionaryAccessor dict;
		if (dict.IsValid()) {
#define SETPROP(dict, obj, prop) dict.SetValue(L ## #prop, obj->prop)
			SETPROP(dict, lay, layer_type);
			SETPROP(dict, lay, top);
			SETPROP(dict, lay, left);
			SETPROP(dict, lay, bottom);
			SETPROP(dict, lay, right);
			SETPROP(dict, lay, width);
			SETPROP(dict, lay, height);
			SETPROP(dict, lay, blend_mode);
			SETPROP(dict, lay, opacity);
			SETPROP(dict, lay, visible);
			dict.SetValue(L"name", layname(lay));
			dict.SetValue(L"type", convBlendMode(lay->blend_mode));

			// additional information
			SETPROP(dict, lay, clipping);
			SETPROP(dict, lay, transparency_protected);
			SETPROP(dict, lay, obsolete);
			SETPROP(dict, lay, pixel_data_irrelevant);
			// ...struct: layer_mask_info
			// ...struct: layer_blending_ranges
			// ...struct: vector_mask
			// ...array:  layer_info_type/data (layer_info_count)
			SETPROP(dict, lay, adjustment_valid); // 調整レイヤーかどうか?
			SETPROP(dict, lay, fill_opacity);
			SETPROP(dict, lay, layer_name_id);
			SETPROP(dict, lay, layer_id);
			SETPROP(dict, lay, layer_version);
			SETPROP(dict, lay, blend_clipped);
			SETPROP(dict, lay, blend_interior);
			SETPROP(dict, lay, knockout);
			SETPROP(dict, lay, transparency);
			SETPROP(dict, lay, composite);
			SETPROP(dict, lay, position_respectively);
			SETPROP(dict, lay, sheet_color);
			SETPROP(dict, lay, reference_point_x); // 塗りつぶしレイヤ(パターン)のオフセット
			SETPROP(dict, lay, reference_point_y); // 塗りつぶしレイヤ(パターン)のオフセット
			SETPROP(dict, lay, transparency_shapes_layer);
			SETPROP(dict, lay, layer_mask_hides_effects);
			SETPROP(dict, lay, vector_mask_hides_effects);
			SETPROP(dict, lay, divider_type);
			SETPROP(dict, lay, divider_blend_mode);

			// group layer はスクリプト側では layer_id 参照で引くようにする
			if (lay->group_layer != NULL)
				dict.SetValue(L"group_layer_id", lay->group_layer->layer_id);

			result = dict;
		}
		return result;
	}
コード例 #5
0
ファイル: os.c プロジェクト: shinpei/konoha-wand
void knh_System_initPath(CTX ctx, knh_System_t *o)
{
	knh_DictMap_t *sysprops = DP(o)->props;
	knh_path_t phbuf, *ph = knh_path_open(ctx, NULL, ".", &phbuf);
	knh_bytes_t home = {{NULL}, 0}, user = {{NULL}, 0};

	// current working directory
	knh_ospath(ctx, ph);
	KNH_SETv(ctx, ctx->share->rootns->rpath, knh_path_newString(ctx, ph, 0));

	home.text = (const char*)knh_getenv("KONOHAHOME");
#if defined(K_KONOHAHOME)
	if(home.text == NULL) {
		home.text = K_KONOHAHOME;
	}
#endif
	if(home.text != NULL) {
		home.len = knh_strlen(home.text);
		SETPROP("konoha.home.path", new_T(home.text));
	}
#if defined(K_USING_WINDOWS)
	{
		char buf[FILEPATH_BUFSIZ];
		int bufsiz = FILEPATH_BUFSIZ;
		HMODULE h = LoadLibrary(NULL);
		GetModuleFileNameA(h, buf, bufsiz);
		ph = knh_path_open_(ctx, NULL, B(buf), &phbuf);
		SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0));
		if(homepath == NULL) {
			knh_String_t *s;
			GetModuleFileNameA(h, buf, bufsiz);
			knh_path_reduce(ctx, ph, '/');
			s = knh_path_newString(ctx, ph);
			SETPROP("konoha.home.path", UPCAST(s));
			home = S_tobytes(shome);
		}
	}
#elif defined(K_USING_LINUX_)
	// @url(http://shinh.skr.jp/binary/b2con.html)
	// http://doc.trolltech.com/3.3/qapplication.html#applicationDirPath
	{
		char buf[FILEPATH_BUFSIZ];
		int bufsiz = FILEPATH_BUFSIZ;
		size_t size = readlink("/proc/self/exe", buf, bufsiz);
		ph = knh_path_open_(ctx, NULL, new_bytes2(buf, size), &phbuf);
		SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0));
		if(home.text == NULL) {
			knh_String_t *s;
			knh_path_reduce(ctx, ph, '/');
			knh_path_reduce(ctx, ph, '/');
			knh_path_append(ctx, ph, 1/*isSep*/, "konoha");
			s = knh_path_newString(ctx, ph, 0/*hasScheme*/);
			SETPROP("konoha.home.path", UPCAST(s));
			home = S_tobytes(s);
		}
	}
#elif defined(K_USING_MACOSX_)
	ph = knh_path_open(ctx, NULL, _dyld_get_image_name(0), &phbuf);
	knh_ospath(ctx, ph);
	SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0/*hasScheme*/));
	if(home.text == NULL) {
		knh_String_t *s;
		knh_path_reduce(ctx, ph, '/');
		knh_path_reduce(ctx, ph, '/');
		knh_path_append(ctx, ph, 1/*isSep*/, "konoha");
		s = knh_path_newString(ctx, ph, 0/*hasScheme*/);
		SETPROP("konoha.home.path", UPCAST(s));
		home = S_tobytes(s);
	}
#else
	home = STEXT("/opt/konoha");
	SETPROP("konoha.home.path", new_T("/opt/konoha"));
#endif
	DBG_ASSERT(home.utext != NULL);

	/* $konoha.package.path {$konoha.home.path}/package */
	knh_path_reset(ctx, ph, NULL, home);
	knh_path_append(ctx, ph, 1/*sep*/, "package");
	knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION);
	SETPROP("konoha.package.path", knh_path_newString(ctx, ph, 0/*hasScheme*/));

	/* $konoha.script.path {$konoha.home.path}/script */
	knh_path_reset(ctx, ph, NULL, home);
	knh_path_append(ctx, ph, 1/*sep*/, "script");
	knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION);
	SETPROP("konoha.script.path", knh_path_newString(ctx, ph, 0/*hasScheme*/));

#if defined(K_USING_WINDOWS)
	user.text = knh_getenv("USERPROFILE");
#else
	user.text = knh_getenv("HOME");
#endif
	if(user.text != NULL) {
		/* $user.path */
		user.len = knh_strlen(user.text);
		knh_path_reset(ctx, ph, NULL, user);
		knh_path_append(ctx, ph, 1/*sep*/, K_KONOHAFOLDER);
		SETPROP("user.path", knh_path_newString(ctx, ph, 0));
		knh_ospath(ctx, ph);
		knh_path_mkdir(ctx, ph);

		knh_path_reset(ctx, ph, NULL, user); /* user.package.path */
		knh_path_append(ctx, ph, 1/*sep*/, K_KONOHAFOLDER);
		knh_path_append(ctx, ph, 1/*sep*/, "package");
		knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION);
		SETPROP("user.package.path", knh_path_newString(ctx, ph, 0));
	}
	knh_path_close(ctx, ph);
}