Fungsi EngAlphaBlend (winddi.h)
Fungsi EngAlphaBlend menyediakan kemampuan transfer blok bit dengan penpaduan alfa.
Sintaks
ENGAPI BOOL EngAlphaBlend(
SURFOBJ *psoDest,
SURFOBJ *psoSrc,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDest,
RECTL *prclSrc,
BLENDOBJ *pBlendObj
);
Parameter
psoDest
Penunjuk ke struktur SURFOBJ yang mengidentifikasi permukaan untuk menggambar.
psoSrc
Penunjuk ke struktur SURFOBJ yang mengidentifikasi permukaan sumber.
pco
Penunjuk ke struktur CLIPOBJ . Rutinitas layanan CLIPOBJ_Xxx disediakan untuk menghitung wilayah klip sebagai satu set persegi panjang. Enumerasi ini membatasi area tujuan yang dimodifikasi. Jika memungkinkan, GDI menyederhanakan kliping yang terlibat. Namun, tidak seperti EngBitBlt, EngAlphaBlend mungkin dipanggil dengan satu persegi panjang untuk mencegah kesalahan round-off dalam mengklip output.
pxlo
Penunjuk ke struktur XLATEOBJ yang menentukan bagaimana indeks warna harus diterjemahkan antara permukaan sumber dan tujuan.
Jika permukaan sumber dikelola palet, warnanya diwakili oleh indeks ke dalam tabel pencarian nilai warna RGB. Dalam hal ini, GDI dapat mengkueri struktur XLATEOBJ untuk vektor terjemahan untuk menerjemahkan indeks sumber apa pun dengan cepat ke dalam indeks warna untuk tujuan.
Situasinya lebih rumit ketika, misalnya, sumbernya adalah RGB tetapi tujuannya dikelola palet. Dalam hal ini, kecocokan terdekat dengan setiap nilai RGB sumber harus ditemukan di palet tujuan. GDI memanggil rutinitas layanan XLATEOBJ_iXlate untuk melakukan operasi pencocokan ini.
prclDest
Penunjuk ke struktur RECTL yang menentukan area persegi panjang yang akan dimodifikasi. Persegi panjang ini ditentukan dalam sistem koordinat permukaan tujuan dan didefinisikan oleh dua titik: kiri atas dan kanan bawah. Dua titik yang menentukan persegi panjang selalu diurutkan dengan baik.
Persegi panjang eksklusif kanan bawah; artinya, tepi bawah dan kanannya bukan bagian dari perpaduan.
Persegi panjang yang ditentukan dapat membalikkan permukaan tujuan; GDI melakukan kliping yang tepat ketika itu terjadi.
EngAlphaBlend tidak boleh dipanggil dengan persegi panjang tujuan kosong.
prclSrc
Penunjuk ke struktur RECTL yang menentukan area yang akan disalin. Persegi panjang ini ditentukan dalam sistem koordinat permukaan sumber dan didefinisikan oleh dua titik: kiri atas dan kanan bawah. Dua titik yang menentukan persegi panjang selalu diurutkan dengan baik.
Persegi panjang eksklusif kanan bawah; artinya, tepi bawah dan kanannya bukan bagian dari perpaduan.
Persegi panjang sumber tidak boleh melebihi batas permukaan sumber, dan dengan demikian tidak pernah membantu permukaan sumber.
EngAlphaBlend tidak boleh dipanggil dengan persegi panjang sumber kosong.
Pemetaan didefinisikan oleh prclSrc dan prclDest. Titik yang ditentukan dalam prclDest dan prclSrc terletak pada koordinat bilangan bulat, yang sesuai dengan pusat piksel. Persegi panjang yang ditentukan oleh dua titik tersebut dianggap sebagai persegi panjang geometris dengan dua simpul yang koordinatnya adalah titik yang diberikan, tetapi dengan 0,5 dikurangi dari setiap koordinat. (Struktur POINTL adalah notasi singkat untuk menentukan simpul koordinat pecahan ini.)
pBlendObj
Penunjuk ke struktur BLENDOBJ yang menjelaskan operasi penpaduan untuk dilakukan antara permukaan sumber dan tujuan. Struktur ini adalah pembungkus untuk struktur BLENDFUNCTION, yang mencakup informasi format sumber dan tujuan yang diperlukan yang tidak tersedia dalam struktur XLATEOBJ . BLENDFUNCTION dideklarasikan dalam dokumentasi Microsoft Windows SDK. Anggotanya didefinisikan sebagai berikut:
BlendOp mendefinisikan operasi campuran yang akan dilakukan. Saat ini nilai ini harus AC_SRC_OVER, yang berarti bahwa bitmap sumber ditempatkan di atas bitmap tujuan berdasarkan nilai alfa piksel sumber. Ada tiga kemungkinan kasus yang harus ditangani operasi campuran ini. Ini dijelaskan di bagian Keterangan dari halaman referensi ini.
BlendFlags dicadangkan dan saat ini diatur ke nol.
SourceConstantAlpha mendefinisikan faktor campuran konstanta untuk diterapkan ke seluruh permukaan sumber. Nilai ini berada di kisaran [0,255], di mana 0 benar-benar transparan dan 255 benar-benar buram.
AlphaFormat menentukan apakah permukaan diasumsikan memiliki saluran alfa. Anggota ini secara opsional dapat diatur ke nilai berikut:
AC_SRC_ALPHA
Permukaan sumber dapat diasumsikan dalam format "BGRA" alfa 32bpp yang telah diisi sebelumnya; yaitu, jenis permukaan BMF_32BPP dan jenis palet BI_RGB. Komponen alfa adalah bilangan bulat dalam kisaran [0.255], di mana 0 benar-benar transparan dan 255 benar-benar buram.
Nilai kembali
EngAlphaBlend mengembalikan TRUE setelah berhasil. Jika terjadi kesalahan, kesalahan akan menampilkan FALSE dan melaporkan kode kesalahan.
Keterangan
Transfer blok bit dengan penpaduan alfa didukung di antara permukaan berikut:
- Dari satu permukaan yang dikelola perangkat ke permukaan lain yang dikelola perangkat.
- Dari satu bitmap format standar yang dikelola GDI ke bitmap format standar yang dikelola GDI lainnya.
- Dari satu permukaan yang dikelola perangkat hingga permukaan yang dikelola GDI, dan sebaliknya.
Tiga kemungkinan kasus untuk fungsi campuran AC_SRC_OVER adalah:
- Bitmap sumber tidak memiliki alfa per piksel (AC_SRC_ALPHA tidak diatur), sehingga campuran diterapkan ke saluran warna piksel berdasarkan nilai alfa sumber konstan yang ditentukan dalam SourceConstantAlpha sebagai berikut:
Dst.Red = Round(((Src.Red * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Red)) / 255); Dst.Green = Round(((Src.Green * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Green)) / 255); Dst.Blue = Round(((Src.Blue * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Blue)) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Round(((Src.Alpha * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Alpha)) / 255);
- Bitmap sumber memiliki nilai alfa per piksel (AC_SRC_ALPHA diatur), dan SourceConstantAlpha tidak digunakan (diatur ke 255). Campuran dihitung sebagai berikut:
Dst.Red = Src.Red + Round(((255 − Src.Alpha) * Dst.Red) / 255); Dst.Green = Src.Green + Round(((255 − Src.Alpha) * Dst.Green) / 255); Dst.Blue = Src.Blue + Round(((255 − Src.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Src.Alpha + Round(((255 − Src.Alpha) * Dst.Alpha) / 255);
- Bitmap sumber memiliki nilai alfa per piksel (AC_SRC_ALPHA diatur), dan SourceConstantAlpha digunakan (tidak diatur ke 255). Campuran dihitung sebagai berikut:
Temp.Red = Round((Src.Red * SourceConstantAlpha) / 255); Temp.Green = Round((Src.Green * SourceConstantAlpha) / 255); Temp.Blue = Round((Src.Blue * SourceConstantAlpha) / 255); /* The next computation must be done even if the destination bitmap does not have an alpha channel. */ Temp.Alpha = Round((Src.Alpha * SourceConstantAlpha) / 255); /* Note that the following equations use the just-computed Temp.Alpha value: */ Dst.Red = Temp.Red + Round(((255 − Temp.Alpha) * Dst.Red) / 255); Dst.Green = Temp.Green + Round(((255 − Temp.Alpha) * Dst.Green) / 255); Dst.Blue = Temp.Blue + Round(((255 − Temp.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Temp.Alpha + Round(((255 − Temp.Alpha) * Dst.Alpha) / 255);
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia di Windows 2000 dan versi yang lebih baru dari sistem operasi Windows. |
Target Platform | Universal |
Header | winddi.h (termasuk Winddi.h) |
Pustaka | Win32k.lib |
DLL | Win32k.sys |