Комментарии 3
Сарказм: даже если оставить в стороне ваш очаровательный микс чистого Си и C++ (с чем связано?) и фатальную нелюбовь к обработке ошибок (например, даже при наличии файла вам могут его не дать открыть и тем более записать - по многим причинам), остаются вопросы по коду.
Пардонь-те, зачем такие изыски: сначала декремент указателя, потом инкремент?:
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++;
Может слегка исправить возможный баг: переписать:
u8 readu8(u8 *tempN)
{
u8 t=tempN[1] ;
return t;
}
как:
u8 readu8(u8 *tempN)
{
u8 t=tempN[0] ;
return t;
}
Прим.: индекс изменить с 1 на 0.
По-идее должно быть легче и понятнее.
Или, как вариант, в этом подходе есть "верхний" смысл ... Не раскроете тему?
если честно в своё время хотел переписать, что знал на Си, потом столкнулся неподнятием той темы, по некоторым причинам, потом взял тайм-аут на редактор текста и детокс в java, и вернулся обратно уже с четко назревшим планом пофиг на Си если там получается заковыристая идея.
спасибо опечатался (с -- и ++ тогда давно отладку делал заметилось и оставил так), проверил опечатался извините.
помимо того что вы описали еще есть нюанс на каком движке открываем страницу, в гноме всё изящно, в лисе у меня лично артефакты есть, пока забил на это
фаерфокс или то что в нём запоминает некоторую группу g1 и она проходит дублем от родителя
пример

суть статьи только емодзи, этот кусочек кода подходит под него, в самом текстовом движке проще конечно на С++ будет
под движок надо скрипт какойто писать под локализацию и сам принцип очень много тем охватывает, в видео он делает скорее всего АСКИ, у меня уже строки u32string на все языки работает, потому и нужен скрипт (на язык по атласу наверно соотв это по 1 вызову)
ошибки пока не обрабатываю надо будет, написать проверки на виды сборки, пока это несерьёзная реализация пока присматриваюсь с тем что получается
кто будет читать эту статью знайте, все браузеры группы svg-inline рисуют по разному, кто-то их по каким-то причинам пересчитывает соотв если это группа из svg то пропуск. в целом начало алгоритма не знаю, но далее чтобы изолировать каждый елемент-SVG надо вести счет групп. в С++ это делать накладно проще делать в js
соотв для кросс-браузера и такого количества SVG елементов, надо изолировать каждый елемент по g id(изменить) и его fill/use ="url(#его сюда продублировать)"
Скрытый текст
// Получаем все элементы <svg> на странице
var elements = document.body.getElementsByTagName('svg');
// Создаем объект для хранения значений атрибута id и fill
var fillCounts = {};
var idCounts = {};
// Начинаем с 12000 для id
var idStart = 12000;
// Сначала обрабатываем элементы <defs> для id
for (var i = 0; i < elements.length; i++) {
// Находим элемент <defs> внутри текущего svg
var defs = elements[i].getElementsByTagName('defs')[0];
// Если элемент <defs> существует
if (defs) {
// Получаем все дочерние элементы текущего defs
var defsChildren = defs.getElementsByTagName('*'); // Получаем все элементы внутри defs
for (var j = 0; j < defsChildren.length; j++) {
// Получаем значение атрибута id
var idValue = defsChildren[j].getAttribute('id');
// Обрабатываем id
if (idValue && /^g\d+$/.test(idValue)) {
if (!idCounts[idValue]) {
idCounts[idValue] = 0;
}
idCounts[idValue]++;
}
}
}
// Обрабатываем элементы <path> для fill
var paths = elements[i].getElementsByTagName('path'); // Получаем все элементы <path>
for (var j = 0; j < paths.length; j++) {
var fillValue = paths[j].getAttribute('fill');
// Обрабатываем fill
if (fillValue && /^url\D#g\d+/.test(fillValue)) {
if (!fillCounts[fillValue]) {
fillCounts[fillValue] = 0;
}
fillCounts[fillValue]++;
}
}
}
// Теперь изменяем id и fill элементов на уникальные значения g12000, g12001 и т.д.
let currentIdNumber = idStart; // Начинаем с 12000
for (var i = 0; i < elements.length; i++) {
var defs = elements[i].getElementsByTagName('defs')[0];
if (defs) {
var defsChildren = defs.getElementsByTagName('*');
// Сначала создаем мапу для соответствия старых ID новым ID
let oldToNewIdMap = {};
for (var j = 0; j < defsChildren.length; j++) {
var idValue = defsChildren[j].getAttribute('id');
// Изменяем id и запоминаем соответствие старого ID новому ID
if (idValue && /^g\d+$/.test(idValue)) {
let newId = 'g' + currentIdNumber;
oldToNewIdMap[idValue] = newId; // Сохраняем соответствие старого ID новому ID
defsChildren[j].setAttribute('id', newId);
currentIdNumber++; // Увеличиваем номер для следующего ID
}
}
// Теперь обновляем fill в элементах <path>
var paths = elements[i].getElementsByTagName('path'); // Получаем все элементы <path>
for (var j = 0; j < paths.length; j++) {
var fillValue = paths[j].getAttribute('fill');
// Изменяем fill, если он соответствует старым ID из oldToNewIdMap
if (fillValue && /^url\D#g\d+/.test(fillValue)) {
let oldFillIdMatch = fillValue.match(/#(g\d+)/);
if (oldFillIdMatch && oldToNewIdMap[oldFillIdMatch[1]]) {
paths[j].setAttribute('fill', 'url(#' + oldToNewIdMap[oldFillIdMatch[1]] + ')');
}
}
}
// Теперь обрабатываем элементы <use>
var uses = elements[i].getElementsByTagName('use'); // Получаем все элементы <use>
for (var j = 0; j < uses.length; j++) {
var fillValue = uses[j].getAttribute('fill');
if (fillValue && /^url\D#g\d+/.test(fillValue)) {
let oldUseIdMatch = fillValue.match(/#(g\d+)/);
if (oldUseIdMatch && oldToNewIdMap[oldUseIdMatch[1]]) {
uses[j].setAttribute('fill', 'url(#' + oldToNewIdMap[oldUseIdMatch[1]] + ')');
}
}
}
}
}
Простая отрисовка емодзи в атлас из таблицы .ttf (NotoColorEmoji)