-
если не ошибаюсь, в ТВижн чё то такое было, и с плавающими итп... без всяких vsprintf_s. по крайней мере видел в исходниках Дос Навигатора
-
Бился сейчас с bitmap. До чего же он кривой!
1) Assign иногда работает, иногда падает на ровном месте. В частности пытался сделать копию одного битмапа в другом, так после assign второй битмап упал на Free. 2) Проблема была в глюке, когда присваиваешь ширину (или высоту, не помню уже сейчас), потом ее увеличиваешь, а потом уменьшаешь и scanline пользоваться невозможно = nil. 3) NewDIBBitmap(ширина,высота,pf4bit) - делаем битмап подобным другому. Но scanline выдает nil. А достаточно сделать Canvas.FillRect(BoundsRect), чтоб залить всю канву черным (и, тем самым, "включить" наконец scanline) и все нормализуется. Спрашивается, какого хрена? По идее мы создали битмап, данные указаны, память под битовые данные выделена, а данных на самом деле нет.
Имхо надо выбрасывать этот глюкавый битмап и делать на основе стандартного новый.
-
Ну, так поправить Bitmap чтобы выделял память после создания и все свойства корректно заполнял (если текущее поведение не было сделано с целью отодвинуть алокацию ресурсов до первого использования - тогда надо искать/добавить возможность делать это по требованию).
-
Так если бы это было только в этом. А с падениями на Free после Assign или (о, боже!) SaveToFile после работы со scanline, которые вылетают в ntdll, как быть? Ошибка в коде исключена - тоже самое в VCL работает без запинки. Вышеописанное на одном изображении проходит нормально, на следующем - падает. Причем меняешь изображения местами - сначала падающее, потом нет - все равно на втором падает.
-
Кстати, в NewDIBBitmap память для DIBBits выделяется сразу, но непонятно, почему scanline выдает nil. И на кой черт в GetScanline:
Result := Pointer( PAnsiChar( fDIBBits ) + fScanLineSize * Y );
указатель fDIBBits оборачивается PAnsiChar?? Откуда такая дичь? Мб тут проблема? Неужели сложно сделать:
Result := Pointer( DWORD( fDIBBits ) + fScanLineSize * Y );
-
> Откуда такая дичь?
Ну, так арифметика с Pointer-ами (до недавнего времени) работает только с PAnsiChar(). Так и привыкли.
> Мб тут проблема?
Да, вроде, вполне безобидный код. Возвратит лажу, если fDIBBits указывает на что-то левое или fScanLineSize вычислен неправильно.
-
Проблему с падением при уменьшении глубины цвета решил - тупо загнал одинаковые палитры в битмапы и отрисовал большую глубину на меньшую. Все "сконвертилось", палитра не искажена, запись и удаление без вылетов. Костыль, конечно, но другого выхода пока нет.
-
> отрисовал большую глубину на меньшую
А разве есть какой-то другой способ?
-
>> А разве есть какой-то другой способ? Руками. Тем более, если палитра заранее неизвестна (дизеринг). В данном случае палитра была известна и "умещалась" в 16 цветов. Но могут быть варианты, когда исходная палитра имеет цветов больше, чем результирующая.
|