Конференция "KOL" » KOL 3.23 [Delphi, Windows]
 
  • dlf (06.10.17 22:42) [100]
    если не ошибаюсь, в ТВижн чё то такое было, и с плавающими итп... без всяких vsprintf_s. по крайней мере видел в исходниках Дос Навигатора
  • Dimaxx © (16.02.18 14:04) [101]
    Бился сейчас с bitmap. До чего же он кривой!

    1) Assign иногда работает, иногда падает на ровном месте. В частности пытался сделать копию одного битмапа в другом, так после assign второй битмап упал на Free.
    2) Проблема была в глюке, когда присваиваешь ширину (или высоту, не помню уже сейчас), потом ее увеличиваешь, а потом уменьшаешь и scanline пользоваться невозможно = nil.
    3) NewDIBBitmap(ширина,высота,pf4bit) - делаем битмап подобным другому. Но scanline выдает nil. А достаточно сделать Canvas.FillRect(BoundsRect), чтоб залить всю канву черным (и, тем самым, "включить" наконец scanline) и все нормализуется. Спрашивается, какого хрена? По идее мы создали битмап, данные указаны, память под битовые данные выделена, а данных на самом деле нет.

    Имхо надо выбрасывать этот глюкавый битмап и делать на основе стандартного новый.
  • Netspirit (16.02.18 15:03) [102]
    Ну, так поправить Bitmap чтобы выделял память после создания и все свойства корректно заполнял (если текущее поведение не было сделано с целью отодвинуть алокацию ресурсов до первого использования - тогда надо искать/добавить возможность делать это по требованию).
  • Dimaxx © (16.02.18 17:16) [103]
    Так если бы это было только в этом. А с падениями на Free после Assign или (о, боже!) SaveToFile после работы со scanline, которые вылетают в ntdll, как быть? Ошибка в коде исключена - тоже самое в VCL работает без запинки. Вышеописанное на одном изображении проходит нормально, на следующем - падает. Причем меняешь изображения местами - сначала падающее, потом нет - все равно на втором падает.
  • Dimaxx © (16.02.18 17:26) [104]
    Кстати, в NewDIBBitmap память для DIBBits выделяется сразу, но непонятно, почему scanline выдает nil. И на кой черт в GetScanline:

    Result := Pointer( PAnsiChar( fDIBBits ) + fScanLineSize * Y );

    указатель fDIBBits оборачивается PAnsiChar?? Откуда такая дичь? Мб тут проблема? Неужели сложно сделать:

    Result := Pointer( DWORD( fDIBBits ) + fScanLineSize * Y );
  • Netspirit (16.02.18 18:26) [105]

    > Откуда такая дичь?

    Ну, так арифметика с Pointer-ами (до недавнего времени) работает только с PAnsiChar(). Так и привыкли.

    > Мб тут проблема?

    Да, вроде, вполне безобидный код. Возвратит лажу, если fDIBBits указывает на что-то левое или fScanLineSize вычислен неправильно.
  • Dimaxx © (19.02.18 11:54) [106]
    Проблему с падением при уменьшении глубины цвета решил - тупо загнал одинаковые палитры в битмапы и отрисовал большую глубину на меньшую. Все "сконвертилось", палитра не искажена, запись и удаление без вылетов. Костыль, конечно, но другого выхода пока нет.
  • Styx © (19.02.18 22:59) [107]

    > отрисовал большую глубину на меньшую

    А разве есть какой-то другой способ?
  • Dimaxx © (20.02.18 10:04) [108]
    >> А разве есть какой-то другой способ?
    Руками. Тем более, если палитра заранее неизвестна (дизеринг). В данном случае палитра была известна и "умещалась" в 16 цветов. Но могут быть варианты, когда исходная палитра имеет цветов больше, чем результирующая.
 
Конференция "KOL" » KOL 3.23 [Delphi, Windows]
Есть новые Нет новых   [103740   +63][b:0.002][p:0.001]