feat(kg-3): template

This commit is contained in:
2025-10-19 17:22:05 +03:00
parent 9de7d68dda
commit 886f7f4268
5 changed files with 156 additions and 0 deletions

4
kg/25-1/3/.clangd Normal file
View File

@ -0,0 +1,4 @@
CompileFlags:
Add:
- "-isystem"
- "/usr/include/gimp-3.0"

4
kg/25-1/3/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
build
dist
compile_commands.json
.cache

23
kg/25-1/3/Makefile Normal file
View File

@ -0,0 +1,23 @@
DIRS=dist build $(PLUGIN_DIR)
CXX=clang++ -std=c++23
NAME=seam_carving
PLUGIN_DIR=$(HOME)/.config/GIMP/3.0/plug-ins/$(NAME)
all: $(DIRS) $(PLUGIN_DIR)/$(NAME)
$(PLUGIN_DIR)/$(NAME): dist/plugin
cp $< $@
dist/plugin: build/plugin.o
$(CXX) $< -o $@ $(shell pkg-config --libs gimp-3.0 gimpui-3.0 gegl-0.4)
chmod +x $@
build/plugin.o: plugin.cpp
$(CXX) -c $< -o $@ $(shell pkg-config --cflags gimp-3.0 gimpui-3.0 gegl-0.4)
clean:
rm -rf $(DIRS)
rm compile_commands.json
$(DIRS):
mkdir -p $@

BIN
kg/25-1/3/README.docx Normal file

Binary file not shown.

125
kg/25-1/3/plugin.cpp Normal file
View File

@ -0,0 +1,125 @@
#include "gtk/gtk.h"
#include <cstddef>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpuitypes.h>
#include <libgimpbase/gimpbaseenums.h>
#define PLUG_IN_PROC "plug-in-seam-carving"
#define PLUG_IN_BINARY "seam_carving"
struct _Plugin {
GimpPlugIn parent_instance;
};
#define PLUGIN_TYPE (plugin_get_type())
G_DECLARE_FINAL_TYPE(Plugin, plugin, plugin, , GimpPlugIn)
static GList *plugin_query_procedures(GimpPlugIn *plug_in);
static GimpProcedure *plugin_create_procedure(GimpPlugIn *plug_in,
const gchar *name);
static GimpValueArray *plugin_run(GimpProcedure *procedure,
GimpRunMode run_mode, GimpImage *image,
GimpDrawable **drawables,
GimpProcedureConfig *config,
gpointer run_data);
G_DEFINE_TYPE(Plugin, plugin, GIMP_TYPE_PLUG_IN)
static void plugin_class_init(PluginClass *klass) {
GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS(klass);
plug_in_class->query_procedures = plugin_query_procedures;
plug_in_class->create_procedure = plugin_create_procedure;
}
static void plugin_init(Plugin *plugin) {}
static GList *plugin_query_procedures(GimpPlugIn *plug_in) {
return g_list_append(NULL, g_strdup(PLUG_IN_PROC));
}
static GimpProcedure *plugin_create_procedure(GimpPlugIn *plug_in,
const gchar *name) {
GimpProcedure *procedure = NULL;
if (g_strcmp0(name, PLUG_IN_PROC) == 0) {
procedure = gimp_image_procedure_new(
plug_in, name, GIMP_PDB_PROC_TYPE_PLUGIN, plugin_run, NULL, NULL);
gimp_procedure_set_sensitivity_mask(procedure,
GIMP_PROCEDURE_SENSITIVE_DRAWABLE);
gimp_procedure_set_menu_label(procedure, "_Seam carving");
gimp_procedure_add_menu_path(procedure, "<Image>/Filters/");
gimp_procedure_set_documentation(procedure, "Intelligent image resizing",
NULL, NULL);
gimp_procedure_set_attribution(procedure, "Vlad Litvinov <vlad@sek1.ro>",
"LGPL-3.0", "2025");
gimp_procedure_add_int_argument(procedure, "blur-factor", "Blur factor",
NULL, 0, 100, 20, G_PARAM_READWRITE);
gimp_procedure_add_int_argument(procedure, "horizontal-resize",
"Horizontal resize", NULL, 0, 100, 50,
G_PARAM_READWRITE);
}
return procedure;
}
static GimpValueArray *plugin_run(GimpProcedure *procedure,
GimpRunMode run_mode, GimpImage *image,
GimpDrawable **drawables,
GimpProcedureConfig *config,
gpointer run_data) {
gint blur_factor, horizontal_resize;
g_object_get(config, "blur-factor", &blur_factor, "horizontal-resize",
&horizontal_resize, NULL);
if (run_mode == GIMP_RUN_INTERACTIVE) {
GtkWidget *dialog, *area, *label_bf, *label_hr, *scale_bf, *scale_hr;
gimp_ui_init(PLUG_IN_BINARY);
dialog = gtk_dialog_new_with_buttons("Seam carving", NULL, GTK_DIALOG_MODAL,
"_Ok", GTK_RESPONSE_OK, "_Cancel",
GTK_RESPONSE_CANCEL, NULL);
gtk_window_set_resizable(GTK_WINDOW(dialog), false);
area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
gtk_widget_set_margin_start(area, 12);
gtk_widget_set_margin_end(area, 12);
gtk_widget_set_margin_top(area, 12);
scale_bf = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
scale_hr = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
gtk_range_set_value(GTK_RANGE(scale_bf), blur_factor);
gtk_range_set_value(GTK_RANGE(scale_hr), horizontal_resize);
label_bf = gtk_label_new("Blur factor");
label_hr = gtk_label_new("Horizontal resize");
gtk_box_pack_end(GTK_BOX(area), scale_hr, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(area), label_hr, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(area), scale_bf, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(area), label_bf, FALSE, FALSE, 0);
gtk_widget_show_all(dialog);
gint response = gtk_dialog_run(GTK_DIALOG(dialog));
switch (response) {
case GTK_RESPONSE_OK:
blur_factor = gtk_range_get_value(GTK_RANGE(scale_bf));
horizontal_resize = gtk_range_get_value(GTK_RANGE(scale_hr));
break;
default:
return gimp_procedure_new_return_values(procedure, GIMP_PDB_CANCEL, NULL);
}
}
return gimp_procedure_new_return_values(procedure, GIMP_PDB_SUCCESS, NULL);
}
GIMP_MAIN(PLUGIN_TYPE)