skia~setDIBitsToDevice~Windows

问题: 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 image
14         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 below
25         //       may be ignored by builds, and the only obviously safe option
26         //       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的逻辑坐标(屏幕左上角的,右、下),而位图的逻辑坐标是左下角(右、上),所有变换在位图的显示变换中有一个倒置的操作。

即:

skia~setDIBitsToDevice~Windows,布布扣,bubuko.com

时间: 2024-10-10 03:41:08

skia~setDIBitsToDevice~Windows的相关文章

Windows下从源代码编译Skia

在PPAPI里面画图,能够结合第三方的图形库.比方Cairo.Skia. Google Chrome.Chromium和Android都使用Skia作为画图引擎.我也来试试Skia,先过编译关. foruok原创.如需转载请关注foruok的微信订阅号"程序视界"联系foruok. CEF编译出的Skia不可单独用 Chromium使用Skia.Windows下从源代码编译CEF说明了怎么编译CEF,它会捎带着编译Chromium.里面有Skia,但它编译出来的skia_library

在Windows下编译多种VS版本的Skia

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/51272050 这几天刚改了改Duilib,之前为了让Duilib更好的支持透明异形窗体所以把Duilib改为Gdi和Gdi+的双渲染引擎.于是想到了有时间就把渲染引擎完全独立为渲染接口,可以增加更多的渲染引擎.现在来说Skia是个很不错的渲染,之前我只是单独编译了VS2013的Skia做来简单的测试使用,要想把它加到Duilib就得完全编译好Skia并且支持各个版本的V

Skia简介以及在Windows下编译操作步骤

Skia是一个C++的开源2D向量图形处理函数库(Cairo是一个矢量库),包括字型.坐标转换.位图等等,相当于轻量级的Cairo,目前主要用于Google的Android和Chrome平台,Skia搭配OpenGL/ES与特定的硬件特征,强化显示的效果.另外,Skia是WebKit支持的众多图形平台之一,在WebKit的GraphicsContext.h/.c中有相关实现. Android与Chrome的源代码库中都有一份Skia的复制,因需求不同,做了部分的修改. Skia需要的底层库有:f

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

Windows DIB文件操作详解-4.使用DIB Section

前面讲了为了提高DIB的显示性能和效率,我们将DIB转换成DDB,但是这又遇到一个问题,如果我想操作DIB的数据的话,显然是不能使用DDB:一是因为DIB转DDB时发生了颜色转换,再就是DDB无法直接提取指定像素点的数据.那么我们怎么办呢,Windows使用一种折中的方式来达到这一目标(既提高了显示效率和性能,又可以直接操作像素点). 1.DIB Section存储和显示 Windows使用DIB块(DIB Section)来存储DIB数据,其内存结构示意图如下 其实,和我们自己读入DIB数据到

C语言漫谈(二) 图像显示 Windows和Linux

关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库. 了解最原始的方式,对于加深理解依然是有帮助的.下面给Windows和Linux下显示位图的最简单例子: Windows用GDI显示图像的例子: 1 /* 2 * FileName: Image_Win.c 3 * Usage: tcc -luser32 -lgdi32 -run Image_Win.c 4 */ 5 6

skia作图显示

问题:怎么canvas上的不同的不同绘制图案,反应到终端. setDIBitsToDevice()函数默认是将其中的srcx.srcy中的bitmap当做绘制buffer的.与canvas是无关的.那么怎么将canvas的绘制反应到device呢? canvas = new SkCanvas(*bitmap); 通过初始化canvas的操作与位图建立联系.以后无论有多少重新定义的bitmapX,canvas->drawBitmap(); canvas->drawText("Hello

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

Windows DIB文件操作详解-1.DIB的读入、保存和显示

DIB(设备无关位图)是存储在磁盘上的位图文件,可以从磁盘读到内存中或从内存保存到磁盘上,它的磁盘文件结构是标准化的,在Linux.Unix及Windows上都可以以同样效果显示.位图是最接近硬件的图像格式,Windows显示的核心是位图,它的SDK API专门提供了一组用于操作DIB文件的函数.但是由于这样或那样的原因,高效合理的使用这些DIB API是需要了解不少历史和使用背景的,在这里我抽茧剥丝介绍和演示DIB的使用,相信对你更好的使用DIB文件有帮助,由于DIB函数比较多,这里分为三部分