Menyalin Bitmap

Fungsi transfer blok bit (BitBlt) yang diimplementasikan oleh driver menyalin blok bit dari satu permukaan ke permukaan lainnya. Fungsi-fungsi ini meliputi:

Ada juga fungsi BitBlt khusus driver tampilan bernama DrvSaveScreenBits.

Jika permukaan yang digambar adalah permukaan atau bitmap yang dikelola perangkat , driver harus mendukung tingkat minimum fungsi transfer blok bit. Jika permukaan adalah bitmap format standar yang dikelola GDI, GDI hanya menangani operasi yang tidak dikaitkan oleh driver.

DrvBitBlt

Fungsi DrvBitBlt menyediakan kemampuan transfer blok bit umum. Jika sumber digunakan, DrvBitBlt menyalin konten persegi sumber ke persegi panjang tujuan. (Parameter pptlSrc dari fungsi ini mengidentifikasi sudut kiri atas persegi panjang.) Jika tidak ada persegi panjang sumber, DrvBitBlt mengabaikan parameter pptlSrc . Persegi panjang tujuan, permukaan yang akan dimodifikasi, didefinisikan oleh dua titik bilangan bulat, sudut kiri atas dan kanan bawah. Persegi panjang eksklusif kanan bawah; tepi bawah dan kanan persegi panjang bukan bagian dari transfer blok. DrvBitBlt tidak dapat dipanggil dengan persegi tujuan kosong. Dua titik persegi panjang selalu diurutkan dengan baik; artinya, kedua koordinat titik kanan bawah lebih besar dari rekan-rekannya di titik kiri atas.

DrvBitBlt menangani ROP yang berbeda dan melakukan pengoptimalan tergantung pada perangkat. Dalam beberapa kasus, jika ROP berwarna solid, isian daripada BitBlt dapat dilakukan. Untuk perangkat atau driver yang tidak mendukung ROP, seperti driver Pscript, mungkin ada perbedaan antara gambar yang ditampilkan dan dicetak.

Secara opsional, transfer blok yang ditangani oleh DrvBitBlt dapat ditutupi dan melibatkan terjemahan indeks warna. Vektor terjemahan membantu dalam terjemahan indeks warna untuk palet. Transfer mungkin perlu diklip secara sewenang-wenang oleh driver tampilan, menggunakan serangkaian persegi panjang klip. Wilayah dan informasi yang diperlukan dilengkapi oleh GDI.

Menerapkan DrvBitBlt mewakili sebagian besar pekerjaan yang terlibat dalam penulisan driver untuk driver tampilan raster yang tidak memiliki buffer bingkai format standar. Driver Microsoft VGA yang dilengkapi dengan Windows Driver Kit (WDK) menyediakan kode sampel yang mendukung fungsi dasar untuk perangkat planar. Menerapkan DrvBitBlt untuk perangkat lain mungkin kurang kompleks.

DrvCopyBits

Fungsi DrvCopyBits dipanggil oleh GDI dari operasi simulasinya untuk menerjemahkan antara permukaan raster yang dikelola perangkat dan bitmap format standar GDI. DrvCopyBits menyediakan jalur cepat untuk transfer blok bit ROP SRCCOPY (0xCCCC).

Diperlukan untuk driver grafis dengan bitmap yang dikelola perangkat atau permukaan raster, fungsi ini harus menerjemahkan permukaan driver ke dan dari bitmap format standar apa pun. DrvCopyBits tidak pernah dipanggil dengan persegi panjang tujuan kosong, dan dua titik persegi panjang tujuan selalu diurutkan dengan baik. Panggilan ini memiliki persyaratan yang sama dengan DrvBitBlt.

Jika driver mendukung permukaan atau bitmap yang dikelola perangkat, driver harus mengimplementasikan fungsi DrvCopyBits . Minimal, driver harus melakukan hal berikut ketika DrvCopyBits dipanggil:

  • Lakukan transfer blok ke dan dari bitmap, dalam format pilihan perangkat, dan ke permukaan perangkat.
  • Lakukan transfer dengan operasi raster SRCCOPY (0xCCCC) (ROP).
  • Izinkan kliping arbitrer.

Driver dapat menggunakan layanan enumerasi GDI CLIPOBJ untuk mengurangi kliping menjadi serangkaian persegi panjang klip. GDI meneruskan vektor terjemahan, struktur XLATEOBJ , untuk membantu terjemahan indeks warna antara permukaan sumber dan tujuan.

Jika permukaan perangkat diatur sebagai bitmap independen perangkat format standar (DIB),driver hanya dapat mendukung transfer sederhana. Jika panggilan masuk dengan ROP yang rumit, driver dapat melumpuhkan permintaan transfer blok kembali ke GDI dengan panggilan ke fungsi EngCopyBits . Hal ini memungkinkan GDI untuk memecah panggilan menjadi fungsi yang lebih sederhana yang dapat dilakukan driver.

DrvCopyBits juga dipanggil dengan bitmap RLE (lihat dokumentasi Microsoft Windows SDK) dan bitmap yang bergantung pada perangkat (DDB). Bitmap disediakan untuk fungsi ini sebagai hasil dari panggilan program aplikasi ke beberapa rutinitas Win32 GDI. DDB opsional hanya didukung oleh beberapa driver khusus.

DrvStretchBlt

Driver secara opsional dapat menyediakan fungsi DrvStretchBlt , bahkan driver yang mendukung permukaan yang dikelola perangkat. Fungsi ini menyediakan kemampuan untuk meregangkan transfer blok antara permukaan yang dikelola perangkat dan yang dikelola GDI. DrvStretchBlt hanya mendukung jenis peregangan tertentu, seperti peregangan dengan kelipatan bilangan bulat.

DrvStretchBlt juga memungkinkan driver untuk menulis pada bitmap GDI, terutama ketika driver dapat melakukan halftoning. Fungsi ini juga memungkinkan algoritma halftoning yang sama untuk diterapkan ke bitmap GDI dan permukaan perangkat.

DrvStretchBlt memetakan persegi panjang sumber geometris persis ke persegi panjang tujuan geometris. Sumbernya adalah persegi panjang dengan sudut yang dialihkan oleh (-0,5,-0,5) dari koordinat bilangan bulat yang diberikan. Titik yang ditentukan dalam parameter fungsi terletak pada koordinat bilangan bulat yang sesuai dengan pusat piksel. Persegi panjang yang ditentukan oleh dua titik tersebut dianggap geometris, dengan dua simpul yang koordinatnya adalah titik yang diberikan, tetapi dengan 0,5 dikurangi dari setiap koordinat. (Struktur GDI POINTL menggunakan notasi singkat untuk menentukan simpul koordinat pecahan ini.) Perhatikan bahwa tepi persegi panjang tersebut tidak pernah bersinggungan dengan piksel, tetapi mengelilingi sekumpulan piksel. Piksel di dalam persegi panjang adalah piksel normal untuk persegi panjang eksklusif kanan bawah.

Titik-titik yang mendefinisikan sudut persegi panjang sumber diurutkan dengan baik; DrvStretchBlt tidak dapat diberikan persegi panjang sumber kosong. Tidak seperti DrvBitBlt, DrvStretchBlt dapat dipanggil dengan satu persegi panjang kliping untuk mencegah kesalahan round-off dalam mengklip output.

Persegi panjang tujuan didefinisikan oleh dua titik bilangan bulat. Titik-titik ini tidak diurutkan dengan baik, yang berarti bahwa koordinat titik kedua belum tentu lebih besar dari yang pertama. Persegi panjang sumber yang dijelaskan titik-titik ini tidak menyertakan tepi bawah dan kanan. Karena persegi panjang tidak diurutkan dengan baik, DrvStretchBlt terkadang harus melakukan inversi dalam dua koordinat x dan/atau dua koordinat y. (Driver tidak boleh mencoba membaca piksel yang tidak terletak pada permukaan sumber). DrvStretchBlt tidak dapat dipanggil dengan persegi panjang tujuan kosong.

Untuk terjemahan warna, DrvStretchBlt menyediakan pointer, pxlo, ke struktur XLATEOBJ , yang digunakan untuk menerjemahkan antara permukaan sumber dan tujuan. Struktur XLATEOBJ dapat dikueri untuk menemukan indeks tujuan untuk indeks sumber apa pun. Untuk transfer blok peregangan berkualitas tinggi, DrvStretchBlt diperlukan untuk menginterpolasi warna dalam beberapa kasus. DrvStretchBlt juga menggunakan struktur COLORADJUSTMENT untuk menentukan nilai penyesuaian warna yang akan diterapkan ke bitmap sumber sebelum bit direntangkan.

DrvStretchBlt menggunakan parameter iMode untuk menentukan bagaimana piksel sumber akan digabungkan untuk output. Secara khusus, iMode menyediakan opsi HALFTONE yang memungkinkan driver menggunakan grup piksel di permukaan output untuk memperkirakan warna atau tingkat output abu-abu. Perubahan pada struktur COLORADJUSTMENT diteruskan ke driver setelah panggilan DrvStretchBlt berikutnya dengan iMode HALFTONE. Selain itu, jika driver mengharuskan GDI untuk menangani halftoning untuk bitmap GDI, driver menghubungkan DrvStretchBlt, mengatur parameter iMode ke HALFTONE, dan mengembalikannya di EngStretchBlt.

Jika DrvStretchBlt telah menghubungkan panggilan ke fungsi EngStretchBlt dan diminta untuk melakukan sesuatu yang tidak didukungnya, ia mengembalikan permintaan ke GDI sehingga fungsi yang sesuai dapat menanganinya.

DrvTransparentBlt

Fungsi DrvTransparentBlt menyebabkan bitmap sumber disalin ke bitmap tujuan sehingga bagian bitmap tujuan tetap terlihat setelah salinan. Parameter iTransColor dari fungsi ini menentukan warna yang akan dibuat transparan.

Gambar berikut menggambarkan contoh blt transparan.

Diagram yang mengilustrasikan proses blt transparan dengan bitmap sumber dan tujuan.

Dari kiri ke kanan, gambar sebelumnya menunjukkan bitmap sumber, bitmap tujuan sebelum blt transparan, dan bitmap tujuan setelah blt transparan. Perhatikan bahwa warna di iTransColor sama dengan warna di empat wilayah di atas, di bawah, dan ke salah satu sisi wilayah pusat di bitmap sumber.

Ketika operasi blt berlangsung, keempat wilayah ini tidak disalin, yang menyebabkan pola piksel apa pun di bitmap tujuan di bawah wilayah ini tetap terlihat. Pola piksel apa pun di bawah wilayah lain (empat sudut dan tengah) ditimpa dalam blt transparan.

Ini diilustrasikan dalam gambar paling kanan: bagian huruf 'M' di empat sudut dan tengah ditimpa dengan warna dalam bitmap sumber. Bagian huruf 'M' di bawah empat wilayah yang warnanya sama dengan di iTransColor tetap terlihat.