skia~setDIBitsToDevice~Windows

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   io   資料   

問題: skia是一個圖形庫,本身沒有在裝置上作圖的能力,可以通過提供的SkView類,參考實現對不同平台裝置上作畫。

  SkOsWindow_Win.cpp: onPaint方法中提供了在windows平台裝置上作圖的介面,SetDIBitsToDevice();  

 1 SetDIBitsToDevice( 2                 HDC hdc,                 // 裝置環境控制代碼。 3                 int XDest,               // 指定目標矩形左上方的X軸座標,按邏輯單位表示座標。 4                 int YDest,               // 指字目標矩形左上方的Y軸座標,按邏輯單位表示座標。 5                 DWORD dwWidth,           // 指定DIB的寬度,按邏輯單位表示寬度。 6                 DWORD dwHeight,          // 指定DIB的高度,按邏輯單位表示高度。 7                 int XSrc,                // 指定DIB位元影像左下角的X軸座標,按邏輯單位表示座標 8                 int YSrc,                // 指定DIB位元影像左下角的Y軸座標,按邏輯單位表示座標。 9                 UINT uStartScan,         // 指定DIB中的起始掃描線。10                 UINT cScanLines,         // 指定參數lpvBits指向的數組中包含的DIB掃描線數目。11                 CONST VOID *lpvBits,     // 指向儲存DIB顏色資料的位元組類型數組的指標。12                 CONST BITMAPINFO *lpbmi, // 指向BITMAPINFO結構的指標,該結構包含有關DIB的資訊。13                 UINT fuColorUse          // 指向BITMAPINFO結構中的成員bmiColors是否包含明確的RGB值或對調色盤進行索引的值。14                 )
SetDIBitsToDevice
 1 void SkOSWindow::doPaint(void* ctx) { 2     this->update(NULL); 3  4     if (kNone_BackEndType == fAttached) 5     { 6         HDC hdc = (HDC)ctx; 7         const SkBitmap& bitmap = this->getBitmap(); 8  9         BITMAPINFO bmi;10         memset(&bmi, 0, sizeof(bmi));11         bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);12         bmi.bmiHeader.biWidth       = bitmap.width();13         bmi.bmiHeader.biHeight      = -bitmap.height(); // top-down image14         bmi.bmiHeader.biPlanes      = 1;15         bmi.bmiHeader.biBitCount    = 32;16         bmi.bmiHeader.biCompression = BI_RGB;17         bmi.bmiHeader.biSizeImage   = 0;18 19         //20         // Do the SetDIBitsToDevice.21         //22         // TODO(wjmaclean):23         //       Fix this call to handle SkBitmaps that have rowBytes != width,24         //       i.e. may have padding at the end of lines. The SkASSERT below25         //       may be ignored by builds, and the only obviously safe option26         //       seems to be to copy the bitmap to a temporary (contiguous)27         //       buffer before passing to SetDIBitsToDevice().28         SkASSERT(bitmap.width() * bitmap.bytesPerPixel() == bitmap.rowBytes());29         bitmap.lockPixels();30         int ret = SetDIBitsToDevice(hdc,31             0, 0,32             bitmap.width(), bitmap.height(),33             0, 0,34             0, bitmap.height(),35             bitmap.getPixels(),36             &bmi,37             DIB_RGB_COLORS);38         (void)ret; // we‘re ignoring potential failures for now.39         bitmap.unlockPixels();40     }41 }
SkOSWindow_win.cpp

 

 1 //建立邏輯座標系 2         paint.setARGB(255, 255, 0, 0); 3         paint.setStrokeWidth(3); 4         canvas->drawLine(0, 0, bitmap->width(), 0, paint); 5         canvas->drawLine(0, 0, 0, bitmap->height(), paint); 6  7         paint.setARGB(255, 255, 200, 200); 8         canvas->drawText("X/2", 4, bitmap->width() / 2 + 10, 10, paint); 9         canvas->drawText("Y/2", 4, 5, bitmap->height() / 2, paint);10 11         paint.setARGB(255, 255, 200, 0);12         canvas->drawText("X", 2, bitmap->width()-10, 10, paint);13         canvas->drawText("Y", 2, 5, bitmap->height(), paint);
建立座標系
1 //三個概念 視窗地區、畫布canvas地區、位元影像bitmap地區2             SetDIBitsToDevice(hdc,3                 0, 0,    //指定邏輯座標系(即:畫布canavs)的座標原點,左上方(即:右、下為正方向),4                 bitmap->width(), bitmap->height(),5                 0, 0,6                 0,            //畫布中起始顯示位置7                 bitmap->height(), bitmap->getPixels(), //掃描的起點與掃描的高度8                 &lpbmi, DIB_RGB_COLORS);
三個地區

 

  

   

 

 

通過設定用畫筆填充真箇繪製地區發現,canvas的繪製地區,一直都是bitmap的地區,而,

在位元影像的變換中,canvas的邏輯座標(螢幕左上方的,右、下),而位元影像的邏輯座標是左下角(右、上),所有變換在位元影像的顯示變換中有一個倒置的操作。

即:。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.