skui学习笔记

爷,独闯天下 提交于 2019-12-10 00:51:47

一、skui简介

使用Skia作为低级绘图工具包的UI框架。它使用C ++标准库的最新功能(当前针对C ++ 17)。目前这个仓库处于开发阶段,功能还不稳定。该仓库的源代码在github上(https://github.com/skui-org/skui),作者是Ruben Van Boxem,遵循MIT开源协议。

这里不得不先介绍一下skia。Skia是一个开源2D图形库,它提供可在各种硬件和软件平台上工作的通用API。它用作Google Chrome和Chrome OS,Android,Mozilla Firefox和Firefox OS以及许多其他产品的图形引擎。Skia由Google赞助和管理,根据BSD自由软件许可,任何人均可使用。skia的优势在于CPU和2D渲染。

二、编译环境搭建

我的编译环境:Ubuntu18.04LTS,GCC版本7.4.0
首先从github上克隆仓库

git clone https://github.com/skui-org/skui.git

进入仓库

cd skui

更新子模块仓库

git submodule update --init --recursive

有的时候会在拉取skia的时候卡住,这时候进入3rdparty目录再次拉取

cd 3rdparty
git submodule update --init --recursive
cd ..

这样就拉取了skui所有源码。

然后就可以编译

mkdir ../skui-build
cd ../skui-build
cmake ../skui -G Ninja
cmake --build .

可以运行一下例程,是个很小的弹出窗口。

./examples/widget_gallery/widget_gallery

在这里插入图片描述

三、cmake目录分析

不想了解cmake编译的这部分可以跳过。

1、根目录CMakeLists

源码根目录CMakeLists定义了工程名和编译选项,设置了cmake模块目录,添加toolchain_options.cmake

cmake_minimum_required(VERSION 3.13)
project(skui)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
include(toolchain_options)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

添加了几个option开关,添加3rdparty_options.cmake

# 3rdparty dependencies
option(SKUI_USE_PREBUILT_3RDPARTY "Use a prebuilt 3rdparty package" OFF)
set(SKUI_PREBUILT_3RDPARTY_PATH CACHE STRING "NOTSET")
option(SKUI_USE_PREBUILT_ZLIB "Use a prebuilt zlib" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_LIBEXPAT "Use a prebuilt libexpat" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_LIBPNG "Use a prebuilt libpng" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_GIFLIB "Use a prebuilt giflib" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_LIBJPEG_TURBO "Use a prebuilt libjpeg-turbo" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_SKIA "Use a prebuilt Skia" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_PREBUILT_BOOST "Use a prebuilt Boost" ${SKUI_USE_PREBUILT_3RDPARTY})
option(SKUI_USE_SYSTEM_ZLIB "Use system zlib" OFF)
option(SKUI_USE_SYSTEM_LIBEXPAT "Use system libexpat" OFF)
option(SKUI_USE_SYSTEM_LIBPNG "Use system libpng" OFF)
option(SKUI_USE_SYSTEM_GIFLIB "Use system giflib" OFF)
option(SKUI_USE_SYSTEM_LIBJPEG_TURBO "Use system libjpeg-turbo" OFF)
option(SKUI_USE_SYSTEM_SKIA "Use system Skia library" OFF)
option(SKUI_USE_SYSTEM_BOOST "Use system Boost library" OFF)

include(3rdparty_options)

定义了一个函数exclude_from_build用来剔除不用的源码文件,实现跨平台。

# Boilerplate
function(exclude_from_build)
  set_source_files_properties(${ARGV} PROPERTIES HEADER_FILE_ONLY TRUE)
endfunction()

添加了core、css、graphics、gui、opengl、system几个模块

# skui itself
add_subdirectory(core)
add_subdirectory(css)
add_subdirectory(graphics)
add_subdirectory(gui)
add_subdirectory(opengl)
add_subdirectory(system)

最后添加例程和测试代码

# skui examples
add_subdirectory(examples)

# skui tests
enable_testing()
add_subdirectory(tests)

2、cmake/toolchain_options.cmake

防止文件多次被调用

include_guard(GLOBAL)

里面主要是针对一些平台的编译设置和优化

忽略编译警告,去除不用的处理单元

if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "-pedantic-errors -Wextra -Wconversion -Winit-self -Wmissing-include-dirs -Wstrict-aliasing -Werror ${CMAKE_CXX_FLAGS}")
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
......

if(GC_SECTIONS)
  if(MINGW OR UNIX AND NOT APPLE)
    message("#6")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
  endif()
endif()

3、cmake/3rdparty_options.cmake

该目录下是第三方的库zlib、libexpat、libpng、giflib、jpeg-turbo、skia的预编译,通过变量SKUI_USE_PREBUILT_3RDPARTY控制,默认OFF

zlib

if(SKUI_USE_PREBUILT_ZLIB)
  add_library(zlib INTERFACE)
  target_include_directories(zlib SYSTEM INTERFACE ${SKUI_PREBUILT_3RDPARTY_PATH}/zlib)
  target_link_libraries(zlib INTERFACE ${SKUI_PREBUILT_3RDPARTY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}zlib${CMAKE_STATIC_LIBRARY_SUFFIX})
  set(ZLIB_FOUND TRUE)
elseif(SKUI_USE_SYSTEM_ZLIB)
  find_package(ZLIB REQUIRED)
  add_library(zlib INTERFACE)
  target_link_libraries(zlib INTERFACE ZLIB::ZLIB)

libexpat

.......

4、3rdparty/CMakeLists.txt

该目录是第三方的库zlib、libexpat、libpng、giflib、jpeg-turbo、skia的编译部分,用来生成静态库

5、examples/widget_gallery/CMakeLists.txt

这部分很简单,只有widget_gallery.c++一个源文件。链接了core、gui两个库。这两个库是由core、gui模块编译出来的静态库。

set(widget_gallery_src
    widget_gallery.c++
   )

source_group("" FILES ${widget_gallery_src})

add_executable(widget_gallery WIN32 widget_gallery.c++)
target_link_libraries(widget_gallery core gui)
set_target_properties(widget_gallery PROPERTIES FOLDER examples)

四、模块分析

skui分为几个模块:

# skui itself
add_subdirectory(core)
add_subdirectory(css)
add_subdirectory(graphics)
add_subdirectory(gui)
add_subdirectory(opengl)
add_subdirectory(system)

目前example里面例程用到的只有core、graphics、gui三个模块。

1、core

基本功能,包括信号,属性,字符串,路径,应用程序,操作系统抽象

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!