## hcie-draw Projesi Nedir? **hcie-draw**, HCIE (HC Image Editor) Rust port'unun bir parçası olan **raster çizim motoru** kütüphanesidir. ### Projenin Amacı Bu kütüphane, RGBA piksel buffer'ları üzerine **vektörel çizim araçlarını** (çizgi, daire, elips, dikdörten, flood fill) ve **fırça darbelerini** (pressure-aware brush strokes) rasterize eder. Pure Rust ile yazılmış, GUI'den bağımsız bir çekirdek kütüphane. --- ### Mimari Yapı (Katman Bakışı) ``` ┌─────────────────────────────┐ │ hcie-core-app (Tauri GUI) │ ← Svelte frontend + Rust backend ├─────────────────────────────┤ │ hcie-engine-api │ ← Public API & command bridge ├─────────────────────────────┤ │ hcie-draw (bu crate) │ ← Rasterization motoru │ ├─ Layer │ • Pixel buffer yönetimi │ ├─ draw_line/circle/ellipse│ • Primitif çizim fonksiyonları │ ├─ draw_brush_stroke │ • Pressure-aware fırça │ └─ C FFI exports │ • Zero-copy native arayüz ├─────────────────────────────┤ │ hcie-blend │ ← Blend modları (Normal, Multiply, vb.) │ hcie-brush-engine │ ← Fırça tipi, spacing, jitter └─────────────────────────────┘ ``` --- ### Ana Bileşenler **`Layer` struct'ı:** ```rust pub struct Layer { pub name: String, pub pixels: Vec, // RGBA format (4 bayt/piksel) pub width: u32, pub height: u32, pub visible: bool, pub opacity: f32, pub dirty: bool, // Render invalidation flag } ``` **Çizim fonksiyonları:** | Fonksiyon | Açıklama | |-----------|----------| | `draw_line()` | Xiaolin Wu algoritmasıyla AA çizgi | | `draw_filled_circle()` | Doldurulmuş daire (kenar geçişli) | | `draw_filled_rect()` | Doldurulmuş dikdörtgen | | `draw_filled_ellipse()` | Doldurulmuş elips | | `flood_fill()` | Bağlamsız renk değiştirme | | `draw_brush_stamp()` | Tek fırça dampası | | `draw_brush_stroke()` | Tüm noktalar boyunca fırça izi | --- ### Çalışma Mantığı 1. **Piksel Erişimi**: `get_pixel()` / `set_pixel()` ile RGBA okuma-yazma 2. **Blend Entegrasyonu**: `hcie_blend::blend_pixels()` ile renk karıştırma 3. **Brush Entegrasyonu**: `hcie_brush_engine::draw_dab_capped()` ile fırça tipi uygulama 4. **Mask Desteği**: Opsiyonel selection mask (0-255) ile çizim sınırlandırma **Pressure-aware brush stroke akışı:** ``` Input: points = [(x, y, pressure), ...] ↓ brush_spacing_pixels() → spacing hesapla ↓ Her segment için interpolate → pressure değişimi ↓ jitter_offset() → pozisyon rastgelelik ↓ draw_dab_capped() → fırça dampası render et ``` --- ### C FFI Arayüzü Kütüphane **cdylib** olarak derlenir, bu sayede başka dillerden doğrudan çağrılabilir: ```c // draw_line_c - raw buffer pointer alır, in-place değiştirir void draw_line_c( uint8_t* pixels, uint32_t width, uint32_t height, float x0, float y0, float x1, float y1, const uint8_t* color_rgba, float line_thickness, const uint8_t* mask ); ``` Diğer FFI fonksiyonları: `draw_filled_rect_c`, `draw_filled_circle_c`, `flood_fill_c`, `draw_brush_stroke_c` --- ### Kullanım Örkeli Test runner'ı çalıştırmak: ```bash cargo test --manifest-path tests/draw_pixels.rs ``` GUI testörünü çalıştırmak: ```bash cargo run --example draw_tester ``` --- ### Bağımlılıklar ```toml [dependencies] hcie-blend = { path = "../hcie-blend" } # blend_pixels hcie-brush-engine = { path = "../hcie-brush-engine" } # brush tip & spacing ``` --- ### Özellikler - **Zero-copy FFI**: Buffer kopyası yok, doğrudan pointer manipülasyonu - **GUI bağımsız**: Pure Rust, egui/tauri olmadan da kullanılabilir - **Multi-threading hazır**: rayon entegrasyonu (blend katmanında) - **30+ fırça stıl**: BrushStyle enum'ı içinde (Round, Pencil, Oil, Watercolor, vb.)