SDLPainter 1.2.0
SDL3 + OpenGL/Vulkan 2D çizim kütüphanesi
Yüklüyor...
Arıyor...
Eşleşme Yok
sdl_painter::Painter Sınıf Referans

Ana çizim sınıfı Ayrıntılar...

#include <painter.h>

Public Üye Fonksiyonlar

 Painter (SDL_Window *window, RendererBackend backend)
 Belirtilen pencere ve backend ile Painter oluştur.
 Painter (std::unique_ptr< IRenderer > renderer, int32_t viewport_width, int32_t viewport_height)
 Hazır bir renderer ile pencere olmadan Painter oluştur.
bool IsValid () const noexcept
 Renderer başarıyla başlatıldı mı?
void Begin ()
 Frame başlangıcı — her frame başında çağrılmalı.
void End ()
 Frame sonu — her frame sonunda çağrılmalı, ekrana sunar.
void SetDrawableSize (int32_t width, int32_t height)
 Çizim yüzeyi boyutunu bildir (viewport + projeksiyon güncellenir).
void SetViewport (int32_t x, int32_t y, int32_t width, int32_t height)
 Çizimi pencerenin bir alt dikdörtgeniyle sınırla.
void ResetViewport ()
 Viewport'u tüm çizim yüzeyine geri al.
void Clear (const Color &color)
 Ekranı belirtilen renkle temizle.
const FrameStatsGetFrameStats () const noexcept
 Son tamamlanan karenin çizim istatistikleri.
void SetPen (const Pen &pen)
 Aktif kalemi ayarla (çizgi rengi ve kalınlığı).
void SetBrush (const Brush &brush)
 Aktif fırçayı ayarla (dolgu rengi).
void SetFont (std::shared_ptr< Font > font)
 Aktif fontu ayarla.
const std::shared_ptr< Font > & GetFont () const noexcept
 Aktif font (yoksa nullptr).
void SetOpacity (float alpha)
 Global opaklığı ayarla [0.0, 1.0].
void SetBlendMode (BlendMode mode)
 Renk karıştırma modunu ayarla.
BlendMode GetBlendMode () const noexcept
 Yürürlükteki karıştırma modu.
void DrawLine (float x1, float y1, float x2, float y2)
 İki nokta arasına çizgi çiz.
void DrawRect (float x, float y, float w, float h)
 Dikdörtgen çerçeve çiz (dolgu yok).
void FillRect (float x, float y, float w, float h)
 Dikdörtgeni doldur.
void DrawRoundedRect (float x, float y, float w, float h, float radius)
 Yuvarlatılmış köşeli dikdörtgen çerçevesi çiz.
void FillRoundedRect (float x, float y, float w, float h, float radius)
 Yuvarlatılmış köşeli dikdörtgeni doldur.
void DrawCircle (float cx, float cy, float radius)
 Daire çerçeve çiz.
void FillCircle (float cx, float cy, float radius)
 Daireyi doldur.
void DrawEllipse (float cx, float cy, float rx, float ry)
 Elips çerçeve çiz.
void FillEllipse (float cx, float cy, float rx, float ry)
 Elipsi doldur.
void DrawArc (float cx, float cy, float rx, float ry, float start_degrees, float sweep_degrees)
 Yay çiz (açık — uçları birleştirilmez).
void DrawPie (float cx, float cy, float rx, float ry, float start_degrees, float sweep_degrees)
 Dilim (pie) çerçevesi — yay artı merkeze giden iki yarıçap.
void FillPie (float cx, float cy, float rx, float ry, float start_degrees, float sweep_degrees)
 Dilimi doldur. Çizelgelerin (pasta grafik) temel yapı taşı.
void DrawChord (float cx, float cy, float rx, float ry, float start_degrees, float sweep_degrees)
 Kiriş (chord) çerçevesi — yay artı uçlarını birleştiren doğru.
void FillChord (float cx, float cy, float rx, float ry, float start_degrees, float sweep_degrees)
 Kirişi doldur.
void DrawPolygon (const std::vector< Point > &points)
 Çok kenarlı kapalı şeklin çerçevesini çiz.
void FillPolygon (const std::vector< Point > &points)
 Çok kenarlıyı doldur (ear clipping tessellation).
void DrawPolyline (const std::vector< Point > &points)
 Açık çizgi dizisi çiz.
void DrawImage (const Image &image, float x, float y, const Color &tint=Color::White(), ImageFlip flip=ImageFlip::kNone)
 Görüntüyü orijinal boyutuyla çiz.
void DrawImage (const Image &image, const Rect &dest_rect, const Color &tint=Color::White(), ImageFlip flip=ImageFlip::kNone)
 Görüntüyü hedef dikdörtgene ölçekleyerek çiz.
void DrawImageMesh (const Image &image, int32_t cols, int32_t rows, const std::vector< Point > &points, const Color &tint=Color::White())
 Dokuyu serbest biçimli bir ızgara üzerine çiz.
void UpdateImage (const Image &image, const uint8_t *rgba)
 Yüklenmiş bir görüntünün doku içeriğini yerinde güncelle.
void DrawImage (const Image &image, const Rect &src_rect, const Rect &dest_rect, const Color &tint=Color::White(), ImageFlip flip=ImageFlip::kNone)
 Görüntünün kaynak dikdörtgenini hedef dikdörtgene çiz.
void DrawText (float x, float y, const std::string &text)
 Noktaya metin çiz.
void DrawText (const Rect &rect, const std::string &text, Alignment alignment=Alignment::kLeft, TextWrap wrap=TextWrap::kNone)
 Dikdörtgen içine hizalanmış metin çiz.
std::size_t CountTextLines (const std::string &text, float max_width, TextWrap wrap) const
 Sarmalanmış metnin kaç satır tutacağını hesapla (çizmeden).
void Save ()
 Mevcut render durumunu stack'e kaydet.
void Restore ()
 Son kaydedilen durumu geri yükle.
void Translate (float dx, float dy)
 Öteleme uygula.
void Rotate (float angle_degrees)
 Döndürme uygula (derece).
void Scale (float sx, float sy)
 Ölçekleme uygula.
void ResetTransform ()
 Transform'u birim matrise sıfırla.
void SetClipRect (const Rect &rect)
 Scissor kırpma dikdörtgeni ayarla.
void ClearClip ()
 Kırpma dikdörtgenini kaldır.

Ayrıntılı tanımlama

Ana çizim sınıfı

Painter, SDL penceresi üzerinde 2B çizim yapar. Backend (OpenGL/Vulkan) IRenderer arayüzü üzerinden soyutlanır.

Uyarı
Yaşam döngüsü sözleşmesi: Painter'a texture yükleyen tüm Image ve Font nesneleri, Painter yıkılmadan önce yıkılmalıdır. Image veya Font'u global / static ya da daha uzun yaşayan bir konuma yerleştirmek tanımsız davranışa yol açar — yıkım sırasında dangling IRenderer pointer kullanılır. v0.2.0'da bu sözleşme weak_ptr<IRenderer> veya benzeri bir mekanizma ile zorunlu kılınacaktır.

Constructor & Destructor Dokümantasyonu

◆ Painter()

sdl_painter::Painter::Painter ( std::unique_ptr< IRenderer > renderer,
int32_t viewport_width,
int32_t viewport_height )

Hazır bir renderer ile pencere olmadan Painter oluştur.

Renderer'ın sahipliği devralınır; Initialize() çağrısı yapılmaz (çağıranın sorumluluğu). Pencere olmadığı için Begin her karede yeniden boyutlandırma yoklaması yapmaz — viewport bu ctor'da verilen değerde sabit kalır.

Offscreen render ve birim testleri (sahte IRenderer enjeksiyonu) için.

Parametreler
rendererSahipliği devralınan renderer; nullptr ise Painter geçersiz durumda kalır (IsValid false).
viewport_widthViewport genişliği (piksel, > 0).
viewport_heightViewport yüksekliği (piksel, > 0).

Üye Fonksiyon Dokümantasyonu

◆ CountTextLines()

std::size_t sdl_painter::Painter::CountTextLines ( const std::string & text,
float max_width,
TextWrap wrap ) const
nodiscard

Sarmalanmış metnin kaç satır tutacağını hesapla (çizmeden).

Yerleşim hesabı için: kutunun yüksekliğini metne göre belirlemek isteyenin, metni önce çizip ölçmesi gerekmesin.

Döndürdüğü değer
Satır sayısı; font yoksa veya metin boşsa 0.

◆ DrawArc()

void sdl_painter::Painter::DrawArc ( float cx,
float cy,
float rx,
float ry,
float start_degrees,
float sweep_degrees )

Yay çiz (açık — uçları birleştirilmez).

Açı birimi derece. 0° = +x ekseni ve açı, Rotate ile aynı yönde artar. Qt'nin 1/16 derece sözleşmesi bilinçli olarak izlenmez; kütüphane içi tutarlılık tercih edildi.

Parametreler
sweep_degreesTaranan açı; negatif olabilir (ters yön), mutlak değeri 360°'ye kırpılır.

◆ DrawImage() [1/2]

void sdl_painter::Painter::DrawImage ( const Image & image,
const Rect & src_rect,
const Rect & dest_rect,
const Color & tint = Color::White(),
ImageFlip flip = ImageFlip::kNone )

Görüntünün kaynak dikdörtgenini hedef dikdörtgene çiz.

Not
Tint, vertex'te taşınır — aynı texture'ı farklı renklerle çizmek batch'i kırmaz. (Opaklık için aynısı geçerli değildir.)

◆ DrawImage() [2/2]

void sdl_painter::Painter::DrawImage ( const Image & image,
float x,
float y,
const Color & tint = Color::White(),
ImageFlip flip = ImageFlip::kNone )

Görüntüyü orijinal boyutuyla çiz.

Parametreler
tintDoku rengiyle çarpılacak renk. Varsayılan beyaz = değişiklik yok. Alfası, SetOpacity ile çarpışmaz: opaklık tüm kareye uygulanan bir uniform, tint ise yalnızca bu görüntüye aittir.
flipAynalama (bkz. ImageFlip).

◆ DrawImageMesh()

void sdl_painter::Painter::DrawImageMesh ( const Image & image,
int32_t cols,
int32_t rows,
const std::vector< Point > & points,
const Color & tint = Color::White() )

Dokuyu serbest biçimli bir ızgara üzerine çiz.

DrawImage'ın üç aşırı yüklemesi de eksen hizalı Rect alır, yani dörtgenin köşeleri bağımsız hareket edemez. Dalgalanan bayrak, sayfa kıvrımı, perspektif taklidi gibi efektler bunu gerektirir; bu aşırı yükleme IRenderer::DrawTextured'a Painter seviyesinden erişim verir.

Doku koordinatları ızgara konumundan düzgün türetilir: (c, r) köşesinin UV'si (c / cols, r / rows)'tur. Yani deformasyon yalnızca konumdadır, dokunun kendisi ızgaraya eşit dağılır.

Parametreler
colsYatay hücre sayısı (> 0).
rowsDikey hücre sayısı (> 0).
pointsIzgara köşeleri, satır-major ve tam (cols + 1) * (rows + 1) adet. Boyut tutmuyorsa çağrı yok sayılır ve hata loglanır — sessizce yanlış geometri çizmektense.
tintDrawImage ile aynı anlamda.

◆ DrawRoundedRect()

void sdl_painter::Painter::DrawRoundedRect ( float x,
float y,
float w,
float h,
float radius )

Yuvarlatılmış köşeli dikdörtgen çerçevesi çiz.

Arayüz çiziminin en sık kullanılan şekli; QPainter'daki drawRoundedRect karşılığı.

Parametreler
radiusKöşe yarıçapı. <= 0 ise DrawRect ile birebir aynı sonucu verir. min(w, h) / 2'yi aşarsa oraya kırpılır — sonuç stadyum (kare girdide daire) şeklidir, taşma olmaz. w veya h pozitif değilse hiçbir şey çizilmez.

◆ DrawText() [1/2]

void sdl_painter::Painter::DrawText ( const Rect & rect,
const std::string & text,
Alignment alignment = Alignment::kLeft,
TextWrap wrap = TextWrap::kNone )

Dikdörtgen içine hizalanmış metin çiz.

Metin dikdörtgen içinde dikey olarak ortalanır; satır sonu karakteri (LF) satır böler.

Parametreler
wrapTextWrap::kWord ise satırlar dikdörtgen genişliğini aşmayacak şekilde sözcük sınırlarından bölünür. Tek bir sözcük bile sığmıyorsa karakter sınırından bölünür (UTF-8 güvenli). Varsayılan TextWrap::kNone: davranış eskisiyle birebir aynı, uzun metin dikdörtgenden taşar.

◆ DrawText() [2/2]

void sdl_painter::Painter::DrawText ( float x,
float y,
const std::string & text )

Noktaya metin çiz.

Satır sonu karakteri (LF) satır böler; her satır bir öncekinden Font::LineHeight kadar aşağıya çizilir. y ilk satırın baseline'ıdır.

◆ FillRoundedRect()

void sdl_painter::Painter::FillRoundedRect ( float x,
float y,
float w,
float h,
float radius )

Yuvarlatılmış köşeli dikdörtgeni doldur.

Kenar durumları DrawRoundedRect ile aynıdır.

◆ GetFont()

const std::shared_ptr< Font > & sdl_painter::Painter::GetFont ( ) const
inlinenodiscardnoexcept

Aktif font (yoksa nullptr).

Save / Restore font'u kapsamaz (font bir çizim durumu değil, paylaşılan bir kaynaktır). Geçici olarak başka bir fontla çizim yapan kod, önceki fontu bununla okuyup geri koyabilir.

◆ GetFrameStats()

const FrameStats & sdl_painter::Painter::GetFrameStats ( ) const
inlinenodiscardnoexcept

Son tamamlanan karenin çizim istatistikleri.

Begin sayaçları sıfırlar, End değerleri tamamlar. Dolayısıyla anlamlı okuma noktası End() sonrası — tipik olarak bir sonraki karenin çizimi sırasında (ekran üstü FPS göstergesi bunu böyle kullanır).

Ayrıca Bakınız
FrameStats

◆ SetBlendMode()

void sdl_painter::Painter::SetBlendMode ( BlendMode mode)

Renk karıştırma modunu ayarla.

Save / Restore kapsamındadır. Opaklık gibi bir GPU durumu olduğu için batch'i kırar: mod değiştikçe bir draw call daha çıkar. Renk ve tint'in aksine vertex'te taşınamaz.

Not
Vulkan'da karıştırma pipeline'ın sabit durumudur; mod başına ayrı bir pipeline varyantı önceden üretilir, çizim anında derleme yapılmaz.

◆ SetDrawableSize()

void sdl_painter::Painter::SetDrawableSize ( int32_t width,
int32_t height )

Çizim yüzeyi boyutunu bildir (viewport + projeksiyon güncellenir).

Boyut framebuffer piksel cinsindendir. Application bunu SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED olayında çağırır.

Not
Bu fonksiyon bir kez çağrıldığında Painter, boyutu artık her karede pencereden okumayı bırakır ve yalnızca bu çağrılara güvenir. Kendi olay döngüsünü yazan uygulamalar ya bu metodu yeniden boyutlandırmada çağırmalı ya da hiç çağırmamalıdır (o zaman otomatik yoklama sürer).

◆ SetViewport()

void sdl_painter::Painter::SetViewport ( int32_t x,
int32_t y,
int32_t width,
int32_t height )

Çizimi pencerenin bir alt dikdörtgeniyle sınırla.

Bölünmüş ekran, mini harita ve kenar panelleri için. Viewport ayarlandıktan sonra çizim koordinatları o alt dikdörtgene göre yereldir: (0, 0) viewport'un sol üst köşesidir ve projeksiyon width × height'a göre kurulur.

Uyarı
Bu, SetClipRect ile aynı şey değildir. Kırpma koordinat sistemini değiştirmeden pikselleri maskeler; viewport ise koordinat sisteminin kendisini yeniden tanımlar.
Not
Viewport bir GPU durumudur ve Save / Restore kapsamında değildir; değiştirmek biriken çizimleri flush eder. Tam pencereye dönmek için ResetViewport.
Parametreler
xSol kenar (framebuffer piksel, sol üst köşeden).
yÜst kenar (framebuffer piksel, sol üst köşeden).
widthGenişlik (> 0; değilse çağrı yok sayılır).
heightYükseklik (> 0; değilse çağrı yok sayılır).

◆ UpdateImage()

void sdl_painter::Painter::UpdateImage ( const Image & image,
const uint8_t * rgba )

Yüklenmiş bir görüntünün doku içeriğini yerinde güncelle.

Her karede değişen prosedürel dokular içindir (plazma, ısı haritası, piksel tuvali). Görüntüyü her karede yeniden yaratmaya göre farkı, doku tahsis/serbest bırakma döngüsünün hiç yaşanmamasıdır.

Görüntü henüz yüklenmemişse bu çağrı onu yükler; sonraki çağrılar aynı dokuyu günceller.

Parametreler
imageGüncellenecek görüntü. 4 kanallı (RGBA8) olmalıdır; değilse çağrı yok sayılır ve hata loglanır.
rgbaSıkı paketlenmiş Width() * Height() * 4 baytlık veri.
Not
Çağrı, biriken çizimleri flush eder. Doku içeriği anında değiştiği için, o karede aynı dokudan yapılmış ve henüz gönderilmemiş çizimler eski içerikle çizilmiş olmalı — aksi halde geriye dönük olarak yeni içerikle çizilirlerdi. Bedeli kare başına bir draw call'dur.

Bu sınıf için dokümantasyon aşağıdaki dosyadan üretilmiştir: