static int local_copy_member(lua_State *L) { if(lua_gettop(L) != 3) { const dt_image_t *my_image = checkreadimage(L, 1); lua_pushboolean(L, my_image->flags & DT_IMAGE_LOCAL_COPY); releasereadimage(L, my_image); return 1; } else { dt_image_t *my_image = checkwriteimage(L, 1); int imgid = my_image->id; luaL_checktype(L, 3, LUA_TBOOLEAN); // we need to release write image for the other functions to use it releasewriteimage(L, my_image); if(lua_toboolean(L, 3)) { dt_image_local_copy_set(imgid); } else { dt_image_local_copy_reset(imgid); } return 0; } }
static int group_leader_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); luaA_push(L, dt_lua_image_t, &(my_image->group_id)); releasereadimage(L, my_image); return 1; }
static int rating_member(lua_State *L) { if(lua_gettop(L) != 3) { const dt_image_t *my_image = checkreadimage(L, 1); int score = my_image->flags & 0x7; if(score > 6) score = 5; if(score == 6) score = -1; lua_pushinteger(L, score); releasereadimage(L, my_image); return 1; } else { dt_image_t *my_image = checkwriteimage(L, 1); int my_score = luaL_checkinteger(L, 3); 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; releasewriteimage(L, my_image); return 0; } }
static int id_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); lua_pushinteger(L, my_image->id); releasereadimage(L, my_image); return 1; }
static int film_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); luaA_push(L, dt_lua_film_t, &my_image->film_id); releasereadimage(L, my_image); return 1; }
static int is_raw_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); lua_pushboolean(L, dt_image_is_raw(my_image)); releasereadimage(L, my_image); return 1; }
static int duplicate_index_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); lua_pushinteger(L, my_image->version); releasereadimage(L, my_image); return 1; }
static int path_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); char pathname[PATH_MAX] = { 0 }; dt_image_film_roll_directory(my_image, pathname, sizeof(pathname)); lua_pushstring(L, pathname); releasereadimage(L, my_image); return 1; }
static int image_tostring(lua_State *L) { const dt_image_t * my_image=checkreadimage(L,-1); char image_name[PATH_MAX]; dt_image_full_path(my_image->id,image_name,PATH_MAX); dt_image_path_append_version(my_image->id,image_name,PATH_MAX); lua_pushstring(L,image_name); releasereadimage(L,my_image); return 1; }
static int image_tostring(lua_State *L) { const dt_image_t * my_image=checkreadimage(L,-1); char image_name[PATH_MAX]; gboolean from_cache = FALSE; dt_image_full_path(my_image->id, image_name, sizeof(image_name), &from_cache); dt_image_path_append_version(my_image->id, image_name, sizeof(image_name)); lua_pushstring(L,image_name); releasereadimage(L,my_image); return 1; }
static int sidecar_member(lua_State *L) { const dt_image_t *my_image = checkreadimage(L, 1); gboolean from_cache = TRUE; char filename[PATH_MAX] = { 0 }; dt_image_full_path(my_image->id, filename, sizeof(filename), &from_cache); dt_image_path_append_version(my_image->id, filename, sizeof(filename)); g_strlcat(filename, ".xmp", sizeof(filename)); lua_pushstring(L, filename); releasereadimage(L, my_image); return 1; }
/////////////// // toplevel and common /////////////// static int image_luaautoc_member(lua_State *L) { dt_lua_image_t imgid; luaA_to(L, dt_lua_image_t, &imgid, 1); const char *member_name = luaL_checkstring(L, 2); if(lua_gettop(L) != 3) { const dt_image_t *image = checkreadimage(L, 1); luaA_struct_push_member_name(L, dt_image_t, member_name, image); releasereadimage(L, image); return 1; } else { dt_image_t *image = checkwriteimage(L, 1); luaA_struct_to_member_name(L, dt_image_t, member_name, image, 3); releasewriteimage(L, image); return 0; } }
static int has_txt_member(lua_State *L) { if(lua_gettop(L) != 3) { const dt_image_t *my_image = checkreadimage(L, 1); int has_txt = my_image->flags & DT_IMAGE_HAS_TXT; lua_pushboolean(L, has_txt); releasereadimage(L, my_image); return 1; } else { dt_image_t *my_image = checkwriteimage(L, 1); if(lua_toboolean(L, 3)) my_image->flags |= DT_IMAGE_HAS_TXT; else my_image->flags &= ~DT_IMAGE_HAS_TXT; releasewriteimage(L, my_image); return 0; } }
static int rights_member(lua_State *L) { if(lua_gettop(L) != 3) { const dt_image_t *my_image = checkreadimage(L, 1); GList *res = dt_metadata_get(my_image->id, "Xmp.dc.rights", NULL); if(res) lua_pushstring(L, (char *)res->data); else lua_pushstring(L, ""); releasereadimage(L, my_image); g_list_free_full(res, g_free); return 1; } else { dt_image_t *my_image = checkwriteimage(L, 1); dt_metadata_set(my_image->id, "Xmp.dc.rights", luaL_checkstring(L, 3)); dt_image_synch_xmp(my_image->id); releasewriteimage(L, my_image); return 0; } }
static dt_image_t*checkwriteimage(lua_State*L,int index) { const dt_image_t* my_readimage=checkreadimage(L,index); return dt_image_cache_write_get(darktable.image_cache,my_readimage); }
static int image_index(lua_State *L) { const char* membername = lua_tostring(L, -1); const dt_image_t * my_image=checkreadimage(L,-2); if(luaA_struct_has_member_name(L,dt_image_t,membername)) { const int result = luaA_struct_push_member_name(L, dt_image_t, my_image, membername); releasereadimage(L,my_image); return result; } switch(luaL_checkoption(L,-1,NULL,image_fields_name)) { case PATH: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select folder from images, film_rolls where " "images.film_id = film_rolls.id and images.id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); if(sqlite3_step(stmt) == SQLITE_ROW) { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } else { sqlite3_finalize(stmt); releasereadimage(L,my_image); return luaL_error(L,"should never happen"); } sqlite3_finalize(stmt); break; } case DUP_INDEX: { // get duplicate suffix int version = 0; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select count(id) from images where filename in " "(select filename from images where id = ?1) and film_id in " "(select film_id from images where id = ?1) and id < ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); if(sqlite3_step(stmt) == SQLITE_ROW) version = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); lua_pushinteger(L,version); break; } case IS_LDR: lua_pushboolean(L,dt_image_is_ldr(my_image)); break; case IS_HDR: lua_pushboolean(L,dt_image_is_hdr(my_image)); break; case IS_RAW: lua_pushboolean(L,dt_image_is_raw(my_image)); break; case RATING: { int score = my_image->flags & 0x7; if(score >6) score=5; if(score ==6) score=-1; lua_pushinteger(L,score); break; } case ID: lua_pushinteger(L,my_image->id); break; case FILM: luaA_push(L,dt_lua_film_t,&my_image->film_id); break; case CREATOR: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select value from meta_data where id = ?1 and key = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, DT_METADATA_XMP_DC_CREATOR); if(sqlite3_step(stmt) != SQLITE_ROW) { lua_pushstring(L,""); } else { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); break; } case PUBLISHER: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select value from meta_data where id = ?1 and key = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, DT_METADATA_XMP_DC_PUBLISHER); if(sqlite3_step(stmt) != SQLITE_ROW) { lua_pushstring(L,""); } else { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); break; } case TITLE: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select value from meta_data where id = ?1 and key = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, DT_METADATA_XMP_DC_TITLE); if(sqlite3_step(stmt) != SQLITE_ROW) { lua_pushstring(L,""); } else { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); break; } case DESCRIPTION: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select value from meta_data where id = ?1 and key = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, DT_METADATA_XMP_DC_DESCRIPTION); if(sqlite3_step(stmt) != SQLITE_ROW) { lua_pushstring(L,""); } else { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); break; } case RIGHTS: { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select value from meta_data where id = ?1 and key = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, my_image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, DT_METADATA_XMP_DC_RIGHTS); if(sqlite3_step(stmt) != SQLITE_ROW) { lua_pushstring(L,""); } else { lua_pushstring(L,(char *)sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); break; } case GROUP_LEADER: { luaA_push(L,dt_lua_image_t,&(my_image->group_id)); break; } case APPLY_STYLE: { lua_pushcfunction(L,dt_lua_style_apply); break; } case CREATE_STYLE: { lua_pushcfunction(L,dt_lua_style_create_from_image); break; } case RESET: { lua_pushcfunction(L,history_delete); break; } case MOVE: { lua_pushcfunction(L,dt_lua_move_image); break; } case COPY: { lua_pushcfunction(L,dt_lua_copy_image); break; } case LOCAL_COPY: { lua_pushboolean(L,my_image->flags &DT_IMAGE_LOCAL_COPY); break; } default: releasereadimage(L,my_image); return luaL_error(L,"should never happen %s",lua_tostring(L,-1)); } releasereadimage(L,my_image); return 1; }