想在 Ubuntu 上使用 Skia 学习图形[关闭]

Posted

技术标签:

【中文标题】想在 Ubuntu 上使用 Skia 学习图形[关闭]【英文标题】:Want to learn graphics using Skia on Ubuntu [closed] 【发布时间】:2011-07-10 06:33:10 【问题描述】:

我想学习图形编程,我想使用 Skia 作为库。 如何在 Ubuntu 上开始使用它?

【问题讨论】:

【参考方案1】:

使用 r1236 版本。较新版本的 skia 在 Linux 上存在问题。

svn checkout http://skia.googlecode.com/svn/trunk -r1236

// New URL: svn checkout http://skia.googlecode.com/svn/trunk_no_commit -r1236

cd trunk

Skia 有硬编码的字体路径,所以你想改变它。

编辑src/ports/SkFontHost_linux.cpp

搜索“SK_FONT_FILE_PREFIX”

将“/usr/share/fonts/truetype/msttcorefonts/”更改为“/usr/share/fonts/TTF/”

./gyp/gyp_skia

make

你现在应该有 libskia.a。

#include "SkCanvas.h"
#include "SkGraphics.h"
#include "SkImageEncoder.h"
#include "SkString.h"
#include "SkTemplates.h"
#include "SkTypeface.h"

// g++ main.cpp -Wl,-rpath,./ -L. -lskia -Iinclude/core -Iinclude/config -Iinclude/images -lpthread -lfreetype -lpng -o main

int main (int argc, char * const argv[]) 

    //
    SkAutoGraphics ag;

    //Output filename
    SkString path("skhello.png");

    //Set Text To Draw
    SkString text("Hydra v0.0.1a");

    SkPaint paint;

    //Set Text ARGB Color
    paint.setARGB(255, 255, 255, 255);

    //Turn AntiAliasing On
    paint.setAntiAlias(true);
    paint.setLCDRenderText(true);
    paint.setTypeface(SkTypeface::CreateFromName("sans-serif", SkTypeface::kNormal));

    //Set Text Size
    paint.setTextSize(SkIntToScalar(40));

    //Set Image Width & Height
    int width = 500;
    int height = 600;

    SkBitmap bitmap;
    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
    bitmap.allocPixels();

    //Create Canvas
    SkCanvas canvas(bitmap);
    canvas.drawARGB(255, 25, 25, 25);

    //Text X, Y Position Varibles
    int x = 80;
    int y = 60;

    canvas.drawText(text.c_str(), text.size(), x, y, paint);

    //Set Style and Stroke Width
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(3);

    //Draw A Rectangle
    SkRect rect;
    paint.setARGB(255, 255, 255, 255);
    //Left, Top, Right, Bottom
    rect.set(50, 100, 200, 200);
    canvas.drawRoundRect(rect, 20, 20, paint);

    canvas.drawOval(rect, paint);

    //Draw A Line
    canvas.drawLine(10, 300, 300, 300, paint);

    //Draw Circle (X, Y, Size, Paint)
    canvas.drawCircle(100, 400, 50, paint);

    //Same Image  (file, bitmap, image_type, quality)
    SkImageEncoder::EncodeFile(path.c_str(), bitmap, SkImageEncoder::kPNG_Type, 0);

    return 0;

这是一个 SFML2 和 Skia 示例:

#include <SFML/Graphics.hpp>
#include "SkCanvas.h"
#include "SkGraphics.h"
#include "SkImageEncoder.h"
#include "SkString.h"
#include "SkTemplates.h"
#include "SkTypeface.h"

#include <iostream>

// g++ main.cpp -Wl,-rpath,./ -L. -lskia -Iinclude/core -Iinclude/config -Iinclude/images -lpthread -lfreetype -lpng -lsfml-window -lsfml-graphics -lsfml-system

using namespace std;

int main(int argc, char **argv) 

    int width = 800;
    int height = 600;

    // Create the main window
    sf::RenderWindow window(sf::VideoMode(width, height), "SFML window");
    sf::Image image;

    SkAutoGraphics ag;

    //Set Text To Draw
    SkString text("Hydra Skia v0.0.1a");

    SkPaint paint;

    //Set Text ARGB Color
    paint.setARGB(255, 255, 255, 255);

    //Turn AntiAliasing On
    paint.setAntiAlias(true);
    paint.setLCDRenderText(true);
    paint.setTypeface(SkTypeface::CreateFromName("sans-serif", SkTypeface::kNormal));

    //Set Text Size
    paint.setTextSize(SkIntToScalar(20));

    SkBitmap bitmap;
    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width / 2, height);
    bitmap.allocPixels();

    //Create Canvas
    SkCanvas canvas(bitmap);
    canvas.drawARGB(100, 25, 25, 25);

    //Text X, Y Position Varibles
    int x = 80;
    int y = 60;

    canvas.drawText(text.c_str(), text.size(), x, y, paint);

    //Set Style and Stroke Width
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(3);

    //Draw A Rectangle
    SkRect rect;
    paint.setARGB(255, 0, 0, 0);
    //Left, Top, Right, Bottom
    rect.set(50, 100, 200, 200);
    canvas.drawRoundRect(rect, 20, 20, paint);

    canvas.drawOval(rect, paint);

    //Draw A Line
    canvas.drawLine(10, 300, 300, 300, paint);

    //Draw Circle (X, Y, Size, Paint)
    canvas.drawCircle(100, 400, 50, paint);


    image.Create(bitmap.width(), bitmap.height(), reinterpret_cast<const sf::Uint8*>(bitmap.getPixels()));

    // Load a sprite to display
    sf::Texture texture;
    if (!texture.LoadFromImage(image))
            return EXIT_FAILURE;

    sf::Sprite sprite(texture);
    //sprite.SetPosition(100, 100);
    //sprite.Resize(400, 400);

    // Load a sprite to display
    sf::Texture tex;
    if (!tex.LoadFromFile("background.jpg"))
           return EXIT_FAILURE;
    sf::Sprite texs(tex);


    // Start the game loop
    while (window.IsOpened())
    
        // Process events
        sf::Event event;
        while (window.PollEvent(event))
        
            // Close window : exit
            if (event.Type == sf::Event::Closed)
                window.Close();
        

        // Clear screen
        window.Clear();

        window.Draw(texs);
        window.Draw(sprite);

        // Update the window
        window.Display();
    

    return EXIT_SUCCESS;

【讨论】:

第一个程序显示了一些错误,例如No member called CreateFromName in SkTypeface,您的情况如何?【参考方案2】:

来自Google Code 页面上的 wiki:Getting Started on Linux

【讨论】:

以上是关于想在 Ubuntu 上使用 Skia 学习图形[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Windows下从源代码编译Skia

关于skia antialias

如何为ios构建skia

如何为ios构建skia

ANGLE 和 Skia 图形引擎有啥区别?

用于 Kotlin 多平台移动设备的 Skia