[图形引擎Skia之二]开发环境搭建

2018-02-27  本文已影响0人  var_rain

前言

首先呢,在搭建开发环境之前,请确保你已经编译出了对应平台的library :
Windows : skia.dll , skia.dll.lib
Linux : libskia.a , libskia.so
如果没有编译出来或者还不知道怎么编译,请参考我的上一篇文章,根据你需要的平台下载源码进行编译:
[图形引擎Skia之一]源码下载与编译(Windows)
[图形引擎Skia之一]源码下载与编译(Ubuntu)

为了各位方便,这里提供编译好的 Windows x86Windows x64 版本的 skia 相关开发文件
百度网盘

准备工作

首先呢,Skia就是一个单纯的2D图形引擎而已,他并不像Cairo那样All In One,所以呢,并不包含窗体,事件,线程,UI更新等功能,但是我们开发应用程序则需要这些功能,那么怎么办呢?当然有办法啦,我的解决办法就是使用SDL2来承载Skia,实现跨平台的功能,并解决我们的窗体创建,事件,线程,UI更新等.关于SDL2是什么,我这里就不多说了,不懂的小伙伴自行百(gu)度(ge).
既然我们要开发应用程序,那么就需要搭建开发环境啦,对应的平台选择对应的开发环境,我的开发环境如下,各位小伙伴们可以参考参考:
Windows :
桌面环境 : Windows 10 X64 Professional
开发环境 : Visual Studio 2017 Enterprise
依赖环境 : SDL2 , Skia
Ubuntu :
桌面环境 : Ubuntu 16.04 X64 STL
开发环境 : JetBrains CLion 2017.3.3
依赖环境 : libsdl2-dev Skia libfontconfig1-dev freeglut3-dev libfreetype6-dev libgif-dev libglu1-mesa-dev libpng12-dev libqt4-dev
依赖安装 :

$ sudo apt install libsdl2-dev libfontconfig1-dev freeglut3-dev libfreetype6-dev libgif-dev libglu1-mesa-dev libpng12-dev libqt4-dev

Windows开发环境搭建

首先呢,打开你的Visual Studio,然后新建一个项目,选择Visual C++,选择空项目,并填上你的应用名称,选择好你的创建路径.

create_new_project_with_windows.png
然后确定,等待项目创建完成.创建完成之后,如果你编译的平台是x64,则需要切换构建的平台,不然链接的时候会报错. select_platform_with_windows.png
紧接着,右键创建的项目,注意,是项目,不是解决方案,然后选择属性. config_project_with_windows.png
在属性窗口的左边选择配置属性->VC++ 目录,找到包含目录并点击编辑. add_include_files_with_windows.png
添加skia源码目录下的include文件夹以及include目录下的所有文件夹,别忘了还有SDL2的include文件夹 add_include_directory_with_windows.png
然后点击确定,之后再属性窗口左边找到连接器选项,选择常规,并点击编辑附加目录库. add_library_directory_with_windows.png
然后添加skia.dll.lib所在的目录和SDL2.lib所在的目录,注意选择与你的构建平台对应的目录. add_library_directory_2_with_windows.png
之后点击确定,选择属性窗口左边的输入,并点击编辑附加依赖项,添加skia.dll.lib, SDL2.lib, SDL2main.lib add_library_file_with_windows.png
然后点击确定,在属性窗口点击应用并点击确定关闭属性窗口.
之后就是你的编码工作了,我会在本文末尾贴上此处的代码. skia_run_with_windows.png
填坑(Windows)
1.如果出现 LNK156:必须定义入口点 这类错误,请右键项目->属性->连接器->系统->子系统->选择 窗口 (/SUBSYSTEM:WINDOWS) 然后确定即可. not_found_main_method.png select_system_type_with_windows.png
2.如果出现SDL2.dll未找到的错误或者skia.dll未找到的错误,则需要将skia.dll和SDL2.dll复制到Visual Studio的编译输出目录即可. not_found_SDL2_dll.png
not_found_skia_dll.png copy_library_to_run_with_windows.png

Ubuntu开发环境搭建

还是老样子,打开你的CLion,然后File->New Project创建一个C++ Executable项目,然后选则你的项目路径,并设置好你的项目名称,然后点击Create. create_new_project_with_linux.png
之后配置你的项目,在左边的Project窗口打开项目目录下的CMakeLists.txt文件,添加目录包含和编译链接. add_include_and_library_with_linux.png
由于Ubuntu下的SDL2是直接安装在系统中的,所以就不需要我们手动导入include和写全libSDL2.so路径了,但是呢,skia.so的路径还是要写全的.为了小伙伴们方便,我就直接贴出来吧.
cmake_minimum_required(VERSION 3.9)
project(SkiaConfig)

set(CMAKE_CXX_STANDARD 11)

# 设置SKIA的主目录
set(SKIA /home/var/files/skia)

# 包含目录
include_directories(
        ${SKIA}/include
        ${SKIA}/include/android
        ${SKIA}/include/atlastext
        ${SKIA}/include/c
        ${SKIA}/include/codec
        ${SKIA}/include/config
        ${SKIA}/include/core
        ${SKIA}/include/effects
        ${SKIA}/include/encode
        ${SKIA}/include/gpu
        ${SKIA}/include/gpu/gl
        ${SKIA}/include/gpu/mock
        ${SKIA}/include/gpu/mtl
        ${SKIA}/include/gpu/vk
        ${SKIA}/include/pathops
        ${SKIA}/include/ports
        ${SKIA}/include/private
        ${SKIA}/include/svg
        ${SKIA}/include/utils
        ${SKIA}/include/utils/mac
        ${SKIA}/include/views)

# 设置链接库
link_libraries(SDL2 SDL2main ${SKIA}/out/Shared/libskia.so)

add_executable(SkiaConfig main.cpp)

紧接着就是SKIA的编码工作了,感觉Linux开发是要比Windows方便很多呢.
填坑(Ubuntu)
在Ubuntu下使用Skia绘制文字需要加载系统的字体文件,不然的话文字是不会显示的.

skia_run_with_linux.png

干货分享

#include <SkBitmap.h>
#include <core/SkCanvas.h>
#include <core/SkTypeface.h>

#ifdef _WIN32

#include <SDL.h>

#else

#include <SDL2/SDL.h>

#endif

//创建RGBA结构体
struct RGBA {
    //设置Red
    Uint32 rmask = 0x00ff0000;
    //设置Green
    Uint32 gmask = 0x0000ff00;
    //设置Blue
    Uint32 bmask = 0x000000ff;
    //设置Alpha
    Uint32 amask = 0xff000000;
};

//创建SkBitmap对象并在Bitmap上绘制
SkBitmap draw(int w, int h) {
    //声明
    SkBitmap bitmap;
    //设置Bitmap的配置信息
    bitmap.setInfo(SkImageInfo::Make(w, h, kBGRA_8888_SkColorType, kOpaque_SkAlphaType));
    //转换为像素填充
    bitmap.allocPixels();
    //创建画布
    SkCanvas canvas(bitmap);
    //创建画笔
    SkPaint paint;
    //设置画布颜色
    canvas.clear(SK_ColorWHITE);
    //设置画笔抗锯齿
    paint.setAntiAlias(true);
    //设置画笔颜色(此处为红色)
    paint.setARGB(255, 255, 0, 0);
    //绘制圆形
    canvas.drawCircle(80, 80, 40, paint);
    //绘制线段
    canvas.drawLine(0, 280, w, 280, paint);
    //设置字体大小
    paint.setTextSize(60);
    //绘制字体
    canvas.drawString("Hello Skia", 300, 150, paint);
    //返回SkBitmap对象
    return bitmap;
}

//通过SDL_Surface创建SDL_Rect
SDL_Rect create_rect(SDL_Surface *surface) {
    //创建SDL_Rect对象
    SDL_Rect src = { 0, 0, surface->w, surface->h };
    //返回SDL_Rect对象
    return src;
}

//程序的入口点
int main(int args, char *argv[]) {
    //声明窗口
    SDL_Window *window;
    //声明绘图表面
    SDL_Surface *surface;
    //声明渲染器
    SDL_Renderer *renderer;
    //声明纹理
    SDL_Texture *texture;
    //声明Bitmap
    SkBitmap bitmap;
    //声明RGBA结构体
    RGBA rgba;
    //声明矩形
    SDL_Rect rect;
    //声明窗口的宽高
    int width = 800;
    int height = 480;
    //初始化SDL为视频显示
    SDL_Init(SDL_INIT_VIDEO);
    //创建窗口
    window = SDL_CreateWindow("Hello Skia", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height,
        SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (window == NULL) {
        return -1;
    }
    //获取绘制后的Bitmap
    bitmap = draw(width, height);
    //通过Bitmap的像素数据创建表面
    surface = SDL_CreateRGBSurfaceFrom(bitmap.getPixels(), width, height, 32, width * 4, rgba.rmask, rgba.gmask,
        rgba.bmask, rgba.amask);
    //通过SDL_Surface创建矩形
    rect = create_rect(surface);
    //创建渲染器
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    //清理渲染器
    SDL_RenderClear(renderer);
    //创建纹理
    texture = SDL_CreateTextureFromSurface(renderer, surface);
    //辅助纹理到渲染器
    SDL_RenderCopy(renderer, texture, NULL, &rect);
    //显示到窗口
    SDL_RenderPresent(renderer);
    //延时5秒钟
    SDL_Delay(5000);
    //释放表面
    SDL_FreeSurface(surface);
    //释放纹理
    SDL_DestroyTexture(texture);
    //释放渲染器
    SDL_DestroyRenderer(renderer);
    //释放窗口
    SDL_DestroyWindow(window);
    //结束SDL
    SDL_Quit();
    //程序退出
    return 0;
}

如果遇到问题,可留言,我会在我能力范围内进行逐一解答.
好吧,这次就到这里吧,下次我们将开始深入研究Skia.

上一篇下一篇

猜你喜欢

热点阅读