[圖形引擎Skia之二]開(kāi)發(fā)環(huán)境搭建

前言

首先呢,在搭建開(kāi)發(fā)環(huán)境之前,請(qǐng)確保你已經(jīng)編譯出了對(duì)應(yīng)平臺(tái)的library :
Windows : skia.dll , skia.dll.lib
Linux : libskia.a , libskia.so
如果沒(méi)有編譯出來(lái)或者還不知道怎么編譯,請(qǐng)參考我的上一篇文章,根據(jù)你需要的平臺(tái)下載源碼進(jìn)行編譯:
[圖形引擎Skia之一]源碼下載與編譯(Windows)
[圖形引擎Skia之一]源碼下載與編譯(Ubuntu)

為了各位方便,這里提供編譯好的 Windows x86Windows x64 版本的 skia 相關(guān)開(kāi)發(fā)文件
百度網(wǎng)盤

準(zhǔn)備工作

首先呢,Skia就是一個(gè)單純的2D圖形引擎而已,他并不像Cairo那樣All In One,所以呢,并不包含窗體,事件,線程,UI更新等功能,但是我們開(kāi)發(fā)應(yīng)用程序則需要這些功能,那么怎么辦呢?當(dāng)然有辦法啦,我的解決辦法就是使用SDL2來(lái)承載Skia,實(shí)現(xiàn)跨平臺(tái)的功能,并解決我們的窗體創(chuàng)建,事件,線程,UI更新等.關(guān)于SDL2是什么,我這里就不多說(shuō)了,不懂的小伙伴自行百(gu)度(ge).
既然我們要開(kāi)發(fā)應(yīng)用程序,那么就需要搭建開(kāi)發(fā)環(huán)境啦,對(duì)應(yīng)的平臺(tái)選擇對(duì)應(yīng)的開(kāi)發(fā)環(huán)境,我的開(kāi)發(fā)環(huán)境如下,各位小伙伴們可以參考參考:
Windows :
桌面環(huán)境 : Windows 10 X64 Professional
開(kāi)發(fā)環(huán)境 : Visual Studio 2017 Enterprise
依賴環(huán)境 : SDL2 , Skia
Ubuntu :
桌面環(huán)境 : Ubuntu 16.04 X64 STL
開(kāi)發(fā)環(huán)境 : JetBrains CLion 2017.3.3
依賴環(huán)境 : 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開(kāi)發(fā)環(huán)境搭建

首先呢,打開(kāi)你的Visual Studio,然后新建一個(gè)項(xiàng)目,選擇Visual C++,選擇空項(xiàng)目,并填上你的應(yīng)用名稱,選擇好你的創(chuàng)建路徑.

create_new_project_with_windows.png

然后確定,等待項(xiàng)目創(chuàng)建完成.創(chuàng)建完成之后,如果你編譯的平臺(tái)是x64,則需要切換構(gòu)建的平臺(tái),不然鏈接的時(shí)候會(huì)報(bào)錯(cuò).
select_platform_with_windows.png

緊接著,右鍵創(chuàng)建的項(xiàng)目,注意,是項(xiàng)目,不是解決方案,然后選擇屬性.
config_project_with_windows.png

在屬性窗口的左邊選擇配置屬性->VC++ 目錄,找到包含目錄并點(diǎn)擊編輯.
add_include_files_with_windows.png

添加skia源碼目錄下的include文件夾以及include目錄下的所有文件夾,別忘了還有SDL2的include文件夾
add_include_directory_with_windows.png

然后點(diǎn)擊確定,之后再屬性窗口左邊找到連接器選項(xiàng),選擇常規(guī),并點(diǎn)擊編輯附加目錄庫(kù).
add_library_directory_with_windows.png

然后添加skia.dll.lib所在的目錄和SDL2.lib所在的目錄,注意選擇與你的構(gòu)建平臺(tái)對(duì)應(yīng)的目錄.
add_library_directory_2_with_windows.png

之后點(diǎn)擊確定,選擇屬性窗口左邊的輸入,并點(diǎn)擊編輯附加依賴項(xiàng),添加skia.dll.lib, SDL2.lib, SDL2main.lib
add_library_file_with_windows.png

然后點(diǎn)擊確定,在屬性窗口點(diǎn)擊應(yīng)用并點(diǎn)擊確定關(guān)閉屬性窗口.
之后就是你的編碼工作了,我會(huì)在本文末尾貼上此處的代碼.
skia_run_with_windows.png

填坑(Windows)
1.如果出現(xiàn) LNK156:必須定義入口點(diǎn) 這類錯(cuò)誤,請(qǐng)右鍵項(xiàng)目->屬性->連接器->系統(tǒng)->子系統(tǒng)->選擇 窗口 (/SUBSYSTEM:WINDOWS) 然后確定即可.
not_found_main_method.png
select_system_type_with_windows.png

2.如果出現(xiàn)SDL2.dll未找到的錯(cuò)誤或者skia.dll未找到的錯(cuò)誤,則需要將skia.dll和SDL2.dll復(fù)制到Visual Studio的編譯輸出目錄即可.
not_found_SDL2_dll.png

not_found_skia_dll.png
copy_library_to_run_with_windows.png

Ubuntu開(kāi)發(fā)環(huán)境搭建

還是老樣子,打開(kāi)你的CLion,然后File->New Project創(chuàng)建一個(gè)C++ Executable項(xiàng)目,然后選則你的項(xiàng)目路徑,并設(shè)置好你的項(xiàng)目名稱,然后點(diǎn)擊Create.
create_new_project_with_linux.png

之后配置你的項(xiàng)目,在左邊的Project窗口打開(kāi)項(xiàng)目目錄下的CMakeLists.txt文件,添加目錄包含和編譯鏈接.
add_include_and_library_with_linux.png

由于Ubuntu下的SDL2是直接安裝在系統(tǒng)中的,所以就不需要我們手動(dòng)導(dǎo)入include和寫全libSDL2.so路徑了,但是呢,skia.so的路徑還是要寫全的.為了小伙伴們方便,我就直接貼出來(lái)吧.
cmake_minimum_required(VERSION 3.9)
project(SkiaConfig)

set(CMAKE_CXX_STANDARD 11)

# 設(shè)置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)

# 設(shè)置鏈接庫(kù)
link_libraries(SDL2 SDL2main ${SKIA}/out/Shared/libskia.so)

add_executable(SkiaConfig main.cpp)

緊接著就是SKIA的編碼工作了,感覺(jué)Linux開(kāi)發(fā)是要比Windows方便很多呢.
填坑(Ubuntu)
在Ubuntu下使用Skia繪制文字需要加載系統(tǒng)的字體文件,不然的話文字是不會(huì)顯示的.

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

//創(chuàng)建RGBA結(jié)構(gòu)體
struct RGBA {
    //設(shè)置Red
    Uint32 rmask = 0x00ff0000;
    //設(shè)置Green
    Uint32 gmask = 0x0000ff00;
    //設(shè)置Blue
    Uint32 bmask = 0x000000ff;
    //設(shè)置Alpha
    Uint32 amask = 0xff000000;
};

//創(chuàng)建SkBitmap對(duì)象并在Bitmap上繪制
SkBitmap draw(int w, int h) {
    //聲明
    SkBitmap bitmap;
    //設(shè)置Bitmap的配置信息
    bitmap.setInfo(SkImageInfo::Make(w, h, kBGRA_8888_SkColorType, kOpaque_SkAlphaType));
    //轉(zhuǎn)換為像素填充
    bitmap.allocPixels();
    //創(chuàng)建畫布
    SkCanvas canvas(bitmap);
    //創(chuàng)建畫筆
    SkPaint paint;
    //設(shè)置畫布顏色
    canvas.clear(SK_ColorWHITE);
    //設(shè)置畫筆抗鋸齒
    paint.setAntiAlias(true);
    //設(shè)置畫筆顏色(此處為紅色)
    paint.setARGB(255, 255, 0, 0);
    //繪制圓形
    canvas.drawCircle(80, 80, 40, paint);
    //繪制線段
    canvas.drawLine(0, 280, w, 280, paint);
    //設(shè)置字體大小
    paint.setTextSize(60);
    //繪制字體
    canvas.drawString("Hello Skia", 300, 150, paint);
    //返回SkBitmap對(duì)象
    return bitmap;
}

//通過(guò)SDL_Surface創(chuàng)建SDL_Rect
SDL_Rect create_rect(SDL_Surface *surface) {
    //創(chuàng)建SDL_Rect對(duì)象
    SDL_Rect src = { 0, 0, surface->w, surface->h };
    //返回SDL_Rect對(duì)象
    return src;
}

//程序的入口點(diǎn)
int main(int args, char *argv[]) {
    //聲明窗口
    SDL_Window *window;
    //聲明繪圖表面
    SDL_Surface *surface;
    //聲明渲染器
    SDL_Renderer *renderer;
    //聲明紋理
    SDL_Texture *texture;
    //聲明Bitmap
    SkBitmap bitmap;
    //聲明RGBA結(jié)構(gòu)體
    RGBA rgba;
    //聲明矩形
    SDL_Rect rect;
    //聲明窗口的寬高
    int width = 800;
    int height = 480;
    //初始化SDL為視頻顯示
    SDL_Init(SDL_INIT_VIDEO);
    //創(chuàng)建窗口
    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);
    //通過(guò)Bitmap的像素?cái)?shù)據(jù)創(chuàng)建表面
    surface = SDL_CreateRGBSurfaceFrom(bitmap.getPixels(), width, height, 32, width * 4, rgba.rmask, rgba.gmask,
        rgba.bmask, rgba.amask);
    //通過(guò)SDL_Surface創(chuàng)建矩形
    rect = create_rect(surface);
    //創(chuàng)建渲染器
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    //清理渲染器
    SDL_RenderClear(renderer);
    //創(chuàng)建紋理
    texture = SDL_CreateTextureFromSurface(renderer, surface);
    //輔助紋理到渲染器
    SDL_RenderCopy(renderer, texture, NULL, &rect);
    //顯示到窗口
    SDL_RenderPresent(renderer);
    //延時(shí)5秒鐘
    SDL_Delay(5000);
    //釋放表面
    SDL_FreeSurface(surface);
    //釋放紋理
    SDL_DestroyTexture(texture);
    //釋放渲染器
    SDL_DestroyRenderer(renderer);
    //釋放窗口
    SDL_DestroyWindow(window);
    //結(jié)束SDL
    SDL_Quit();
    //程序退出
    return 0;
}

如果遇到問(wèn)題,可留言,我會(huì)在我能力范圍內(nèi)進(jìn)行逐一解答.
好吧,這次就到這里吧,下次我們將開(kāi)始深入研究Skia.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市英支,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赋荆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冷冗,死亡現(xiàn)場(chǎng)離奇詭異蝴猪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)养葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘩缆,“玉大人关拒,你說(shuō)我怎么就攤上這事∮褂椋” “怎么了着绊?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熟尉。 經(jīng)常有香客問(wèn)我归露,道長(zhǎng),這世上最難降的妖魔是什么斤儿? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任剧包,我火速辦了婚禮,結(jié)果婚禮上往果,老公的妹妹穿的比我還像新娘疆液。我一直安慰自己,他們只是感情好陕贮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布堕油。 她就那樣靜靜地躺著,像睡著了一般肮之。 火紅的嫁衣襯著肌膚如雪掉缺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天戈擒,我揣著相機(jī)與錄音眶明,去河邊找鬼。 笑死峦甩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凯傲,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼犬辰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冰单?” 一聲冷哼從身側(cè)響起幌缝,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诫欠,沒(méi)想到半個(gè)月后涵卵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荒叼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年轿偎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被廓。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坏晦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫁乘,到底是詐尸還是另有隱情昆婿,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布蜓斧,位于F島的核電站仓蛆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挎春。R本人自食惡果不足惜看疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搂蜓。 院中可真熱鬧狼荞,春花似錦、人聲如沸帮碰。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)殉挽。三九已至丰涉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斯碌,已是汗流浹背一死。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傻唾,地道東北人投慈。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓承耿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伪煤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子加袋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容