Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Functions
paragraph_bindings.cpp File Reference
#include "include/core/SkColor.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkString.h"
#include "modules/skparagraph/include/DartTypes.h"
#include "modules/skparagraph/include/Paragraph.h"
#include "modules/skparagraph/include/TextStyle.h"
#include "modules/skparagraph/include/TypefaceFontProvider.h"
#include "modules/skparagraph/src/ParagraphBuilderImpl.h"
#include "modules/skparagraph/src/ParagraphImpl.h"
#include "modules/skunicode/include/SkUnicode.h"
#include <string>
#include <vector>
#include <emscripten.h>
#include <emscripten/bind.h>
#include "modules/canvaskit/WasmCommon.h"

Go to the source code of this file.

Classes

struct  SimpleFontStyle
 
struct  SimpleTextStyle
 
struct  SimpleStrutStyle
 
struct  SimpleParagraphStyle
 
struct  SimpleTextBox
 

Functions

SkColor4f toSkColor4f (WASMPointerF32 cPtr)
 
static sk_sp< SkUnicodeget_unicode ()
 
para::StrutStyle toStrutStyle (const SimpleStrutStyle &s)
 
para::TextStyle toTextStyle (const SimpleTextStyle &s)
 
para::ParagraphStyle toParagraphStyle (const SimpleParagraphStyle &s)
 
Float32Array TextBoxesToFloat32Array (std::vector< para::TextBox > boxes)
 
Float32Array GetRectsForRange (para::Paragraph &self, unsigned start, unsigned end, para::RectHeightStyle heightStyle, para::RectWidthStyle widthStyle)
 
Float32Array GetRectsForPlaceholders (para::Paragraph &self)
 
JSObject JSObjectFromLineMetrics (skia::textlayout::LineMetrics &metrics)
 
JSObject JSObjectFromGlyphInfo (skia::textlayout::Paragraph::GlyphInfo &glyphInfo)
 
JSArray GetLineMetrics (para::Paragraph &self)
 
JSObject GetLineMetricsAt (para::Paragraph &self, size_t lineNumber)
 
JSObject GetGlyphInfoAt (para::Paragraph &self, size_t index)
 
JSObject GetClosestGlyphInfoAtCoordinate (para::Paragraph &self, SkScalar dx, SkScalar dy)
 
JSArray GetShapedLines (para::Paragraph &self)
 
std::vector< SkUnicode::PositionconvertArrayU32 (WASMPointerU32 array, size_t count)
 
JSArray UnresolvedCodepoints (para::Paragraph &self)
 
 EMSCRIPTEN_BINDINGS (Paragraph)
 

Function Documentation

◆ convertArrayU32()

std::vector< SkUnicode::Position > convertArrayU32 ( WASMPointerU32  array,
size_t  count 
)

Definition at line 509 of file paragraph_bindings.cpp.

509 {
510 std::vector<size_t> vec;
511 vec.resize(count);
512 SkUnicode::Position* data = reinterpret_cast<SkUnicode::Position*>(array);
513 std::memcpy(vec.data(), data, count * sizeof(size_t));
514 return vec;
515}
int count
size_t Position
Definition SkUnicode.h:98
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switches.h:41

◆ EMSCRIPTEN_BINDINGS()

EMSCRIPTEN_BINDINGS ( Paragraph  )

Definition at line 525 of file paragraph_bindings.cpp.

525 {
526
527 class_<para::Paragraph>("Paragraph")
528 .function("didExceedMaxLines", &para::Paragraph::didExceedMaxLines)
529 .function("getAlphabeticBaseline", &para::Paragraph::getAlphabeticBaseline)
530 .function("getGlyphPositionAtCoordinate", &para::Paragraph::getGlyphPositionAtCoordinate)
531 .function("getHeight", &para::Paragraph::getHeight)
532 .function("getIdeographicBaseline", &para::Paragraph::getIdeographicBaseline)
533 .function("getLineMetrics", &GetLineMetrics)
534 .function("getLineMetricsAt", &GetLineMetricsAt)
535 .function("getLineNumberAt", &para::Paragraph::getLineNumberAt)
536 .function("getLongestLine", &para::Paragraph::getLongestLine)
537 .function("getMaxIntrinsicWidth", &para::Paragraph::getMaxIntrinsicWidth)
538 .function("getMaxWidth", &para::Paragraph::getMaxWidth)
539 .function("getMinIntrinsicWidth", &para::Paragraph::getMinIntrinsicWidth)
540 .function("getNumberOfLines", &para::Paragraph::lineNumber)
541 .function("_getClosestGlyphInfoAtCoordinate", &GetClosestGlyphInfoAtCoordinate)
542 .function("_getGlyphInfoAt", &GetGlyphInfoAt)
543 .function("_getRectsForPlaceholders", &GetRectsForPlaceholders)
544 .function("_getRectsForRange", &GetRectsForRange)
545 .function("getShapedLines", &GetShapedLines)
546 .function("getWordBoundary", &para::Paragraph::getWordBoundary)
547 .function("layout", &para::Paragraph::layout)
548 .function("unresolvedCodepoints", &UnresolvedCodepoints);
549
550 class_<para::ParagraphBuilderImpl>("ParagraphBuilder")
551 .class_function(
552 "_Make",
553 optional_override([](SimpleParagraphStyle style, sk_sp<SkFontMgr> fontMgr)
554 -> std::unique_ptr<para::ParagraphBuilderImpl> {
555 auto fc = sk_make_sp<para::FontCollection>();
556 fc->setDefaultFontManager(fontMgr);
557 fc->enableFontFallback();
558 auto ps = toParagraphStyle(style);
559 auto pb = para::ParagraphBuilderImpl::make(ps, fc, get_unicode());
560 return std::unique_ptr<para::ParagraphBuilderImpl>(
561 static_cast<para::ParagraphBuilderImpl*>(pb.release()));
562 }),
563 allow_raw_pointers())
564 .class_function(
565 "_MakeFromFontProvider",
566 optional_override([](SimpleParagraphStyle style,
568 -> std::unique_ptr<para::ParagraphBuilderImpl> {
569 auto fc = sk_make_sp<para::FontCollection>();
570 fc->setDefaultFontManager(fontProvider);
571 fc->enableFontFallback();
572 auto ps = toParagraphStyle(style);
573 auto pb = para::ParagraphBuilderImpl::make(ps, fc, get_unicode());
574 return std::unique_ptr<para::ParagraphBuilderImpl>(
575 static_cast<para::ParagraphBuilderImpl*>(pb.release()));
576 }),
577 allow_raw_pointers())
578 .class_function(
579 "_MakeFromFontCollection",
580 optional_override([](SimpleParagraphStyle style,
581 sk_sp<para::FontCollection> fontCollection)
582 -> std::unique_ptr<para::ParagraphBuilderImpl> {
583 auto ps = toParagraphStyle(style);
584 auto pb = para::ParagraphBuilderImpl::make(ps, fontCollection, get_unicode());
585 return std::unique_ptr<para::ParagraphBuilderImpl>(
586 static_cast<para::ParagraphBuilderImpl*>(pb.release()));
587 }),
588 allow_raw_pointers())
589 .class_function(
590 "_ShapeText",
591 optional_override([](JSString jtext, JSArray jruns, float width) -> JSArray {
592 std::string textStorage = jtext.as<std::string>();
593 const char* text = textStorage.data();
594 size_t textCount = textStorage.size();
595
596 auto fc = sk_make_sp<para::FontCollection>();
597 fc->setDefaultFontManager(SkFontMgr::RefEmpty());
598 fc->enableFontFallback();
599
601 {
602 // For the most part this is ignored, since we set an explicit TextStyle
603 // for all of our text runs, but it is required by SkParagraph.
604 para::TextStyle style;
605 style.setFontFamilies({SkString("sans-serif")});
606 style.setFontSize(32);
607 pstyle.setTextStyle(style);
608 }
609
610 auto pb = para::ParagraphBuilder::make(pstyle, fc, get_unicode());
611
612 // tease apart the FontBlock runs
613 size_t runCount = jruns["length"].as<size_t>();
614 for (size_t i = 0; i < runCount; ++i) {
615 emscripten::val r = jruns[i];
616
617 para::TextStyle style;
618 style.setTypeface(r["typeface"].as< sk_sp<SkTypeface> >());
619 style.setFontSize(r["size"].as<float>());
620
621 const size_t subTextCount = r["length"].as<size_t>();
622 if (subTextCount > textCount) {
623 return emscripten::val("block runs exceed text length!");
624 }
625
626 pb->pushStyle(style);
627 pb->addText(text, subTextCount);
628 pb->pop();
629
630 text += subTextCount;
631 textCount -= subTextCount;
632 }
633 if (textCount != 0) {
634 return emscripten::val("Didn't have enough block runs to cover text");
635 }
636
637 auto pa = pb->Build();
638 pa->layout(width);
639
640 // workaround until this is fixed in SkParagraph
641 {
643 pa->paint(rec.beginRecording({0,0,9999,9999}), 0, 0);
644 }
645 return GetShapedLines(*pa);
646 }),
647 allow_raw_pointers())
648 .class_function("RequiresClientICU", &para::ParagraphBuilderImpl::RequiresClientICU)
649 .function("addText",
650 optional_override([](para::ParagraphBuilderImpl& self, std::string text) {
651 return self.addText(text.c_str(), text.length());
652 }))
653 .function("build", &para::ParagraphBuilderImpl::Build, allow_raw_pointers())
654 .function("build", optional_override([](para::ParagraphBuilderImpl& self) {
655#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
656 auto [words, graphemeBreaks, lineBreaks] = self.getClientICUData();
657 auto text = self.getText();
658 sk_sp<SkUnicode> clientICU = SkUnicodes::Client::Make(text, words, graphemeBreaks, lineBreaks);
659 self.SetUnicode(clientICU);
660#endif
661 return self.Build();
662 }), allow_raw_pointers())
663 .function("pop", &para::ParagraphBuilderImpl::pop)
664 .function("reset", &para::ParagraphBuilderImpl::Reset, allow_raw_pointers())
665 .function("_pushStyle", optional_override([](para::ParagraphBuilderImpl& self,
666 SimpleTextStyle textStyle) {
667 auto ts = toTextStyle(textStyle);
668 self.pushStyle(ts);
669 }))
670 // A method of pushing a textStyle with paints instead of colors for foreground and
671 // background. Since SimpleTextStyle is a value object, it cannot contain paints, which
672 // are not primitives. This binding is here to accept them. Any color that is specified
673 // in the textStyle is overridden.
674 .function("_pushPaintStyle",
675 optional_override([](para::ParagraphBuilderImpl& self,
676 SimpleTextStyle textStyle, SkPaint foreground,
677 SkPaint background) {
678 auto ts = toTextStyle(textStyle);
679 ts.setForegroundColor(foreground);
680 ts.setBackgroundColor(background);
681 self.pushStyle(ts);
682 }))
683 .function("_addPlaceholder", optional_override([](para::ParagraphBuilderImpl& self,
687 para::TextBaseline baseline,
689 para::PlaceholderStyle ps(width, height, alignment, baseline, offset);
690 self.addPlaceholder(ps);
691 }))
692 .function("getText",
693 optional_override([](para::ParagraphBuilderImpl& self) -> JSString {
694 auto text = self.getText();
695 return emscripten::val(std::string(text.data(), text.size()).c_str());
696 }))
697 .function("_setWordsUtf8",
698 optional_override([](para::ParagraphBuilderImpl& self,
699 WASMPointerU32 clientWords, size_t wordsNum) {
700#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
701 self.setWordsUtf8(convertArrayU32(clientWords, wordsNum));
702#endif
703 }))
704 .function("_setWordsUtf16",
705 optional_override([](para::ParagraphBuilderImpl& self,
706 WASMPointerU32 clientWords, size_t wordsNum) {
707#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
708 self.setWordsUtf16(convertArrayU32(clientWords, wordsNum));
709#endif
710 }))
711 .function("_setGraphemeBreaksUtf8",
712 optional_override([](para::ParagraphBuilderImpl& self,
713 WASMPointerU32 clientGraphemes, size_t graphemesNum) {
714#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
715 self.setGraphemeBreaksUtf8(convertArrayU32(clientGraphemes, graphemesNum));
716#endif
717 }))
718 .function("_setGraphemeBreaksUtf16",
719 optional_override([](para::ParagraphBuilderImpl& self,
720 WASMPointerU32 clientGraphemes, size_t graphemesNum) {
721#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
722 self.setGraphemeBreaksUtf16(convertArrayU32(clientGraphemes, graphemesNum));
723#endif
724 }))
725 .function("_setLineBreaksUtf8",
726 optional_override([](para::ParagraphBuilderImpl& self,
727 WASMPointerU32 clientLineBreaks, size_t lineBreaksNum) {
728#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
729 SkUnicode::Position* lineBreakData = reinterpret_cast<SkUnicode::Position*>(clientLineBreaks);
730 std::vector<SkUnicode::LineBreakBefore> lineBreaks;
731 for (size_t i = 0; i < lineBreaksNum; i += 2) {
732 auto pos = lineBreakData[i];
733 auto breakType = lineBreakData[i+1];
734 if (breakType == 0) {
735 lineBreaks.emplace_back(pos, SkUnicode::LineBreakType::kSoftLineBreak);
736 } else {
737 lineBreaks.emplace_back(pos, SkUnicode::LineBreakType::kHardLineBreak);
738 }
739 }
740 self.setLineBreaksUtf8(std::move(lineBreaks));
741#endif
742 }))
743 .function("_setLineBreaksUtf16",
744 optional_override([](para::ParagraphBuilderImpl& self,
745 WASMPointerU32 clientLineBreaks, size_t lineBreaksNum) {
746#if defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
747 SkUnicode::Position* lineBreakData = reinterpret_cast<SkUnicode::Position*>(clientLineBreaks);
748 std::vector<SkUnicode::LineBreakBefore> lineBreaks;
749 for (size_t i = 0; i < lineBreaksNum; i += 2) {
750 auto pos = lineBreakData[i];
751 auto breakType = lineBreakData[i+1];
752 if (breakType == 0) {
753 lineBreaks.emplace_back(pos, SkUnicode::LineBreakType::kSoftLineBreak);
754 } else {
755 lineBreaks.emplace_back(pos, SkUnicode::LineBreakType::kHardLineBreak);
756 }
757 }
758 self.setLineBreaksUtf16(std::move(lineBreaks));
759#endif
760 }));
761
762 class_<para::TypefaceFontProvider, base<SkFontMgr>>("TypefaceFontProvider")
763 .smart_ptr<sk_sp<para::TypefaceFontProvider>>("sk_sp<TypefaceFontProvider>")
764 .class_function("Make", optional_override([]()-> sk_sp<para::TypefaceFontProvider> {
765 return sk_make_sp<para::TypefaceFontProvider>();
766 }))
767 .function("_registerFont", optional_override([](para::TypefaceFontProvider& self,
768 sk_sp<SkTypeface> typeface,
769 WASMPointerU8 familyPtr) {
770 const char* fPtr = reinterpret_cast<const char*>(familyPtr);
771 SkString fStr(fPtr);
772 self.registerTypeface(typeface, fStr);
773 }), allow_raw_pointers());
774
775 class_<para::FontCollection>("FontCollection")
776 .smart_ptr<sk_sp<para::FontCollection>>("sk_sp<FontCollection>")
777 .class_function("Make", optional_override([]()-> sk_sp<para::FontCollection> {
778 return sk_make_sp<para::FontCollection>();
779 }))
780 .function("setDefaultFontManager", optional_override([](para::FontCollection& self,
781 const sk_sp<para::TypefaceFontProvider>& fontManager) {
782 self.setDefaultFontManager(fontManager);
783 }), allow_raw_pointers())
784 .function("enableFontFallback", &para::FontCollection::enableFontFallback);
785
786 // These value objects make it easier to send data across the wire.
787 value_object<para::PositionWithAffinity>("PositionWithAffinity")
788 .field("pos", &para::PositionWithAffinity::position)
789 .field("affinity", &para::PositionWithAffinity::affinity);
790
791 value_object<SimpleFontStyle>("FontStyle")
792 .field("slant", &SimpleFontStyle::slant)
793 .field("weight", &SimpleFontStyle::weight)
794 .field("width", &SimpleFontStyle::width);
795
796 value_object<SimpleParagraphStyle>("ParagraphStyle")
797 .field("disableHinting", &SimpleParagraphStyle::disableHinting)
798 .field("_ellipsisPtr", &SimpleParagraphStyle::ellipsisPtr)
799 .field("_ellipsisLen", &SimpleParagraphStyle::ellipsisLen)
800 .field("heightMultiplier", &SimpleParagraphStyle::heightMultiplier)
801 .field("maxLines", &SimpleParagraphStyle::maxLines)
802 .field("replaceTabCharacters", &SimpleParagraphStyle::replaceTabCharacters)
803 .field("textAlign", &SimpleParagraphStyle::textAlign)
804 .field("textDirection", &SimpleParagraphStyle::textDirection)
805 .field("textHeightBehavior", &SimpleParagraphStyle::textHeightBehavior)
806 .field("textStyle", &SimpleParagraphStyle::textStyle)
807 .field("strutStyle", &SimpleParagraphStyle::strutStyle)
808 .field("applyRoundingHack", &SimpleParagraphStyle::applyRoundingHack);
809
810 value_object<SimpleStrutStyle>("StrutStyle")
811 .field("_fontFamiliesPtr", &SimpleStrutStyle::fontFamiliesPtr)
812 .field("_fontFamiliesLen", &SimpleStrutStyle::fontFamiliesLen)
813 .field("strutEnabled", &SimpleStrutStyle::strutEnabled)
814 .field("fontSize", &SimpleStrutStyle::fontSize)
815 .field("fontStyle", &SimpleStrutStyle::fontStyle)
816 .field("heightMultiplier", &SimpleStrutStyle::heightMultiplier)
817 .field("halfLeading", &SimpleStrutStyle::halfLeading)
818 .field("leading", &SimpleStrutStyle::leading)
819 .field("forceStrutHeight", &SimpleStrutStyle::forceStrutHeight);
820
821 value_object<SimpleTextStyle>("TextStyle")
822 .field("_colorPtr", &SimpleTextStyle::colorPtr)
823 .field("_foregroundColorPtr", &SimpleTextStyle::foregroundColorPtr)
824 .field("_backgroundColorPtr", &SimpleTextStyle::backgroundColorPtr)
825 .field("decoration", &SimpleTextStyle::decoration)
826 .field("decorationThickness", &SimpleTextStyle::decorationThickness)
827 .field("_decorationColorPtr", &SimpleTextStyle::decorationColorPtr)
828 .field("decorationStyle", &SimpleTextStyle::decorationStyle)
829 .field("_fontFamiliesPtr", &SimpleTextStyle::fontFamiliesPtr)
830 .field("_fontFamiliesLen", &SimpleTextStyle::fontFamiliesLen)
831 .field("fontSize", &SimpleTextStyle::fontSize)
832 .field("letterSpacing", &SimpleTextStyle::letterSpacing)
833 .field("wordSpacing", &SimpleTextStyle::wordSpacing)
834 .field("heightMultiplier", &SimpleTextStyle::heightMultiplier)
835 .field("halfLeading", &SimpleTextStyle::halfLeading)
836 .field("_localePtr", &SimpleTextStyle::localePtr)
837 .field("_localeLen", &SimpleTextStyle::localeLen)
838 .field("fontStyle", &SimpleTextStyle::fontStyle)
839 .field("_shadowLen", &SimpleTextStyle::shadowLen)
840 .field("_shadowColorsPtr", &SimpleTextStyle::shadowColorsPtr)
841 .field("_shadowOffsetsPtr", &SimpleTextStyle::shadowOffsetsPtr)
842 .field("_shadowBlurRadiiPtr", &SimpleTextStyle::shadowBlurRadiiPtr)
843 .field("_fontFeatureLen", &SimpleTextStyle::fontFeatureLen)
844 .field("_fontFeatureNamesPtr", &SimpleTextStyle::fontFeatureNamesPtr)
845 .field("_fontFeatureValuesPtr", &SimpleTextStyle::fontFeatureValuesPtr)
846 .field("_fontVariationLen", &SimpleTextStyle::fontVariationLen)
847 .field("_fontVariationAxesPtr", &SimpleTextStyle::fontVariationAxesPtr)
848 .field("_fontVariationValuesPtr", &SimpleTextStyle::fontVariationValuesPtr);
849
850 // The U stands for unsigned - we can't bind a generic/template object, so we have to specify it
851 // with the type we are using.
852 // TODO(kjlubick) make this a typedarray.
853 value_object<para::SkRange<size_t>>("URange")
854 .field("start", &para::SkRange<size_t>::start)
855 .field("end", &para::SkRange<size_t>::end);
856
857 // TextDecoration should be a const because they can be combined
858 constant("NoDecoration", int(para::TextDecoration::kNoDecoration));
859 constant("UnderlineDecoration", int(para::TextDecoration::kUnderline));
860 constant("OverlineDecoration", int(para::TextDecoration::kOverline));
861 constant("LineThroughDecoration", int(para::TextDecoration::kLineThrough));
862}
SkPoint pos
const char * fStr
uintptr_t WASMPointerU8
Definition WasmCommon.h:46
emscripten::val JSString
Definition WasmCommon.h:29
uintptr_t WASMPointerU32
Definition WasmCommon.h:48
emscripten::val JSArray
Definition WasmCommon.h:27
static sk_sp< SkFontMgr > RefEmpty()
SkCanvas * beginRecording(const SkRect &bounds, sk_sp< SkBBoxHierarchy > bbh)
void setTypeface(sk_sp< SkTypeface > typeface)
Definition TextStyle.h:277
void setFontFamilies(std::vector< SkString > families)
Definition TextStyle.h:253
void setFontSize(SkScalar size)
Definition TextStyle.h:250
sk_sp< SkFontMgr > fontMgr
Definition examples.cpp:32
float SkScalar
Definition extension.cpp:12
Dart_NativeFunction function
Definition fuchsia.cc:51
std::u16string text
SKUNICODE_API sk_sp< SkUnicode > Make(SkSpan< char > text, std::vector< SkUnicode::Position > words, std::vector< SkUnicode::Position > graphemeBreaks, std::vector< SkUnicode::LineBreakBefore > lineBreaks)
PlaceholderAlignment
Where to vertically align the placeholder relative to the surrounding text.
Definition TextStyle.h:87
JSArray UnresolvedCodepoints(para::Paragraph &self)
JSObject GetClosestGlyphInfoAtCoordinate(para::Paragraph &self, SkScalar dx, SkScalar dy)
JSArray GetLineMetrics(para::Paragraph &self)
para::TextStyle toTextStyle(const SimpleTextStyle &s)
JSObject GetLineMetricsAt(para::Paragraph &self, size_t lineNumber)
Float32Array GetRectsForRange(para::Paragraph &self, unsigned start, unsigned end, para::RectHeightStyle heightStyle, para::RectWidthStyle widthStyle)
JSArray GetShapedLines(para::Paragraph &self)
JSObject GetGlyphInfoAt(para::Paragraph &self, size_t index)
Float32Array GetRectsForPlaceholders(para::Paragraph &self)
para::ParagraphStyle toParagraphStyle(const SimpleParagraphStyle &s)
static sk_sp< SkUnicode > get_unicode()
std::vector< SkUnicode::Position > convertArrayU32(WASMPointerU32 array, size_t count)
int32_t height
int32_t width
Point offset
SkFontStyle::Weight weight
SkFontStyle::Slant slant
SkFontStyle::Width width
para::TextDirection textDirection
para::TextHeightBehavior textHeightBehavior
SimpleFontStyle fontStyle
WASMPointerU32 fontFamiliesPtr
WASMPointerF32 fontVariationValuesPtr
WASMPointerU8 localePtr
WASMPointerF32 shadowOffsetsPtr
WASMPointerF32 fontFeatureNamesPtr
WASMPointerU8 fontFamiliesPtr
WASMPointerF32 shadowBlurRadiiPtr
WASMPointerF32 decorationColorPtr
WASMPointerF32 backgroundColorPtr
WASMPointerF32 fontFeatureValuesPtr
WASMPointerF32 foregroundColorPtr
SimpleFontStyle fontStyle
WASMPointerF32 shadowColorsPtr
para::TextDecorationStyle decorationStyle
WASMPointerF32 fontVariationAxesPtr
WASMPointerF32 colorPtr
void setTextStyle(const TextStyle &textStyle)

◆ get_unicode()

static sk_sp< SkUnicode > get_unicode ( )
static

Definition at line 54 of file paragraph_bindings.cpp.

54 {
55 // For code size reasons, we prefer to use the unicode implementation first
56 // over the full ICU version.
57#if defined(SK_UNICODE_ICU_IMPLEMENTATION)
58 return SkUnicodes::ICU::Make();
59#else
60 return nullptr;
61#endif
62}
SKUNICODE_API sk_sp< SkUnicode > Make()

◆ GetClosestGlyphInfoAtCoordinate()

JSObject GetClosestGlyphInfoAtCoordinate ( para::Paragraph self,
SkScalar  dx,
SkScalar  dy 
)

Definition at line 404 of file paragraph_bindings.cpp.

404 {
406 return self.getClosestUTF16GlyphInfoAt(dx, dy, &glyphInfo)
407 ? JSObjectFromGlyphInfo(glyphInfo)
408 : emscripten::val::null();
409}
JSObject JSObjectFromGlyphInfo(skia::textlayout::Paragraph::GlyphInfo &glyphInfo)

◆ GetGlyphInfoAt()

JSObject GetGlyphInfoAt ( para::Paragraph self,
size_t  index 
)

Definition at line 397 of file paragraph_bindings.cpp.

397 {
399 return self.getGlyphInfoAtUTF16Offset(index, &glyphInfo)
400 ? JSObjectFromGlyphInfo(glyphInfo)
401 : emscripten::val::null();
402}

◆ GetLineMetrics()

JSArray GetLineMetrics ( para::Paragraph self)

Definition at line 380 of file paragraph_bindings.cpp.

380 {
381 std::vector<skia::textlayout::LineMetrics> metrics;
382 self.getLineMetrics(metrics);
383 JSArray result = emscripten::val::array();
384 for (auto metric : metrics) {
385 result.call<void>("push", JSObjectFromLineMetrics(metric));
386 }
387 return result;
388}
GAsyncResult * result
JSObject JSObjectFromLineMetrics(skia::textlayout::LineMetrics &metrics)

◆ GetLineMetricsAt()

JSObject GetLineMetricsAt ( para::Paragraph self,
size_t  lineNumber 
)

Definition at line 390 of file paragraph_bindings.cpp.

390 {
392 return self.getLineMetricsAt(lineNumber, &metrics)
393 ? JSObjectFromLineMetrics(metrics)
394 : emscripten::val::null();
395}

◆ GetRectsForPlaceholders()

Float32Array GetRectsForPlaceholders ( para::Paragraph self)

Definition at line 338 of file paragraph_bindings.cpp.

338 {
339 std::vector<para::TextBox> boxes = self.getRectsForPlaceholders();
340 return TextBoxesToFloat32Array(boxes);
341}
Float32Array TextBoxesToFloat32Array(std::vector< para::TextBox > boxes)

◆ GetRectsForRange()

Float32Array GetRectsForRange ( para::Paragraph self,
unsigned  start,
unsigned  end,
para::RectHeightStyle  heightStyle,
para::RectWidthStyle  widthStyle 
)

Definition at line 329 of file paragraph_bindings.cpp.

333 {
334 std::vector<para::TextBox> boxes = self.getRectsForRange(start, end, heightStyle, widthStyle);
335 return TextBoxesToFloat32Array(boxes);
336}
glong glong end

◆ GetShapedLines()

JSArray GetShapedLines ( para::Paragraph self)

Definition at line 414 of file paragraph_bindings.cpp.

414 {
415 struct LineAccumulate {
416 int lineNumber = -1; // deliberately -1 from starting value
417 uint32_t minOffset = 0xFFFFFFFF;
418 uint32_t maxOffset = 0;
419 float minAscent = 0;
420 float maxDescent = 0;
421 // not really accumulated, but definitely set
422 float baseline = 0;
423
424 void reset(int newLineNum) {
425 new (this) LineAccumulate;
426 this->lineNumber = newLineNum;
427 }
428 };
429
430 // where we accumulate our js output
431 JSArray jlines = emscripten::val::array();
432 JSObject jline = emscripten::val::null();
433 JSArray jruns = emscripten::val::null();
434 LineAccumulate accum;
435
436 self.visit([&](int lineNumber, const para::Paragraph::VisitorInfo* info) {
437 if (!info) {
438 if (!jline) return; // how???
439 // end of current line
440 JSObject range = emscripten::val::object();
441 range.set("first", accum.minOffset);
442 range.set("last", accum.maxOffset);
443 jline.set("textRange", range);
444
445 jline.set("top", accum.baseline + accum.minAscent);
446 jline.set("bottom", accum.baseline + accum.maxDescent);
447 jline.set("baseline", accum.baseline);
448 return;
449 }
450
451 if (lineNumber != accum.lineNumber) {
452 SkASSERT(lineNumber == accum.lineNumber + 1); // assume monotonic
453
454 accum.reset(lineNumber);
455 jruns = emscripten::val::array();
456
457 jline = emscripten::val::object();
458 jline.set("runs", jruns);
459 // will assign textRange and metrics on end-of-line signal
460
461 jlines.call<void>("push", jline);
462 }
463
464 // append the run
465 const int N = info->count; // glyphs
466 const int N1 = N + 1; // positions, offsets have 1 extra (trailing) slot
467
468 JSObject jrun = emscripten::val::object();
469
470 jrun.set("flags", info->flags);
471
472// TODO: figure out how to set a wrapped sk_sp<SkTypeface>
473// jrun.set("typeface", info->font.getTypeface());
474 jrun.set("typeface", emscripten::val::null());
475 jrun.set("size", info->font.getSize());
476 if (info->font.getScaleX()) {
477 jrun.set("scaleX", info->font.getScaleX());
478 }
479
480 jrun.set("glyphs", MakeTypedArray(N, info->glyphs));
481 jrun.set("offsets", MakeTypedArray(N1, info->utf8Starts));
482
483 // we need to modify the positions, so make a temp copy
484 AutoSTMalloc<32, SkPoint> positions(N1);
485 for (int i = 0; i < N; ++i) {
486 positions.get()[i] = info->positions[i] + info->origin;
487 }
488 positions.get()[N] = { info->advanceX, positions.get()[N - 1].fY };
489 jrun.set("positions", MakeTypedArray(N1*2, (const float*)positions.get()));
490
491 jruns.call<void>("push", jrun);
492
493 // update accum
494 { SkFontMetrics fm;
495 info->font.getMetrics(&fm);
496
497 accum.minAscent = std::min(accum.minAscent, fm.fAscent);
498 accum.maxDescent = std::max(accum.maxDescent, fm.fDescent);
499 accum.baseline = info->origin.fY;
500
501 accum.minOffset = std::min(accum.minOffset, info->utf8Starts[0]);
502 accum.maxOffset = std::max(accum.maxOffset, info->utf8Starts[N]);
503 }
504
505 });
506 return jlines;
507}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
m reset()
#define SkASSERT(cond)
Definition SkAssert.h:116
emscripten::val JSObject
Definition WasmCommon.h:28
TypedArray MakeTypedArray(int count, const T src[])
Definition WasmCommon.h:72
#define N
Definition beziers.cpp:19
SkScalar fAscent
distance to reserve above baseline, typically negative
SkScalar fDescent
distance to reserve below baseline, typically positive

◆ JSObjectFromGlyphInfo()

JSObject JSObjectFromGlyphInfo ( skia::textlayout::Paragraph::GlyphInfo glyphInfo)

Definition at line 360 of file paragraph_bindings.cpp.

360 {
361 JSObject object = emscripten::val::object();
362
363 JSObject range = emscripten::val::object();
364 range.set("start", glyphInfo.fGraphemeClusterTextRange.start);
365 range.set("end", glyphInfo.fGraphemeClusterTextRange.end);
366 object.set("graphemeClusterTextRange", range);
367
368 JSArray rect = emscripten::val::array();
369 rect.call<void>("push", glyphInfo.fGraphemeLayoutBounds.left());
370 rect.call<void>("push", glyphInfo.fGraphemeLayoutBounds.top());
371 rect.call<void>("push", glyphInfo.fGraphemeLayoutBounds.right());
372 rect.call<void>("push", glyphInfo.fGraphemeLayoutBounds.bottom());
373 object.set("graphemeLayoutBounds", rect);
374
375 object.set("dir", glyphInfo.fDirection == skia::textlayout::TextDirection::kRtl ? 0 : 1);
376 object.set("isEllipsis", glyphInfo.fIsEllipsis);
377 return object;
378}
sk_sp< SkBlender > blender SkRect rect
Definition SkRecords.h:350
constexpr float left() const
Definition SkRect.h:734
constexpr float top() const
Definition SkRect.h:741
constexpr float right() const
Definition SkRect.h:748
constexpr float bottom() const
Definition SkRect.h:755

◆ JSObjectFromLineMetrics()

JSObject JSObjectFromLineMetrics ( skia::textlayout::LineMetrics metrics)

Definition at line 343 of file paragraph_bindings.cpp.

343 {
344 JSObject m = emscripten::val::object();
345 m.set("startIndex", metrics.fStartIndex);
346 m.set("endIndex", metrics.fEndIndex);
347 m.set("endExcludingWhitespaces", metrics.fEndExcludingWhitespaces);
348 m.set("endIncludingNewline", metrics.fEndIncludingNewline);
349 m.set("isHardBreak", metrics.fHardBreak);
350 m.set("ascent", metrics.fAscent);
351 m.set("descent", metrics.fDescent);
352 m.set("height", metrics.fHeight);
353 m.set("width", metrics.fWidth);
354 m.set("left", metrics.fLeft);
355 m.set("baseline", metrics.fBaseline);
356 m.set("lineNumber", metrics.fLineNumber);
357 return m;
358}

◆ TextBoxesToFloat32Array()

Float32Array TextBoxesToFloat32Array ( std::vector< para::TextBox boxes)

Definition at line 309 of file paragraph_bindings.cpp.

309 {
310 // Pack these text boxes into an array of n groups of 5 SkScalar (floats)
311 if (!boxes.size()) {
312 return emscripten::val::null();
313 }
314 SimpleTextBox* rects = new SimpleTextBox[boxes.size()];
315 for (size_t i = 0; i < boxes.size(); i++) {
316 rects[i].rect = boxes[i].rect;
317 if (boxes[i].direction == para::TextDirection::kRtl) {
318 rects[i].direction = 0;
319 } else {
320 rects[i].direction = 1;
321 }
322 }
323 float* fPtr = reinterpret_cast<float*>(rects);
324 // Of note: now that we have cast rects to float*, emscripten is smart enough to wrap this
325 // into a Float32Array for us.
326 return Float32Array(typed_memory_view(boxes.size() * 5, fPtr));
327}
emscripten::val Float32Array
Definition WasmCommon.h:35

◆ toParagraphStyle()

para::ParagraphStyle toParagraphStyle ( const SimpleParagraphStyle s)

Definition at line 272 of file paragraph_bindings.cpp.

272 {
274 if (s.disableHinting) {
275 ps.turnHintingOff();
276 }
277
278 if (s.ellipsisLen > 0) {
279 const char* ellipsisPtr = reinterpret_cast<const char*>(s.ellipsisPtr);
280 SkString eStr(ellipsisPtr, s.ellipsisLen);
281 ps.setEllipsis(eStr);
282 }
283 ps.setTextAlign(s.textAlign);
284 ps.setTextDirection(s.textDirection);
285 auto ts = toTextStyle(s.textStyle);
286 ps.setTextStyle(ts);
287 auto ss = toStrutStyle(s.strutStyle);
288 ps.setStrutStyle(ss);
289 if (s.heightMultiplier != -1) {
290 ps.setHeight(s.heightMultiplier);
291 }
292 if (s.maxLines != 0) {
293 ps.setMaxLines(s.maxLines);
294 }
295 ps.setApplyRoundingHack(s.applyRoundingHack);
296 ps.setTextHeightBehavior(s.textHeightBehavior);
297 ps.setReplaceTabCharacters(s.replaceTabCharacters);
298 return ps;
299}
struct MyStruct s
para::StrutStyle toStrutStyle(const SimpleStrutStyle &s)
void setEllipsis(const std::u16string &ellipsis)
void setTextDirection(TextDirection direction)
void setMaxLines(size_t maxLines)
void setHeight(SkScalar height)
void setStrutStyle(StrutStyle strutStyle)
void setTextHeightBehavior(TextHeightBehavior v)
void setTextAlign(TextAlign align)

◆ toSkColor4f()

SkColor4f toSkColor4f ( WASMPointerF32  cPtr)

Definition at line 40 of file paragraph_bindings.cpp.

40 {
41 float* fourFloats = reinterpret_cast<float*>(cPtr);
42 SkColor4f color = {fourFloats[0], fourFloats[1], fourFloats[2], fourFloats[3]};
43 return color;
44}
SkColor4f color

◆ toStrutStyle()

para::StrutStyle toStrutStyle ( const SimpleStrutStyle s)

Definition at line 111 of file paragraph_bindings.cpp.

111 {
113
114 const char** fontFamilies = reinterpret_cast<const char**>(s.fontFamiliesPtr);
115 if (fontFamilies != nullptr) {
116 std::vector<SkString> ff;
117 for (int i = 0; i < s.fontFamiliesLen; i++) {
118 ff.emplace_back(fontFamilies[i]);
119 }
120 ss.setFontFamilies(ff);
121 }
122
123 SkFontStyle fs(s.fontStyle.weight, s.fontStyle.width, s.fontStyle.slant);
124 ss.setFontStyle(fs);
125
126 if (s.fontSize != -1) {
127 ss.setFontSize(s.fontSize);
128 }
129 if (s.heightMultiplier != -1) {
130 ss.setHeight(s.heightMultiplier);
131 ss.setHeightOverride(true);
132 }
133 ss.setHalfLeading(s.halfLeading);
134
135 if (s.leading != 0) {
136 ss.setLeading(s.leading);
137 }
138
139 ss.setStrutEnabled(s.strutEnabled);
140 ss.setForceStrutHeight(s.forceStrutHeight);
141
142 return ss;
143}
void setHalfLeading(bool halfLeading)
void setFontFamilies(std::vector< SkString > families)
void setFontStyle(SkFontStyle fontStyle)
void setHeight(SkScalar height)
void setLeading(SkScalar Leading)
void setFontSize(SkScalar size)

◆ toTextStyle()

para::TextStyle toTextStyle ( const SimpleTextStyle s)

Definition at line 145 of file paragraph_bindings.cpp.

145 {
147
148 // textstyle.color doesn't support a 4f color, however the foreground and background fields
149 // below do.
150 ts.setColor(toSkColor4f(s.colorPtr).toSkColor());
151
152 // It is functionally important that these paints be unset when no value was provided.
153 if (s.foregroundColorPtr) {
154 SkPaint p1;
155 p1.setColor4f(toSkColor4f(s.foregroundColorPtr));
156 ts.setForegroundColor(p1);
157 }
158
159 if (s.backgroundColorPtr) {
160 SkPaint p2;
161 p2.setColor4f(toSkColor4f(s.backgroundColorPtr));
162 ts.setBackgroundColor(p2);
163 }
164
165 if (s.fontSize != -1) {
166 ts.setFontSize(s.fontSize);
167 }
168 if (s.letterSpacing != 0) {
169 ts.setLetterSpacing(s.letterSpacing);
170 }
171 if (s.wordSpacing != 0) {
172 ts.setWordSpacing(s.wordSpacing);
173 }
174
175 if (s.heightMultiplier != -1) {
176 ts.setHeight(s.heightMultiplier);
177 ts.setHeightOverride(true);
178 }
179
180 ts.setHalfLeading(s.halfLeading);
181
182 ts.setDecoration(para::TextDecoration(s.decoration));
183 ts.setDecorationStyle(s.decorationStyle);
184 if (s.decorationThickness != 0) {
185 ts.setDecorationThicknessMultiplier(s.decorationThickness);
186 }
187 if (s.decorationColorPtr) {
188 ts.setDecorationColor(toSkColor4f(s.decorationColorPtr).toSkColor());
189 }
190
191 if (s.localeLen > 0) {
192 const char* localePtr = reinterpret_cast<const char*>(s.localePtr);
193 SkString lStr(localePtr, s.localeLen);
194 ts.setLocale(lStr);
195 }
196
197 const char** fontFamilies = reinterpret_cast<const char**>(s.fontFamiliesPtr);
198 if (fontFamilies != nullptr) {
199 std::vector<SkString> ff;
200 for (int i = 0; i < s.fontFamiliesLen; i++) {
201 ff.emplace_back(fontFamilies[i]);
202 }
203 ts.setFontFamilies(ff);
204 }
205
206 ts.setTextBaseline(s.textBaseline);
207
208 SkFontStyle fs(s.fontStyle.weight, s.fontStyle.width, s.fontStyle.slant);
209 ts.setFontStyle(fs);
210
211 if (s.shadowLen > 0) {
212 const SkColor4f* colors = reinterpret_cast<const SkColor4f*>(s.shadowColorsPtr);
213 const SkPoint* offsets = reinterpret_cast<const SkPoint*>(s.shadowOffsetsPtr);
214 const float* blurRadii = reinterpret_cast<const float*>(s.shadowBlurRadiiPtr);
215 for (int i = 0; i < s.shadowLen; i++) {
216 para::TextShadow shadow(colors[i].toSkColor(), offsets[i], blurRadii[i]);
217 ts.addShadow(shadow);
218 }
219 }
220
221
222 if (s.fontFeatureLen > 0) {
223 const char** fontFeatureNames = reinterpret_cast<const char**>(s.fontFeatureNamesPtr);
224 const int* fontFeatureValues = reinterpret_cast<const int*>(s.fontFeatureValuesPtr);
225 for (int i = 0; i < s.fontFeatureLen; i++) {
226 // Font features names are 4-character simple strings.
227 SkString name(fontFeatureNames[i], 4);
228 ts.addFontFeature(name, fontFeatureValues[i]);
229 }
230 }
231
232 if (s.fontVariationLen > 0) {
233 const char** fontVariationAxes = reinterpret_cast<const char**>(s.fontVariationAxesPtr);
234 const float* fontVariationValues = reinterpret_cast<const float*>(s.fontVariationValuesPtr);
235 std::vector<SkFontArguments::VariationPosition::Coordinate> coordinates;
236 for (int i = 0; i < s.fontVariationLen; i++) {
237 // Font variation axis tags are 4-character simple strings.
238 SkString axis(fontVariationAxes[i]);
239 if (axis.size() != 4) {
240 continue;
241 }
242 coordinates.push_back({
243 SkSetFourByteTag(axis[0], axis[1], axis[2], axis[3]),
244 fontVariationValues[i]
245 });
246 }
248 coordinates.data(),
249 static_cast<int>(coordinates.size())
250 };
252 }
253
254 return ts;
255}
static constexpr SkFourByteTag SkSetFourByteTag(char a, char b, char c, char d)
Definition SkTypes.h:167
void setColor4f(const SkColor4f &color, SkColorSpace *colorSpace=nullptr)
Definition SkPaint.h:253
void setDecorationStyle(TextDecorationStyle style)
Definition TextStyle.h:222
void addShadow(TextShadow shadow)
Definition TextStyle.h:233
void setHeight(SkScalar height)
Definition TextStyle.h:260
void setLetterSpacing(SkScalar letterSpacing)
Definition TextStyle.h:269
void setWordSpacing(SkScalar wordSpacing)
Definition TextStyle.h:272
void setColor(SkColor color)
Definition TextStyle.h:166
void setHeightOverride(bool heightOverride)
Definition TextStyle.h:263
void setTextBaseline(TextBaseline baseline)
Definition TextStyle.h:283
void setFontStyle(SkFontStyle fontStyle)
Definition TextStyle.h:228
void setBackgroundColor(SkPaint paint)
Definition TextStyle.h:204
void setLocale(const SkString &locale)
Definition TextStyle.h:280
void setHalfLeading(bool halfLeading)
Definition TextStyle.h:266
void setFontArguments(const std::optional< SkFontArguments > &args)
void setForegroundColor(SkPaint paint)
Definition TextStyle.h:181
void addFontFeature(const SkString &fontFeature, int value)
Definition TextStyle.h:239
void setDecorationColor(SkColor color)
Definition TextStyle.h:223
void setDecoration(TextDecoration decoration)
Definition TextStyle.h:220
void setDecorationThicknessMultiplier(SkScalar m)
Definition TextStyle.h:224
const char * name
Definition fuchsia.cc:50
PODArray< SkColor > colors
Definition SkRecords.h:276
SkColor4f toSkColor4f(WASMPointerF32 cPtr)
SkFontArguments & setVariationDesignPosition(VariationPosition position)

◆ UnresolvedCodepoints()

JSArray UnresolvedCodepoints ( para::Paragraph self)

Definition at line 517 of file paragraph_bindings.cpp.

517 {
518 JSArray result = emscripten::val::array();
519 for (auto cp : self.unresolvedCodepoints()) {
520 result.call<void>("push", cp);
521 }
522 return result;
523}