/** * レイヤデータの読み出し * @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; } }
/** * レイヤ情報の取得 * @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; }
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); }
/** * レイヤ情報の取得 * @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; }
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); }