itfontsrv: fix handling of colored glyphs (emoji) - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 9843fc0d82c68c78059ccb167e8402def5a4ee1f /src/plan9port/commit/9843fc0d82c68c78059ccb167e8402def5a4ee1f.gph mx1.adamsgaard.dk 70 1parent 977b25a76ae8263e53fb4eb1abfc395769f23e3d /src/plan9port/commit/977b25a76ae8263e53fb4eb1abfc395769f23e3d.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Sat, 15 Aug 2020 09:10:54 -0400 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ifontsrv: fix handling of colored glyphs (emoji) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDrawing as white on black to produce a mask only works if Err mx1.adamsgaard.dk 70 itthe white on black is the inversion of black on white. Err mx1.adamsgaard.dk 70 iEmoji that force use of specific colors don't respect that. Err mx1.adamsgaard.dk 70 iDraw black on white and invert to mask separately. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M src/cmd/fontsrv/mac.c | 22 +++++++++++++++++----- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i1 file changed, 17 insertions(+), 5 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fontsrv/mac.c b/src/cmd/fontsrv/mac.c /src/plan9port/file/src/cmd/fontsrv/mac.c.gph mx1.adamsgaard.dk 70 it@@ -76,6 +76,17 @@ mac2r(CGRect r, int size, int unit) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i+meminvert(Memimage *m) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ uchar *p, *ep; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ p = byteaddr(m, m->r.min); Err mx1.adamsgaard.dk 70 i+ ep = p + 4*m->width*Dy(m->r); Err mx1.adamsgaard.dk 70 i+ for(; p < ep; p++) Err mx1.adamsgaard.dk 70 i+ *p ^= 0xff; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+void Err mx1.adamsgaard.dk 70 i loadfonts(void) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i int i, n; Err mx1.adamsgaard.dk 70 it@@ -223,8 +234,8 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i int i, height, ascent; Err mx1.adamsgaard.dk 70 i Fontchar *fc, *fc0; Err mx1.adamsgaard.dk 70 i Memsubfont *sf; Err mx1.adamsgaard.dk 70 i- CGFloat whitef[] = { 1.0, 1.0 }; Err mx1.adamsgaard.dk 70 i- CGColorRef white; Err mx1.adamsgaard.dk 70 i+ CGFloat blackf[] = { 0.0, 1.0 }; Err mx1.adamsgaard.dk 70 i+ CGColorRef black; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i s = c2mac(name); Err mx1.adamsgaard.dk 70 i desc = CTFontDescriptorCreateWithNameAndSize(s, size); Err mx1.adamsgaard.dk 70 it@@ -267,7 +278,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i color = CGColorSpaceCreateWithName(kCGColorSpaceGenericGray); Err mx1.adamsgaard.dk 70 i ctxt = CGBitmapContextCreate(byteaddr(mc, mc->r.min), Dx(mc->r), Dy(mc->r), 8, Err mx1.adamsgaard.dk 70 i mc->width*sizeof(u32int), color, kCGImageAlphaNone); Err mx1.adamsgaard.dk 70 i- white = CGColorCreate(color, whitef); Err mx1.adamsgaard.dk 70 i+ black = CGColorCreate(color, blackf); Err mx1.adamsgaard.dk 70 i CGColorSpaceRelease(color); Err mx1.adamsgaard.dk 70 i if(ctxt == nil) { Err mx1.adamsgaard.dk 70 i freememimage(m); Err mx1.adamsgaard.dk 70 it@@ -293,7 +304,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i CGRect r; Err mx1.adamsgaard.dk 70 i CGPoint p1; Err mx1.adamsgaard.dk 70 i CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorAttributeName }; Err mx1.adamsgaard.dk 70 i- CFTypeRef values[] = { font, white }; Err mx1.adamsgaard.dk 70 i+ CFTypeRef values[] = { font, black }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i sprint(buf, "%C", (Rune)mapUnicode(name, i)); Err mx1.adamsgaard.dk 70 i str = c2mac(buf); Err mx1.adamsgaard.dk 70 it@@ -310,7 +321,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i line = CTLineCreateWithAttributedString(attrString); Err mx1.adamsgaard.dk 70 i CGContextSetTextPosition(ctxt, 0, y0); Err mx1.adamsgaard.dk 70 i r = CTLineGetImageBounds(line, ctxt); Err mx1.adamsgaard.dk 70 i- memfillcolor(mc, DBlack); Err mx1.adamsgaard.dk 70 i+ memfillcolor(mc, DWhite); Err mx1.adamsgaard.dk 70 i CTLineDraw(line, ctxt); Err mx1.adamsgaard.dk 70 i CFRelease(line); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -330,6 +341,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) Err mx1.adamsgaard.dk 70 i continue; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ meminvert(mc); Err mx1.adamsgaard.dk 70 i memimagedraw(m, Rect(x, 0, x + p1.x, y), mc, ZP, memopaque, ZP, S); Err mx1.adamsgaard.dk 70 i fc->width = p1.x; Err mx1.adamsgaard.dk 70 i fc->left = 0; Err mx1.adamsgaard.dk 70 .