Fungsi DrvAlphaBlend (winddi.h)
Fungsi DrvAlphaBlend menyediakan kemampuan transfer blok bit dengan penpaduan alfa.
BOOL DrvAlphaBlend(
[in, out] SURFOBJ *psoDest,
[in] SURFOBJ *psoSrc,
[in] CLIPOBJ *pco,
[in, optional] XLATEOBJ *pxlo,
[in] RECTL *prclDest,
[in] RECTL *prclSrc,
[in] BLENDOBJ *pBlendObj
);
[in, out] psoDest
Penunjuk ke struktur SURFOBJ yang mengidentifikasi permukaan untuk menggambar.
[in] psoSrc
Penunjuk ke struktur SURFOBJ yang mengidentifikasi permukaan sumber.
[in] 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 DrvBitBlt, DrvAlphaBlend mungkin dipanggil dengan satu persegi panjang untuk mencegah kesalahan round-off dalam mengklip output.
[in, optional] pxlo
Penunjuk ke struktur XLATEOBJ yang menentukan bagaimana indeks warna harus diterjemahkan antara permukaan sumber dan tujuan. Jika pxloNULL, tidak diperlukan terjemahan.
Jika permukaan sumber dikelola palet, warnanya diwakili oleh indeks ke dalam tabel pencarian nilai warna RGB. Dalam hal ini, XLATEOBJ dapat dikueri untuk vektor terjemahan yang memungkinkan driver perangkat untuk dengan cepat menerjemahkan indeks sumber apa pun 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. Driver dapat memanggil rutinitas layanan XLATEOBJ_iXlate untuk melakukan operasi pencocokan ini.
[in] 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.
Driver harus berhati-hati untuk melakukan kliping yang tepat saat menulis piksel karena persegi panjang yang ditentukan mungkin membanyangi permukaan tujuan.
DrvAlphaBlend tidak pernah dipanggil dengan persegi panjang tujuan kosong.
[in] 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 akan pernah melebihi batas permukaan sumber, sehingga tidak akan pernah membantu permukaan sumber.
DrvAlphaBlend tidak pernah 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.)
[in] 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 di XLATEOBJ. Struktur BLENDFUNCTION didefinisikan 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.
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:
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.
DrvAlphaBlend mengembalikan TRUE setelah berhasil. Jika tidak, ia melaporkan kesalahan dan mengembalikan FALSE.
Driver dapat mendukung transfer bit-block dengan penpaduan alfa 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.
Driver tidak akan pernah dipanggil dengan persegi panjang sumber dan tujuan yang tumpang tindih pada permukaan yang sama.
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);
Trunc(x + 0.5);
DrvAlphaBlend dapat diimplementasikan secara opsional dalam driver grafis. Ini dapat disediakan untuk menangani beberapa jenis campuran alfa, seperti campuran di mana permukaan sumber dan tujuan memiliki format yang sama dan tidak berisi saluran alfa.
Implementasi perangkat keras dapat menggunakan titik pecahan atau titik tetap dalam operasi campuran. Pengujian kompatibilitas akan mempertanyakan beberapa kesalahan numerik dalam hasil; silakan lihat Efek Khusus dalam Driver Tampilan untuk informasi tentang kesalahan maksimum yang diizinkan. Saat menggunakan titik tetap, perkiraan yang dapat diterima untuk istilah x/255 adalah (x*257)/65536. Menggabungkan pembulatan, ekspresi:
((255 - Src.Alpha) * Dst.Red) / 255
kemudian dapat diprata sebagai:
temp = ((255 - Src.Alpha) * Dst.Red) + 128;
result = (temp + (temp >> 8)) >> 8;
Driver menghubungkan DrvAlphaBlend dengan mengatur bendera HOOK_ALPHABLEND saat memanggil EngAssociateSurface. Jika driver telah menghubungkan DrvAlphaBlend dan dipanggil untuk melakukan operasi yang tidak didukungnya, driver harus memiliki GDI yang menangani operasi dengan menghantui data dalam panggilan ke EngAlphaBlend.
Persyaratan | Nilai |
---|---|
Target Platform | Desktop |
Header | winddi.h (termasuk Winddi.h) |