#include "SkBitmap.h" #include "SkDevice.h" #include "SkPaint.h" #include "SkRect.h" #include "SkImageEncoder.h" int main() { // Declare a raster bitmap, which has an integer width and height, // and a format (config), and a pointer to the actual pixels. // Bitmaps can be drawn into a SkCanvas, but they are also used to // specify the target of a SkCanvas' drawing operations. SkBitmap bitmap; bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200); bitmap.allocPixels(); // A Canvas encapsulates all of the state about drawing into a // device (bitmap). This includes a reference to the device itself, // and a stack of matrix/clip values. For any given draw call (e.g. // drawRect), the geometry of the object being drawn is transformed // by the concatenation of all the matrices in the stack. The // transformed geometry is clipped by the intersection of all of the // clips in the stack. SkCanvas canvas(new SkDevice(bitmap)); // SkPaint class holds the style and color information about how to // draw geometries, text and bitmaps. SkPaint paint; // SkIRect holds four 32 bit integer coordinates for a rectangle. SkRect r; paint.setARGB(255, 255, 0, 0); r.set(25, 25, 145, 145); canvas.drawRect(r, paint); paint.setARGB(255, 0, 255, 0); r.offset(20, 20); canvas.drawRect(r, paint); paint.setARGB(255, 0, 0, 255); r.offset(20, 20); canvas.drawRect(r, paint); // SkImageEncoder is the base class for encoding compressed images // from a specific SkBitmap. SkImageEncoder::EncodeFile("snapshot.png", bitmap, SkImageEncoder::kPNG_Type, 100); return 0; } 編譯方式: g++ \ -I./include \ -I./include/core \ -I./include/images \ -Wall -o test-skia test-skia.c \ out/src/images/SkImageDecoder_libpng.o out/libskia.a \ -lpng -lpthread -g 筆者做了簡要的批註,大概可知曉 Sk 開頭的這些 API 的功用,而上述的範常式序一開始就要求 Skia 配置畫布 (SkCanvas),接著透過一份 SkRect 對象 r,給定 ARGB 的描述,使其有著不同的顏色,再來就是調整向量對象的位移並繪製。正如前文提及,Skia 僅是繪圖引擎,並未如 Cairo 一般廣泛對應到 PDF, X11, GDI 等等底層繪圖裝置,所以為了方便觀察繪圖結果,我們透過 Skia 內建的 image codec 來輸出 PNG 圖檔,所以執行前述編譯後的執行檔 "test-skia",應該會得到以檔:(本無外框與底色,但為了清楚於文章呈現,額外用繪圖軟體追加) 迭合的三個不同色的矩形對象,就是透過以下 API 呼叫達成: paint.setARGB(255, 0, 255, 0); r.offset(20, 20); canvas.drawRect(r, paint); 由於 Skia 與 Cairo 的同構型相當高,也可參照 [Cairo :: documentation] 建立所需的背景知識。 轉載, 原地址:http://blog.sina.com.cn/s/blog_4a0a39c30100cog4.html 另外一個例子: #include "SkBitmap.h"#include "SkDevice.h"#include "SkPaint.h"#include "SkRect.h"#include <cairo.h>int main(){ SkBitmap bitmap; bitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); bitmap.allocPixels(); SkDevice device(bitmap); SkCanvas canvas(&device); SkPaint paint; SkRect r; paint.setARGB(255, 255, 255, 255); r.set(10, 10, 20, 20); canvas.drawRect(r, paint); paint.setARGB(255, 255, 0, 0); r.offset(5, 5); canvas.drawRect(r, paint); paint.setARGB(255, 0, 0, 255); r.offset(5, 5); canvas.drawRect(r, paint); { SkAutoLockPixels image_lock(bitmap); cairo_surface_t* surface = cairo_image_surface_create_for_data( (unsigned char*)bitmap.getPixels(), CAIRO_FORMAT_ARGB32, bitmap.width(), bitmap.height(), bitmap.rowBytes()); cairo_surface_write_to_png(surface, "snapshot.png"); cairo_surface_destroy(surface); } return 0;}原地址:http://www.linuxgraphics.cn/android/skia.html |