skia-safeはSkiaのRustバインディング(非公式)。厳密にはskia-bindingというバインディングがあり、それをRustらしく使えるようにしたのがskia-safe。
use std::fs::File; use std::io::BufWriter;
fn main() { let width:u32 = 400; let height:u32 = 400; //(C++) SkBitmap bitmap; let mut bitmap = skia_safe::Bitmap::new(); //(C++) bitmap.setInfo(SkImageInfo::MakeN32Premul(400, 400)); let info = skia_safe::ImageInfo::new( (400,400), skia_safe::ColorType::N32, skia_safe::AlphaType::Premul, None ); bitmap.set_info(&info,None); //(C++) bitmap.allocPixels(); bitmap.alloc_pixels(); //(C++) SkCanvas canvas(bitmap); let mut canvas:skia_safe::OwnedCanvas = skia_safe::Canvas::from_bitmap(&bitmap,None).unwrap(); // bitmapの情報を表示 dispinfo(&bitmap); // 描画呼び出し draw(&mut canvas); //(C++) SkPngEncoder::Options options; //(C++) options.fZLibLevel = 9; // 圧縮レベル //(C++) options.fFilterFlags = SkPngEncoder::FilterFlag::kAll; // フィルタの種類 let mut opt = skia_safe::png_encoder::Options::default(); opt.z_lib_level = 9; opt.filter_flags = skia_safe::png_encoder::FilterFlag::ALL; opt.comments = vec![]; // ファイル出力 let file = File::create("out.png").unwrap(); let mut writer = BufWriter::new(file); let png_data = skia_safe::png_encoder::encode(&bitmap.pixmap(),&mut writer,&opt); }
fn draw(canvas:&mut skia_safe::OwnedCanvas){ //(C++) SkPaint paint; let mut paint: skia_safe::Paint = skia_safe::Paint::new(skia_safe::colors::BLACK,None); //(C++) paint.setStyle(SkPaint::kStroke_Style); paint.set_style(skia_safe::PaintStyle::Stroke); //(C++) paint.setStrokeWidth(5); paint.set_stroke_width(5.0); //(C++) paint.setColor(SK_ColorRED); paint.set_color(skia_safe::Color::RED); //(C++) canvas.drawCircle(200, 200, 100, paint); // (200,200) はタプル canvas.draw_circle((200,200),100.0,&paint); }
fn dispinfo(bitmap :&skia_safe::Bitmap) { let info = &bitmap.info(); let rowbytes = bitmap.row_bytes(); let channel = info.bytes_per_pixel(); let width = info.width(); let height = info.height(); println!("rowbytes:{}\nchannel:{}\nwidth:{}\nheight{}",rowbytes,channel,width,height); }