QuickPaint

Eklenti geliştirme

QuickPaint eklentileri, tek bir C fonksiyonu dışa aktaran dinamik kütüphanelerdir (.so / .dll / .dylib):

c
const QpPluginInfo* qp_plugin_entry(void);

Dönen tanımlayıcı ve işaret ettiği her şey süreç boyunca geçerli kalmalıdır. Tüm tipler crates/qp-plugin-api/src/lib.rs içinde #[repr(C)] olarak tanımlıdır; bu sayede eklentiler C, C++, Zig vb. dillerle de yazılabilir.

Kurulum yeri

Uygulama açılışta şu klasörlerdeki kütüphaneleri yükler:

  1. Çalıştırılabilir dosyanın yanındaki plugins/ klasörü
  2. Kullanıcı ayar klasöründeki plugins/ (Linux: ~/.config/quickpaint/plugins, Windows: %APPDATA%\EarthQuick\QuickPaint\config\plugins)

Yüklenen eklentiler ve hatalar Yardım > Eklentiler penceresinde görünür.

Rust ile efekt yazmak

toml
[lib]
crate-type = ["cdylib"]

[dependencies]
qp-plugin-api = { path = "../../crates/qp-plugin-api" }
rust
use qp_plugin_api::sdk::{self, Render};
use qp_plugin_api::*;

extern "C" fn invert_red(args: *const QpRenderArgs) -> i32 {
    let mut r = unsafe { Render::from_raw(args) };
    let amount = r.int(0) as f32 / 100.0;          // özellik sırasına göre değer
    r.map(|_x, _y, c| QpColor { r: c.r + ((255 - 2 * c.r as i32) as f32 * amount) as u8, ..c });
    0 // başarılı
}

export_plugin!(|| {
    sdk::plugin("Benim Eklentim", "Ben", "1.0.0", "Açıklama",
        vec![sdk::effect("me.invertred", "Kırmızıyı Ters Çevir", "Benim Menüm", menu::EFFECTS,
            vec![sdk::int("amount", "Miktar", 0, 100, 100)], invert_red)],
        vec![])
});

Özellik türleri

SDK fonksiyonuArayüzDeğer alanı
intkaydırıcıi
floatkaydırıcıf
booleanonay kutusui (0/1)
choiceradyo / açılır listei (indeks)
colorrenk seçici (birincil/ikincil/sabit varsayılan)color
angleaçı düğmesif (derece)
point2B konum seçici, merkeze göre -1..1f, f2
seed"Yeniden Tohumla" düğmesii

Render sözleşmesi

  • src ve dst düz (önçarpımsız) RGBA, satır aralığı width * 4 bayt.
  • dst başlangıçta src'nin kopyasıdır; yalnızca roi_* dikdörtgenini yazmanız yeterli.
  • Seçim maskesi uygulama tarafından sonradan uygulanır (seçim dışı pikseller geri yüklenir).
  • Uzun döngülerde Render::cancelled() kontrol edin, Render::progress() ile ilerleme bildirin.
  • Render bir arka plan iş parçacığında çalışır; global durum kullanıyorsanız iş parçacığı güvenliğine dikkat edin.

Dosya türü eklentisi

QpFileTypeInfo ile uzantı listesi ("raw;bin"), load, save ve free_image fonksiyonları verilir. load doldurduğu QpImage'ı uygulama işi bitince free_image ile size geri verir. Örnek: plugins/qp-sample-plugin içindeki .qraw türü.

ABI sürümü

QpPluginInfo::abi_version alanı QP_ABI_VERSION olmalıdır. Uyumsuz sürümler yüklenmez ve hata olarak listelenir.