Bagikan melalui


Fungsi DrvAlphaBlend (winddi.h)

Fungsi DrvAlphaBlend menyediakan kemampuan transfer blok bit dengan penpaduan alfa.

Sintaks

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
);

Parameter

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

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

DrvAlphaBlend mengembalikan TRUE setelah berhasil. Jika tidak, ia melaporkan kesalahan dan mengembalikan FALSE.

Keterangan

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 dapat menghajar panggilan ke EngAlphaBlend.

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);
    
Fungsi Round(x) membulatkan ke bilangan bulat terdekat, dihitung sebagai:
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

Persyaratan Nilai
Target Platform Desktop
Header winddi.h (termasuk Winddi.h)

Lihat juga

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt