Skia简介以及在Windows下编译操作步骤
Skia是一个C++的开源2D向量图形处理函数库(Cairo是一个矢量库),包括字型、坐标转换、位图等等,相当于轻量级的Cairo,目前主要用于Google的Android和Chrome平台,Skia搭配OpenGL/ES与特定的硬件特征,强化显示的效果。另外,Skia是WebKit支持的众多图形平台之一,在WebKit的GraphicsContext.h/.c中有相关实现。
Android与Chrome的源代码库中都有一份Skia的复制,因需求不同,做了部分的修改。
Skia需要的底层库有:freetype2,expat,tinyxml。
可以用svn从Google下载源码:svncheckout http://skia.googlecode.com/svn 。
(1)、animator目录:用来实现Skia的动画效果,Android不支持;
(2)、core目录:Skia的核心,基本都是一些图形绘制函数;
(3)、effects目录:实现一些图形图像的特效效果,包括遮罩、浮雕、模糊、滤镜、渐变色、离散、透明等,并且实现了PATH的各种特效;
(4)gl目录:实现了Skia的图形库,Skia调用OpenGL或OpenGL ES来实现一些简单的3D效果;
(5)、images目录:用来处理images的,支持常见图像的解码、部分图像的编码和动画。Skia能处理的图像类型包括:BMP、JPEG/PVJPEG、PNG、ICO、SkMovie处理gif动画;
(6)、ports目录:是Skia的一些接口在不同系统上的实现,平台相关的代码,比如字体、线程、时间等。这些与Skia的接口,需要针对不同的操作系统实现;
(7)、svg目录:实现了Skia对矢量图SVG的支持,Android不支持;
(10)、xml目录:处理xml的数据,Skia在这里只是对xml解析器做了一层包装,具体的xml解析器的实现需要根据不同的操作系统及宿主程序来实现;
(12)、pdf目录:处理PDF文档,用了一个fpdfemb库;
Skia主要使用的第三方库:Zlib、Jpeglib、Pnglib、giflib、fpdfemb(处理pdf文档)。
Android版本不同,Skia版本也不太相同,接口有些细微的差别。
Skia主要包含三个库:(1)、libcorecg.so:包含/skia/src/core的部分内容,比如其中的Region,Rect是在SurfaceFlinger里面用来计算可视区域的;(2)、libsgl.so:包含/skia/src/core|effects|images|ports|utils的部分和全部内容,这个实现了skia大部分的图形效果,以及图形格式的编解码;(3)、libskiagl.so:包含/skia/src/gl里面的内容,主要用来调用opengl实现部分效果。
Skia对上层的接口:Skia的源文件及部分头文件都在external/skia/src目录下,导出的头文件在external/skia/include目录下。最主要的是SKCanvas类,几乎整个AndroidGUI系统的底层绘制都是由这个类来完成的。SKCanvas类主要有三种绘制功能:(1)、基本图形绘制(如drawARGB,drawLine函数);(2)、图像文件绘制(如drawBitmap函数);(3)、文本绘制(drawText函数)。
Skia的图像编解码部分:(1)、/include/image/SKImageDecoder.h:把图像文件或者流解码到skia的内部内存SKBitmap中;(2)、/include/image/SKImageEncoder.h :把skia内部内存SKBitmap编码成文件或流的形式。这些接口需要具体的类实现,主要代码在src/image文件中。
Skia引擎重要类:(1)、SkCanvas:Skia引擎的一个核心类,它封装了所有对设备进行的画图操作.
Skia中用到的硬件加速技术:(1)、OpenGL/OpenGLES;(2)、SIMD:SSE2/SSSE3,NEON.
Skia在Windows下的编译:
1、 从https://www.python.org/download/releases/2.7.8/下载python-2.7.8.amd64.msi并安装;安装到D:\ProgramFiles\Python27目录下,并将D:\ProgramFiles\Python27添加到环境变量Path中,重启电脑;
2、 从 https://cygwin.com/install.html 下载setup-x86_64.exe 并安装;
3、 使用svn,下载gyp: http://gyp.googlecode.com/svn/trunk, 将整个gyp文件夹存放到/trunk_no_commit/third_party/externals文件夹下;
4、 在其它分支中将jsoncpp、jsoncpp-chromium、libjpeg、libwebp四个文件夹内容全部拷贝到/trunk_no_commit/third_party/externals文件夹下;
5、 打开Cygwin,将其切换到Skia的trunk_no_commit目录下,执行 python gyp_skia,会生成一个out文件夹,里面有生成的skia.sln工程;
6、 如果在执行python gyp_skia命令过程中,提示/third_party/externals/libwebp/src/dec/frame.c 等文件丢失,则从相关网站下载最新代码替换之即可。
7、 (1)、如果出现errorC2220:warning treated as error -no ‘object’ file generated,则将相应工程中的C/C++->General:Treat Warning As Errors,由原来的Level3(/W3)改为No(/WX-),如effects、gm工程;(2)、选中gm/verttext.cpp文件->File->AdvancedSave Options->Encoding:由原来的Unicode(UTF-8 without signature)-Codepage 65001改为ChineseSimplified(GB2312)-Codepage 936;(3)、如果third_party/extternal中的第三方库文件编译时与其它源代码不匹配,可以通过改动gyp文件夹下的相应.gyp文件来做相应的调整;
8、 通过svn http://skia.googlecode.com/svn下载所有相应的Skia源码,包括branches和trunk,下载后发现没有trunk,只有trunk_no_commit;
9、 打开Cygwin,将其定位到trunk_no_commit文件夹,执行 python gyp_skia 命令,如果出现Warning: Missing input files相关信息,说明缺少相关文件,则根据提示查找原因,否则在后期编译时会报错;
10、 正确执行完pythongyp_skia命令后,会在trunk_no_commit目录下生成out文件夹,打开里面的skia.sln,编译SampleApp工程,会生成SampleApp.exe和其它相应静态库。
11、仿照tests工程新创建一个TestSkia工程,工程设置及代码如下:
(1)、Debug和Release下,Character Set:Use Unicode Character Set;
(2)、C/C++ ->Additional Include Directories:
E:\Skia\code\google\trunk_no_commit\includeE:\Skia\code\google\trunk_no_commit\include\animatorE:\Skia\code\google\trunk_no_commit\include\configE:\Skia\code\google\trunk_no_commit\include\coreE:\Skia\code\google\trunk_no_commit\include\device\xpsE:\Skia\code\google\trunk_no_commit\include\effectsE:\Skia\code\google\trunk_no_commit\include\gpuE:\Skia\code\google\trunk_no_commit\include\gpu\glE:\Skia\code\google\trunk_no_commit\include\imagesE:\Skia\code\google\trunk_no_commit\include\pathopsE:\Skia\code\google\trunk_no_commit\include\pdfE:\Skia\code\google\trunk_no_commit\include\pipeE:\Skia\code\google\trunk_no_commit\include\portsE:\Skia\code\google\trunk_no_commit\include\recordE:\Skia\code\google\trunk_no_commit\include\svgE:\Skia\code\google\trunk_no_commit\include\textE:\Skia\code\google\trunk_no_commit\include\utilsE:\Skia\code\google\trunk_no_commit\include\utils\winE:\Skia\code\google\trunk_no_commit\include\viewsE:\Skia\code\google\trunk_no_commit\include\views\animatedE:\Skia\code\google\trunk_no_commit\include\xmlE:\Skia\code\google\trunk_no_commit\tools
(3)、C/C++ -> Preprocessor:
Debug:
WIN32_DEBUG_CONSOLESK_INTERNALSK_GAMMA_SRGBSK_GAMMA_APPLY_TO_A8SK_SCALAR_TO_FLOAT_EXCLUDEDSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1SK_SUPPORT_GPU=1SK_SUPPORT_OPENCL=0SK_FORCE_DISTANCEFIELD_FONTS=0SK_SCALAR_IS_FLOATSK_CAN_USE_FLOATSK_BUILD_FOR_WIN32_CRT_SECURE_NO_WARNINGSGR_GL_FUNCTION_TYPE=__stdcallSK_BUILD_JSON_WRITERSK_SUPPORT_PDFSK_DEBUGSK_DEVELOPER=1
Release:
WIN32NDEBUG_CONSOLESK_INTERNALSK_GAMMA_SRGBSK_GAMMA_APPLY_TO_A8SK_SCALAR_TO_FLOAT_EXCLUDEDSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1SK_SUPPORT_GPU=1SK_SUPPORT_OPENCL=0SK_FORCE_DISTANCEFIELD_FONTS=0SK_SCALAR_IS_FLOATSK_CAN_USE_FLOATSK_BUILD_FOR_WIN32_CRT_SECURE_NO_WARNINGSGR_GL_FUNCTION_TYPE=__stdcallSK_BUILD_JSON_WRITERSK_SUPPORT_PDFSK_RELEASE
(4)、Linker -> Input -> Additional Dependencies:
OpenGL32.libusp10.libDelayImp.libwindowscodecs.lib
(5)、将trunk_no_commit->tools->flags中的SkCommandLineFlags两个文件拷贝到此测试工程下并加入到工程中;
(6)、stdafx.h:
#pragma once#include "targetver.h"#include <stdio.h>#include "SkCanvas.h"#include "SkData.h"#include "SkDocument.h"#include "SkForceLinking.h"#include "SkGraphics.h"#include "SkSurface.h"#include "SkImage.h"#include "SkStream.h"#include "SkString.h"#include "SkCommandLineFlags.h"
(7)、stdafx.cpp:
#include "stdafx.h"// TODO: reference any additional headers you need in STDAFX.H// and not in this file#ifdef _DEBUG #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/experimental.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libetc1.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libjpeg.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libwebp_dec.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libwebp_dsp.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libwebp_enc.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/libwebp_utils.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/lua.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/skflate.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/lib/views_animated.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_animator.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_core.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_effects.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_images.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_opts.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_opts_ssse3.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_pdf.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_ports.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_sfnt.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_skgpu.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_skgputest.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_utils.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_views.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Debug/skia_xml.lib")#else #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/experimental.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libetc1.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libjpeg.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libwebp_dec.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libwebp_dsp.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libwebp_enc.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/libwebp_utils.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/lua.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/skflate.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/lib/views_animated.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_animator.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_core.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_effects.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_images.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_opts.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_opts_ssse3.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_pdf.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_ports.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_sfnt.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_skgpu.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_skgputest.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_utils.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_views.lib") #pragma comment(lib, "E:/Skia/code/google/trunk_no_commit/out/Release/skia_xml.lib")#endif
(8)、TestSkia.cpp:
#include "stdafx.h"#include <iostream>using namespace std;__SK_FORCE_IMAGE_DECODER_LINKING;DEFINE_string2(outFile, o, "skhello", "The filename to write the image.");DEFINE_string2(text, t, "Hello", "The string to write.");static void doDraw(SkCanvas* canvas, const SkPaint& paint, const char text[]) { SkRect bounds; canvas->getClipBounds(&bounds); canvas->drawColor(SK_ColorWHITE); canvas->drawText(text, strlen(text), bounds.centerX(), bounds.centerY(), paint);}static bool do_surface(int w, int h, const char path[], const char text[], const SkPaint& paint) { SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(w, h)); doDraw(surface->getCanvas(), paint, text); SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); SkAutoDataUnref data(image->encode()); if (NULL == data.get()) { return false; } SkFILEWStream stream(path); return stream.write(data->data(), data->size());}static bool do_document(int w, int h, const char path[], const char text[], const SkPaint& paint) { SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(path)); if (doc.get()) { SkScalar width = SkIntToScalar(w); SkScalar height = SkIntToScalar(h); doDraw(doc->beginPage(width, height, NULL), paint, text); return true; } return false;}int tool_main(int argc, char** argv) { SkCommandLineFlags::SetUsage(""); SkCommandLineFlags::Parse(argc, argv); SkAutoGraphics ag; SkString path("skhello"); SkString text("Hello"); if (!FLAGS_outFile.isEmpty()) { path.set(FLAGS_outFile[0]); } if (!FLAGS_text.isEmpty()) { text.set(FLAGS_text[0]); } SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(SkIntToScalar(30)); paint.setTextAlign(SkPaint::kCenter_Align); SkScalar width = paint.measureText(text.c_str(), text.size()); SkScalar spacing = paint.getFontSpacing(); int w = SkScalarRoundToInt(width) + 30; int h = SkScalarRoundToInt(spacing) + 30; static const struct { bool (*fProc)(int w, int h, const char path[], const char text[], const SkPaint&); const char* fSuffix; } gRec[] = { { do_surface, ".png" }, { do_document, ".pdf" }, }; for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { SkString file; file.printf("%s%s", path.c_str(), gRec[i].fSuffix); if (!gRec[i].fProc(w, h, file.c_str(), text.c_str(), paint)) { return -1; } } return 0;}int main(int argc, char* argv[]){ int flag = tool_main(argc, (char**) argv); if (flag == 0) cout<<"ok"<<endl; else cout<<"error"<<endl; return 0;}
运行此工程,会在此工程目录下生成 skhello.pdf 和 skhello.png 两个文件,文件内容为Hello
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
Skia简介以及在Windows下编译操作步骤相关推荐
- GDAL库简介以及在Windows下编译过程
GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个在X/MIT许可协议下的开源栅格空间数据转换库.官网http://www.gdal.org/ ...
- windows下编译skia库
windows下编译skia库 环境需求: 1.安装python2.7.x: python3系列可能又某些库不支持,所以推荐使用python2.7.15(最新). 如何检查是否安装python: 1. ...
- 在Windows下编译FFmpeg详细说明
在Windows下编译FFmpeg详细说明 MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 Mi ...
- Windows下编译OpenSSL(使用VS2013或VS2008)
转自https://www.cnblogs.com/findumars/p/4299976.html 简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和 ...
- Windows下编译Chrome V8
主要还是参考google的官方文档: How to Download and Build V8 Building on Windows 同时也参考了一些其它的中文博客: 脚本引擎小pk:SpiderM ...
- Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
参考:https://www.cnblogs.com/jliangqiu2016/p/7642471.html Windows下编译TensorFlow1.3 C++ library及创建一个简单的T ...
- Windows下编译语音识别引擎Wenet
Windows下编译语音识别引擎Wenet 一.Wenet简介 二.Wenet首次编译过程 2.1下载第三方库源码 2.2替换软链接 2.3下载gRPC的third_party 三.Wenet第二次编 ...
- windows下编译以及运行cryptominisat 求解器(sat求解器)
cryptominisat是由msoos所开发的一款sat求解器,sat的具体问题另外一篇博客里有详细介绍点击打开链接,本篇文章只介绍如何在windows下运行cryptominisat,将自己遇到的 ...
- windows下编译darknet
目录 windows下编译darknet 换了编译方案 windows下编译darknet 使用vs2015 配置失败 疯狂报错有位置引用错误 配置环境 cuda版本11.6 报错如下 C:\Prog ...
最新文章
- mysql远程连接设置_MySQL远程连接设置
- java高并发(二)并发与高并发基本概念
- Hadoop之MapReduce程序应用一读取专利引用数据集并对它进行倒排
- VHDL设计脉搏计的课程设计
- 第10章 32 位 Intel 微处理器编程架构
- 证监会:对贾跃亭、杨丽杰采取终身证券市场禁入措施
- python3.7.4安装教程win7_Window10下python3.7 安装与卸载教程图解
- Atitit mvc框架的实现 目录 1.1. class MvcCtrol {	1 1.2. MvcFilter	1 1.3. MvcUtil	2 /springboothelloword/sr
- 机器学习笔记(十四):主成分分析法(PCA)(2)
- PHP函数和MySQL数据库
- 3G是IPv6的3G(转)
- 随机信号分析学习笔记(6)
- excel转txt后导入mysql 20211207
- java graphics类详解_java 基础二 Graphics类
- 地图SDK全面升级 – 数十项新功能及优化等你来体验
- python爬取高校课程信息进行选课实战
- pdf文件如何在安卓手机端不用下载在线预览
- 从阿里 Weex 一窥移动技术发展之路
- Baidu KDD Cup 2022 官方赛题解读,内附 Baseline 开源代码
- 数字化营销模式有哪些?数字化营销怎么做?
热门文章
- 评测 i5 13600kf和r7 5800x3D差距 酷睿i513600kf和锐龙r7 5800x3D选哪个好
- 计算机专业常用的软件
- 《Blender建模练习:人物模型多边形建模》
- 抛物样条曲线(最详细简单的解析)
- 如何删除题注外面的图文框
- 认知神经科学笔记---2 (绪论)
- 艾伟_转载:一次挂死(hang)的处理过程及经验
- 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记05...
- 咸鱼洽谈(正则表达式)来自咸鱼王的无能拍桌~
- SAP ERP助力文档管理服务实力企业实现管理信息化,提升交易效率