標籤: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的邏輯座標(螢幕左上方的,右、下),而位元影像的邏輯座標是左下角(右、上),所有變換在位元影像的顯示變換中有一個倒置的操作。
即:。