{"id":458828,"date":"2025-05-06T15:01:00","date_gmt":"2025-05-06T15:01:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=458828"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=458828","title":{"rendered":"<span>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0435\u043c\u043e\u0434\u0437\u0438 \u0432 \u0430\u0442\u043b\u0430\u0441 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b .ttf (NotoColorEmoji)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c1\/912\/5c7\/5c19125c7c1aeb40123a9badd5d500ec.png\" alt=\"\u0421\u0442\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u043e\u0436\u043a\u0430\" title=\"\u0421\u0442\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u043e\u0436\u043a\u0430\" width=\"1673\" height=\"999\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5c1\/912\/5c7\/5c19125c7c1aeb40123a9badd5d500ec.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c1\/912\/5c7\/5c19125c7c1aeb40123a9badd5d500ec.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u043e\u0436\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0422\u0435\u043a\u0441\u0442 &#8212; \u044d\u0442\u043e \u043d\u0435\u043e\u0442\u044c\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445. \u0422\u0435\u043a\u0441\u0442 \u043c\u043e\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0438\u0441\u0442\u043e\u0447\u043a\u043e\u0439 &#8212; \u043a\u0430\u043b\u043b\u0438\u0433\u0440\u0430\u0444\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c &#8212; \u0440\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u043a\u0438, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044d\u0442\u043e \u041f\u041a \u0438 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u044b, \u0442\u0435\u043a\u0441\u0442 \u0435\u0441\u0442\u044c \u043d\u0430 mp3 \u043f\u043b\u0435\u0435\u0440\u0430\u0445, \u0432\u043e\u043e\u0431\u0449\u0435\u043c \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0435\u043c\u043e\u0434\u0437\u0438 \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430 NotoColorEmoji.ttf. <\/p>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0440\u0430\u0441\u0442\u0440\u0435 \u0434\u043b\u044f \u0430\u0442\u043b\u0430\u0441\u0430. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f <a href=\"https:\/\/www.youtube.com\/watch?v=SO83KQuuZvg\" rel=\"noopener noreferrer nofollow\">SO83KQuuZvg<\/a>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0448\u0440\u0438\u0444\u0442\u0430 \u0438\u0437 ttf(<a href=\"https:\/\/developer.apple.com\/fonts\/TrueType-Reference-Manual\/\" rel=\"noopener noreferrer nofollow\">TrueType-Reference-Manual\/<\/a> &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c, <a href=\"https:\/\/learn.microsoft.com\/en-us\/typography\/opentype\/spec\/svg\" rel=\"noopener noreferrer nofollow\">svg<\/a> &#8212; \u0442\u043e \u0447\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f), \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0435\u043c\u043e\u0434\u0437\u0438.<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/p>\n<p>\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 FreeBSD14.2, clang++20, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c SVG, html\/css, \u0431\u0440\u0430\u0443\u0437\u0435\u0440. <\/p>\n<p>Encode+Decode \u044e\u043d\u0438\u043a\u043e\u0434\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u043a \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p><strong>\u0412\u0432\u043e\u0434\u043d\u0430\u044f <\/strong><\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0421++ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 html \u0444\u0430\u0439\u043b, css \u0444\u0430\u0439\u043b. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c html \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 SVG \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430 .ttf. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u0444\u0430\u0439\u043b css, \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a html, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 ttf \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b SVG<\/p>\n<p>SVG \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u0448\u0440\u0438\u0444\u0442\u0430\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 ttf(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/TrueType\" rel=\"noopener noreferrer nofollow\">TrueType<\/a>) \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 OpenType(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/OpenType\" rel=\"noopener noreferrer nofollow\">OpenType<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft.<\/p>\n<p>SVG \u0444\u043e\u0440\u043c\u0430\u0442(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/SVG\" rel=\"noopener noreferrer nofollow\">SVG<\/a>) \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043e\u043d \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 xml. \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441 \u043d\u0438\u043c.<\/p>\n<p>SVG \u0433\u0440\u0443\u043f\u043f\u044b &#8212; \u0435\u043c\u043e\u0434\u0437\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b .ttf \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430\u0434\u043e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u0442\u043e\u0435\u0441\u0442\u044c \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430, \u0438\u043c\u0435\u043d\u0430 \u0438 \u0434\u043b\u0438\u043d\u044b \u0442\u0430\u0431\u043b\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/developer.apple.com\/fonts\/TrueType-Reference-Manual\/RM06\/Chap6.html#ScalerTypeNote\" rel=\"noopener noreferrer nofollow\">Chap6.html#ScalerTypeNote<\/a> \u0441 \u0441\u0430\u0439\u0442\u0430 Apple, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 4(\u0442\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b) \u0438 5(\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f).<\/p>\n<p><strong>\u041d\u0430\u0447\u043d\u0435\u043c<\/strong><\/p>\n<p>NotoColorEmoji-Regular.ttf \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u043d.<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;cctype&gt; #include &lt;iostream&gt; #include &lt;vector&gt;  typedef unsigned char u8;       typedef unsigned short u16;       typedef unsigned int u32;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 12 \u0431\u0430\u0439\u0442 typedef struct OffsetTable_t {   u32 scaler;   u16 nTabs;   u16 searchRange;   u16 entrySelector;   u16 rangeShift; }OffsetTable;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b typedef struct TableLocation_t\/\/ {   u8 tag[5];   u32 ccks;   u32 off;   u32 len; }TableLocation;  u32 readu32(const u8 *tempN) {   u32 t=((tempN[0] &lt;&lt; 24)  |  (tempN[1] &lt;&lt; 16)  |  (tempN[2] &lt;&lt; 8)   |  (tempN[3]&lt;&lt;0));    return t; }  u16 readu16(u8 *tempN) {   u16 t=(tempN[0] &lt;&lt; 8)  |          tempN[1] ;    return t; }  u8 readu8(u8 *tempN) {   u8 t=tempN[1] ;    return t; }  \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b u8* FindTableByTag(u8* data,const u8 *sTag) {   u8* p = data + 4;\/\/scaler   u16 numTables = readu16(p);\/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446          u32 intTag = readu32(sTag);\/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u0433   u8* t = data + 12;\/\/\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         for (u16 i = 0; i &lt; numTables; ++i) {     u32 thisTag =readu32(t);\/\/tag     if (thisTag == intTag) {       p = t + 8;\/\/offset       u32 offset = readu32(p);             return data + offset;\/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e     }     t += 16;\/\/\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430   }         return 0; } \/\/\u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438  TableLocation* getTable(OffsetTable* oft,TableLocation* t,u8* data) {   oft-&gt;scaler=readu32(data);data+=4;      oft-&gt;nTabs=readu16(data);data+=2;      oft-&gt;searchRange=readu16(data);data+=2;      oft-&gt;entrySelector=readu16(data);data+=2;      oft-&gt;rangeShift=readu16(data);data+=2;      printf(\"%d %d %d %d %d\\n\",oft-&gt;scaler,oft-&gt;nTabs,oft-&gt;searchRange,oft-&gt;entrySelector,oft-&gt;rangeShift);      t=(TableLocation*)malloc(sizeof(TableLocation)*oft-&gt;nTabs);      for(int i=0;i&lt;oft-&gt;nTabs;i++){     data--;     t[i].tag[0]=readu8(data++);     t[i].tag[1]=readu8(data++);     t[i].tag[2]=readu8(data++);     t[i].tag[3]=readu8(data++);     t[i].tag[4]='\\0';     data++;      t[i].ccks=(u32)readu32(data);data+=4;     t[i].off=(u32)readu32(data);data+=4;     t[i].len=(u32)readu32(data);data+=4;     printf(\"%s %d\\n\",t[i].tag,t[i].off);   }   return t; }  int main() {   FILE* file = fopen(\"NotoColorEmoji-Regular.ttf\",\"rb\");    fseek(file, 0, SEEK_END);    size_t size = ftell(file);   fseek(file, 0, SEEK_SET);    u8* data = (u8*)malloc(size+1);   fread(data,size,1,file);   data[size]='\\0';   fclose(file);   printf(\"1 %s\\n\",data);     OffsetTable *offTable=(OffsetTable*)malloc(sizeof(OffsetTable));   TableLocation *tLoc;    tLoc=getTable(offTable,tLoc,data);    free(tLoc);   free(offTable);   free(data);      return 0; }   \u0432\u044b\u0432\u043e\u0434  .\/a.out 1  65536 16 256 4 0 COLR 461536 CPAL 11048 GSUB 34748 OS\/2 460 SVG  4817344 cmap 1976 glyf 1546632 head 404 hhea 332 hmtx 143240 loca 302360 maxp 268 name 556 post 300 vhea 368 vmtx 63652 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 SVG (\u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043c\u0430\u0439\u043a\u0440\u043e\u0441\u043e\u0444\u0442 <a href=\"https:\/\/learn.microsoft.com\/en-us\/typography\/opentype\/spec\/svg\" rel=\"noopener noreferrer nofollow\">spec\/svg<\/a>)<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;cctype&gt; #include &lt;iostream&gt; #include &lt;vector&gt;  typedef unsigned char u8;       typedef unsigned short u16;       typedef unsigned int u32;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 12 \u0431\u0430\u0439\u0442 typedef struct OffsetTable_t {   u32 scaler;   u16 nTabs;   u16 searchRange;   u16 entrySelector;   u16 rangeShift; }OffsetTable;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b typedef struct TableLocation_t\/\/ {   u8 tag[5];   u32 ccks;   u32 off;   u32 len; }TableLocation;  u32 readu32(const u8 *tempN) {   u32 t=((tempN[0] &lt;&lt; 24)  |  (tempN[1] &lt;&lt; 16)  |  (tempN[2] &lt;&lt; 8)   |  (tempN[3]&lt;&lt;0));    return t; }  u16 readu16(u8 *tempN) {   u16 t=(tempN[0] &lt;&lt; 8)  |          tempN[1] ;    return t; }  u8 readu8(u8 *tempN) {   u8 t=tempN[1] ;    return t; }  \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b u8* FindTableByTag(u8* data,const u8 *sTag) {   u8* p = data + 4;\/\/scaler   u16 numTables = readu16(p);\/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446          u32 intTag = readu32(sTag);\/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u0433   u8* t = data + 12;\/\/\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         for (u16 i = 0; i &lt; numTables; ++i) {     u32 thisTag =readu32(t);\/\/tag     if (thisTag == intTag) {       p = t + 8;\/\/offset       u32 offset = readu32(p);             return data + offset;\/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e     }     t += 16;\/\/\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430   }         return 0; } \/\/\u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438  TableLocation* getTable(OffsetTable* oft,TableLocation* t,u8* data) {   oft-&gt;scaler=readu32(data);data+=4;      oft-&gt;nTabs=readu16(data);data+=2;      oft-&gt;searchRange=readu16(data);data+=2;      oft-&gt;entrySelector=readu16(data);data+=2;      oft-&gt;rangeShift=readu16(data);data+=2;      printf(\"%d %d %d %d %d\\n\",oft-&gt;scaler,oft-&gt;nTabs,oft-&gt;searchRange,oft-&gt;entrySelector,oft-&gt;rangeShift);      t=(TableLocation*)malloc(sizeof(TableLocation)*oft-&gt;nTabs);      for(int i=0;i&lt;oft-&gt;nTabs;i++){     data--;     t[i].tag[0]=readu8(data++);     t[i].tag[1]=readu8(data++);     t[i].tag[2]=readu8(data++);     t[i].tag[3]=readu8(data++);     t[i].tag[4]='\\0';     data++;      t[i].ccks=(u32)readu32(data);data+=4;     t[i].off=(u32)readu32(data);data+=4;     t[i].len=(u32)readu32(data);data+=4;     printf(\"%s %d\\n\",t[i].tag,t[i].off);   }   return t; }  \/\/\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b SVG struct SVGDRecord_t {     u16 start;     u16 end;     u32 offset;     u32 length; };  typedef struct SVGDRecord_t SVGDRecord;  int main() {   FILE* file = fopen(\"NotoColorEmoji-Regular.ttf\",\"rb\");    fseek(file, 0, SEEK_END);    size_t size = ftell(file);   fseek(file, 0, SEEK_SET);    u8* data = (u8*)malloc(size+1);   fread(data,size,1,file);   data[size]='\\0';   fclose(file);   printf(\"1 %s\\n\",data);       OffsetTable *offTable=(OffsetTable*)malloc(sizeof(OffsetTable));   TableLocation *tLoc;    tLoc=getTable(offTable,tLoc,data);      u8* SVG=FindTableByTag(data,(const u8*)\"SVG \");\/\/4 \u0431\u0430\u0439\u0442\u0430   \/\/\u0447\u0438\u0442\u0430\u0435\u043c   printf(\"\\n\\n\\n%16s %d\\n\",\"SVGv            \",readu16(SVG));SVG=SVG+2;   printf(\"%16s %d\\n\",\"SVGDocListOffset\",readu32(SVG));SVG+=4;   printf(\"%16s %d\\n\",\"SVGvReserved    \",readu32(SVG));SVG+=4;    \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   u32 nt=readu16(SVG);SVG=SVG+2;    \/\/\u043d\u0430\u0447\u0430\u043b\u043e   u8* tempSVG=SVG-2;    \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   printf(\"\\n\\n\\n%16s %d\\n\",\"NumEntries      \",nt);    \/\/   SVGDRecord svgDRecord[nt];      FILE *sFile = 0;      sFile = fopen(\"htmltest1.html\", \"wb\");    \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u043e html   char *tttemp=\"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&lt;\/title&gt;&lt;link rel=\\\"stylesheet\\\" href=\\\"style.css\\\"&gt;&lt;\/head&gt;&lt;body&gt;&lt;div class=\\\"center\\\"&gt;\";   fwrite(tttemp,strlen(tttemp), 1, sFile);    \/\/\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0433\u0440\u0443\u043f\u043f   for(int i=0;i&lt;nt;i++){          svgDRecord[i].start=readu16(SVG);SVG=SVG+2;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"start      \",svgDRecord[i].start);          svgDRecord[i].end=readu16(SVG);SVG=SVG+2;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"end      \",svgDRecord[i].end);          svgDRecord[i].offset=readu32(SVG);SVG=SVG+4;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"Offset      \",svgDRecord[i].offset);          svgDRecord[i].length=readu32(SVG);SVG=SVG+4;          \/\/\u043f\u0438\u0448\u0435\u043c \u043f\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0442\u0441\u0442\u0443\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u044b     fwrite(tempSVG+svgDRecord[i].offset,svgDRecord[i].length, 1, sFile);    }    \/\/\u0437\u0430\u043a\u0440\u043e\u0435\u043c   fwrite(\"&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\",strlen(\"&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\"), 1, sFile);   fclose(sFile);    free(tLoc);   free(offTable);   free(data);    return 0; } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0438\u043b\u0438 css \u0444\u0430\u0439\u043b &#8212; style.css<\/p>\n<pre><code class=\"cpp\">\/\/main1.cpp #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; int main(){   std::string t=\"style.css\";   std::ofstream file(t,std::ios::binary);   std::string gMO(\".center {\\n  margin: auto;\\n  width: 60%;\\n  text-align: left;\\n  width: 4250px;\\n  height: 16150px;\\n  overflow-y: scroll;\\n}\\nsvg {\\n  width: 100px;\\n  height: 150px;\\n  overflow: visible !important;\\n  transform:scale(0.1,0.1);\\n  position: absolute;\\n}\\n\");   std::string glyph(\"#glyph\");   std::string glyphN1(\" {\\n\\t\\tmargin: auto;\\n\\t\\toverflow:visible !important;\\n\\t\\ttransform:translate(\");   std::string glyphN2(\"px, \");   std::string glyphN3(\"px);\\n}\\n \");   std::string glyphNEqual(\"\");    glyphNEqual+=gMO;   uint startTX=80;   uint startTY=500;    int paddingTX=1300;   int paddingTY=1300;      for(int i=2;i&lt;=3846;i++){     glyphNEqual+=glyph;     std::string tf = std::to_string(i);     glyphNEqual+=tf;     glyphNEqual+=glyphN1;     glyphNEqual+=std::to_string(startTX);     glyphNEqual+=glyphN2;     glyphNEqual+=std::to_string(startTY);     glyphNEqual+=glyphN3;     file.write(glyphNEqual.c_str(), glyphNEqual.size());     if(i&gt;=4&amp;&amp;i&lt;=2799){       if(startTX &gt;= 39080){startTX=80;startTY+=1300;}       else startTX+=1300;     }     else if(i&gt;=2800)       { if(startTX &gt;= 39080){startTX=0;startTY+=1300;} else startTX+=1300;       }          glyphNEqual=\"\";     glyphNEqual.clear();        }   file.close();   return 0; } <\/code><\/pre>\n<p>\u0432\u0441\u0451 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 2 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 .center )<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/369\/f23\/05c\/369f2305cb834282eb872dbd0fdf9f06.png\" alt=\"\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438 \u0435\u043c\u043e\u0434\u0437\u0438\" title=\"\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438 \u0435\u043c\u043e\u0434\u0437\u0438\" width=\"1841\" height=\"790\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/369\/f23\/05c\/369f2305cb834282eb872dbd0fdf9f06.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/369\/f23\/05c\/369f2305cb834282eb872dbd0fdf9f06.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438 \u0435\u043c\u043e\u0434\u0437\u0438<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/907364\/\"> https:\/\/habr.com\/ru\/articles\/907364\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u043e\u0436\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0422\u0435\u043a\u0441\u0442 &#8212; \u044d\u0442\u043e \u043d\u0435\u043e\u0442\u044c\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445. \u0422\u0435\u043a\u0441\u0442 \u043c\u043e\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0438\u0441\u0442\u043e\u0447\u043a\u043e\u0439 &#8212; \u043a\u0430\u043b\u043b\u0438\u0433\u0440\u0430\u0444\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c &#8212; \u0440\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u043a\u0438, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044d\u0442\u043e \u041f\u041a \u0438 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u044b, \u0442\u0435\u043a\u0441\u0442 \u0435\u0441\u0442\u044c \u043d\u0430 mp3 \u043f\u043b\u0435\u0435\u0440\u0430\u0445, \u0432\u043e\u043e\u0431\u0449\u0435\u043c \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0435\u043c\u043e\u0434\u0437\u0438 \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430 NotoColorEmoji.ttf. <\/p>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0440\u0430\u0441\u0442\u0440\u0435 \u0434\u043b\u044f \u0430\u0442\u043b\u0430\u0441\u0430. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f <a href=\"https:\/\/www.youtube.com\/watch?v=SO83KQuuZvg\" rel=\"noopener noreferrer nofollow\">SO83KQuuZvg<\/a>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0448\u0440\u0438\u0444\u0442\u0430 \u0438\u0437 ttf(<a href=\"https:\/\/developer.apple.com\/fonts\/TrueType-Reference-Manual\/\" rel=\"noopener noreferrer nofollow\">TrueType-Reference-Manual\/<\/a> &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c, <a href=\"https:\/\/learn.microsoft.com\/en-us\/typography\/opentype\/spec\/svg\" rel=\"noopener noreferrer nofollow\">svg<\/a> &#8212; \u0442\u043e \u0447\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f), \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0435\u043c\u043e\u0434\u0437\u0438.<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/p>\n<p>\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 FreeBSD14.2, clang++20, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c SVG, html\/css, \u0431\u0440\u0430\u0443\u0437\u0435\u0440. <\/p>\n<p>Encode+Decode \u044e\u043d\u0438\u043a\u043e\u0434\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0438\u044f \u043a\u043e\u0434\u0430 \u043a \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p><strong>\u0412\u0432\u043e\u0434\u043d\u0430\u044f <\/strong><\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0421++ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 html \u0444\u0430\u0439\u043b, css \u0444\u0430\u0439\u043b. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c html \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 SVG \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430 .ttf. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u0444\u0430\u0439\u043b css, \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a html, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 ttf \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b SVG<\/p>\n<p>SVG \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u0448\u0440\u0438\u0444\u0442\u0430\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 ttf(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/TrueType\" rel=\"noopener noreferrer nofollow\">TrueType<\/a>) \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 OpenType(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/OpenType\" rel=\"noopener noreferrer nofollow\">OpenType<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft.<\/p>\n<p>SVG \u0444\u043e\u0440\u043c\u0430\u0442(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/SVG\" rel=\"noopener noreferrer nofollow\">SVG<\/a>) \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043e\u043d \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 xml. \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441 \u043d\u0438\u043c.<\/p>\n<p>SVG \u0433\u0440\u0443\u043f\u043f\u044b &#8212; \u0435\u043c\u043e\u0434\u0437\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b .ttf \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430\u0434\u043e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u0442\u043e\u0435\u0441\u0442\u044c \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430, \u0438\u043c\u0435\u043d\u0430 \u0438 \u0434\u043b\u0438\u043d\u044b \u0442\u0430\u0431\u043b\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/developer.apple.com\/fonts\/TrueType-Reference-Manual\/RM06\/Chap6.html#ScalerTypeNote\" rel=\"noopener noreferrer nofollow\">Chap6.html#ScalerTypeNote<\/a> \u0441 \u0441\u0430\u0439\u0442\u0430 Apple, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 4(\u0442\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b) \u0438 5(\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f).<\/p>\n<p><strong>\u041d\u0430\u0447\u043d\u0435\u043c<\/strong><\/p>\n<p>NotoColorEmoji-Regular.ttf \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u043d.<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;cctype&gt; #include &lt;iostream&gt; #include &lt;vector&gt;  typedef unsigned char u8;       typedef unsigned short u16;       typedef unsigned int u32;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 12 \u0431\u0430\u0439\u0442 typedef struct OffsetTable_t {   u32 scaler;   u16 nTabs;   u16 searchRange;   u16 entrySelector;   u16 rangeShift; }OffsetTable;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b typedef struct TableLocation_t\/\/ {   u8 tag[5];   u32 ccks;   u32 off;   u32 len; }TableLocation;  u32 readu32(const u8 *tempN) {   u32 t=((tempN[0] &lt;&lt; 24)  |  (tempN[1] &lt;&lt; 16)  |  (tempN[2] &lt;&lt; 8)   |  (tempN[3]&lt;&lt;0));    return t; }  u16 readu16(u8 *tempN) {   u16 t=(tempN[0] &lt;&lt; 8)  |          tempN[1] ;    return t; }  u8 readu8(u8 *tempN) {   u8 t=tempN[1] ;    return t; }  \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b u8* FindTableByTag(u8* data,const u8 *sTag) {   u8* p = data + 4;\/\/scaler   u16 numTables = readu16(p);\/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446          u32 intTag = readu32(sTag);\/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u0433   u8* t = data + 12;\/\/\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         for (u16 i = 0; i &lt; numTables; ++i) {     u32 thisTag =readu32(t);\/\/tag     if (thisTag == intTag) {       p = t + 8;\/\/offset       u32 offset = readu32(p);             return data + offset;\/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e     }     t += 16;\/\/\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430   }         return 0; } \/\/\u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438  TableLocation* getTable(OffsetTable* oft,TableLocation* t,u8* data) {   oft-&gt;scaler=readu32(data);data+=4;      oft-&gt;nTabs=readu16(data);data+=2;      oft-&gt;searchRange=readu16(data);data+=2;      oft-&gt;entrySelector=readu16(data);data+=2;      oft-&gt;rangeShift=readu16(data);data+=2;      printf(\"%d %d %d %d %d\\n\",oft-&gt;scaler,oft-&gt;nTabs,oft-&gt;searchRange,oft-&gt;entrySelector,oft-&gt;rangeShift);      t=(TableLocation*)malloc(sizeof(TableLocation)*oft-&gt;nTabs);      for(int i=0;i&lt;oft-&gt;nTabs;i++){     data--;     t[i].tag[0]=readu8(data++);     t[i].tag[1]=readu8(data++);     t[i].tag[2]=readu8(data++);     t[i].tag[3]=readu8(data++);     t[i].tag[4]='\\0';     data++;      t[i].ccks=(u32)readu32(data);data+=4;     t[i].off=(u32)readu32(data);data+=4;     t[i].len=(u32)readu32(data);data+=4;     printf(\"%s %d\\n\",t[i].tag,t[i].off);   }   return t; }  int main() {   FILE* file = fopen(\"NotoColorEmoji-Regular.ttf\",\"rb\");    fseek(file, 0, SEEK_END);    size_t size = ftell(file);   fseek(file, 0, SEEK_SET);    u8* data = (u8*)malloc(size+1);   fread(data,size,1,file);   data[size]='\\0';   fclose(file);   printf(\"1 %s\\n\",data);     OffsetTable *offTable=(OffsetTable*)malloc(sizeof(OffsetTable));   TableLocation *tLoc;    tLoc=getTable(offTable,tLoc,data);    free(tLoc);   free(offTable);   free(data);      return 0; }   \u0432\u044b\u0432\u043e\u0434  .\/a.out 1  65536 16 256 4 0 COLR 461536 CPAL 11048 GSUB 34748 OS\/2 460 SVG  4817344 cmap 1976 glyf 1546632 head 404 hhea 332 hmtx 143240 loca 302360 maxp 268 name 556 post 300 vhea 368 vmtx 63652 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 SVG (\u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043c\u0430\u0439\u043a\u0440\u043e\u0441\u043e\u0444\u0442 <a href=\"https:\/\/learn.microsoft.com\/en-us\/typography\/opentype\/spec\/svg\" rel=\"noopener noreferrer nofollow\">spec\/svg<\/a>)<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;cctype&gt; #include &lt;iostream&gt; #include &lt;vector&gt;  typedef unsigned char u8;       typedef unsigned short u16;       typedef unsigned int u32;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 12 \u0431\u0430\u0439\u0442 typedef struct OffsetTable_t {   u32 scaler;   u16 nTabs;   u16 searchRange;   u16 entrySelector;   u16 rangeShift; }OffsetTable;  \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b typedef struct TableLocation_t\/\/ {   u8 tag[5];   u32 ccks;   u32 off;   u32 len; }TableLocation;  u32 readu32(const u8 *tempN) {   u32 t=((tempN[0] &lt;&lt; 24)  |  (tempN[1] &lt;&lt; 16)  |  (tempN[2] &lt;&lt; 8)   |  (tempN[3]&lt;&lt;0));    return t; }  u16 readu16(u8 *tempN) {   u16 t=(tempN[0] &lt;&lt; 8)  |          tempN[1] ;    return t; }  u8 readu8(u8 *tempN) {   u8 t=tempN[1] ;    return t; }  \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b u8* FindTableByTag(u8* data,const u8 *sTag) {   u8* p = data + 4;\/\/scaler   u16 numTables = readu16(p);\/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446          u32 intTag = readu32(sTag);\/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u0433   u8* t = data + 12;\/\/\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         for (u16 i = 0; i &lt; numTables; ++i) {     u32 thisTag =readu32(t);\/\/tag     if (thisTag == intTag) {       p = t + 8;\/\/offset       u32 offset = readu32(p);             return data + offset;\/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e     }     t += 16;\/\/\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430   }         return 0; } \/\/\u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438  TableLocation* getTable(OffsetTable* oft,TableLocation* t,u8* data) {   oft-&gt;scaler=readu32(data);data+=4;      oft-&gt;nTabs=readu16(data);data+=2;      oft-&gt;searchRange=readu16(data);data+=2;      oft-&gt;entrySelector=readu16(data);data+=2;      oft-&gt;rangeShift=readu16(data);data+=2;      printf(\"%d %d %d %d %d\\n\",oft-&gt;scaler,oft-&gt;nTabs,oft-&gt;searchRange,oft-&gt;entrySelector,oft-&gt;rangeShift);      t=(TableLocation*)malloc(sizeof(TableLocation)*oft-&gt;nTabs);      for(int i=0;i&lt;oft-&gt;nTabs;i++){     data--;     t[i].tag[0]=readu8(data++);     t[i].tag[1]=readu8(data++);     t[i].tag[2]=readu8(data++);     t[i].tag[3]=readu8(data++);     t[i].tag[4]='\\0';     data++;      t[i].ccks=(u32)readu32(data);data+=4;     t[i].off=(u32)readu32(data);data+=4;     t[i].len=(u32)readu32(data);data+=4;     printf(\"%s %d\\n\",t[i].tag,t[i].off);   }   return t; }  \/\/\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b SVG struct SVGDRecord_t {     u16 start;     u16 end;     u32 offset;     u32 length; };  typedef struct SVGDRecord_t SVGDRecord;  int main() {   FILE* file = fopen(\"NotoColorEmoji-Regular.ttf\",\"rb\");    fseek(file, 0, SEEK_END);    size_t size = ftell(file);   fseek(file, 0, SEEK_SET);    u8* data = (u8*)malloc(size+1);   fread(data,size,1,file);   data[size]='\\0';   fclose(file);   printf(\"1 %s\\n\",data);       OffsetTable *offTable=(OffsetTable*)malloc(sizeof(OffsetTable));   TableLocation *tLoc;    tLoc=getTable(offTable,tLoc,data);      u8* SVG=FindTableByTag(data,(const u8*)\"SVG \");\/\/4 \u0431\u0430\u0439\u0442\u0430   \/\/\u0447\u0438\u0442\u0430\u0435\u043c   printf(\"\\n\\n\\n%16s %d\\n\",\"SVGv            \",readu16(SVG));SVG=SVG+2;   printf(\"%16s %d\\n\",\"SVGDocListOffset\",readu32(SVG));SVG+=4;   printf(\"%16s %d\\n\",\"SVGvReserved    \",readu32(SVG));SVG+=4;    \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   u32 nt=readu16(SVG);SVG=SVG+2;    \/\/\u043d\u0430\u0447\u0430\u043b\u043e   u8* tempSVG=SVG-2;    \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   printf(\"\\n\\n\\n%16s %d\\n\",\"NumEntries      \",nt);    \/\/   SVGDRecord svgDRecord[nt];      FILE *sFile = 0;      sFile = fopen(\"htmltest1.html\", \"wb\");    \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u043e html   char *tttemp=\"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&lt;\/title&gt;&lt;link rel=\\\"stylesheet\\\" href=\\\"style.css\\\"&gt;&lt;\/head&gt;&lt;body&gt;&lt;div class=\\\"center\\\"&gt;\";   fwrite(tttemp,strlen(tttemp), 1, sFile);    \/\/\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0433\u0440\u0443\u043f\u043f   for(int i=0;i&lt;nt;i++){          svgDRecord[i].start=readu16(SVG);SVG=SVG+2;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"start      \",svgDRecord[i].start);          svgDRecord[i].end=readu16(SVG);SVG=SVG+2;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"end      \",svgDRecord[i].end);          svgDRecord[i].offset=readu32(SVG);SVG=SVG+4;          \/\/printf(\"\\n\\n\\n%16s %d\\n\",\"Offset      \",svgDRecord[i].offset);          svgDRecord[i].length=readu32(SVG);SVG=SVG+4;          \/\/\u043f\u0438\u0448\u0435\u043c \u043f\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0442\u0441\u0442\u0443\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u044b     fwrite(tempSVG+svgDRecord[i].offset,svgDRecord[i].length, 1, sFile);    }    \/\/\u0437\u0430\u043a\u0440\u043e\u0435\u043c   fwrite(\"&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\",strlen(\"&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\"), 1, sFile);   fclose(sFile);    free(tLoc);   free(offTable);   free(data);    return 0; } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0438\u043b\u0438 css \u0444\u0430\u0439\u043b &#8212; style.css<\/p>\n<pre><code class=\"cpp\">\/\/main1.cpp #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; int main(){   std::string t=\"style.css\";   std::ofstream file(t,std::ios::binary);   std::string gMO(\".center {\\n  margin: auto;\\n  width: 60%;\\n  text-align: left;\\n  width: 4250px;\\n  height: 16150px;\\n  overflow-y: scroll;\\n}\\nsvg {\\n  width: 100px;\\n  height: 150px;\\n  overflow: visible !important;\\n  transform:scale(0.1,0.1);\\n  position: absolute;\\n}\\n\");   std::string glyph(\"#glyph\");   std::string glyphN1(\" {\\n\\t\\tmargin: auto;\\n\\t\\toverflow:visible<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-458828","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/458828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=458828"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/458828\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=458828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=458828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=458828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}