6

グラフィックプログラミングを学びたい、Skiaをライブラリとして使いたい。Ubuntuでそれを始めるにはどうすればよいですか?

4

2 に答える 2

10

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;
}
于 2012-01-24T05:29:33.473 に答える
0

Google Codeページの wiki から: Getting Started on Linux

于 2011-08-12T08:08:25.527 に答える