static int image_newindex(lua_State *L) { const char* membername = lua_tostring(L, -2); dt_image_t * my_image=checkwriteimage(L,-3); if(luaA_struct_has_member_name(L,dt_image_t,membername)) { if(luaA_type_has_to_func(luaA_struct_typeof_member_name(L,dt_image_t,membername))) { luaA_struct_to_member_name(L, dt_image_t, my_image, membername,-1); } else { releasewriteimage(L,my_image); luaL_error(L,"%s is read only",membername); } releasewriteimage(L,my_image); return 0; } switch(luaL_checkoption(L,-2,NULL,image_fields_name)) { case RATING: { int my_score = luaL_checkinteger(L,-1); if(my_score > 5) { releasewriteimage(L,my_image); return luaL_error(L,"rating too high : %d",my_score); } if(my_score == -1) my_score = 6; if(my_score < -1) { releasewriteimage(L,my_image); return luaL_error(L,"rating too low : %d",my_score); } my_image->flags &= ~0x7; my_image->flags |= my_score; break; } case CREATOR: dt_metadata_set(my_image->id,"Xmp.dc.creator",luaL_checkstring(L,-1)); dt_image_synch_xmp(my_image->id); break; case PUBLISHER: dt_metadata_set(my_image->id,"Xmp.dc.publisher",luaL_checkstring(L,-1)); dt_image_synch_xmp(my_image->id); break; case TITLE: dt_metadata_set(my_image->id,"Xmp.dc.title",luaL_checkstring(L,-1)); dt_image_synch_xmp(my_image->id); break; case DESCRIPTION: dt_metadata_set(my_image->id,"Xmp.dc.description",luaL_checkstring(L,-1)); dt_image_synch_xmp(my_image->id); break; case RIGHTS: dt_metadata_set(my_image->id,"Xmp.dc.title",luaL_checkstring(L,-1)); dt_image_synch_xmp(my_image->id); break; case LOCAL_COPY: { int imgid = my_image->id; luaL_checktype(L,-1,LUA_TBOOLEAN); // we need to release write image for the other functions to use it releasewriteimage(L,my_image); if(lua_toboolean(L,-1)) { dt_image_local_copy_set(imgid); } else { dt_image_local_copy_reset(imgid); } return 0; } default: releasewriteimage(L,my_image); return luaL_error(L,"unknown index for image : ",lua_tostring(L,-2)); } releasewriteimage(L,my_image); return 0; }
int dt_lua_init_image(lua_State *L) { luaA_struct(L, dt_image_t); luaA_struct_member(L, dt_image_t, exif_exposure, float); luaA_struct_member(L, dt_image_t, exif_aperture, float); luaA_struct_member(L, dt_image_t, exif_iso, float); luaA_struct_member(L, dt_image_t, exif_focal_length, float); luaA_struct_member(L, dt_image_t, exif_focus_distance, float); luaA_struct_member(L, dt_image_t, exif_crop, float); luaA_struct_member(L, dt_image_t, exif_maker, char_64); luaA_struct_member(L, dt_image_t, exif_model, char_64); luaA_struct_member(L, dt_image_t, exif_lens, char_128); luaA_struct_member(L, dt_image_t, exif_datetime_taken, char_20); luaA_struct_member(L, dt_image_t, filename, const char_filename_length); luaA_struct_member(L, dt_image_t, width, const int32_t); luaA_struct_member(L, dt_image_t, height, const int32_t); luaA_struct_member(L, dt_image_t, longitude, protected_double); // set to NAN if value is not set luaA_struct_member(L, dt_image_t, latitude, protected_double); // set to NAN if value is not set luaA_struct_member(L, dt_image_t, elevation, protected_double); // set to NAN if value is not set dt_lua_init_int_type(L, dt_lua_image_t); const char *member_name = luaA_struct_next_member_name(L, dt_image_t, LUAA_INVALID_MEMBER_NAME); while(member_name != LUAA_INVALID_MEMBER_NAME) { lua_pushcfunction(L, image_luaautoc_member); luaA_Type member_type = luaA_struct_typeof_member_name(L, dt_image_t, member_name); if(luaA_conversion_to_registered_type(L, member_type) || luaA_struct_registered_type(L, member_type) || luaA_enum_registered_type(L, member_type)) { dt_lua_type_register(L, dt_lua_image_t, member_name); } else { dt_lua_type_register_const(L, dt_lua_image_t, member_name); } member_name = luaA_struct_next_member_name(L, dt_image_t, member_name); } // read only members lua_pushcfunction(L, path_member); dt_lua_type_register_const(L, dt_lua_image_t, "path"); lua_pushcfunction(L, sidecar_member); dt_lua_type_register_const(L, dt_lua_image_t, "sidecar"); lua_pushcfunction(L, duplicate_index_member); dt_lua_type_register_const(L, dt_lua_image_t, "duplicate_index"); lua_pushcfunction(L, is_ldr_member); dt_lua_type_register_const(L, dt_lua_image_t, "is_ldr"); lua_pushcfunction(L, is_hdr_member); dt_lua_type_register_const(L, dt_lua_image_t, "is_hdr"); lua_pushcfunction(L, is_raw_member); dt_lua_type_register_const(L, dt_lua_image_t, "is_raw"); lua_pushcfunction(L, id_member); dt_lua_type_register_const(L, dt_lua_image_t, "id"); lua_pushcfunction(L, film_member); dt_lua_type_register_const(L, dt_lua_image_t, "film"); lua_pushcfunction(L, group_leader_member); dt_lua_type_register_const(L, dt_lua_image_t, "group_leader"); // read/write functions lua_pushcfunction(L, has_txt_member); dt_lua_type_register(L, dt_lua_image_t, "has_txt"); lua_pushcfunction(L, rating_member); dt_lua_type_register(L, dt_lua_image_t, "rating"); lua_pushcfunction(L, creator_member); dt_lua_type_register(L, dt_lua_image_t, "creator"); lua_pushcfunction(L, publisher_member); dt_lua_type_register(L, dt_lua_image_t, "publisher"); lua_pushcfunction(L, title_member); dt_lua_type_register(L, dt_lua_image_t, "title"); lua_pushcfunction(L, description_member); dt_lua_type_register(L, dt_lua_image_t, "description"); lua_pushcfunction(L, rights_member); dt_lua_type_register(L, dt_lua_image_t, "rights"); lua_pushcfunction(L, local_copy_member); dt_lua_type_register(L, dt_lua_image_t, "local_copy"); const char **name = dt_colorlabels_name; while(*name) { lua_pushcfunction(L, colorlabel_member); dt_lua_type_register(L, dt_lua_image_t, *name); name++; } // constant functions (i.e class methods) lua_pushcfunction(L, dt_lua_duplicate_image); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "duplicate"); lua_pushcfunction(L, dt_lua_delete_image); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "delete"); lua_pushcfunction(L, group_with); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "group_with"); lua_pushcfunction(L, make_group_leader); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "make_group_leader"); lua_pushcfunction(L, get_group); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "get_group_members"); lua_pushcfunction(L, dt_lua_tag_attach); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "attach_tag"); lua_pushcfunction(L, dt_lua_tag_detach); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "detach_tag"); lua_pushcfunction(L, dt_lua_tag_get_attached); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "get_tags"); lua_pushcfunction(L, dt_lua_style_apply); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "apply_style"); lua_pushcfunction(L, dt_lua_style_create_from_image); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "create_style"); lua_pushcfunction(L, history_delete); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "reset"); lua_pushcfunction(L, dt_lua_move_image); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "move"); lua_pushcfunction(L, dt_lua_copy_image); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "copy"); lua_pushcfunction(L, drop_cache); lua_pushcclosure(L, dt_lua_type_member_common, 1); dt_lua_type_register_const(L, dt_lua_image_t, "drop_cache"); lua_pushcfunction(L, image_tostring); dt_lua_type_setmetafield(L,dt_lua_image_t,"__tostring"); return 0; }