Files
hcie-rust-v3.05/hcie-draw/readme.md
T

128 lines
4.2 KiB
Markdown
Raw Normal View History

2026-07-09 02:59:53 +03:00
## 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<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ığı
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.)