Skip to content

Commit

Permalink
feat: support GlobalFonts.families
Browse files Browse the repository at this point in the history
  • Loading branch information
doodlewind committed May 4, 2021
1 parent 9b7a00a commit 00be237
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 6 deletions.
3 changes: 3 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ const FillType = {
}

const GlobalFontsSingleton = new GlobalFonts()
GlobalFontsSingleton.__defineGetter__('families', function() {
return Object.keys(GlobalFontsSingleton._families)
})

CanvasRenderingContext2D.prototype.createPattern = function createPattern(image, repetition) {
if (image instanceof ImageData) {
Expand Down
14 changes: 14 additions & 0 deletions skia-c/skia_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1018,6 +1018,20 @@ extern "C"
return new skiac_font_collection(c_font_collection->collection);
}

uint32_t skiac_font_collection_get_families_size(skiac_font_collection *c_font_collection)
{
return c_font_collection->font_mgr->countFamilies();
}

void skiac_font_collection_get_family(skiac_font_collection *c_font_collection, uint32_t i, skiac_string *c_string)
{
auto name = new SkString();
c_font_collection->font_mgr->getFamilyName(i, name);
c_string->length = name->size();
c_string->ptr = name->c_str();
c_string->sk_string = name;
}

void skiac_font_collection_destroy(skiac_font_collection *c_font_collection)
{
delete c_font_collection;
Expand Down
13 changes: 9 additions & 4 deletions skia-c/skia_c.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,17 @@ typedef struct skiac_font_metrics skiac_font_metrics;
struct skiac_font_collection
{
sk_sp<FontCollection> collection;
skiac_font_collection() {
auto font_mgr = SkFontMgr::RefDefault();
sk_sp<SkFontMgr> font_mgr;
skiac_font_collection()
{
font_mgr = SkFontMgr::RefDefault();
collection = sk_make_sp<FontCollection>();
collection->setDefaultFontManager(font_mgr);
collection->enableFontFallback();
}
skiac_font_collection(sk_sp<FontCollection> collection) {
auto font_mgr = SkFontMgr::RefDefault();
skiac_font_collection(sk_sp<FontCollection> collection)
{
font_mgr = SkFontMgr::RefDefault();
collection->setDefaultFontManager(font_mgr);
collection->enableFontFallback();
this->collection = collection;
Expand Down Expand Up @@ -307,6 +310,8 @@ extern "C"
// FontCollection
skiac_font_collection *skiac_font_collection_create();
skiac_font_collection *skiac_font_collection_clone(skiac_font_collection *c_font_collection);
uint32_t skiac_font_collection_get_families_size(skiac_font_collection *c_font_collection);
void skiac_font_collection_get_family(skiac_font_collection *c_font_collection, uint32_t i, skiac_string *c_string);
void skiac_font_collection_destroy(skiac_font_collection *c_font_collection);
}

Expand Down
2 changes: 1 addition & 1 deletion src/global_fonts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ impl FontCollection {
global_fonts_constructor,
&vec![
Property::new(&env, "register")?.with_method(register),
Property::new(&env, "families")?
Property::new(&env, "_families")?
.with_getter(get_families)
.with_property_attributes(PropertyAttributes::Enumerable),
],
Expand Down
27 changes: 26 additions & 1 deletion src/sk.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::f32::consts::PI;
use std::ffi::CStr;
use std::ffi::CString;
use std::ops::{Deref, DerefMut};
use std::os::raw::c_char;
Expand Down Expand Up @@ -585,6 +586,16 @@ mod ffi {
c_font_collection: *mut skiac_font_collection,
) -> *mut skiac_font_collection;

pub fn skiac_font_collection_get_families_size(
c_font_collection: *mut skiac_font_collection,
) -> u32;

pub fn skiac_font_collection_get_family(
c_font_collection: *mut skiac_font_collection,
i: u32,
skia_string: *mut SkiaString,
);

pub fn skiac_font_collection_destroy(c_font_collection: *mut skiac_font_collection);
}
}
Expand Down Expand Up @@ -2655,7 +2666,21 @@ impl FontCollection {

#[inline]
pub fn get_families(&self) -> Vec<String> {
vec![]
let mut names = Vec::new();
unsafe {
let size = ffi::skiac_font_collection_get_families_size(self.0);
for i in 0..size {
let mut name = SkiaString {
ptr: ptr::null_mut(),
length: 0,
sk_string: ptr::null_mut(),
};
ffi::skiac_font_collection_get_family(self.0, i, &mut name);
let c_str: &CStr = CStr::from_ptr(name.ptr);
names.push(c_str.to_string_lossy().into_owned());
}
}
names
}
}

Expand Down

0 comments on commit 00be237

Please sign in to comment.