4.2 KiB
4.2 KiB
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'ı:
pub struct Layer {
pub name: String,
pub pixels: Vec<u8>, // 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ığı
- Piksel Erişimi:
get_pixel()/set_pixel()ile RGBA okuma-yazma - Blend Entegrasyonu:
hcie_blend::blend_pixels()ile renk karıştırma - Brush Entegrasyonu:
hcie_brush_engine::draw_dab_capped()ile fırça tipi uygulama - 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:
// 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:
cargo test --manifest-path tests/draw_pixels.rs
GUI testörünü çalıştırmak:
cargo run --example draw_tester
Bağımlılıklar
[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.)