SDLPainter 1.2.0
SDL3 + OpenGL/Vulkan 2B çizim kütüphanesi
Yüklüyor...
Arıyor...
Eşleşme Yok
Public Üye Fonksiyonlar | Tüm üyelerin listesi
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.
 
RenderTarget CreateRenderTarget (int32_t width, int32_t height, TextureFilter filter=TextureFilter::kLinear)
 Ekran yerine çizilebilen offscreen bir yüzey oluştur.
 
bool SetRenderTarget (const RenderTarget &target)
 Sonraki çizimleri verilen hedefe yönlendir.
 
void ResetRenderTarget ()
 Çizimi ekrana geri al.
 
void DrawRenderTarget (const RenderTarget &target, float x, float y, const Color &tint=Color::White(), ImageFlip flip=ImageFlip::kNone)
 Hedefin içeriğini orijinal boyutuyla çiz.
 
void DrawRenderTarget (const RenderTarget &target, const Rect &dest_rect, const Color &tint=Color::White(), ImageFlip flip=ImageFlip::kNone)
 Hedefin içeriğini hedef dikdörtgene ölçekleyerek çiz.
 
bool ReadRenderTarget (const RenderTarget &target, std::vector< uint8_t > &out_rgba)
 Hedefin piksellerini ana belleğe oku.
 
void Clear (const Color &color)
 Ekranı belirtilen renkle temizle.
 
const FrameStats & GetFrameStats () 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 DrawPath (const Path &path)
 Yolun çerçevesini çiz.
 
void FillPath (const Path &path)
 Yolun içini doldur (ear clipping tessellation).
 
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

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.

◆ CreateRenderTarget()

RenderTarget sdl_painter::Painter::CreateRenderTarget ( int32_t  width,
int32_t  height,
TextureFilter  filter = TextureFilter::kLinear 
)

Ekran yerine çizilebilen offscreen bir yüzey oluştur.

Mini harita, son işlem efektleri, iz efekti ve pahalı katmanların önbelleklenmesi için. Ayrıntı ve kullanım örneği: RenderTarget.

Parametreler
widthGenişlik (piksel, > 0).
heightYükseklik (piksel, > 0).
filterHedef ekrana basılırken kullanılacak örnekleme filtresi.
Döndürdüğü değer
Geçerli bir hedef; başarısızlıkta RenderTarget::IsValid false döner (backend desteklemiyor olabilir).

◆ 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.

◆ DrawPath()

void sdl_painter::Painter::DrawPath ( const Path &  path)

Yolun çerçevesini çiz.

Her alt yol ayrı çizilir: kapalı olanlar (Path::Close) kapalı poligon gibi, açık olanlar polyline gibi işlenir. Dolayısıyla uç stili yalnızca açık alt yolların iki ucuna, birleşim stili tüm köşelere uygulanır.

Not
Kesikli kalemde desen her alt yolun başında sıfırlanır; tek bir alt yol içinde ise yol boyunca sürekli ilerler (bir kesik köşenin üzerinden geçebilir).

◆ DrawRenderTarget()

void sdl_painter::Painter::DrawRenderTarget ( const RenderTarget &  target,
float  x,
float  y,
const Color &  tint = Color::White(),
ImageFlip  flip = ImageFlip::kNone 
)

Hedefin içeriğini orijinal boyutuyla çiz.

Parametreler
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.

◆ FillPath()

void sdl_painter::Painter::FillPath ( const Path &  path)

Yolun içini doldur (ear clipping tessellation).

Açık alt yollar dolgu için örtük olarak kapatılır — QPainter da böyle davranır.

Uyarı
Her alt yol bağımsız doldurulur; even-odd veya nonzero dolgu kuralı uygulanmaz. Bir alt yolun diğerinin içinde kalması onu delik yapmaz, üzerine ikinci bir dolgu çizer. Delikli şekiller bu sürümün kapsamı dışındadır (bkz. Path).

◆ 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
inlinenoexcept

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
inlinenoexcept

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

◆ ReadRenderTarget()

bool sdl_painter::Painter::ReadRenderTarget ( const RenderTarget &  target,
std::vector< uint8_t > &  out_rgba 
)

Hedefin piksellerini ana belleğe oku.

Sonuç sıkı paketlenmiş, doğrusal RGBA8 ve satırlar yukarıdan aşağı — OpenGL ile Vulkan birebir aynı baytları verir. Ekran görüntüsü almak ve iki backend'in çıktısını karşılaştıran testler için.

Uyarı
Bloklar: GPU'nun işi bitene kadar bekler. Kare döngüsünde kullanılmamalıdır. Ayrıca End sonrasında çağrılmalıdır; kare ortasında çağrılırsa o karede biriken çizimler henüz gönderilmemiş olabilir.
Parametreler
out_rgbaSonuç buraya yazılır; gerekiyorsa yeniden boyutlandırılır.
Döndürdüğü değer
Başarıda true.

◆ 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).

◆ SetRenderTarget()

bool sdl_painter::Painter::SetRenderTarget ( const RenderTarget &  target)

Sonraki çizimleri verilen hedefe yönlendir.

Çizim koordinatları hedefe yerel olur: (0, 0) hedefin sol üst köşesi, projeksiyon hedefin boyutuna göre. SetViewport ile ayarlanmış bir viewport varsa hedef süresince askıya alınır ve ResetRenderTarget ile geri gelir.

Not
Hedef seçimi bir GPU durumudur: Save / Restore kapsamında değildir ve değiştirmek biriken çizimleri flush eder. Seçim kare sınırını da aşmaz — her Begin ekranda başlar.
Döndürdüğü değer
Geçiş yapıldıysa true.

◆ 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: