OberonCore
https://forum.oberoncore.ru/

Кросс-платформенное чтение растров
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6961
Страница 1 из 1

Автор:  arisu [ Суббота, 03 Июнь, 2023 07:43 ]
Заголовок сообщения:  Кросс-платформенное чтение растров

кстати. вот вам магия для блита RGBA-битмапов из памяти без GDI+. смотреть в районе `AlphaBlend()`. оный `AlphaBlend()` надо в WinApi добавить, и одну структуру. тоже у меня можно взять. готовить битмап надо точно как у меня написано: с обменом цветов, и с premultiplied alpha.

Автор:  Иван Денисов [ Воскресенье, 04 Июнь, 2023 23:10 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
кстати. вот вам магия для блита RGBA-битмапов из памяти без GDI+. смотреть в районе `AlphaBlend()`. оный `AlphaBlend()` надо в WinApi добавить, и одну структуру. тоже у меня можно взять. готовить битмап надо точно как у меня написано: с обменом цветов, и с premultiplied alpha.

Здорово! то, что надо, похоже, я смогу это изучить чуть позднее.

Автор:  arisu [ Понедельник, 05 Июнь, 2023 00:05 ]
Заголовок сообщения:  Re: BlackBox 2.0

и можете попереть у меня из Raster читалку пингов, например. там можно собрать читалку и распаковщик deflate-потоков в один очень компактный файлик, и не надо таскать за собой большие библиотеки типа Vi и Zlib.

Автор:  Иван Денисов [ Понедельник, 05 Июнь, 2023 04:16 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
и можете попереть у меня из Raster читалку пингов, например. там можно собрать читалку и распаковщик deflate-потоков в один очень компактный файлик, и не надо таскать за собой большие библиотеки типа Vi и Zlib.

Да, это очень круто. Похоже это уберёт проблему с пропадающими картинками в Windows.

Автор:  arisu [ Понедельник, 05 Июнь, 2023 14:32 ]
Заголовок сообщения:  Re: BlackBox 2.0

да, забыл добавить. если где-то в LC не указана лицензия на код, и автора или нет, или только я (это одно и то же) — то такой Щидевр можно брать под лицензией WTFPL. это Официальное Разрешение типа.

Автор:  Иван Денисов [ Понедельник, 05 Июнь, 2023 19:01 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
да, забыл добавить. если где-то в LC не указана лицензия на код, и автора или нет, или только я (это одно и то же) — то такой Щидевр можно брать под лицензией WTFPL. это Официальное Разрешение типа.

Так как этот замечательный тип лицензии допускает перепубликацию под любой другой люцензией, то в составе сборки это будет под BSD 2-Clause License.

Автор:  arisu [ Понедельник, 05 Июнь, 2023 23:54 ]
Заголовок сообщения:  Re: BlackBox 2.0

без проблем. именно это и имеется в виду: цепляйте чего хотите, автор согласный. ;-)

Автор:  arisu [ Вторник, 01 Август, 2023 06:28 ]
Заголовок сообщения:  Re: BlackBox 2.0

кстати. если вы у меня брали читалку PNG, то там маленький багфикс. везде, где:
Код:
* UP.UP.bitdepth + UP.UP.bitdepth - 1) DIV UP.UP.bitdepth;

должно быть:
Код:
* UP.UP.bitdepth + 8 - 1) DIV 8;

(там два места таких.)

Автор:  Иван Денисов [ Вторник, 08 Август, 2023 00:45 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
кстати. если вы у меня брали читалку PNG, то там маленький багфикс. везде, где:
Код:
* UP.UP.bitdepth + UP.UP.bitdepth - 1) DIV UP.UP.bitdepth;

должно быть:
Код:
* UP.UP.bitdepth + 8 - 1) DIV 8;

(там два места таких.)

Это ещё предстоит делать. Спасибо за исправление.

Автор:  Иван Денисов [ Четверг, 19 Октябрь, 2023 02:28 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

Александр помог адаптировать код arisu под Блэкбокс 2.0, и после этого я в целом осмыслил, что получается универсальный модуль WinRasters, который может рисовать любые форматы для которых сделан загрузчик изображений в структуру StdRasters.Image
Загрузчики я придумал присоединять прямо к StdRasters.Raster

StdRasters.Load превращает растр в картинку с возможностью чтения данных, это раз, а во вторых её уже может рисовать WinRasters.

Самое главное - уход от GDI+ привел к тому, что картинки перестали пропадать при исчерпании RAM.

Опробовать (покритиковать и предложить какие-то рационализаторские предложения) возможно в сборке 208.

Пока это главным образом надо для Windows, так как в Linux изображение не пропадают. Но постепенно можно на всех платформах что-то подобным образом доделать.

Есть проблема с раскодированием рисунков, нарисованных в MS Paint. Я пока закомментировал строгую проверку idat.Error().
Код:
            Log.String("DONE-EOF: err="); Log.Bool(idat.Error()); Log.Ln;
            END;
            IF idat.crcIsWrong THEN img := NIL END
            (*  this leads to break reading of PNG images from MS Paint    TODO
            IF idat.Error() OR idat.crcIsWrong THEN img := NIL END
            *)
         END
      END DecodeImage;

Автор:  arisu [ Суббота, 21 Октябрь, 2023 06:30 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

я рад, что пригодилось. обязательно потом посмотрю на ваш вариант: может там чего вкусного украсть есть. ;-)

насчёт картинок из паинта: можно мне парочку таких? это вполне может быть какая-то ошибка в моём коде. архивом в ЛС, например. у меня пока что проблем с чтением картинок не было (16-битный цвет только не проверял, за неимением таких).

я имею подозрение, что m$ как обычно плюёт на стандарты (в большинстве случаев причина именно такая), но мало ли… раз в сто лет и я виноват бываю. ;-)

Автор:  Иван Денисов [ Суббота, 21 Октябрь, 2023 22:44 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

Вот такая картинка из Paint

Вложения:
4445.png
4445.png [ 13.2 КБ | Просмотров: 16671 ]

Автор:  arisu [ Воскресенье, 22 Октябрь, 2023 10:03 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

таки мой косяк: криво портировал считалку adler32 с сишечки. забыл про то, что сишечный `%` и обероновский `MOD` — разные вещи. в общем, или возьмите у меня починеный "RasterInflate" (я там чуть-чуть лишнего выкинул), или просто замените там `PutByte` на вот это:
Код:
   PROCEDURE (inf: Inflater) PutByte (bt: SHORTCHAR), NEW;
   BEGIN
      inf.dict[inf.dictEnd] := bt;
      inf.dictEnd := (inf.dictEnd + 1) MOD LEN(inf.dict);
      IF inf.mode = ZLib THEN
         INC(inf.a32s1, ORD(bt));
         INC(inf.a32s2, inf.a32s1);
         IF (inf.a32s1 < 0) OR (inf.a32s2 < 0) THEN
            DEC(inf.a32s2, inf.a32s1);
            DEC(inf.a32s1, ORD(bt));
            inf.a32s1 := inf.a32s1 MOD AdlerBase;
            inf.a32s2 := inf.a32s2 MOD AdlerBase;
            INC(inf.a32s1, ORD(bt));
            INC(inf.a32s2, inf.a32s1)
         END
      END;
      INC(inf.totalUnpacked)
   END PutByte;

спасибо за найденый баг!

Автор:  arisu [ Воскресенье, 22 Октябрь, 2023 10:08 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

вы, кстати, если что не работает у меня взятое — не стесняйтесь меня сразу напрямую пинать (в теме, или лс-ом). я очень люблю багрепорты (в прямом, неироничном смысле).

Автор:  arisu [ Воскресенье, 22 Октябрь, 2023 10:19 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

p.s.: на самом деле вполне достаточно только s2 проверять, он переполнится значительно быстрее, чем s1 — но давайте играть безопасно. на всякий случай.

Автор:  Иван Денисов [ Понедельник, 23 Октябрь, 2023 00:52 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

arisu писал(а):
просто замените там `PutByte` на вот это

Класс, спасибо. Да, теперь читает.

Автор:  Иван Денисов [ Вторник, 05 Декабрь, 2023 01:26 ]
Заголовок сообщения:  Re: Кросс-платформенное чтение растров

Использованы алгоритмы билинейной фильтрации, которые arisu портировал из A2, для вывода в Windows изображений, которые требуют масштабирования. Raster/Mod/Scale.odc.
Так как часто в Windows применяется увеличение масштаба программы, то случай весьма частый.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/