[{"data":1,"prerenderedAt":4663},["ShallowReactive",2],{"navigation":3,"docs-sdk-4.5-editor-custom-inking":498,"nav-sdk45":4495,"support-index":4594},[4],{"title":5,"path":6,"stem":7,"children":8,"page":40},"Docs","\u002Fdocs","docs",[9,242,320],{"title":10,"path":11,"stem":12,"children":13,"page":40},"Cloud","\u002Fdocs\u002Fcloud","docs\u002Fcloud",[14],{"title":15,"path":16,"stem":17,"children":18,"page":40},"4.5","\u002Fdocs\u002Fcloud\u002F4.5","docs\u002Fcloud\u002F4.5",[19,41,54,79,100,147,172,196,209,234],{"title":20,"path":21,"stem":22,"children":23,"page":40},"Overview","\u002Fdocs\u002Fcloud\u002F4.5\u002Foverview","docs\u002Fcloud\u002F4.5\u002F01.overview",[24,28,32,36],{"title":25,"path":26,"stem":27},"MyScript iink SDK for web-based platform","\u002Fdocs\u002Fcloud\u002F4.5\u002Foverview\u002Fintroduction","docs\u002Fcloud\u002F4.5\u002F01.overview\u002F01.introduction",{"title":29,"path":30,"stem":31},"Choosing between REST or WebSockets","\u002Fdocs\u002Fcloud\u002F4.5\u002Foverview\u002Fhttp-rest-or-websocket","docs\u002Fcloud\u002F4.5\u002F01.overview\u002F02.http-rest-or-websocket",{"title":33,"path":34,"stem":35},"What's new","\u002Fdocs\u002Fcloud\u002F4.5\u002Foverview\u002Fchangelog","docs\u002Fcloud\u002F4.5\u002F01.overview\u002F03.changelog",{"title":37,"path":38,"stem":39},"Migration guide","\u002Fdocs\u002Fcloud\u002F4.5\u002Foverview\u002Fmigration-guide","docs\u002Fcloud\u002F4.5\u002F01.overview\u002F04.migration-guide",false,{"title":42,"path":43,"stem":44,"children":45,"page":40},"Integration","\u002Fdocs\u002Fcloud\u002F4.5\u002Fintegration","docs\u002Fcloud\u002F4.5\u002F02.integration",[46,50],{"title":47,"path":48,"stem":49},"Supported platforms","\u002Fdocs\u002Fcloud\u002F4.5\u002Fintegration\u002Fplatforms","docs\u002Fcloud\u002F4.5\u002F02.integration\u002F01.platforms",{"title":51,"path":52,"stem":53},"Integration levels","\u002Fdocs\u002Fcloud\u002F4.5\u002Fintegration\u002Fintegration-levels","docs\u002Fcloud\u002F4.5\u002F02.integration\u002F02.integration-levels",{"title":55,"path":56,"stem":57,"children":58,"page":40},"Recognition capabilities","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities",[59,63,67,71,75],{"title":60,"path":61,"stem":62},"Recognizers","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities\u002Frecognizers","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities\u002F01.recognizers",{"title":64,"path":65,"stem":66},"Text languages and features","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities\u002Ftext-languages","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities\u002F02.text-languages",{"title":68,"path":69,"stem":70},"Math elements and rules","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities\u002Fmath-elements-and-rules","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities\u002F03.math-elements-and-rules",{"title":72,"path":73,"stem":74},"Shapes and connectors","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities\u002Fdiagram-features","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities\u002F04.diagram-features",{"title":76,"path":77,"stem":78},"Gestures","\u002Fdocs\u002Fcloud\u002F4.5\u002Frecognition-capabilities\u002Fgestures","docs\u002Fcloud\u002F4.5\u002F03.recognition-capabilities\u002F05.gestures",{"title":80,"path":81,"stem":82,"children":83,"page":40},"Interactivity integration","\u002Fdocs\u002Fcloud\u002F4.5\u002Finteractivity-integration","docs\u002Fcloud\u002F4.5\u002F04.interactivity-integration",[84,88,92,96],{"title":85,"path":86,"stem":87},"Content types","\u002Fdocs\u002Fcloud\u002F4.5\u002Finteractivity-integration\u002Fcontent-types","docs\u002Fcloud\u002F4.5\u002F04.interactivity-integration\u002F01.content-types",{"title":89,"path":90,"stem":91},"Interactive features","\u002Fdocs\u002Fcloud\u002F4.5\u002Finteractivity-integration\u002Finteractive-features","docs\u002Fcloud\u002F4.5\u002F04.interactivity-integration\u002F02.interactive-features",{"title":93,"path":94,"stem":95},"Import and export formats","\u002Fdocs\u002Fcloud\u002F4.5\u002Finteractivity-integration\u002Fimport-and-export-formats","docs\u002Fcloud\u002F4.5\u002F04.interactivity-integration\u002F03.import-and-export-formats",{"title":97,"path":98,"stem":99},"Math interactive features","\u002Fdocs\u002Fcloud\u002F4.5\u002Finteractivity-integration\u002Fmath-features","docs\u002Fcloud\u002F4.5\u002F04.interactivity-integration\u002F04.math-features",{"title":101,"path":102,"stem":103,"children":104,"page":40},"iinkTS","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts","docs\u002Fcloud\u002F4.5\u002F05.iinkts",[105,109,113,121,138],{"title":106,"path":107,"stem":108},"Getting started","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Fget-started","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F01.get-started",{"title":110,"path":111,"stem":112},"Canvas","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Fcanvas","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F02.canvas",{"title":114,"path":115,"stem":116,"children":117,"page":40},"Ink Canvas","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Fink-canvas","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F03.ink-canvas",[118],{"title":114,"path":119,"stem":120},"\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Fink-canvas\u002Fink-canvas","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F03.ink-canvas\u002F01.ink-canvas",{"title":122,"path":123,"stem":124,"children":125,"page":40},"Interactive Ink Canvas","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Finteractive-ink-canvas","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F04.interactive-ink-canvas",[126,130,134],{"title":127,"path":128,"stem":129},"Interactive ink canvas","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Finteractive-ink-canvas\u002Finteractive-ink-canvas","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F04.interactive-ink-canvas\u002F01.interactive-ink-canvas",{"title":131,"path":132,"stem":133},"Interactive Math","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Finteractive-ink-canvas\u002Fiicanvas-math","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F04.interactive-ink-canvas\u002F02.iicanvas-math",{"title":135,"path":136,"stem":137},"Using a custom rendering","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Finteractive-ink-canvas\u002Fiicanvas-other-rendering","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F04.interactive-ink-canvas\u002F03.iicanvas-other-rendering",{"title":139,"path":140,"stem":141,"children":142,"page":40},"Reference","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Freference","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F05.reference",[143],{"title":144,"path":145,"stem":146},"Configuration","\u002Fdocs\u002Fcloud\u002F4.5\u002Fiinkts\u002Freference\u002Fconfiguration-iinkts","docs\u002Fcloud\u002F4.5\u002F05.iinkts\u002F05.reference\u002F01.configuration-iinkts",{"title":148,"path":149,"stem":150,"children":151,"page":40},"REST","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest","docs\u002Fcloud\u002F4.5\u002F06.rest",[152,156,160,164,168],{"title":153,"path":154,"stem":155},"MyScript iink SDK Web REST Overview","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest\u002Farchitecture","docs\u002Fcloud\u002F4.5\u002F06.rest\u002F01.architecture",{"title":157,"path":158,"stem":159},"MyScript iink SDK Web REST Recognizer API","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest\u002Fnew-api","docs\u002Fcloud\u002F4.5\u002F06.rest\u002F02.new-api",{"title":161,"path":162,"stem":163},"Recognizer configuration","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest\u002Fconfiguration-recognizer-rest","docs\u002Fcloud\u002F4.5\u002F06.rest\u002F03.configuration-recognizer-rest",{"title":165,"path":166,"stem":167},"MyScript iink SDK Web REST Batch API","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest\u002Flegacy-api","docs\u002Fcloud\u002F4.5\u002F06.rest\u002F04.legacy-api",{"title":169,"path":170,"stem":171},"Batch configuration","\u002Fdocs\u002Fcloud\u002F4.5\u002Frest\u002Fconfiguration-rest","docs\u002Fcloud\u002F4.5\u002F06.rest\u002F05.configuration-rest",{"title":173,"path":174,"stem":175,"children":176,"page":40},"WebSockets","\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets","docs\u002Fcloud\u002F4.5\u002F07.websockets",[177,181,185,189,193],{"title":178,"path":179,"stem":180},"MyScript iink SDK WebSockets API architecture","\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets\u002Farchitecture","docs\u002Fcloud\u002F4.5\u002F07.websockets\u002F01.architecture",{"title":182,"path":183,"stem":184},"Offscreen interactivity mode messages","\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets\u002Fmessages-offscreen","docs\u002Fcloud\u002F4.5\u002F07.websockets\u002F02.messages-offscreen",{"title":186,"path":187,"stem":188},"Offscreen interactivity math messages","\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets\u002Fmath-offscreen","docs\u002Fcloud\u002F4.5\u002F07.websockets\u002F03.math-offscreen",{"title":190,"path":191,"stem":192},"Onscreen interactivity mode messages","\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets\u002Fmessages-onscreen","docs\u002Fcloud\u002F4.5\u002F07.websockets\u002F04.messages-onscreen",{"title":144,"path":194,"stem":195},"\u002Fdocs\u002Fcloud\u002F4.5\u002Fwebsockets\u002Fconfiguration-ws","docs\u002Fcloud\u002F4.5\u002F07.websockets\u002F05.configuration-ws",{"title":197,"path":198,"stem":199,"children":200,"page":40},"Specific","\u002Fdocs\u002Fcloud\u002F4.5\u002Fspecific","docs\u002Fcloud\u002F4.5\u002F08.specific",[201,205],{"title":202,"path":203,"stem":204},"Text recognition candidates","\u002Fdocs\u002Fcloud\u002F4.5\u002Fspecific\u002Ftext-recognition-candidates","docs\u002Fcloud\u002F4.5\u002F08.specific\u002F01.text-recognition-candidates",{"title":206,"path":207,"stem":208},"Recognition resources","\u002Fdocs\u002Fcloud\u002F4.5\u002Fspecific\u002Fcustom-recognition","docs\u002Fcloud\u002F4.5\u002F08.specific\u002F02.custom-recognition",{"title":210,"path":211,"stem":212,"children":213,"page":40},"Server","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver","docs\u002Fcloud\u002F4.5\u002F09.server",[214,218,222,226,230],{"title":215,"path":216,"stem":217},"MyScript Server Installation Preamble and Prerequisites","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver\u002Fpreamble-prerequisites","docs\u002Fcloud\u002F4.5\u002F09.server\u002F01.preamble-prerequisites",{"title":219,"path":220,"stem":221},"MyScript Server Monoserver Installation Documentation","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver\u002Fmonoserver-installation","docs\u002Fcloud\u002F4.5\u002F09.server\u002F02.monoserver-installation",{"title":223,"path":224,"stem":225},"MyScript Server Production Installation Documentation","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver\u002Fproduction-installation","docs\u002Fcloud\u002F4.5\u002F09.server\u002F03.production-installation",{"title":227,"path":228,"stem":229},"MyScript Server Migration Guide","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver\u002Fserver-migration-guide","docs\u002Fcloud\u002F4.5\u002F09.server\u002F04.server-migration-guide",{"title":231,"path":232,"stem":233},"MyScript Server Administration Guide","\u002Fdocs\u002Fcloud\u002F4.5\u002Fserver\u002Fadministration-guide","docs\u002Fcloud\u002F4.5\u002F09.server\u002F05.administration-guide",{"title":139,"path":235,"stem":236,"children":237,"page":40},"\u002Fdocs\u002Fcloud\u002F4.5\u002Freference","docs\u002Fcloud\u002F4.5\u002F10.reference",[238],{"title":239,"path":240,"stem":241},"JIIX format reference","\u002Fdocs\u002Fcloud\u002F4.5\u002Freference\u002Fjiix","docs\u002Fcloud\u002F4.5\u002F10.reference\u002F01.jiix",{"title":243,"path":244,"stem":245,"children":246,"page":40},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002Fconcepts",[247,250,254],{"title":20,"path":248,"stem":249},"\u002Fdocs\u002Fconcepts\u002Foverview","docs\u002Fconcepts\u002F01.overview",{"title":251,"path":252,"stem":253},"Glossary","\u002Fdocs\u002Fconcepts\u002Fglossary","docs\u002Fconcepts\u002F02.glossary",{"title":255,"path":256,"stem":257,"children":258,"page":40},"Fundamentals","\u002Fdocs\u002Fconcepts\u002Ffundamentals","docs\u002Fconcepts\u002F03.fundamentals",[259,263,292,312],{"title":260,"path":261,"stem":262},"OCR vs digital ink recognition","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fdigital-ink-vs-ocr","docs\u002Fconcepts\u002F03.fundamentals\u002F01.digital-ink-vs-ocr",{"title":264,"path":265,"stem":266,"children":267,"page":40},"Ink interpretation","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation",[268,272,276,280,284,288],{"title":269,"path":270,"stem":271},"Ink processing","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Fink-interpretation","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F01.ink-interpretation",{"title":273,"path":274,"stem":275},"Recognition features","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Fcontent-types","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F02.content-types",{"title":277,"path":278,"stem":279},"Ink classification","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Fink-classification","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F03.ink-classification",{"title":281,"path":282,"stem":283},"What are batch mode and incremental mode?","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Fbatch-mode","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F04.batch-mode",{"title":285,"path":286,"stem":287},"Gestures and context","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Fcontext-gestures","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F05.context-gestures",{"title":289,"path":290,"stem":291},"What is interactivity","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fink-interpretation\u002Finteractive-ink","docs\u002Fconcepts\u002F03.fundamentals\u002F02.ink-interpretation\u002F06.interactive-ink",{"title":293,"path":294,"stem":295,"children":296,"page":40},"Rendering-driven interactivity","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Frendering-driven-interactivity","docs\u002Fconcepts\u002F03.fundamentals\u002F03.rendering-driven-interactivity",[297,301,304,308],{"title":298,"path":299,"stem":300},"Ink capture","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Frendering-driven-interactivity\u002Fink-capture","docs\u002Fconcepts\u002F03.fundamentals\u002F03.rendering-driven-interactivity\u002F01.ink-capture",{"title":76,"path":302,"stem":303},"\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Frendering-driven-interactivity\u002Fediting-gestures","docs\u002Fconcepts\u002F03.fundamentals\u002F03.rendering-driven-interactivity\u002F02.editing-gestures",{"title":305,"path":306,"stem":307},"Smart tools","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Frendering-driven-interactivity\u002Fsmart-tools","docs\u002Fconcepts\u002F03.fundamentals\u002F03.rendering-driven-interactivity\u002F03.smart-tools",{"title":309,"path":310,"stem":311},"Responsive and productive","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Frendering-driven-interactivity\u002Fresponsive-layout","docs\u002Fconcepts\u002F03.fundamentals\u002F03.rendering-driven-interactivity\u002F04.responsive-layout",{"title":313,"path":314,"stem":315,"children":316,"page":40},"Handwriting generation","\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fhandwriting-generation","docs\u002Fconcepts\u002F03.fundamentals\u002F04.handwriting-generation",[317],{"title":313,"path":318,"stem":319},"\u002Fdocs\u002Fconcepts\u002Ffundamentals\u002Fhandwriting-generation\u002Fhandwriting-generation","docs\u002Fconcepts\u002F03.fundamentals\u002F04.handwriting-generation\u002F01.handwriting-generation",{"title":321,"path":322,"stem":323,"children":324,"page":40},"Sdk","\u002Fdocs\u002Fsdk","docs\u002Fsdk",[325],{"title":15,"path":326,"stem":327,"children":328,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5","docs\u002Fsdk\u002F4.5",[329,333,336,339,349,368,381,393,401,417,426,463,467,470,474,477,484],{"title":330,"path":331,"stem":332},"About MyScript iink SDK","\u002Fdocs\u002Fsdk\u002F4.5\u002Fabout","docs\u002Fsdk\u002F4.5\u002F01.about",{"title":33,"path":334,"stem":335},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fchangelog","docs\u002Fsdk\u002F4.5\u002F02.changelog",{"title":37,"path":337,"stem":338},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fmigration-guide","docs\u002Fsdk\u002F4.5\u002F03.migration-guide",{"title":42,"path":340,"stem":341,"children":342,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fintegration","docs\u002Fsdk\u002F4.5\u002F04.integration",[343,346],{"title":47,"path":344,"stem":345},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fintegration\u002Fplatforms","docs\u002Fsdk\u002F4.5\u002F04.integration\u002F01.platforms",{"title":51,"path":347,"stem":348},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fintegration\u002Fintegration-levels","docs\u002Fsdk\u002F4.5\u002F04.integration\u002F02.integration-levels",{"title":55,"path":350,"stem":351,"children":352,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities",[353,356,359,362,365],{"title":60,"path":354,"stem":355},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities\u002Frecognizers","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities\u002F01.recognizers",{"title":64,"path":357,"stem":358},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities\u002Ftext-languages","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities\u002F02.text-languages",{"title":68,"path":360,"stem":361},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities\u002Fmath-elements-and-rules","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities\u002F03.math-elements-and-rules",{"title":72,"path":363,"stem":364},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities\u002Fdiagram-features","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities\u002F04.diagram-features",{"title":76,"path":366,"stem":367},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognition-capabilities\u002Fgestures","docs\u002Fsdk\u002F4.5\u002F05.recognition-capabilities\u002F05.gestures",{"title":80,"path":369,"stem":370,"children":371,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity-integration","docs\u002Fsdk\u002F4.5\u002F06.interactivity-integration",[372,375,378],{"title":85,"path":373,"stem":374},"\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity-integration\u002Fcontent-types","docs\u002Fsdk\u002F4.5\u002F06.interactivity-integration\u002F01.content-types",{"title":89,"path":376,"stem":377},"\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity-integration\u002Finteractive-features","docs\u002Fsdk\u002F4.5\u002F06.interactivity-integration\u002F02.interactive-features",{"title":93,"path":379,"stem":380},"\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity-integration\u002Fimport-and-export-formats","docs\u002Fsdk\u002F4.5\u002F06.interactivity-integration\u002F03.import-and-export-formats",{"title":106,"path":382,"stem":383,"children":384,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fgetting-started","docs\u002Fsdk\u002F4.5\u002F07.getting-started",[385,389],{"title":386,"path":387,"stem":388},"Setup","\u002Fdocs\u002Fsdk\u002F4.5\u002Fgetting-started\u002Fsetup","docs\u002Fsdk\u002F4.5\u002F07.getting-started\u002F01.setup",{"title":390,"path":391,"stem":392},"Instantiate Engine","\u002Fdocs\u002Fsdk\u002F4.5\u002Fgetting-started\u002Finteractive-ink-runtime","docs\u002Fsdk\u002F4.5\u002F07.getting-started\u002F02.interactive-ink-runtime",{"title":394,"path":395,"stem":396,"children":397,"page":40},"Recognizer","\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognizer","docs\u002Fsdk\u002F4.5\u002F08.recognizer",[398],{"title":60,"path":399,"stem":400},"\u002Fdocs\u002Fsdk\u002F4.5\u002Frecognizer\u002Frecognizers","docs\u002Fsdk\u002F4.5\u002F08.recognizer\u002F01.recognizers",{"title":402,"path":403,"stem":404,"children":405,"page":40},"Interactivity specific","\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity","docs\u002Fsdk\u002F4.5\u002F09.interactivity",[406,410,413],{"title":407,"path":408,"stem":409},"Storage","\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity\u002Fstorage","docs\u002Fsdk\u002F4.5\u002F09.interactivity\u002F01.storage",{"title":97,"path":411,"stem":412},"\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity\u002Fmath-features","docs\u002Fsdk\u002F4.5\u002F09.interactivity\u002F02.math-features",{"title":414,"path":415,"stem":416},"Integrate with the undo\u002Fredo stack of your application","\u002Fdocs\u002Fsdk\u002F4.5\u002Finteractivity\u002Fcombined-undo-redo-stacks","docs\u002Fsdk\u002F4.5\u002F09.interactivity\u002F03.combined-undo-redo-stacks",{"title":418,"path":419,"stem":420,"children":421,"page":40},"OffScreenEditor specific","\u002Fdocs\u002Fsdk\u002F4.5\u002Foffscreen-editor","docs\u002Fsdk\u002F4.5\u002F10.offscreen-editor",[422],{"title":423,"path":424,"stem":425},"OffscreenEditor","\u002Fdocs\u002Fsdk\u002F4.5\u002Foffscreen-editor\u002Foff-screen-usage","docs\u002Fsdk\u002F4.5\u002F10.offscreen-editor\u002F01.off-screen-usage",{"title":427,"path":428,"stem":429,"children":430,"page":40},"Editor specific","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor","docs\u002Fsdk\u002F4.5\u002F11.editor",[431,435,439,443,447,451,455,459],{"title":432,"path":433,"stem":434},"Rendering","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Frendering","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F01.rendering",{"title":436,"path":437,"stem":438},"Editing","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fediting","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F02.editing",{"title":440,"path":441,"stem":442},"Tool controller","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Ftool-controller","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F03.tool-controller",{"title":444,"path":445,"stem":446},"Selection and block","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fblock-selection-management","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F04.block-selection-management",{"title":448,"path":449,"stem":450},"Conversion","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fconversion","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F05.conversion",{"title":452,"path":453,"stem":454},"Zooming and scrolling","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fzooming-and-scrolling","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F06.zooming-and-scrolling",{"title":456,"path":457,"stem":458},"Styling","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fstyling","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F07.styling",{"title":460,"path":461,"stem":462},"Custom inking","\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Fcustom-inking","docs\u002Fsdk\u002F4.5\u002F11.editor\u002F08.custom-inking",{"title":464,"path":465,"stem":466},"Result, import and export","\u002Fdocs\u002Fsdk\u002F4.5\u002Fimport-and-export","docs\u002Fsdk\u002F4.5\u002F12.import-and-export",{"title":202,"path":468,"stem":469},"\u002Fdocs\u002Fsdk\u002F4.5\u002Ftext-recognition-candidates","docs\u002Fsdk\u002F4.5\u002F13.text-recognition-candidates",{"title":471,"path":472,"stem":473},"Error management","\u002Fdocs\u002Fsdk\u002F4.5\u002Ferror-management","docs\u002Fsdk\u002F4.5\u002F14.error-management",{"title":206,"path":475,"stem":476},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fcustom-recognition","docs\u002Fsdk\u002F4.5\u002F15.custom-recognition",{"title":313,"path":478,"stem":479,"children":480,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fhandwriting-generation","docs\u002Fsdk\u002F4.5\u002F16.handwriting-generation",[481],{"title":313,"path":482,"stem":483},"\u002Fdocs\u002Fsdk\u002F4.5\u002Fhandwriting-generation\u002Fhandwriting-generation","docs\u002Fsdk\u002F4.5\u002F16.handwriting-generation\u002F01.handwriting-generation",{"title":139,"path":485,"stem":486,"children":487,"page":40},"\u002Fdocs\u002Fsdk\u002F4.5\u002Freference","docs\u002Fsdk\u002F4.5\u002F17.reference",[488,491,494],{"title":144,"path":489,"stem":490},"\u002Fdocs\u002Fsdk\u002F4.5\u002Freference\u002Fconfiguration","docs\u002Fsdk\u002F4.5\u002F17.reference\u002F01.configuration",{"title":239,"path":492,"stem":493},"\u002Fdocs\u002Fsdk\u002F4.5\u002Freference\u002Fjiix","docs\u002Fsdk\u002F4.5\u002F17.reference\u002F02.jiix",{"title":495,"path":496,"stem":497},"Styling reference","\u002Fdocs\u002Fsdk\u002F4.5\u002Freference\u002Fstyling","docs\u002Fsdk\u002F4.5\u002F17.reference\u002F03.styling",{"path":461,"page":499},{"id":500,"title":460,"body":501,"canonicalPath":461,"description":4486,"extension":4487,"icon":4488,"meta":4489,"navTitle":4490,"navigation":1051,"path":461,"resolveKey":4491,"resolveVersion":4492,"seo":4493,"stem":462,"__hash__":4494},"sdk45\u002Fdocs\u002Fsdk\u002F4.5\u002F11.editor\u002F08.custom-inking.md",{"type":502,"value":503,"toc":4474},"minimark",[504,508,513,533,543,546,550,553,556,587,594,598,605,608,617,620,624,627,939,943,946,951,958,2028,2034,2037,2315,2322,2514,2521,2619,2622,2626,2638,2652,2659,3267,3270,3753,3767,3955,3982,4427,4471],[505,506,507],"p",{},"This page explains how to customize iink SDK stroke rendering.",[509,510,512],"h2",{"id":511},"terminology","Terminology",[505,514,515,516,520,521,524,525,528,529,532],{},"In MyScript terminology, \"inking\" refers to the process of rendering ink strokes. An inking algorithm typically processes the ",[517,518,519],"strong",{},"coordinates of the points"," of a\nstroke, their associated ",[517,522,523],{},"pressure"," or ",[517,526,527],{},"timestamp"," information, as well as ",[517,530,531],{},"stroke styling"," such as color or width. It consists of two main steps:",[534,535,536,540],"ol",{},[537,538,539],"li",{},"computation of the envelope (i.e. the geometry of the stroke),",[537,541,542],{},"drawing of the stroke itself.",[505,544,545],{},"While iink SDK comes with its own built-in inking, the toolkit is flexible enough to let you customize these steps.",[509,547,549],{"id":548},"use-cases","Use cases",[505,551,552],{},"If you are integrating iink SDK into an application that already implements its own inking capabilities, you may want to make sure that the same rendering\nalgorithm is used for both iink- and application-managed content.",[505,554,555],{},"MyScript iink SDK can be tuned to address the following use cases:",[557,558,559,572],"ul",{},[537,560,561,562,565,566,571],{},"You just want to ",[517,563,564],{},"influence the shape of the strokes"," to render and let iink SDK draw the strokes by stroking or filling the envelop you define. In this\ncase, all you have to do is to ",[567,568,570],"a",{"href":569},"#custom-stroker","implement and register your own stroker",".",[537,573,574,575,578,579,582,583,571],{},"You additionally want to ",[517,576,577],{},"draw the strokes by yourself",", for instance if you need to draw textured strokes or if you rely on a rendering technology like\nOpenGL and want to use particles instead  of filling an envelope. In this case, in addition to ",[567,580,581],{"href":569},"implement your own stroker"," (it is required\nby iink SDK, as explained in the following section), you will need to store information into  generated path to be able to use them to ",[567,584,586],{"href":585},"#custom-drawing-of-the-strokes","render the strokes by\nyourself",[588,589,591],"callout",{"color":590},"secondary",[505,592,593],{},"This inking customization should be considered with special care as modifying the default implementation might reduce drastically the rendering performance.",[509,595,597],{"id":596},"requirements-from-iink-sdk","Requirements from iink SDK",[505,599,600,601,604],{},"Independently from the amount of customization you intend to apply to stroke rendering, iink SDK ",[517,602,603],{},"needs to know as precisely as possible the envelope of the\nstrokes"," you intend to draw.",[505,606,607],{},"An envelope corresponds to the geometrical shape of the stroke, as shown in the following illustration:",[505,609,610],{},[611,612],"img",{"alt":613,"height":614,"src":615,"width":616},"",167.51701,"\u002Fdocs\u002Fimages\u002Fstroke-envelope.svg",319.3894,[505,618,619],{},"Among other things, knowing the envelops of the strokes lets iink SDK optimize rendering operations (by computing areas to refresh following changes in the\nmodel), know which items to render at a given point in time and manage the geometry of selections. A precise envelop definition is key to get good results.",[509,621,623],{"id":622},"how-to-use-the-api","How to use the API",[505,625,626],{},"To define your own stroker, you should:",[628,629,630,761,860,897,913,921,927,931],"partial",{},[631,632,633,696,718,731,737,744],"template",{"v-slot:swift":613},[534,634,635,655,666,689],{},[537,636,637,638,642,643,646,647,650,651,654],{},"Define a custom stroker object that adopts the ",[639,640,641],"code",{},"IINKIStroker"," protocol: its ",[639,644,645],{},"stroke"," and  ",[639,648,649],{},"isFill"," methods respectively let you return the envelop of a given stroke as an ",[639,652,653],{},"IINKIPath"," instance\nand choose whether iink SDK shall fill or just stroke the resulting path.",[537,656,657,658,661,662,665],{},"Define a custom stroker factory that conforms to the ",[639,659,660],{},"IINKIStrokerFactory"," protocol: the ",[639,663,664],{},"createStroker"," method will let you return an instance of your custom stroker.",[537,667,668,669,672,673,676,677,680,681,683,684,688],{},"Instantiate your custom stroker factory and register it to your ",[639,670,671],{},"IINKRenderer"," class with the ",[639,674,675],{},"registerStroker"," method (you can unregister it later using\n",[639,678,679],{},"unregisterStroker"," method of the ",[639,682,671],{},"). This method will also let you specify the name of the ",[685,686,687],"em",{},"brush"," corresponding to your stroker.",[537,690,691,692,695],{},"Use the brush name you defined to ",[567,693,694],{"href":457},"style"," the ink.",[505,697,698,699,701,702,680,704,706,707,709,710,713,714,717],{},"To render the strokes by yourself, you may need to have your own implementation of ",[639,700,653],{}," to store stroke information provided via the ",[639,703,645],{},[639,705,641],{}," interface.\nData stored within ",[639,708,653],{}," objects will then be available in ",[639,711,712],{},"IINKICanvas"," ",[639,715,716],{},"drawPath"," method for you to draw the stroke in a custom way.",[588,719,720],{"color":590},[505,721,722,723,725,726,730],{},"A platform-specific implementation of the ",[639,724,653],{}," protocol is provided for each target platform via the\n",[567,727,729],{"href":728},"\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Frendering#reference-implementation","UI Reference Implementation",". You may adapt or subclass it to store the stroke information.",[505,732,733,734,736],{},"Note that depending on whether you close or not your paths and the value you return with ",[639,735,649],{},", you will define a different envelope. The following figure shows in black the resulting envelope depending on the options and the state of the path in red:",[505,738,739],{},[611,740],{"alt":613,"height":741,"src":742,"width":743},283.51199,"\u002Fdocs\u002Fimages\u002Fstroke-fill-style.svg",450.35379,[505,745,746,747,750,751,753,754,757,758,760],{},"As you can see, if you choose to return ",[639,748,749],{},"false"," in the ",[639,752,649],{}," property, iink SDK will consider a larger envelope than what is strictly returned by your path,\nas it will take into account the pixel width of the stroke (",[639,755,756],{},"width"," parameter of the ",[639,759,645],{}," method) to stroke the path.",[631,762,763,815,832,841,846,850],{"v-slot:csharp":613},[534,764,765,783,792,811],{},[537,766,767,768,771,772,775,776,779,780,654],{},"Implement the ",[639,769,770],{},"IStroker"," interface: its ",[639,773,774],{},"Stroke"," and ",[639,777,778],{},"IsFill"," methods respectively let you retrieve the envelop of a given stroke as an ",[639,781,782],{},"IPath",[537,784,767,785,788,789,665],{},[639,786,787],{},"IStrokerFactory"," interface: the ",[639,790,791],{},"CreateStroker()",[537,793,794,795,798,799,676,802,805,806,808,809,688],{},"Instantiate your custom stroker factory and register it with the ",[639,796,797],{},"IRenderer"," interface ",[639,800,801],{},"RegisterStroker()",[639,803,804],{},"UnregisterStroker()"," method on the ",[639,807,797],{}," interface ). This method will also let you specify the name of the ",[685,810,687],{},[537,812,691,813,695],{},[567,814,694],{"href":457},[505,816,698,817,819,820,680,822,706,824,709,826,713,829,717],{},[639,818,782],{}," to store stroke information provided via ",[639,821,774],{},[639,823,770],{},[639,825,782],{},[639,827,828],{},"ICanvas",[639,830,831],{},"DrawPath()",[588,833,834],{"color":590},[505,835,722,836,838,839,730],{},[639,837,782],{}," interface is provided for each target platform via the\n",[567,840,729],{"href":728},[505,842,733,843,736],{},[639,844,845],{},"IsFill()",[505,847,848],{},[611,849],{"alt":613,"height":741,"src":742,"width":743},[505,851,746,852,750,854,856,857,859],{},[639,853,749],{},[639,855,845],{}," method, iink SDK will consider a larger envelope than what is strictly returned by your path,\nas it will take into account the pixel width of the stroke (",[639,858,756],{}," parameter of the method) to stroke the path.",[534,861,862,872,879,893],{},[537,863,767,864,771,866,775,868,650,870,654],{},[639,865,770],{},[639,867,645],{},[639,869,649],{},[639,871,782],{},[537,873,767,874,788,876,665],{},[639,875,787],{},[639,877,878],{},"createStroker()",[537,880,794,881,798,883,676,886,805,889,808,891,688],{},[639,882,797],{},[639,884,885],{},"registerStroker()",[639,887,888],{},"unregisterStroker()",[639,890,797],{},[685,892,687],{},[537,894,691,895,695],{},[567,896,694],{"href":457},[505,898,698,899,819,901,680,904,706,906,709,908,713,910,717],{},[639,900,782],{},[639,902,903],{},"#{strokeMethodName}",[639,905,770],{},[639,907,782],{},[639,909,828],{},[639,911,912],{},"drawPath()",[588,914,915],{"color":590},[505,916,722,917,838,919,730],{},[639,918,782],{},[567,920,729],{"href":728},[505,922,733,923,926],{},[639,924,925],{},"isFill()",", you will define a different envelope. The followingfigure shows in black the resulting envelope depending on the options and the state of the path in red:",[505,928,929],{},[611,930],{"alt":613,"height":741,"src":742,"width":743},[505,932,746,933,750,935,856,937,859],{},[639,934,749],{},[639,936,925],{},[639,938,756],{},[509,940,942],{"id":941},"code-snippets","Code snippets",[505,944,945],{},"For the sake of example, this section shows how to implement a very basic inking algorithm based on \"line to\" instructions. If you are interested to develop\nyour own inking, you will likely implement something both smarter and better looking, but the structure of the code will be similar.",[947,948,950],"h3",{"id":949},"custom-stroker","Custom stroker",[505,952,953,954,957],{},"Let's start by implementing the ",[639,955,956],{},"CustomStroker"," class:",[628,959,960,1255,1510,1807],{},[631,961,962],{"v-slot:java":613},[963,964,968],"pre",{"className":965,"code":966,"language":967,"meta":613,"style":613},"language-java shiki shiki-themes blue-hacker-light blue-hacker-light blue-hacker-dark","public class CustomStroker implements IStroker\n{\n    @Override\n    public boolean isFill()\n    {\n        return false;\n    }\n\n    @Override\n    public void stroke(InkPoint[] input, float width, float pixelSize, IPath output)\n    {\n        output.moveTo(input[0].x, input[0].y);\n        for (int i=1; i\u003C input.length; i++)\n        {\n            output.lineTo(input[i].x, input[i].y);\n        }\n    }\n}\n","java",[639,969,970,993,1000,1009,1021,1027,1040,1046,1053,1060,1107,1112,1153,1198,1204,1238,1244,1249],{"__ignoreMap":613},[971,972,975,979,982,986,989],"span",{"class":973,"line":974},"line",1,[971,976,978],{"class":977},"sglaT","public",[971,980,981],{"class":977}," class",[971,983,985],{"class":984},"sVYTS"," CustomStroker",[971,987,988],{"class":977}," implements",[971,990,992],{"class":991},"sZBTK"," IStroker\n",[971,994,996],{"class":973,"line":995},2,[971,997,999],{"class":998},"soFc9","{\n",[971,1001,1003,1006],{"class":973,"line":1002},3,[971,1004,1005],{"class":998},"    @",[971,1007,1008],{"class":977},"Override\n",[971,1010,1012,1015,1018],{"class":973,"line":1011},4,[971,1013,1014],{"class":977},"    public",[971,1016,1017],{"class":977}," boolean",[971,1019,1020],{"class":998}," isFill()\n",[971,1022,1024],{"class":973,"line":1023},5,[971,1025,1026],{"class":998},"    {\n",[971,1028,1030,1033,1037],{"class":973,"line":1029},6,[971,1031,1032],{"class":998},"        return",[971,1034,1036],{"class":1035},"sU2JI"," false",[971,1038,1039],{"class":998},";\n",[971,1041,1043],{"class":973,"line":1042},7,[971,1044,1045],{"class":998},"    }\n",[971,1047,1049],{"class":973,"line":1048},8,[971,1050,1052],{"emptyLinePlaceholder":1051},true,"\n",[971,1054,1056,1058],{"class":973,"line":1055},9,[971,1057,1005],{"class":998},[971,1059,1008],{"class":977},[971,1061,1063,1065,1068,1071,1074,1077,1080,1083,1086,1089,1091,1093,1096,1098,1101,1104],{"class":973,"line":1062},10,[971,1064,1014],{"class":977},[971,1066,1067],{"class":977}," void",[971,1069,1070],{"class":998}," stroke(",[971,1072,1073],{"class":977},"InkPoint",[971,1075,1076],{"class":998},"[]",[971,1078,1079],{"class":1035}," input",[971,1081,1082],{"class":998},",",[971,1084,1085],{"class":977}," float",[971,1087,1088],{"class":1035}," width",[971,1090,1082],{"class":998},[971,1092,1085],{"class":977},[971,1094,1095],{"class":1035}," pixelSize",[971,1097,1082],{"class":998},[971,1099,1100],{"class":977}," IPath",[971,1102,1103],{"class":1035}," output",[971,1105,1106],{"class":998},")\n",[971,1108,1110],{"class":973,"line":1109},11,[971,1111,1026],{"class":998},[971,1113,1115,1119,1122,1125,1128,1131,1134,1137,1139,1141,1143,1145,1147,1150],{"class":973,"line":1114},12,[971,1116,1118],{"class":1117},"sEQEB","        output",[971,1120,1121],{"class":998},".moveTo(",[971,1123,1124],{"class":1117},"input",[971,1126,1127],{"class":998},"[",[971,1129,1130],{"class":1035},"0",[971,1132,1133],{"class":998},"].",[971,1135,1136],{"class":1117},"x",[971,1138,1082],{"class":998},[971,1140,1079],{"class":1117},[971,1142,1127],{"class":998},[971,1144,1130],{"class":1035},[971,1146,1133],{"class":998},[971,1148,1149],{"class":1117},"y",[971,1151,1152],{"class":998},");\n",[971,1154,1156,1159,1162,1165,1168,1171,1174,1177,1179,1182,1184,1186,1189,1191,1193,1196],{"class":973,"line":1155},13,[971,1157,1158],{"class":998},"        for",[971,1160,1161],{"class":998}," (",[971,1163,1164],{"class":977},"int",[971,1166,1167],{"class":1117}," i",[971,1169,1170],{"class":977},"=",[971,1172,1173],{"class":1035},"1",[971,1175,1176],{"class":998},";",[971,1178,1167],{"class":1117},[971,1180,1181],{"class":977},"\u003C",[971,1183,1079],{"class":1117},[971,1185,571],{"class":998},[971,1187,1188],{"class":1117},"length",[971,1190,1176],{"class":998},[971,1192,1167],{"class":1117},[971,1194,1195],{"class":977},"++",[971,1197,1106],{"class":998},[971,1199,1201],{"class":973,"line":1200},14,[971,1202,1203],{"class":998},"        {\n",[971,1205,1207,1210,1213,1215,1217,1220,1222,1224,1226,1228,1230,1232,1234,1236],{"class":973,"line":1206},15,[971,1208,1209],{"class":1117},"            output",[971,1211,1212],{"class":998},".lineTo(",[971,1214,1124],{"class":1117},[971,1216,1127],{"class":998},[971,1218,1219],{"class":1117},"i",[971,1221,1133],{"class":998},[971,1223,1136],{"class":1117},[971,1225,1082],{"class":998},[971,1227,1079],{"class":1117},[971,1229,1127],{"class":998},[971,1231,1219],{"class":1117},[971,1233,1133],{"class":998},[971,1235,1149],{"class":1117},[971,1237,1152],{"class":998},[971,1239,1241],{"class":973,"line":1240},16,[971,1242,1243],{"class":998},"        }\n",[971,1245,1247],{"class":973,"line":1246},17,[971,1248,1045],{"class":998},[971,1250,1252],{"class":973,"line":1251},18,[971,1253,1254],{"class":1117},"}\n",[631,1256,1257],{"v-slot:swift":613},[963,1258,1262],{"className":1259,"code":1260,"language":1261,"meta":613,"style":613},"language-objective-c shiki shiki-themes blue-hacker-light blue-hacker-light blue-hacker-dark","@implementation CustomStroker\n\n- (BOOL)isFill\n{\n    return NO;\n}\n\n- (void)stroke:(nonnull IINKPoint *)input\n        count:(NSInteger)count\n        width:(float)width\n        pixelSize:(float)pixelSize\n        output:(nonnull id\u003CIINKIPath>)output\n{\n    [output moveTo:CGPointMake(input[0].x, input[0].y)];\n\n    for (int i = 1; i \u003C count; ++i)\n        [output lineTo:CGPointMake(input[i].x, input[i].y)];\n}\n\n@end\n","objective-c",[639,1263,1264,1275,1279,1293,1297,1307,1311,1315,1342,1356,1369,1381,1401,1405,1434,1438,1473,1493,1497,1502],{"__ignoreMap":613},[971,1265,1266,1269,1272],{"class":973,"line":974},[971,1267,1268],{"class":998},"@",[971,1270,1271],{"class":977},"implementation",[971,1273,1274],{"class":984}," CustomStroker\n",[971,1276,1277],{"class":973,"line":995},[971,1278,1052],{"emptyLinePlaceholder":1051},[971,1280,1281,1284,1287,1290],{"class":973,"line":1002},[971,1282,1283],{"class":1117},"- ",[971,1285,1286],{"class":998},"(",[971,1288,1289],{"class":977},"BOOL",[971,1291,1292],{"class":998},")isFill\n",[971,1294,1295],{"class":973,"line":1011},[971,1296,999],{"class":998},[971,1298,1299,1302,1305],{"class":973,"line":1023},[971,1300,1301],{"class":998},"    return",[971,1303,1304],{"class":1035}," NO",[971,1306,1039],{"class":998},[971,1308,1309],{"class":973,"line":1029},[971,1310,1254],{"class":998},[971,1312,1313],{"class":973,"line":1042},[971,1314,1052],{"emptyLinePlaceholder":1051},[971,1316,1317,1319,1321,1324,1327,1330,1333,1336,1339],{"class":973,"line":1048},[971,1318,1283],{"class":1117},[971,1320,1286],{"class":998},[971,1322,1323],{"class":977},"void",[971,1325,1326],{"class":998},")stroke:(",[971,1328,1329],{"class":977},"nonnull",[971,1331,1332],{"class":1117}," IINKPoint ",[971,1334,1335],{"class":977},"*",[971,1337,1338],{"class":998},")",[971,1340,1341],{"class":1035},"input\n",[971,1343,1344,1347,1351,1353],{"class":973,"line":1055},[971,1345,1346],{"class":998},"        count:(",[971,1348,1350],{"class":1349},"stZ3G","NSInteger",[971,1352,1338],{"class":998},[971,1354,1355],{"class":1035},"count\n",[971,1357,1358,1361,1364,1366],{"class":973,"line":1062},[971,1359,1360],{"class":998},"        width:(",[971,1362,1363],{"class":977},"float",[971,1365,1338],{"class":998},[971,1367,1368],{"class":1035},"width\n",[971,1370,1371,1374,1376,1378],{"class":973,"line":1109},[971,1372,1373],{"class":998},"        pixelSize:(",[971,1375,1363],{"class":977},[971,1377,1338],{"class":998},[971,1379,1380],{"class":1035},"pixelSize\n",[971,1382,1383,1386,1388,1391,1393,1395,1398],{"class":973,"line":1114},[971,1384,1385],{"class":998},"        output:(",[971,1387,1329],{"class":977},[971,1389,1390],{"class":977}," id",[971,1392,1181],{"class":998},[971,1394,653],{"class":1117},[971,1396,1397],{"class":998},">)",[971,1399,1400],{"class":1035},"output\n",[971,1402,1403],{"class":973,"line":1155},[971,1404,999],{"class":998},[971,1406,1407,1410,1413,1416,1418,1420,1422,1425,1427,1429,1431],{"class":973,"line":1200},[971,1408,1409],{"class":998},"    [",[971,1411,1412],{"class":1117},"output ",[971,1414,1415],{"class":998},"moveTo:CGPointMake(",[971,1417,1124],{"class":1117},[971,1419,1127],{"class":998},[971,1421,1130],{"class":1035},[971,1423,1424],{"class":998},"].x, ",[971,1426,1124],{"class":1117},[971,1428,1127],{"class":998},[971,1430,1130],{"class":1035},[971,1432,1433],{"class":998},"].y)];\n",[971,1435,1436],{"class":973,"line":1206},[971,1437,1052],{"emptyLinePlaceholder":1051},[971,1439,1440,1443,1445,1447,1450,1452,1455,1457,1459,1461,1464,1466,1469,1471],{"class":973,"line":1240},[971,1441,1442],{"class":998},"    for",[971,1444,1161],{"class":998},[971,1446,1164],{"class":977},[971,1448,1449],{"class":1117}," i ",[971,1451,1170],{"class":977},[971,1453,1454],{"class":1035}," 1",[971,1456,1176],{"class":998},[971,1458,1449],{"class":1117},[971,1460,1181],{"class":977},[971,1462,1463],{"class":1117}," count",[971,1465,1176],{"class":998},[971,1467,1468],{"class":977}," ++",[971,1470,1219],{"class":1117},[971,1472,1106],{"class":998},[971,1474,1475,1478,1480,1483,1485,1488,1490],{"class":973,"line":1246},[971,1476,1477],{"class":998},"        [",[971,1479,1412],{"class":1117},[971,1481,1482],{"class":998},"lineTo:CGPointMake(",[971,1484,1124],{"class":1117},[971,1486,1487],{"class":998},"[i].x, ",[971,1489,1124],{"class":1117},[971,1491,1492],{"class":998},"[i].y)];\n",[971,1494,1495],{"class":973,"line":1251},[971,1496,1254],{"class":998},[971,1498,1500],{"class":973,"line":1499},19,[971,1501,1052],{"emptyLinePlaceholder":1051},[971,1503,1505,1507],{"class":973,"line":1504},20,[971,1506,1268],{"class":998},[971,1508,1509],{"class":977},"end\n",[631,1511,1512],{"v-slot:cpp":613},[963,1513,1517],{"className":1514,"code":1515,"language":1516,"meta":613,"style":613},"language-cpp shiki shiki-themes blue-hacker-light blue-hacker-light blue-hacker-dark","class CustomStroker : public IStroker\n{\npublic:\n  CustomStroker() {}\n\npublic:\n  virtual bool isFill() const noexcept\n  {\n    return false;\n  }\n\n  virtual void stroke(const std::vector\u003CInkPoint>& input, float width, float pixelSize, std::shared_ptr\u003CIPath> output) noexcept\n  {\n    int count = input.size();\n\n    output->moveTo(input[0].x, input[0].y);\n\n    for(int i = 1; i \u003C count; i++)\n    {\n        output->lineTo(input[i].x,input[i].y);\n    }\n  }\n};\n","cpp",[639,1518,1519,1534,1538,1545,1553,1557,1563,1580,1585,1593,1598,1602,1667,1671,1686,1690,1722,1726,1756,1760,1791,1796,1801],{"__ignoreMap":613},[971,1520,1521,1524,1526,1529,1532],{"class":973,"line":974},[971,1522,1523],{"class":977},"class",[971,1525,985],{"class":984},[971,1527,1528],{"class":998}," :",[971,1530,1531],{"class":977}," public",[971,1533,992],{"class":984},[971,1535,1536],{"class":973,"line":995},[971,1537,999],{"class":998},[971,1539,1540,1542],{"class":973,"line":1002},[971,1541,978],{"class":977},[971,1543,1544],{"class":998},":\n",[971,1546,1547,1550],{"class":973,"line":1011},[971,1548,1549],{"class":998},"  CustomStroker()",[971,1551,1552],{"class":998}," {}\n",[971,1554,1555],{"class":973,"line":1023},[971,1556,1052],{"emptyLinePlaceholder":1051},[971,1558,1559,1561],{"class":973,"line":1029},[971,1560,978],{"class":977},[971,1562,1544],{"class":998},[971,1564,1565,1568,1571,1574,1577],{"class":973,"line":1042},[971,1566,1567],{"class":977},"  virtual",[971,1569,1570],{"class":977}," bool",[971,1572,1573],{"class":998}," isFill()",[971,1575,1576],{"class":977}," const",[971,1578,1579],{"class":977}," noexcept\n",[971,1581,1582],{"class":973,"line":1048},[971,1583,1584],{"class":998},"  {\n",[971,1586,1587,1589,1591],{"class":973,"line":1055},[971,1588,1301],{"class":998},[971,1590,1036],{"class":1035},[971,1592,1039],{"class":998},[971,1594,1595],{"class":973,"line":1062},[971,1596,1597],{"class":998},"  }\n",[971,1599,1600],{"class":973,"line":1109},[971,1601,1052],{"emptyLinePlaceholder":1051},[971,1603,1604,1606,1608,1610,1613,1616,1619,1622,1624,1626,1629,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1655,1657,1659,1661,1663,1665],{"class":973,"line":1114},[971,1605,1567],{"class":977},[971,1607,1067],{"class":977},[971,1609,1070],{"class":998},[971,1611,1612],{"class":977},"const",[971,1614,1615],{"class":984}," std",[971,1617,1618],{"class":998},"::",[971,1620,1621],{"class":984},"vector",[971,1623,1181],{"class":998},[971,1625,1073],{"class":984},[971,1627,1628],{"class":998},">",[971,1630,1631],{"class":977},"&",[971,1633,1079],{"class":1035},[971,1635,1082],{"class":998},[971,1637,1085],{"class":977},[971,1639,1088],{"class":1035},[971,1641,1082],{"class":998},[971,1643,1085],{"class":977},[971,1645,1095],{"class":1035},[971,1647,1082],{"class":998},[971,1649,1615],{"class":984},[971,1651,1618],{"class":998},[971,1653,1654],{"class":984},"shared_ptr",[971,1656,1181],{"class":998},[971,1658,782],{"class":984},[971,1660,1628],{"class":998},[971,1662,1103],{"class":1035},[971,1664,1338],{"class":998},[971,1666,1579],{"class":977},[971,1668,1669],{"class":973,"line":1155},[971,1670,1584],{"class":998},[971,1672,1673,1676,1678,1681,1683],{"class":973,"line":1200},[971,1674,1675],{"class":977},"    int",[971,1677,1463],{"class":1035},[971,1679,1680],{"class":977}," =",[971,1682,1079],{"class":1035},[971,1684,1685],{"class":998},".size();\n",[971,1687,1688],{"class":973,"line":1206},[971,1689,1052],{"emptyLinePlaceholder":1051},[971,1691,1692,1695,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720],{"class":973,"line":1240},[971,1693,1694],{"class":1035},"    output",[971,1696,1697],{"class":998},"->moveTo(",[971,1699,1124],{"class":1035},[971,1701,1127],{"class":998},[971,1703,1130],{"class":1035},[971,1705,1133],{"class":998},[971,1707,1136],{"class":1035},[971,1709,1082],{"class":998},[971,1711,1079],{"class":1035},[971,1713,1127],{"class":998},[971,1715,1130],{"class":1035},[971,1717,1133],{"class":998},[971,1719,1149],{"class":1035},[971,1721,1152],{"class":998},[971,1723,1724],{"class":973,"line":1246},[971,1725,1052],{"emptyLinePlaceholder":1051},[971,1727,1728,1731,1733,1735,1737,1739,1741,1743,1746,1748,1750,1752,1754],{"class":973,"line":1251},[971,1729,1730],{"class":998},"    for(",[971,1732,1164],{"class":977},[971,1734,1167],{"class":1035},[971,1736,1680],{"class":977},[971,1738,1454],{"class":1035},[971,1740,1176],{"class":998},[971,1742,1167],{"class":1035},[971,1744,1745],{"class":977}," \u003C",[971,1747,1463],{"class":1035},[971,1749,1176],{"class":998},[971,1751,1167],{"class":1035},[971,1753,1195],{"class":977},[971,1755,1106],{"class":998},[971,1757,1758],{"class":973,"line":1499},[971,1759,1026],{"class":998},[971,1761,1762,1764,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789],{"class":973,"line":1504},[971,1763,1118],{"class":1035},[971,1765,1766],{"class":998},"->lineTo(",[971,1768,1124],{"class":1035},[971,1770,1127],{"class":998},[971,1772,1219],{"class":1035},[971,1774,1133],{"class":998},[971,1776,1136],{"class":1035},[971,1778,1082],{"class":998},[971,1780,1124],{"class":1035},[971,1782,1127],{"class":998},[971,1784,1219],{"class":1035},[971,1786,1133],{"class":998},[971,1788,1149],{"class":1035},[971,1790,1152],{"class":998},[971,1792,1794],{"class":973,"line":1793},21,[971,1795,1045],{"class":998},[971,1797,1799],{"class":973,"line":1798},22,[971,1800,1597],{"class":998},[971,1802,1804],{"class":973,"line":1803},23,[971,1805,1806],{"class":998},"};\n",[631,1808,1809],{"v-slot:csharp":613},[963,1810,1814],{"className":1811,"code":1812,"language":1813,"meta":613,"style":613},"language-csharp shiki shiki-themes blue-hacker-light blue-hacker-light blue-hacker-dark","public class CustomStroker : IStroker\n{\n    public bool IsFill()\n    {\n        return false;\n    }\n\n    public void Stroke(InkPoint[] input, float width, float pixelSize, IPath output)\n    {\n        int count = input.Length;\n        output.MoveTo(input[0].X, input[0].Y);\n        for (int i = 1; i \u003C count; i++)\n        {\n            output.LineTo(input[i].X, input[i].Y);\n        }\n    }\n}\n","csharp",[639,1815,1816,1828,1832,1841,1845,1853,1857,1861,1896,1900,1918,1951,1981,1985,2016,2020,2024],{"__ignoreMap":613},[971,1817,1818,1820,1822,1824,1826],{"class":973,"line":974},[971,1819,978],{"class":977},[971,1821,981],{"class":977},[971,1823,985],{"class":984},[971,1825,1528],{"class":998},[971,1827,992],{"class":984},[971,1829,1830],{"class":973,"line":995},[971,1831,999],{"class":998},[971,1833,1834,1836,1838],{"class":973,"line":1002},[971,1835,1014],{"class":977},[971,1837,1570],{"class":977},[971,1839,1840],{"class":998}," IsFill()\n",[971,1842,1843],{"class":973,"line":1011},[971,1844,1026],{"class":998},[971,1846,1847,1849,1851],{"class":973,"line":1023},[971,1848,1032],{"class":998},[971,1850,1036],{"class":1035},[971,1852,1039],{"class":998},[971,1854,1855],{"class":973,"line":1029},[971,1856,1045],{"class":998},[971,1858,1859],{"class":973,"line":1042},[971,1860,1052],{"emptyLinePlaceholder":1051},[971,1862,1863,1865,1867,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894],{"class":973,"line":1048},[971,1864,1014],{"class":977},[971,1866,1067],{"class":977},[971,1868,1869],{"class":998}," Stroke(",[971,1871,1073],{"class":984},[971,1873,1076],{"class":998},[971,1875,1079],{"class":984},[971,1877,1082],{"class":998},[971,1879,1085],{"class":977},[971,1881,1088],{"class":984},[971,1883,1082],{"class":998},[971,1885,1085],{"class":977},[971,1887,1095],{"class":984},[971,1889,1082],{"class":998},[971,1891,1100],{"class":984},[971,1893,1103],{"class":984},[971,1895,1106],{"class":998},[971,1897,1898],{"class":973,"line":1055},[971,1899,1026],{"class":998},[971,1901,1902,1905,1907,1909,1911,1913,1916],{"class":973,"line":1062},[971,1903,1904],{"class":977},"        int",[971,1906,1463],{"class":984},[971,1908,1680],{"class":977},[971,1910,1079],{"class":1117},[971,1912,571],{"class":998},[971,1914,1915],{"class":1117},"Length",[971,1917,1039],{"class":998},[971,1919,1920,1922,1925,1927,1929,1931,1933,1936,1938,1940,1942,1944,1946,1949],{"class":973,"line":1109},[971,1921,1118],{"class":1117},[971,1923,1924],{"class":998},".MoveTo(",[971,1926,1124],{"class":1117},[971,1928,1127],{"class":998},[971,1930,1130],{"class":1035},[971,1932,1133],{"class":998},[971,1934,1935],{"class":1117},"X",[971,1937,1082],{"class":998},[971,1939,1079],{"class":1117},[971,1941,1127],{"class":998},[971,1943,1130],{"class":1035},[971,1945,1133],{"class":998},[971,1947,1948],{"class":1117},"Y",[971,1950,1152],{"class":998},[971,1952,1953,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979],{"class":973,"line":1114},[971,1954,1158],{"class":998},[971,1956,1161],{"class":998},[971,1958,1164],{"class":977},[971,1960,1167],{"class":984},[971,1962,1680],{"class":977},[971,1964,1454],{"class":1035},[971,1966,1176],{"class":998},[971,1968,1449],{"class":1117},[971,1970,1181],{"class":977},[971,1972,1463],{"class":1117},[971,1974,1176],{"class":998},[971,1976,1167],{"class":1117},[971,1978,1195],{"class":977},[971,1980,1106],{"class":998},[971,1982,1983],{"class":973,"line":1155},[971,1984,1203],{"class":998},[971,1986,1987,1989,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014],{"class":973,"line":1200},[971,1988,1209],{"class":1117},[971,1990,1991],{"class":998},".LineTo(",[971,1993,1124],{"class":1117},[971,1995,1127],{"class":998},[971,1997,1219],{"class":1117},[971,1999,1133],{"class":998},[971,2001,1935],{"class":1117},[971,2003,1082],{"class":998},[971,2005,1079],{"class":1117},[971,2007,1127],{"class":998},[971,2009,1219],{"class":1117},[971,2011,1133],{"class":998},[971,2013,1948],{"class":1117},[971,2015,1152],{"class":998},[971,2017,2018],{"class":973,"line":1206},[971,2019,1243],{"class":998},[971,2021,2022],{"class":973,"line":1240},[971,2023,1045],{"class":998},[971,2025,2026],{"class":973,"line":1246},[971,2027,1254],{"class":998},[505,2029,2030,2031,2033],{},"Here, the code uses the fact that a non-filled, non-closed path will be stroked by iink SDK to simplify the code. In most cases, however, you will want to\nmanage closed paths to create a beautiful shape for the stroke. The ",[639,2032,1073],{}," structure contains all required information about the points of the stroke.",[505,2035,2036],{},"Now, let's implement the custom stroker factory:",[628,2038,2039,2102,2170,2260],{},[631,2040,2041],{"v-slot:java":613},[963,2042,2044],{"className":965,"code":2043,"language":967,"meta":613,"style":613},"public class CustomStrokerFactory implements IStrokerFactory\n{\n    @Override\n    public IStroker createStroker()\n    {\n        return new CustomStroker();\n    }\n}\n",[639,2045,2046,2060,2064,2070,2080,2084,2094,2098],{"__ignoreMap":613},[971,2047,2048,2050,2052,2055,2057],{"class":973,"line":974},[971,2049,978],{"class":977},[971,2051,981],{"class":977},[971,2053,2054],{"class":984}," CustomStrokerFactory",[971,2056,988],{"class":977},[971,2058,2059],{"class":991}," IStrokerFactory\n",[971,2061,2062],{"class":973,"line":995},[971,2063,999],{"class":998},[971,2065,2066,2068],{"class":973,"line":1002},[971,2067,1005],{"class":998},[971,2069,1008],{"class":977},[971,2071,2072,2074,2077],{"class":973,"line":1011},[971,2073,1014],{"class":977},[971,2075,2076],{"class":977}," IStroker",[971,2078,2079],{"class":998}," createStroker()\n",[971,2081,2082],{"class":973,"line":1023},[971,2083,1026],{"class":998},[971,2085,2086,2088,2091],{"class":973,"line":1029},[971,2087,1032],{"class":998},[971,2089,2090],{"class":998}," new",[971,2092,2093],{"class":998}," CustomStroker();\n",[971,2095,2096],{"class":973,"line":1042},[971,2097,1045],{"class":998},[971,2099,2100],{"class":973,"line":1048},[971,2101,1254],{"class":1117},[631,2103,2104],{"v-slot:swift":613},[963,2105,2107],{"className":1259,"code":2106,"language":1261,"meta":613,"style":613},"@implementation CustomStrokerFactory\n\n- (nonnull id\u003CIINKIStroker>)createStroker\n{\n    return [CustomStroker alloc];\n}\n\n@end\n",[639,2108,2109,2118,2122,2139,2143,2156,2160,2164],{"__ignoreMap":613},[971,2110,2111,2113,2115],{"class":973,"line":974},[971,2112,1268],{"class":998},[971,2114,1271],{"class":977},[971,2116,2117],{"class":984}," CustomStrokerFactory\n",[971,2119,2120],{"class":973,"line":995},[971,2121,1052],{"emptyLinePlaceholder":1051},[971,2123,2124,2126,2128,2130,2132,2134,2136],{"class":973,"line":1002},[971,2125,1283],{"class":1117},[971,2127,1286],{"class":998},[971,2129,1329],{"class":977},[971,2131,1390],{"class":977},[971,2133,1181],{"class":998},[971,2135,641],{"class":1117},[971,2137,2138],{"class":998},">)createStroker\n",[971,2140,2141],{"class":973,"line":1011},[971,2142,999],{"class":998},[971,2144,2145,2147,2150,2153],{"class":973,"line":1023},[971,2146,1301],{"class":998},[971,2148,2149],{"class":998}," [",[971,2151,2152],{"class":1117},"CustomStroker ",[971,2154,2155],{"class":998},"alloc];\n",[971,2157,2158],{"class":973,"line":1029},[971,2159,1254],{"class":998},[971,2161,2162],{"class":973,"line":1042},[971,2163,1052],{"emptyLinePlaceholder":1051},[971,2165,2166,2168],{"class":973,"line":1048},[971,2167,1268],{"class":998},[971,2169,1509],{"class":977},[631,2171,2172],{"v-slot:cpp":613},[963,2173,2175],{"className":1514,"code":2174,"language":1516,"meta":613,"style":613},"class CustomStrokerFactory : public IStrokerFactory\n{\npublic:\n  CustomStrokerFactory() {}\n\npublic:\n  virtual std::shared_ptr\u003CIStroker> createStroker() {\n    return std::make_shared\u003CCustomStroker>();\n  }\n};\n",[639,2176,2177,2189,2193,2199,2206,2210,2216,2238,2252,2256],{"__ignoreMap":613},[971,2178,2179,2181,2183,2185,2187],{"class":973,"line":974},[971,2180,1523],{"class":977},[971,2182,2054],{"class":984},[971,2184,1528],{"class":998},[971,2186,1531],{"class":977},[971,2188,2059],{"class":984},[971,2190,2191],{"class":973,"line":995},[971,2192,999],{"class":998},[971,2194,2195,2197],{"class":973,"line":1002},[971,2196,978],{"class":977},[971,2198,1544],{"class":998},[971,2200,2201,2204],{"class":973,"line":1011},[971,2202,2203],{"class":998},"  CustomStrokerFactory()",[971,2205,1552],{"class":998},[971,2207,2208],{"class":973,"line":1023},[971,2209,1052],{"emptyLinePlaceholder":1051},[971,2211,2212,2214],{"class":973,"line":1029},[971,2213,978],{"class":977},[971,2215,1544],{"class":998},[971,2217,2218,2220,2222,2224,2226,2228,2230,2232,2235],{"class":973,"line":1042},[971,2219,1567],{"class":977},[971,2221,1615],{"class":984},[971,2223,1618],{"class":998},[971,2225,1654],{"class":984},[971,2227,1181],{"class":998},[971,2229,770],{"class":984},[971,2231,1628],{"class":998},[971,2233,2234],{"class":998}," createStroker()",[971,2236,2237],{"class":998}," {\n",[971,2239,2240,2242,2244,2247,2249],{"class":973,"line":1048},[971,2241,1301],{"class":998},[971,2243,1615],{"class":984},[971,2245,2246],{"class":998},"::make_shared\u003C",[971,2248,956],{"class":984},[971,2250,2251],{"class":998},">();\n",[971,2253,2254],{"class":973,"line":1055},[971,2255,1597],{"class":998},[971,2257,2258],{"class":973,"line":1062},[971,2259,1806],{"class":998},[631,2261,2262],{"v-slot:csharp":613},[963,2263,2265],{"className":1811,"code":2264,"language":1813,"meta":613,"style":613},"public class CustomStrokerFactory : IStrokerFactory\n{\n    public IStroker CreateStroker()\n    {\n    return new CustomStroker();\n    }\n}\n",[639,2266,2267,2279,2283,2292,2296,2307,2311],{"__ignoreMap":613},[971,2268,2269,2271,2273,2275,2277],{"class":973,"line":974},[971,2270,978],{"class":977},[971,2272,981],{"class":977},[971,2274,2054],{"class":984},[971,2276,1528],{"class":998},[971,2278,2059],{"class":984},[971,2280,2281],{"class":973,"line":995},[971,2282,999],{"class":998},[971,2284,2285,2287,2289],{"class":973,"line":1002},[971,2286,1014],{"class":977},[971,2288,2076],{"class":984},[971,2290,2291],{"class":998}," CreateStroker()\n",[971,2293,2294],{"class":973,"line":1011},[971,2295,1026],{"class":998},[971,2297,2298,2300,2302,2304],{"class":973,"line":1023},[971,2299,1301],{"class":998},[971,2301,2090],{"class":977},[971,2303,985],{"class":984},[971,2305,2306],{"class":998},"();\n",[971,2308,2309],{"class":973,"line":1029},[971,2310,1045],{"class":998},[971,2312,2313],{"class":973,"line":1042},[971,2314,1254],{"class":998},[505,2316,2317,2318,2321],{},"All you have to do now is to instantiate your factory and register it to the ",[567,2319,2320],{"href":433},"renderer"," with an appropriate brush name:",[628,2323,2324,2368,2431,2472],{},[631,2325,2326],{"v-slot:java":613},[963,2327,2329],{"className":965,"code":2328,"language":967,"meta":613,"style":613},"CustomStrokerFactory strokerFactory = new CustomStrokerFactory();\nrenderer.registerStroker(\"LineToBrush\", strokerFactory);\n",[639,2330,2331,2346],{"__ignoreMap":613},[971,2332,2333,2336,2339,2341,2343],{"class":973,"line":974},[971,2334,2335],{"class":977},"CustomStrokerFactory",[971,2337,2338],{"class":1117}," strokerFactory ",[971,2340,1170],{"class":977},[971,2342,2090],{"class":998},[971,2344,2345],{"class":998}," CustomStrokerFactory();\n",[971,2347,2348,2350,2353,2356,2359,2361,2363,2366],{"class":973,"line":995},[971,2349,2320],{"class":1117},[971,2351,2352],{"class":998},".registerStroker(",[971,2354,2355],{"class":998},"\"",[971,2357,2358],{"class":991},"LineToBrush",[971,2360,2355],{"class":998},[971,2362,1082],{"class":998},[971,2364,2365],{"class":1117}," strokerFactory",[971,2367,1152],{"class":998},[631,2369,2370],{"v-slot:swift":613},[963,2371,2373],{"className":1259,"code":2372,"language":1261,"meta":613,"style":613},"self.customStrokerFactory = [CustomStrokerFactory alloc];\nself.editor.renderer registerStroker:@\"LineToBrush\"\n                        factory:self.customStrokerFactory\n                        error:nil];\n",[639,2374,2375,2393,2408,2418],{"__ignoreMap":613},[971,2376,2377,2381,2384,2386,2388,2391],{"class":973,"line":974},[971,2378,2380],{"class":2379},"sYWwX","self",[971,2382,2383],{"class":1117},".customStrokerFactory ",[971,2385,1170],{"class":977},[971,2387,2149],{"class":998},[971,2389,2390],{"class":1117},"CustomStrokerFactory ",[971,2392,2155],{"class":998},[971,2394,2395,2397,2400,2403,2405],{"class":973,"line":995},[971,2396,2380],{"class":2379},[971,2398,2399],{"class":1117},".editor.renderer registerStroker:",[971,2401,2402],{"class":998},"@\"",[971,2404,2358],{"class":991},[971,2406,2407],{"class":998},"\"\n",[971,2409,2410,2413,2415],{"class":973,"line":1002},[971,2411,2412],{"class":1117},"                        factory:",[971,2414,2380],{"class":2379},[971,2416,2417],{"class":1117},".customStrokerFactory\n",[971,2419,2420,2423,2426,2429],{"class":973,"line":1011},[971,2421,2422],{"class":1117},"                        error:",[971,2424,2425],{"class":1035},"nil",[971,2427,2428],{"class":1117},"]",[971,2430,1039],{"class":998},[631,2432,2433],{"v-slot:cpp":613},[963,2434,2436],{"className":1514,"code":2435,"language":1516,"meta":613,"style":613},"CustomStrokerFactory strokerFactory = std::make_shared\u003CCustomStrokerFactory>();\nrenderer->registerStroker(\"LineToBrush\", strokerFactory);\n",[639,2437,2438,2453],{"__ignoreMap":613},[971,2439,2440,2443,2445,2447,2449,2451],{"class":973,"line":974},[971,2441,2442],{"class":1117},"CustomStrokerFactory strokerFactory ",[971,2444,1170],{"class":977},[971,2446,1615],{"class":984},[971,2448,2246],{"class":998},[971,2450,2335],{"class":984},[971,2452,2251],{"class":998},[971,2454,2455,2457,2460,2462,2464,2466,2468,2470],{"class":973,"line":995},[971,2456,2320],{"class":1117},[971,2458,2459],{"class":998},"->registerStroker(",[971,2461,2355],{"class":998},[971,2463,2358],{"class":991},[971,2465,2355],{"class":998},[971,2467,1082],{"class":998},[971,2469,2365],{"class":1117},[971,2471,1152],{"class":998},[631,2473,2474],{"v-slot:csharp":613},[963,2475,2477],{"className":1811,"code":2476,"language":1813,"meta":613,"style":613},"var customStrokerFactory = new CustomStrokerFactory();\nrenderer.RegisterStroker(\"LineToBrush\", customStrokerFactory);\n",[639,2478,2479,2495],{"__ignoreMap":613},[971,2480,2481,2484,2487,2489,2491,2493],{"class":973,"line":974},[971,2482,2483],{"class":977},"var",[971,2485,2486],{"class":984}," customStrokerFactory",[971,2488,1680],{"class":977},[971,2490,2090],{"class":977},[971,2492,2054],{"class":984},[971,2494,2306],{"class":998},[971,2496,2497,2499,2502,2504,2506,2508,2510,2512],{"class":973,"line":995},[971,2498,2320],{"class":1117},[971,2500,2501],{"class":998},".RegisterStroker(",[971,2503,2355],{"class":998},[971,2505,2358],{"class":991},[971,2507,2355],{"class":998},[971,2509,1082],{"class":998},[971,2511,2486],{"class":1117},[971,2513,1152],{"class":998},[505,2515,2516,2517,2520],{},"Finally, you can set the stroker in the theme of the ",[567,2518,2519],{"href":437},"editor",":",[628,2522,2523,2546,2571,2593],{},[631,2524,2525],{"v-slot:java":613},[963,2526,2528],{"className":965,"code":2527,"language":967,"meta":613,"style":613},"editor.setTheme(\"stroke { -myscript-pen-brush: LineToBrush; }\");\n",[639,2529,2530],{"__ignoreMap":613},[971,2531,2532,2534,2537,2539,2542,2544],{"class":973,"line":974},[971,2533,2519],{"class":1117},[971,2535,2536],{"class":998},".setTheme(",[971,2538,2355],{"class":998},[971,2540,2541],{"class":991},"stroke { -myscript-pen-brush: LineToBrush; }",[971,2543,2355],{"class":998},[971,2545,1152],{"class":998},[631,2547,2548],{"v-slot:swift":613},[963,2549,2551],{"className":1259,"code":2550,"language":1261,"meta":613,"style":613},"self.editor.theme = @\"stroke { -myscript-pen-brush: LineToBrush; }\";\n",[639,2552,2553],{"__ignoreMap":613},[971,2554,2555,2557,2560,2562,2565,2567,2569],{"class":973,"line":974},[971,2556,2380],{"class":2379},[971,2558,2559],{"class":1117},".editor.theme ",[971,2561,1170],{"class":977},[971,2563,2564],{"class":998}," @\"",[971,2566,2541],{"class":991},[971,2568,2355],{"class":998},[971,2570,1039],{"class":998},[631,2572,2573],{"v-slot:cpp":613},[963,2574,2576],{"className":1514,"code":2575,"language":1516,"meta":613,"style":613},"editor->setTheme(\"stroke { -myscript-pen-brush: LineToBrush; }\");\n",[639,2577,2578],{"__ignoreMap":613},[971,2579,2580,2582,2585,2587,2589,2591],{"class":973,"line":974},[971,2581,2519],{"class":1117},[971,2583,2584],{"class":998},"->setTheme(",[971,2586,2355],{"class":998},[971,2588,2541],{"class":991},[971,2590,2355],{"class":998},[971,2592,1152],{"class":998},[631,2594,2595],{"v-slot:csharp":613},[963,2596,2598],{"className":1811,"code":2597,"language":1813,"meta":613,"style":613},"editor.Theme=\"stroke { -myscript-pen-brush: LineToBrush; }\";\n",[639,2599,2600],{"__ignoreMap":613},[971,2601,2602,2604,2606,2609,2611,2613,2615,2617],{"class":973,"line":974},[971,2603,2519],{"class":1117},[971,2605,571],{"class":998},[971,2607,2608],{"class":1117},"Theme",[971,2610,1170],{"class":977},[971,2612,2355],{"class":998},[971,2614,2541],{"class":991},[971,2616,2355],{"class":998},[971,2618,1039],{"class":998},[505,2620,2621],{},"That's it! From now on, iink SDK will rely on your custom stroker to render ink strokes!",[947,2623,2625],{"id":2624},"custom-drawing-of-the-strokes","Custom drawing of the strokes",[505,2627,2628,2629,2632,2633,2637],{},"First, implement a custom stroker ",[567,2630,2631],{"href":569},"as described above"," to generate the paths. ",[567,2634,2636],{"href":2635},"#requirements-from-iink-sdk","As explained",", iink SDK requires the stroke envelopes for a variety of tasks even if you draw the strokes by yourself.",[628,2639,2640,2648],{},[631,2641,2642],{"v-slot:swift":613},[505,2643,2644,2645,2647],{},"Next, create your own implementation of ",[639,2646,653],{},"\n(you can modify or subclass the one provided by MyScript) so that you can use it to store information like point coordinates, pressure, etc. that you will need to render your stroke later. Via its internal cache, iink SDK will preserve this information for you and properly free the memory if the strokes are removed from the model.",[505,2649,2644,2650,2647],{},[639,2651,782],{},[505,2653,2654,2655,2658],{},"Here is a possible implementation, based on the ",[639,2656,2657],{},"Path"," class from the UI reference implementation:",[628,2660,2661,2865,3074,3153],{},[631,2662,2663],{"v-slot:java":613},[963,2664,2666],{"className":965,"code":2665,"language":967,"meta":613,"style":613},"public class CustomPath extends Path\n{\n    private InkPoint[] inkPoints;\n    private float width;\n\n    public float getWidth()\n    {\n        return width;\n    }\n\n    public void setWidth(float width)\n    {\n        this.width = width;\n    }\n\n    public InkPoint[] getInkPoints()\n    {\n        return inkPoints;\n    }\n\n    public void setInkPoints(InkPoint[] inkPoints)\n    {\n        this.inkPoints = inkPoints;\n    }\n}\n",[639,2667,2668,2683,2687,2702,2712,2716,2725,2729,2737,2741,2745,2760,2764,2780,2784,2788,2799,2803,2811,2815,2819,2836,2840,2855,2860],{"__ignoreMap":613},[971,2669,2670,2672,2674,2677,2680],{"class":973,"line":974},[971,2671,978],{"class":977},[971,2673,981],{"class":977},[971,2675,2676],{"class":984}," CustomPath",[971,2678,2679],{"class":977}," extends",[971,2681,2682],{"class":991}," Path\n",[971,2684,2685],{"class":973,"line":995},[971,2686,999],{"class":998},[971,2688,2689,2692,2695,2697,2700],{"class":973,"line":1002},[971,2690,2691],{"class":977},"    private",[971,2693,2694],{"class":977}," InkPoint",[971,2696,1076],{"class":998},[971,2698,2699],{"class":1117}," inkPoints",[971,2701,1039],{"class":998},[971,2703,2704,2706,2708,2710],{"class":973,"line":1011},[971,2705,2691],{"class":977},[971,2707,1085],{"class":977},[971,2709,1088],{"class":1117},[971,2711,1039],{"class":998},[971,2713,2714],{"class":973,"line":1023},[971,2715,1052],{"emptyLinePlaceholder":1051},[971,2717,2718,2720,2722],{"class":973,"line":1029},[971,2719,1014],{"class":977},[971,2721,1085],{"class":977},[971,2723,2724],{"class":998}," getWidth()\n",[971,2726,2727],{"class":973,"line":1042},[971,2728,1026],{"class":998},[971,2730,2731,2733,2735],{"class":973,"line":1048},[971,2732,1032],{"class":998},[971,2734,1088],{"class":1117},[971,2736,1039],{"class":998},[971,2738,2739],{"class":973,"line":1055},[971,2740,1045],{"class":998},[971,2742,2743],{"class":973,"line":1062},[971,2744,1052],{"emptyLinePlaceholder":1051},[971,2746,2747,2749,2751,2754,2756,2758],{"class":973,"line":1109},[971,2748,1014],{"class":977},[971,2750,1067],{"class":977},[971,2752,2753],{"class":998}," setWidth(",[971,2755,1363],{"class":977},[971,2757,1088],{"class":1035},[971,2759,1106],{"class":998},[971,2761,2762],{"class":973,"line":1114},[971,2763,1026],{"class":998},[971,2765,2766,2769,2771,2774,2776,2778],{"class":973,"line":1155},[971,2767,2768],{"class":2379},"        this",[971,2770,571],{"class":998},[971,2772,2773],{"class":1117},"width ",[971,2775,1170],{"class":977},[971,2777,1088],{"class":1117},[971,2779,1039],{"class":998},[971,2781,2782],{"class":973,"line":1200},[971,2783,1045],{"class":998},[971,2785,2786],{"class":973,"line":1206},[971,2787,1052],{"emptyLinePlaceholder":1051},[971,2789,2790,2792,2794,2796],{"class":973,"line":1240},[971,2791,1014],{"class":977},[971,2793,2694],{"class":977},[971,2795,1076],{"class":998},[971,2797,2798],{"class":998}," getInkPoints()\n",[971,2800,2801],{"class":973,"line":1246},[971,2802,1026],{"class":998},[971,2804,2805,2807,2809],{"class":973,"line":1251},[971,2806,1032],{"class":998},[971,2808,2699],{"class":1117},[971,2810,1039],{"class":998},[971,2812,2813],{"class":973,"line":1499},[971,2814,1045],{"class":998},[971,2816,2817],{"class":973,"line":1504},[971,2818,1052],{"emptyLinePlaceholder":1051},[971,2820,2821,2823,2825,2828,2830,2832,2834],{"class":973,"line":1793},[971,2822,1014],{"class":977},[971,2824,1067],{"class":977},[971,2826,2827],{"class":998}," setInkPoints(",[971,2829,1073],{"class":977},[971,2831,1076],{"class":998},[971,2833,2699],{"class":1035},[971,2835,1106],{"class":998},[971,2837,2838],{"class":973,"line":1798},[971,2839,1026],{"class":998},[971,2841,2842,2844,2846,2849,2851,2853],{"class":973,"line":1803},[971,2843,2768],{"class":2379},[971,2845,571],{"class":998},[971,2847,2848],{"class":1117},"inkPoints ",[971,2850,1170],{"class":977},[971,2852,2699],{"class":1117},[971,2854,1039],{"class":998},[971,2856,2858],{"class":973,"line":2857},24,[971,2859,1045],{"class":998},[971,2861,2863],{"class":973,"line":2862},25,[971,2864,1254],{"class":1117},[631,2866,2867],{"v-slot:swift":613},[963,2868,2870],{"className":1259,"code":2869,"language":1261,"meta":613,"style":613},"@interface Path ()\n\n@end\n\n@implementation CustomPath\n\n- (float)getWidth{\n  return self.width;\n}\n\n- (void)setWidth:(float)width\n{\n  _width = width;\n}\n\n- (void)setInkPoints:(IINKPoint *)inkPoints\n{\n  _inkPoints = inkPoints;\n}\n\n- (IINKPoint *)getInkPoints\n{\n  return self.inkPoints;\n}\n\n@end\n",[639,2871,2872,2885,2889,2895,2899,2908,2912,2923,2937,2941,2945,2962,2966,2977,2981,2985,3006,3010,3021,3025,3029,3042,3046,3059,3063,3067],{"__ignoreMap":613},[971,2873,2874,2876,2879,2882],{"class":973,"line":974},[971,2875,1268],{"class":998},[971,2877,2878],{"class":977},"interface",[971,2880,2881],{"class":984}," Path",[971,2883,2884],{"class":998}," ()\n",[971,2886,2887],{"class":973,"line":995},[971,2888,1052],{"emptyLinePlaceholder":1051},[971,2890,2891,2893],{"class":973,"line":1002},[971,2892,1268],{"class":998},[971,2894,1509],{"class":977},[971,2896,2897],{"class":973,"line":1011},[971,2898,1052],{"emptyLinePlaceholder":1051},[971,2900,2901,2903,2905],{"class":973,"line":1023},[971,2902,1268],{"class":998},[971,2904,1271],{"class":977},[971,2906,2907],{"class":984}," CustomPath\n",[971,2909,2910],{"class":973,"line":1029},[971,2911,1052],{"emptyLinePlaceholder":1051},[971,2913,2914,2916,2918,2920],{"class":973,"line":1042},[971,2915,1283],{"class":1117},[971,2917,1286],{"class":998},[971,2919,1363],{"class":977},[971,2921,2922],{"class":998},")getWidth{\n",[971,2924,2925,2928,2931,2933,2935],{"class":973,"line":1048},[971,2926,2927],{"class":998},"  return",[971,2929,2930],{"class":2379}," self",[971,2932,571],{"class":998},[971,2934,756],{"class":1035},[971,2936,1039],{"class":998},[971,2938,2939],{"class":973,"line":1055},[971,2940,1254],{"class":998},[971,2942,2943],{"class":973,"line":1062},[971,2944,1052],{"emptyLinePlaceholder":1051},[971,2946,2947,2949,2951,2953,2956,2958,2960],{"class":973,"line":1109},[971,2948,1283],{"class":1117},[971,2950,1286],{"class":998},[971,2952,1323],{"class":977},[971,2954,2955],{"class":998},")setWidth:(",[971,2957,1363],{"class":977},[971,2959,1338],{"class":998},[971,2961,1368],{"class":1035},[971,2963,2964],{"class":973,"line":1114},[971,2965,999],{"class":998},[971,2967,2968,2971,2973,2975],{"class":973,"line":1155},[971,2969,2970],{"class":1117},"  _width ",[971,2972,1170],{"class":977},[971,2974,1088],{"class":1117},[971,2976,1039],{"class":998},[971,2978,2979],{"class":973,"line":1200},[971,2980,1254],{"class":998},[971,2982,2983],{"class":973,"line":1206},[971,2984,1052],{"emptyLinePlaceholder":1051},[971,2986,2987,2989,2991,2993,2996,2999,3001,3003],{"class":973,"line":1240},[971,2988,1283],{"class":1117},[971,2990,1286],{"class":998},[971,2992,1323],{"class":977},[971,2994,2995],{"class":998},")setInkPoints:(",[971,2997,2998],{"class":1117},"IINKPoint ",[971,3000,1335],{"class":977},[971,3002,1338],{"class":998},[971,3004,3005],{"class":1035},"inkPoints\n",[971,3007,3008],{"class":973,"line":1246},[971,3009,999],{"class":998},[971,3011,3012,3015,3017,3019],{"class":973,"line":1251},[971,3013,3014],{"class":1117},"  _inkPoints ",[971,3016,1170],{"class":977},[971,3018,2699],{"class":1117},[971,3020,1039],{"class":998},[971,3022,3023],{"class":973,"line":1499},[971,3024,1254],{"class":998},[971,3026,3027],{"class":973,"line":1504},[971,3028,1052],{"emptyLinePlaceholder":1051},[971,3030,3031,3033,3035,3037,3039],{"class":973,"line":1793},[971,3032,1283],{"class":1117},[971,3034,1286],{"class":998},[971,3036,2998],{"class":1117},[971,3038,1335],{"class":977},[971,3040,3041],{"class":998},")getInkPoints\n",[971,3043,3044],{"class":973,"line":1798},[971,3045,999],{"class":998},[971,3047,3048,3050,3052,3054,3057],{"class":973,"line":1803},[971,3049,2927],{"class":998},[971,3051,2930],{"class":2379},[971,3053,571],{"class":998},[971,3055,3056],{"class":1035},"inkPoints",[971,3058,1039],{"class":998},[971,3060,3061],{"class":973,"line":2857},[971,3062,1254],{"class":998},[971,3064,3065],{"class":973,"line":2862},[971,3066,1052],{"emptyLinePlaceholder":1051},[971,3068,3070,3072],{"class":973,"line":3069},26,[971,3071,1268],{"class":998},[971,3073,1509],{"class":977},[631,3075,3076],{"v-slot:cpp":613},[963,3077,3079],{"className":1514,"code":3078,"language":1516,"meta":613,"style":613},"class CustomPath : public Path\n{\npublic:\n  CustomPath() {}\n\npublic:\n  std::vector\u003CInkPoint> points;\n  float width;\n};\n",[639,3080,3081,3093,3097,3103,3110,3114,3120,3140,3149],{"__ignoreMap":613},[971,3082,3083,3085,3087,3089,3091],{"class":973,"line":974},[971,3084,1523],{"class":977},[971,3086,2676],{"class":984},[971,3088,1528],{"class":998},[971,3090,1531],{"class":977},[971,3092,2682],{"class":984},[971,3094,3095],{"class":973,"line":995},[971,3096,999],{"class":998},[971,3098,3099,3101],{"class":973,"line":1002},[971,3100,978],{"class":977},[971,3102,1544],{"class":998},[971,3104,3105,3108],{"class":973,"line":1011},[971,3106,3107],{"class":998},"  CustomPath()",[971,3109,1552],{"class":998},[971,3111,3112],{"class":973,"line":1023},[971,3113,1052],{"emptyLinePlaceholder":1051},[971,3115,3116,3118],{"class":973,"line":1029},[971,3117,978],{"class":977},[971,3119,1544],{"class":998},[971,3121,3122,3125,3127,3129,3131,3133,3135,3138],{"class":973,"line":1042},[971,3123,3124],{"class":984},"  std",[971,3126,1618],{"class":998},[971,3128,1621],{"class":984},[971,3130,1181],{"class":998},[971,3132,1073],{"class":984},[971,3134,1628],{"class":998},[971,3136,3137],{"class":1035}," points",[971,3139,1039],{"class":998},[971,3141,3142,3145,3147],{"class":973,"line":1048},[971,3143,3144],{"class":977},"  float",[971,3146,1088],{"class":1035},[971,3148,1039],{"class":998},[971,3150,3151],{"class":973,"line":1055},[971,3152,1806],{"class":998},[631,3154,3155],{"v-slot:csharp":613},[963,3156,3158],{"className":1811,"code":3157,"language":1813,"meta":613,"style":613},"public class CustomPath : Path\n{\n    public float _width { get; set; }\n    public InkPoint[] InkPoints { get; set; }\n\n    public CustomPath(CanvasDevice device) : base(device)\n    {\n    }\n};\n",[639,3159,3160,3172,3176,3201,3224,3228,3255,3259,3263],{"__ignoreMap":613},[971,3161,3162,3164,3166,3168,3170],{"class":973,"line":974},[971,3163,978],{"class":977},[971,3165,981],{"class":977},[971,3167,2676],{"class":984},[971,3169,1528],{"class":998},[971,3171,2682],{"class":984},[971,3173,3174],{"class":973,"line":995},[971,3175,999],{"class":998},[971,3177,3178,3180,3182,3185,3188,3191,3193,3196,3198],{"class":973,"line":1002},[971,3179,1014],{"class":977},[971,3181,1085],{"class":977},[971,3183,3184],{"class":984}," _width",[971,3186,3187],{"class":998}," {",[971,3189,3190],{"class":977}," get",[971,3192,1176],{"class":998},[971,3194,3195],{"class":977}," set",[971,3197,1176],{"class":998},[971,3199,3200],{"class":998}," }\n",[971,3202,3203,3205,3207,3209,3212,3214,3216,3218,3220,3222],{"class":973,"line":1011},[971,3204,1014],{"class":977},[971,3206,2694],{"class":984},[971,3208,1076],{"class":998},[971,3210,3211],{"class":984}," InkPoints",[971,3213,3187],{"class":998},[971,3215,3190],{"class":977},[971,3217,1176],{"class":998},[971,3219,3195],{"class":977},[971,3221,1176],{"class":998},[971,3223,3200],{"class":998},[971,3225,3226],{"class":973,"line":1023},[971,3227,1052],{"emptyLinePlaceholder":1051},[971,3229,3230,3232,3235,3238,3241,3243,3245,3248,3250,3253],{"class":973,"line":1029},[971,3231,1014],{"class":977},[971,3233,3234],{"class":998}," CustomPath(",[971,3236,3237],{"class":984},"CanvasDevice",[971,3239,3240],{"class":984}," device",[971,3242,1338],{"class":998},[971,3244,1528],{"class":998},[971,3246,3247],{"class":2379}," base",[971,3249,1286],{"class":998},[971,3251,3252],{"class":1117},"device",[971,3254,1106],{"class":998},[971,3256,3257],{"class":973,"line":1042},[971,3258,1026],{"class":998},[971,3260,3261],{"class":973,"line":1048},[971,3262,1045],{"class":998},[971,3264,3265],{"class":973,"line":1055},[971,3266,1806],{"class":998},[505,3268,3269],{},"You can now update your custom stroker implementation to store the information into the path:",[628,3271,3272,3360,3494,3637],{},[631,3273,3274],{"v-slot:java":613},[963,3275,3277],{"className":965,"code":3276,"language":967,"meta":613,"style":613},"public void stroke(InkPoint[] inkPoints, float width, float pixelSize, IPath output)\n{\n    CustomPath customPath = (CustomPath)output;\n    customPath.setInkPoints(inkPoints);\n    customPath.setWidth(width);\n}\n",[639,3278,3279,3307,3311,3333,3345,3356],{"__ignoreMap":613},[971,3280,3281,3283,3285,3287,3289,3292,3294,3297,3299,3302,3304],{"class":973,"line":974},[971,3282,978],{"class":977},[971,3284,1067],{"class":977},[971,3286,1070],{"class":998},[971,3288,1073],{"class":977},[971,3290,3291],{"class":998},"[] inkPoints, ",[971,3293,1363],{"class":977},[971,3295,3296],{"class":998}," width, ",[971,3298,1363],{"class":977},[971,3300,3301],{"class":998}," pixelSize, ",[971,3303,782],{"class":977},[971,3305,3306],{"class":998}," output)\n",[971,3308,3309],{"class":973,"line":995},[971,3310,999],{"class":998},[971,3312,3313,3316,3319,3321,3323,3326,3328,3331],{"class":973,"line":1002},[971,3314,3315],{"class":977},"    CustomPath",[971,3317,3318],{"class":1117}," customPath ",[971,3320,1170],{"class":977},[971,3322,1161],{"class":998},[971,3324,3325],{"class":1117},"CustomPath",[971,3327,1338],{"class":998},[971,3329,3330],{"class":1117},"output",[971,3332,1039],{"class":998},[971,3334,3335,3338,3341,3343],{"class":973,"line":1011},[971,3336,3337],{"class":1117},"    customPath",[971,3339,3340],{"class":998},".setInkPoints(",[971,3342,3056],{"class":1117},[971,3344,1152],{"class":998},[971,3346,3347,3349,3352,3354],{"class":973,"line":1023},[971,3348,3337],{"class":1117},[971,3350,3351],{"class":998},".setWidth(",[971,3353,756],{"class":1117},[971,3355,1152],{"class":998},[971,3357,3358],{"class":973,"line":1029},[971,3359,1254],{"class":998},[631,3361,3362],{"v-slot:swift":613},[963,3363,3365],{"className":1259,"code":3364,"language":1261,"meta":613,"style":613},"- (void)stroke:(nonnull IINKPoint *)input\n        count:(NSInteger)count\n        width:(float)width\n        pixelSize:(float)pixelSize\n        output:(nonnull id\u003CIINKIPath>)output\n{\n    CustomPath *customPath = output;\n    [customPath setInkPoints:input];\n    [customPath setWidth:width];\n}\n",[639,3366,3367,3392,3405,3418,3431,3452,3456,3472,3481,3490],{"__ignoreMap":613},[971,3368,3369,3372,3374,3376,3378,3381,3383,3386,3388,3390],{"class":973,"line":974},[971,3370,3371],{"class":977},"-",[971,3373,1161],{"class":998},[971,3375,1323],{"class":977},[971,3377,1338],{"class":998},[971,3379,3380],{"class":1117},"stroke:",[971,3382,1286],{"class":998},[971,3384,3385],{"class":1117},"nonnull IINKPoint ",[971,3387,1335],{"class":977},[971,3389,1338],{"class":998},[971,3391,1341],{"class":1117},[971,3393,3394,3397,3399,3401,3403],{"class":973,"line":995},[971,3395,3396],{"class":1117},"        count:",[971,3398,1286],{"class":998},[971,3400,1350],{"class":1349},[971,3402,1338],{"class":998},[971,3404,1355],{"class":1117},[971,3406,3407,3410,3412,3414,3416],{"class":973,"line":1002},[971,3408,3409],{"class":1117},"        width:",[971,3411,1286],{"class":998},[971,3413,1363],{"class":977},[971,3415,1338],{"class":998},[971,3417,1368],{"class":1117},[971,3419,3420,3423,3425,3427,3429],{"class":973,"line":1011},[971,3421,3422],{"class":1117},"        pixelSize:",[971,3424,1286],{"class":998},[971,3426,1363],{"class":977},[971,3428,1338],{"class":998},[971,3430,1380],{"class":1117},[971,3432,3433,3436,3438,3441,3444,3446,3448,3450],{"class":973,"line":1023},[971,3434,3435],{"class":1117},"        output:",[971,3437,1286],{"class":998},[971,3439,3440],{"class":1117},"nonnull ",[971,3442,3443],{"class":977},"id",[971,3445,1181],{"class":998},[971,3447,653],{"class":1117},[971,3449,1397],{"class":998},[971,3451,1400],{"class":1117},[971,3453,3454],{"class":973,"line":1029},[971,3455,999],{"class":998},[971,3457,3458,3461,3463,3466,3468,3470],{"class":973,"line":1042},[971,3459,3460],{"class":1117},"    CustomPath ",[971,3462,1335],{"class":977},[971,3464,3465],{"class":1117},"customPath ",[971,3467,1170],{"class":977},[971,3469,1103],{"class":1117},[971,3471,1039],{"class":998},[971,3473,3474,3476,3478],{"class":973,"line":1048},[971,3475,1409],{"class":998},[971,3477,3465],{"class":1117},[971,3479,3480],{"class":998},"setInkPoints:input];\n",[971,3482,3483,3485,3487],{"class":973,"line":1055},[971,3484,1409],{"class":998},[971,3486,3465],{"class":1117},[971,3488,3489],{"class":998},"setWidth:width];\n",[971,3491,3492],{"class":973,"line":1062},[971,3493,1254],{"class":998},[631,3495,3496],{"v-slot:cpp":613},[963,3497,3499],{"className":1514,"code":3498,"language":1516,"meta":613,"style":613},"virtual void stroke(const std::vector\u003CInkPoint>& input, float width, float pixelSize, std::shared_ptr\u003CIPath> output) noexcept\n{\n  ...\n\n  \u002F\u002F Store information\n  auto customPath = std::dynamic_pointer_cast\u003CCustomPath>(output);\n  customPath->points = input;\n  customPath->width = width;\n}\n",[639,3500,3501,3560,3564,3569,3573,3579,3602,3619,3633],{"__ignoreMap":613},[971,3502,3503,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558],{"class":973,"line":974},[971,3504,3505],{"class":977},"virtual",[971,3507,1067],{"class":977},[971,3509,1070],{"class":998},[971,3511,1612],{"class":977},[971,3513,1615],{"class":984},[971,3515,1618],{"class":998},[971,3517,1621],{"class":984},[971,3519,1181],{"class":998},[971,3521,1073],{"class":984},[971,3523,1628],{"class":998},[971,3525,1631],{"class":977},[971,3527,1079],{"class":1035},[971,3529,1082],{"class":998},[971,3531,1085],{"class":977},[971,3533,1088],{"class":1035},[971,3535,1082],{"class":998},[971,3537,1085],{"class":977},[971,3539,1095],{"class":1035},[971,3541,1082],{"class":998},[971,3543,1615],{"class":984},[971,3545,1618],{"class":998},[971,3547,1654],{"class":984},[971,3549,1181],{"class":998},[971,3551,782],{"class":984},[971,3553,1628],{"class":998},[971,3555,1103],{"class":1035},[971,3557,1338],{"class":998},[971,3559,1579],{"class":977},[971,3561,3562],{"class":973,"line":995},[971,3563,999],{"class":998},[971,3565,3566],{"class":973,"line":1002},[971,3567,3568],{"class":1117},"  ...\n",[971,3570,3571],{"class":973,"line":1011},[971,3572,1052],{"emptyLinePlaceholder":1051},[971,3574,3575],{"class":973,"line":1023},[971,3576,3578],{"class":3577},"sJjcI","  \u002F\u002F Store information\n",[971,3580,3581,3584,3586,3588,3590,3593,3595,3598,3600],{"class":973,"line":1029},[971,3582,3583],{"class":977},"  auto",[971,3585,3318],{"class":1117},[971,3587,1170],{"class":977},[971,3589,1615],{"class":984},[971,3591,3592],{"class":998},"::dynamic_pointer_cast\u003C",[971,3594,3325],{"class":984},[971,3596,3597],{"class":998},">(",[971,3599,3330],{"class":1117},[971,3601,1152],{"class":998},[971,3603,3604,3607,3610,3613,3615,3617],{"class":973,"line":1042},[971,3605,3606],{"class":1117},"  customPath",[971,3608,3609],{"class":998},"->",[971,3611,3612],{"class":1117},"points ",[971,3614,1170],{"class":977},[971,3616,1079],{"class":1117},[971,3618,1039],{"class":998},[971,3620,3621,3623,3625,3627,3629,3631],{"class":973,"line":1048},[971,3622,3606],{"class":1117},[971,3624,3609],{"class":998},[971,3626,2773],{"class":1117},[971,3628,1170],{"class":977},[971,3630,1088],{"class":1117},[971,3632,1039],{"class":998},[971,3634,3635],{"class":973,"line":1055},[971,3636,1254],{"class":998},[631,3638,3639],{"v-slot:csharp":613},[963,3640,3642],{"className":1811,"code":3641,"language":1813,"meta":613,"style":613},"public void Stroke(InkPoint[] input, float width, float pixelSize, IPath output)\n{\n    ...\n\n    \u002F\u002F Store information\n    var customPath = (CustomPath)output;\n    customPath._inkPoints = input;\n    customPath._width = width;\n}\n",[639,3643,3644,3678,3682,3690,3694,3699,3719,3734,3749],{"__ignoreMap":613},[971,3645,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676],{"class":973,"line":974},[971,3647,978],{"class":977},[971,3649,1067],{"class":977},[971,3651,1869],{"class":998},[971,3653,1073],{"class":984},[971,3655,1076],{"class":998},[971,3657,1079],{"class":984},[971,3659,1082],{"class":998},[971,3661,1085],{"class":977},[971,3663,1088],{"class":984},[971,3665,1082],{"class":998},[971,3667,1085],{"class":977},[971,3669,1095],{"class":984},[971,3671,1082],{"class":998},[971,3673,1100],{"class":984},[971,3675,1103],{"class":984},[971,3677,1106],{"class":998},[971,3679,3680],{"class":973,"line":995},[971,3681,999],{"class":998},[971,3683,3684,3687],{"class":973,"line":1002},[971,3685,3686],{"class":977},"    ..",[971,3688,3689],{"class":1117},".\n",[971,3691,3692],{"class":973,"line":1011},[971,3693,1052],{"emptyLinePlaceholder":1051},[971,3695,3696],{"class":973,"line":1023},[971,3697,3698],{"class":3577},"    \u002F\u002F Store information\n",[971,3700,3701,3704,3707,3709,3711,3713,3715,3717],{"class":973,"line":1029},[971,3702,3703],{"class":977},"    var",[971,3705,3706],{"class":984}," customPath",[971,3708,1680],{"class":977},[971,3710,1161],{"class":998},[971,3712,3325],{"class":984},[971,3714,1338],{"class":998},[971,3716,3330],{"class":1117},[971,3718,1039],{"class":998},[971,3720,3721,3723,3725,3728,3730,3732],{"class":973,"line":1042},[971,3722,3337],{"class":1117},[971,3724,571],{"class":998},[971,3726,3727],{"class":1117},"_inkPoints ",[971,3729,1170],{"class":977},[971,3731,1079],{"class":1117},[971,3733,1039],{"class":998},[971,3735,3736,3738,3740,3743,3745,3747],{"class":973,"line":1048},[971,3737,3337],{"class":1117},[971,3739,571],{"class":998},[971,3741,3742],{"class":1117},"_width ",[971,3744,1170],{"class":977},[971,3746,1088],{"class":1117},[971,3748,1039],{"class":998},[971,3750,3751],{"class":973,"line":1055},[971,3752,1254],{"class":998},[628,3754,3755,3763],{},[631,3756,3757],{"v-slot:swift":613},[505,3758,3759,3760,3762],{},"You need to update (or subclass) the provided ",[639,3761,712],{}," implementation to build your custom paths:",[505,3764,3759,3765,3762],{},[639,3766,828],{},[628,3768,3769,3811,3861,3911],{},[631,3770,3771],{"v-slot:java":613},[963,3772,3774],{"className":965,"code":3773,"language":967,"meta":613,"style":613},"@Override\npublic final IPath createPath()\n{\n  return new CustomPath();\n}\n",[639,3775,3776,3782,3794,3798,3807],{"__ignoreMap":613},[971,3777,3778,3780],{"class":973,"line":974},[971,3779,1268],{"class":998},[971,3781,1008],{"class":977},[971,3783,3784,3786,3789,3791],{"class":973,"line":995},[971,3785,978],{"class":977},[971,3787,3788],{"class":977}," final",[971,3790,1100],{"class":977},[971,3792,3793],{"class":998}," createPath()\n",[971,3795,3796],{"class":973,"line":1002},[971,3797,999],{"class":998},[971,3799,3800,3802,3804],{"class":973,"line":1011},[971,3801,2927],{"class":998},[971,3803,2090],{"class":998},[971,3805,3806],{"class":998}," CustomPath();\n",[971,3808,3809],{"class":973,"line":1023},[971,3810,1254],{"class":998},[631,3812,3813],{"v-slot:swift":613},[963,3814,3816],{"className":1259,"code":3815,"language":1261,"meta":613,"style":613},"- (nonnull id\u003CIINKIPath>)createPath\n{\n    return [[CustomPath alloc] init];\n}\n",[639,3817,3818,3837,3841,3857],{"__ignoreMap":613},[971,3819,3820,3822,3824,3826,3828,3830,3832,3834],{"class":973,"line":974},[971,3821,3371],{"class":977},[971,3823,1161],{"class":998},[971,3825,3440],{"class":1117},[971,3827,3443],{"class":977},[971,3829,1181],{"class":998},[971,3831,653],{"class":1117},[971,3833,1397],{"class":998},[971,3835,3836],{"class":1117},"createPath\n",[971,3838,3839],{"class":973,"line":995},[971,3840,999],{"class":998},[971,3842,3843,3845,3848,3851,3854],{"class":973,"line":1002},[971,3844,1301],{"class":998},[971,3846,3847],{"class":998}," [[",[971,3849,3850],{"class":1117},"CustomPath ",[971,3852,3853],{"class":998},"alloc]",[971,3855,3856],{"class":998}," init];\n",[971,3858,3859],{"class":973,"line":1011},[971,3860,1254],{"class":998},[631,3862,3863],{"v-slot:cpp":613},[963,3864,3866],{"className":1514,"code":3865,"language":1516,"meta":613,"style":613},"std::shared_ptr\u003CIPath> Canvas::createPath() noexcept\n{\n  return std::make_shared\u003CCustomPath>();\n}\n",[639,3867,3868,3891,3895,3907],{"__ignoreMap":613},[971,3869,3870,3873,3875,3877,3879,3881,3883,3886,3889],{"class":973,"line":974},[971,3871,3872],{"class":984},"std",[971,3874,1618],{"class":998},[971,3876,1654],{"class":984},[971,3878,1181],{"class":998},[971,3880,782],{"class":984},[971,3882,1628],{"class":998},[971,3884,3885],{"class":984}," Canvas",[971,3887,3888],{"class":998},"::createPath()",[971,3890,1579],{"class":977},[971,3892,3893],{"class":973,"line":995},[971,3894,999],{"class":998},[971,3896,3897,3899,3901,3903,3905],{"class":973,"line":1002},[971,3898,2927],{"class":998},[971,3900,1615],{"class":984},[971,3902,2246],{"class":998},[971,3904,3325],{"class":984},[971,3906,2251],{"class":998},[971,3908,3909],{"class":973,"line":1011},[971,3910,1254],{"class":998},[631,3912,3913],{"v-slot:csharp":613},[963,3914,3916],{"className":1811,"code":3915,"language":1813,"meta":613,"style":613},"public IPath CreatePath()\n{\n    return new CustomPath(_session.Device);\n}\n",[639,3917,3918,3927,3931,3951],{"__ignoreMap":613},[971,3919,3920,3922,3924],{"class":973,"line":974},[971,3921,978],{"class":977},[971,3923,1100],{"class":984},[971,3925,3926],{"class":998}," CreatePath()\n",[971,3928,3929],{"class":973,"line":995},[971,3930,999],{"class":998},[971,3932,3933,3935,3937,3939,3941,3944,3946,3949],{"class":973,"line":1002},[971,3934,1301],{"class":998},[971,3936,2090],{"class":977},[971,3938,2676],{"class":984},[971,3940,1286],{"class":998},[971,3942,3943],{"class":1117},"_session",[971,3945,571],{"class":998},[971,3947,3948],{"class":1117},"Device",[971,3950,1152],{"class":998},[971,3952,3953],{"class":973,"line":1011},[971,3954,1254],{"class":998},[628,3956,3957,3968,3976],{},[631,3958,3959],{"v-slot:swift":613},[505,3960,3961,3962,3964,3965,3967],{},"The ",[639,3963,716],{}," method of ",[639,3966,712],{}," will now be called with our paths and you can access your stored values and draw the stroke the way you want:",[631,3969,3970],{"v-slot:csharp":613},[505,3971,3961,3972,3964,3974,3967],{},[639,3973,831],{},[639,3975,828],{},[505,3977,3961,3978,3964,3980,3967],{},[639,3979,912],{},[639,3981,828],{},[628,3983,3984,4083,4217,4331],{},[631,3985,3986],{"v-slot:java":613},[963,3987,3989],{"className":965,"code":3988,"language":967,"meta":613,"style":613},"public void drawPath(IPath path)\n{\n    \u002F\u002F Retrieve stored information\n    CustomPath customPath = (CustomPath)path;\n    InkPoint[] inkPoints = customPath.getInkPoints();\n    float width = customPath.getWidth();\n\n    \u002F\u002F Custom drawing\n    ...\n}\n",[639,3990,3991,4005,4009,4014,4033,4050,4065,4069,4074,4079],{"__ignoreMap":613},[971,3992,3993,3995,3997,4000,4002],{"class":973,"line":974},[971,3994,978],{"class":977},[971,3996,1067],{"class":977},[971,3998,3999],{"class":998}," drawPath(",[971,4001,782],{"class":977},[971,4003,4004],{"class":998}," path)\n",[971,4006,4007],{"class":973,"line":995},[971,4008,999],{"class":998},[971,4010,4011],{"class":973,"line":1002},[971,4012,4013],{"class":3577},"    \u002F\u002F Retrieve stored information\n",[971,4015,4016,4018,4020,4022,4024,4026,4028,4031],{"class":973,"line":1011},[971,4017,3315],{"class":977},[971,4019,3318],{"class":1117},[971,4021,1170],{"class":977},[971,4023,1161],{"class":998},[971,4025,3325],{"class":1117},[971,4027,1338],{"class":998},[971,4029,4030],{"class":1117},"path",[971,4032,1039],{"class":998},[971,4034,4035,4038,4040,4043,4045,4047],{"class":973,"line":1023},[971,4036,4037],{"class":977},"    InkPoint",[971,4039,1076],{"class":998},[971,4041,4042],{"class":1117}," inkPoints ",[971,4044,1170],{"class":977},[971,4046,3706],{"class":1117},[971,4048,4049],{"class":998},".getInkPoints();\n",[971,4051,4052,4055,4058,4060,4062],{"class":973,"line":1029},[971,4053,4054],{"class":977},"    float",[971,4056,4057],{"class":1117}," width ",[971,4059,1170],{"class":977},[971,4061,3706],{"class":1117},[971,4063,4064],{"class":998},".getWidth();\n",[971,4066,4067],{"class":973,"line":1042},[971,4068,1052],{"emptyLinePlaceholder":1051},[971,4070,4071],{"class":973,"line":1048},[971,4072,4073],{"class":3577},"    \u002F\u002F Custom drawing\n",[971,4075,4076],{"class":973,"line":1055},[971,4077,4078],{"class":998},"    ...\n",[971,4080,4081],{"class":973,"line":1062},[971,4082,1254],{"class":998},[631,4084,4085],{"v-slot:swift":613},[963,4086,4088],{"className":1259,"code":4087,"language":1261,"meta":613,"style":613},"- (void)drawPath:(id\u003CIINKIPath>)path\n{\n    Path *aPath = path;\n    CustomPath *caPath = (CustomPath*) aPath;\n    IINKPoint *inkPoints = caPath.inkPoints;\n    float width = caPath.width;\n\n    \u002F\u002F Custom drawing\n    ...\n\n}\n",[639,4089,4090,4116,4120,4137,4161,4181,4197,4201,4205,4209,4213],{"__ignoreMap":613},[971,4091,4092,4094,4096,4098,4100,4103,4105,4107,4109,4111,4113],{"class":973,"line":974},[971,4093,3371],{"class":977},[971,4095,1161],{"class":998},[971,4097,1323],{"class":977},[971,4099,1338],{"class":998},[971,4101,4102],{"class":1117},"drawPath:",[971,4104,1286],{"class":998},[971,4106,3443],{"class":977},[971,4108,1181],{"class":998},[971,4110,653],{"class":1117},[971,4112,1397],{"class":998},[971,4114,4115],{"class":1117},"path\n",[971,4117,4118],{"class":973,"line":995},[971,4119,999],{"class":998},[971,4121,4122,4125,4127,4130,4132,4135],{"class":973,"line":1002},[971,4123,4124],{"class":1117},"    Path ",[971,4126,1335],{"class":977},[971,4128,4129],{"class":1117},"aPath ",[971,4131,1170],{"class":977},[971,4133,4134],{"class":1117}," path",[971,4136,1039],{"class":998},[971,4138,4139,4141,4143,4146,4148,4150,4152,4154,4156,4159],{"class":973,"line":1011},[971,4140,3460],{"class":1117},[971,4142,1335],{"class":977},[971,4144,4145],{"class":1117},"caPath ",[971,4147,1170],{"class":977},[971,4149,1161],{"class":998},[971,4151,3325],{"class":1117},[971,4153,1335],{"class":977},[971,4155,1338],{"class":998},[971,4157,4158],{"class":1117}," aPath",[971,4160,1039],{"class":998},[971,4162,4163,4166,4168,4170,4172,4175,4177,4179],{"class":973,"line":1023},[971,4164,4165],{"class":1117},"    IINKPoint ",[971,4167,1335],{"class":977},[971,4169,2848],{"class":1117},[971,4171,1170],{"class":977},[971,4173,4174],{"class":1035}," caPath",[971,4176,571],{"class":998},[971,4178,3056],{"class":1035},[971,4180,1039],{"class":998},[971,4182,4183,4185,4187,4189,4191,4193,4195],{"class":973,"line":1029},[971,4184,4054],{"class":977},[971,4186,4057],{"class":1117},[971,4188,1170],{"class":977},[971,4190,4174],{"class":1035},[971,4192,571],{"class":998},[971,4194,756],{"class":1035},[971,4196,1039],{"class":998},[971,4198,4199],{"class":973,"line":1042},[971,4200,1052],{"emptyLinePlaceholder":1051},[971,4202,4203],{"class":973,"line":1048},[971,4204,4073],{"class":3577},[971,4206,4207],{"class":973,"line":1055},[971,4208,4078],{"class":1117},[971,4210,4211],{"class":973,"line":1062},[971,4212,1052],{"emptyLinePlaceholder":1051},[971,4214,4215],{"class":973,"line":1109},[971,4216,1254],{"class":998},[631,4218,4219],{"v-slot:cpp":613},[963,4220,4222],{"className":1514,"code":4221,"language":1516,"meta":613,"style":613},"void Canvas::drawPath(std::shared_ptr\u003CIPath> path) noexcept\n{\n  \u002F\u002F Retrieve stored information\n  auto customPath = std::dynamic_pointer_cast\u003CCustomPath>(path);\n  auto points = customPath->points;\n  auto width = customPath->width;\n\n  \u002F\u002F Custom drawing\n  ...\n}\n",[639,4223,4224,4251,4255,4260,4280,4298,4314,4318,4323,4327],{"__ignoreMap":613},[971,4225,4226,4228,4230,4233,4235,4237,4239,4241,4243,4245,4247,4249],{"class":973,"line":974},[971,4227,1323],{"class":977},[971,4229,3885],{"class":984},[971,4231,4232],{"class":998},"::drawPath(",[971,4234,3872],{"class":984},[971,4236,1618],{"class":998},[971,4238,1654],{"class":984},[971,4240,1181],{"class":998},[971,4242,782],{"class":984},[971,4244,1628],{"class":998},[971,4246,4134],{"class":1035},[971,4248,1338],{"class":998},[971,4250,1579],{"class":977},[971,4252,4253],{"class":973,"line":995},[971,4254,999],{"class":998},[971,4256,4257],{"class":973,"line":1002},[971,4258,4259],{"class":3577},"  \u002F\u002F Retrieve stored information\n",[971,4261,4262,4264,4266,4268,4270,4272,4274,4276,4278],{"class":973,"line":1011},[971,4263,3583],{"class":977},[971,4265,3318],{"class":1117},[971,4267,1170],{"class":977},[971,4269,1615],{"class":984},[971,4271,3592],{"class":998},[971,4273,3325],{"class":984},[971,4275,3597],{"class":998},[971,4277,4030],{"class":1117},[971,4279,1152],{"class":998},[971,4281,4282,4284,4287,4289,4291,4293,4296],{"class":973,"line":1023},[971,4283,3583],{"class":977},[971,4285,4286],{"class":1117}," points ",[971,4288,1170],{"class":977},[971,4290,3706],{"class":1117},[971,4292,3609],{"class":998},[971,4294,4295],{"class":1117},"points",[971,4297,1039],{"class":998},[971,4299,4300,4302,4304,4306,4308,4310,4312],{"class":973,"line":1029},[971,4301,3583],{"class":977},[971,4303,4057],{"class":1117},[971,4305,1170],{"class":977},[971,4307,3706],{"class":1117},[971,4309,3609],{"class":998},[971,4311,756],{"class":1117},[971,4313,1039],{"class":998},[971,4315,4316],{"class":973,"line":1042},[971,4317,1052],{"emptyLinePlaceholder":1051},[971,4319,4320],{"class":973,"line":1048},[971,4321,4322],{"class":3577},"  \u002F\u002F Custom drawing\n",[971,4324,4325],{"class":973,"line":1055},[971,4326,3568],{"class":1117},[971,4328,4329],{"class":973,"line":1062},[971,4330,1254],{"class":998},[631,4332,4333],{"v-slot:csharp":613},[963,4334,4336],{"className":1811,"code":4335,"language":1813,"meta":613,"style":613},"public void DrawPath(IPath path)\n{\n    var customPath= (CustomPath)path;\n    var inkPoints = customPath._inkPoints;\n    var width = customPath._width;\n\n    \u002F\u002F Custom drawing\n    ...\n}\n",[639,4337,4338,4353,4357,4375,4392,4409,4413,4417,4423],{"__ignoreMap":613},[971,4339,4340,4342,4344,4347,4349,4351],{"class":973,"line":974},[971,4341,978],{"class":977},[971,4343,1067],{"class":977},[971,4345,4346],{"class":998}," DrawPath(",[971,4348,782],{"class":984},[971,4350,4134],{"class":984},[971,4352,1106],{"class":998},[971,4354,4355],{"class":973,"line":995},[971,4356,999],{"class":998},[971,4358,4359,4361,4363,4365,4367,4369,4371,4373],{"class":973,"line":1002},[971,4360,3703],{"class":977},[971,4362,3706],{"class":984},[971,4364,1170],{"class":977},[971,4366,1161],{"class":998},[971,4368,3325],{"class":984},[971,4370,1338],{"class":998},[971,4372,4030],{"class":1117},[971,4374,1039],{"class":998},[971,4376,4377,4379,4381,4383,4385,4387,4390],{"class":973,"line":1011},[971,4378,3703],{"class":977},[971,4380,2699],{"class":984},[971,4382,1680],{"class":977},[971,4384,3706],{"class":1117},[971,4386,571],{"class":998},[971,4388,4389],{"class":1117},"_inkPoints",[971,4391,1039],{"class":998},[971,4393,4394,4396,4398,4400,4402,4404,4407],{"class":973,"line":1023},[971,4395,3703],{"class":977},[971,4397,1088],{"class":984},[971,4399,1680],{"class":977},[971,4401,3706],{"class":1117},[971,4403,571],{"class":998},[971,4405,4406],{"class":1117},"_width",[971,4408,1039],{"class":998},[971,4410,4411],{"class":973,"line":1029},[971,4412,1052],{"emptyLinePlaceholder":1051},[971,4414,4415],{"class":973,"line":1042},[971,4416,4073],{"class":3577},[971,4418,4419,4421],{"class":973,"line":1048},[971,4420,3686],{"class":977},[971,4422,3689],{"class":1117},[971,4424,4425],{"class":973,"line":1055},[971,4426,1254],{"class":998},[628,4428,4429,4443,4446,4466],{},[631,4430,4431,4435],{"v-slot:java":613},[947,4432,4434],{"id":4433},"drawing-of-textured-strokes","Drawing of textured strokes",[505,4436,4437,4438,4442],{},"If you want to support textured strokes, you can implement some additional brushes using dedicated APIs. For more details, refer to ",[567,4439,4441],{"href":4440},"\u002Fdocs\u002Fsdk\u002F4.5\u002Feditor\u002Frendering#additional-brush-implementation","the Rendering"," page.",[947,4444,4434],{"id":4445},"drawing-of-textured-strokes-1",[628,4447,4448,4456,4462],{},[631,4449,4450],{"v-slot:swift":613},[505,4451,4452,4453,4455],{},"If you want to support textured strokes, you can register a custom stroker for each texture you support and store the necessary information for your custom\n",[639,4454,716],{}," implementation to take it into account.",[631,4457,4458],{"v-slot:csharp":613},[505,4459,4452,4460,4455],{},[639,4461,831],{},[505,4463,4452,4464,4455],{},[639,4465,912],{},[588,4467,4468],{"color":590},[505,4469,4470],{},"Ensure that the stroke is entirely drawn inside the envelope. Failure to do so will likely result in rendering issues.",[694,4472,4473],{},"html pre.shiki code .sglaT, html code.shiki .sglaT{--shiki-light:#7751EC;--shiki-default:#7751EC;--shiki-dark:#AC92FC}html pre.shiki code .sVYTS, html code.shiki .sVYTS{--shiki-light:#0081F0;--shiki-default:#0081F0;--shiki-dark:#1A9FFF}html pre.shiki code .sZBTK, html code.shiki .sZBTK{--shiki-light:#002DB3;--shiki-default:#002DB3;--shiki-dark:#80EAFF}html pre.shiki code .soFc9, html code.shiki .soFc9{--shiki-light:#1A9FFF;--shiki-default:#1A9FFF;--shiki-dark:#1A9FFF}html pre.shiki code .sU2JI, html code.shiki .sU2JI{--shiki-light:#005FE4;--shiki-default:#005FE4;--shiki-dark:#80DFFF}html pre.shiki code .sEQEB, html code.shiki .sEQEB{--shiki-light:#051F41;--shiki-default:#051F41;--shiki-dark:#D1E9FA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .stZ3G, html code.shiki .stZ3G{--shiki-light:#316081;--shiki-default:#316081;--shiki-dark:#7EACCE}html pre.shiki code .sYWwX, html code.shiki .sYWwX{--shiki-light:#005FE4;--shiki-light-font-style:italic;--shiki-default:#005FE4;--shiki-default-font-style:italic;--shiki-dark:#80DFFF;--shiki-dark-font-style:italic}html pre.shiki code .sJjcI, html code.shiki .sJjcI{--shiki-light:#467191;--shiki-light-font-style:italic;--shiki-default:#467191;--shiki-default-font-style:italic;--shiki-dark:#6493B4;--shiki-dark-font-style:italic}",{"title":613,"searchDepth":1002,"depth":1002,"links":4475},[4476,4477,4478,4479,4480],{"id":511,"depth":995,"text":512},{"id":548,"depth":995,"text":549},{"id":596,"depth":995,"text":597},{"id":622,"depth":995,"text":623},{"id":941,"depth":995,"text":942,"children":4481},[4482,4483,4484,4485],{"id":949,"depth":1002,"text":950},{"id":2624,"depth":1002,"text":2625},{"id":4433,"depth":1002,"text":4434},{"id":4445,"depth":1002,"text":4434},"Explanation about how to implement a custom inking","md","i-tabler-brush",{},null,"poaqok","3.1",{"title":460,"description":4486},"E7aM_9m2-Q0BAhvnViETUH1pSLCKcWHm2mJrGTXBajE",[4496],{"title":5,"path":6,"stem":7,"children":4497,"page":40},[4498],{"title":321,"path":322,"stem":323,"children":4499,"page":40},[4500],{"title":15,"navTitle":4490,"icon":4490,"path":326,"stem":327,"children":4501,"page":40},[4502,4505,4507,4509,4516,4528,4537,4542,4545,4554,4558,4575,4576,4578,4580,4582,4586],{"title":330,"path":331,"stem":332,"navTitle":4503,"icon":4504},"About","i-tabler-info-circle",{"title":33,"path":334,"stem":335,"navTitle":33,"icon":4506},"i-tabler-bell-ringing",{"title":37,"path":337,"stem":338,"navTitle":37,"icon":4508},"i-tabler-gps",{"title":42,"navTitle":4490,"icon":4490,"path":340,"stem":341,"children":4510,"page":40},[4511,4514],{"title":47,"path":344,"stem":345,"navTitle":4512,"icon":4513},"Platforms","i-tabler-device-laptop",{"title":51,"path":347,"stem":348,"navTitle":51,"icon":4515},"i-tabler-stack-2",{"title":55,"navTitle":4490,"icon":4490,"path":350,"stem":351,"children":4517,"page":40},[4518,4520,4522,4524,4526],{"title":60,"path":354,"stem":355,"navTitle":4490,"icon":4519},"i-tabler-text-scan-2",{"title":64,"path":357,"stem":358,"navTitle":64,"icon":4521},"i-tabler-language",{"title":68,"path":360,"stem":361,"navTitle":68,"icon":4523},"i-tabler-math",{"title":72,"path":363,"stem":364,"navTitle":72,"icon":4525},"i-tabler-circle-square",{"title":76,"path":366,"stem":367,"navTitle":4490,"icon":4527},"i-tabler-hand-finger",{"title":80,"navTitle":4490,"icon":4490,"path":369,"stem":370,"children":4529,"page":40},[4530,4532,4534],{"title":85,"path":373,"stem":374,"navTitle":85,"icon":4531},"i-tabler-eye",{"title":89,"path":376,"stem":377,"navTitle":89,"icon":4533},"i-tabler-bolt",{"title":93,"path":379,"stem":380,"navTitle":4535,"icon":4536},"Import and export","i-tabler-arrows-left-right",{"title":106,"navTitle":4490,"icon":4490,"path":382,"stem":383,"children":4538,"page":40},[4539,4541],{"title":386,"path":387,"stem":388,"navTitle":4490,"icon":4540},"i-tabler-direction-sign",{"title":390,"path":391,"stem":392,"navTitle":4490,"icon":4540},{"title":394,"navTitle":4490,"icon":4490,"path":395,"stem":396,"children":4543,"page":40},[4544],{"title":60,"path":399,"stem":400,"navTitle":4490,"icon":4519},{"title":402,"navTitle":4490,"icon":4490,"path":403,"stem":404,"children":4546,"page":40},[4547,4549,4551],{"title":407,"path":408,"stem":409,"navTitle":4490,"icon":4548},"i-tabler-file-database",{"title":97,"path":411,"stem":412,"navTitle":97,"icon":4550},"i-tabler-calculator",{"title":414,"path":415,"stem":416,"navTitle":4552,"icon":4553},"Combined undo\u002Fredo stacks","i-tabler-arrow-back-up",{"title":418,"navTitle":4490,"icon":4490,"path":419,"stem":420,"children":4555,"page":40},[4556],{"title":423,"path":424,"stem":425,"navTitle":4490,"icon":4557},"i-tabler-stack-backward",{"title":427,"navTitle":4490,"icon":4490,"path":428,"stem":429,"children":4559,"page":40},[4560,4562,4564,4566,4568,4570,4572,4574],{"title":432,"path":433,"stem":434,"navTitle":4490,"icon":4561},"i-tabler-app-window",{"title":436,"path":437,"stem":438,"navTitle":4490,"icon":4563},"i-tabler-edit",{"title":440,"path":441,"stem":442,"navTitle":4490,"icon":4565},"i-tabler-adjustments",{"title":444,"path":445,"stem":446,"navTitle":4490,"icon":4567},"i-tabler-pointer",{"title":448,"path":449,"stem":450,"navTitle":4490,"icon":4569},"i-tabler-sparkles",{"title":452,"path":453,"stem":454,"navTitle":4490,"icon":4571},"i-tabler-zoom-pan",{"title":456,"path":457,"stem":458,"navTitle":4490,"icon":4573},"i-tabler-palette",{"title":460,"path":461,"stem":462,"navTitle":4490,"icon":4488},{"title":464,"path":465,"stem":466,"navTitle":4490,"icon":4536},{"title":202,"path":468,"stem":469,"navTitle":4490,"icon":4577},"i-tabler-tags",{"title":471,"path":472,"stem":473,"navTitle":4490,"icon":4579},"i-tabler-bug",{"title":206,"path":475,"stem":476,"navTitle":4490,"icon":4581},"i-tabler-file-code",{"title":313,"navTitle":4490,"icon":4490,"path":478,"stem":479,"children":4583,"page":40},[4584],{"title":313,"path":482,"stem":483,"navTitle":313,"icon":4585},"i-tabler-pencil",{"title":139,"navTitle":4490,"icon":4490,"path":485,"stem":486,"children":4587,"page":40},[4588,4590,4593],{"title":144,"path":489,"stem":490,"navTitle":4490,"icon":4589},"i-tabler-settings",{"title":239,"path":492,"stem":493,"navTitle":4591,"icon":4592},"JIIX","i-tabler-braces",{"title":495,"path":496,"stem":497,"navTitle":456,"icon":4573},{"id":4595,"title":4596,"body":4597,"canonicalPath":4490,"description":4657,"extension":4487,"icon":4508,"meta":4658,"navTitle":20,"navigation":1051,"path":4659,"resolveKey":4490,"resolveVersion":4490,"seo":4660,"stem":4661,"__hash__":4662},"support\u002Fsupport\u002F01.index.md","Support",{"type":502,"value":4598,"toc":4655},[4599,4602],[505,4600,4601],{},"Find answers to common questions about integrating the iink SDK and MyScript Cloud APIs. Browse the topics below or reach out on the community forum.",[4603,4604,4605,4614,4622,4630,4638,4647],"card-group",{},[4606,4607,4611],"card",{"icon":4608,"title":4609,"to":4610},"i-tabler-package","Recognition assets","\u002Fsupport\u002Frecognition-assets\u002F",[505,4612,4613],{},"Download base assets and build custom resources to fine-tune the recognition.",[4606,4615,4619],{"icon":4616,"title":4617,"to":4618},"i-tabler-key","On-device license management","\u002Fsupport\u002Fon-device\u002Fon-device-license-management\u002F",[505,4620,4621],{},"Manage licenses for applications embedding the on-device iink SDK.",[4606,4623,4627],{"icon":4624,"title":4625,"to":4626},"i-tabler-user-circle","Registering with MyScript Cloud","\u002Fsupport\u002Fcloud\u002Fregistering-myscript-cloud\u002F",[505,4628,4629],{},"Create a Cloud account and obtain the keys to call our recognition APIs.",[4606,4631,4635],{"icon":4632,"title":4633,"to":4634},"i-tabler-rocket","Being production ready","\u002Fsupport\u002Fcloud\u002Fbeing-production-ready\u002F",[505,4636,4637],{},"Best practices and quotas to ship your iink Cloud integration to production.",[4606,4639,4644],{"icon":4640,"title":4641,"to":4642,"target":4643},"i-tabler-message-circle","Forums","https:\u002F\u002Fdeveloper-support.myscript.com\u002Fsupport\u002Flogin","_blank",[505,4645,4646],{},"Ask questions and get answers from the MyScript developer community.",[4606,4648,4652],{"icon":4649,"title":4650,"to":4651,"target":4643},"i-tabler-mail","Contact us","https:\u002F\u002Fwww.myscript.com\u002Fcontact\u002F",[505,4653,4654],{},"Can't find what you're looking for? Reach out to our team.",{"title":613,"searchDepth":1002,"depth":1002,"links":4656},[],"MyScript Developer Support hub",{},"\u002Fsupport",{"title":4596,"description":4657},"support\u002F01.index","jENFmcn55y_8r3_6pH5xxlH1dZJBwoAuq9F7gXQtow8",1792566670548]