Запись нечетных артефактов в растровое изображение FMX с помощью TBitmapData в Windows 10
У меня есть странная ошибка в FMX, в которой есть все признаки переполнения указателя или аппаратная ошибка, которую я не смог отследить. Небольшие приложения для его воспроизведения, нет (пока). У меня есть фрагменты кода ниже, но, поскольку мне не удалось воспроизвести это в небольшом приложении, они всего лишь фрагменты.
Приложение загружает некоторые файлы PNG, а затем создает растровые изображения в памяти на основе цветовой кодировки в файлах PNG, то есть создает растровое изображение в памяти, которое достаточно велико, чтобы ограничить все красные области оригинала, и изначально пустой. Существует байтовый массив того же размера, что и растровое изображение в памяти, которое представляет собой маску (ноль, ненулевое значение), указывающую, соответствует ли этот пиксель красной (скажем) области в оригинале или нет. Пользователь может рисовать в приложении, рисовать на временном растровом изображении, а затем, когда они отпускают кнопку мыши, растровое изображение сканируется на массив байтов для записи в растровое изображение в памяти.
Со мной так далеко? В основном, подмножества с цветовой кодировкой оригинала, маски, созданные для цветных областей, закрашивают подмножество. Вот схема:
Это отлично работает на XP (GDI+ canvas) и Win7 (D2D canvas), а также на Win8.1 и большинстве машин Win10. Однако на двух машинах Win10, одна с Intel HD 4600, а другая с Intel Iris 5000, клиент получает странные артефакты на растровом изображении после выполнения маскировки и установки пикселей.
Артефакты - это прямоугольники, разбросанные, по-видимому, случайным образом по растровому изображению, либо большие (скажем, 100x20 пикселей), либо маленькие (скажем, 10x8). Я также видел скриншоты, на которых части остального пользовательского интерфейса, такие как глифы кнопок, также присутствуют на растровом изображении. Вот несколько примеров скриншотов:
Здесь пользователь уже закрасил темно-красную область и закрасил более светлый цвет где-то еще. Появляются эти маленькие пятнистые прямоугольники.
Здесь пользователь нарисовал широкую полосу посередине. Темно-красные и светло-красные прямоугольники являются примерами артефактов после маскировки и отрисовки растрового изображения.
Для меня это звучит так, будто я пишу пиксели с неправильным шагом или что-то в этом роде. Я тщательно проверял код на наличие отдельных ошибок в доступе к массиву или растровым данным, и я использую следующий код для получения или установки пикселей в растровых данных:
function GetBitmapColor(const M : PBitmapData; const X, Y : Integer) : TAlphaColor;
begin
Result := PixelToAlphaColor(
@PAlphaColorArray(M.Data)[Y * (M.Pitch div PixelFormatBytes[M.PixelFormat]) + X],
M.PixelFormat);
end;
procedure SetBitmapColor(const M : PBitmapData; const X, Y : Integer; const C : TAlphaColor);
begin
AlphaColorToPixel(C,
@PAlphaColorArray(M.Data)[Y * (M.Pitch div PixelFormatBytes[M.PixelFormat]) + X],
M.PixelFormat);
end;
Они основаны на примере кода для доступа к растровым данным в документации Сиэтла. Утверждения, что X и Y находятся в допустимом диапазоне (в размере растрового изображения), все в порядке. Хотя это происходит на приведенной выше ОС и оборудовании, это не относится к той же ОС (Win10) с другими картами - другой Intel HD, Nvidia и т. Д.; на планшете Win10; на Win10 VM я пробовал; на моей машине разработки Win7; и т. д. Что касается переполнения буфера и т. д., компиляция с проверками диапазона не дает никаких ошибок и не имеет никаких подтверждений моей собственной проверки допустимых координат X/Y по размеру растрового изображения.
Ошибка возникает как с XE6, так и с Сиэтлом на одних и тех же машинах.
Я не могу воспроизвести это. Они находятся в процессе настройки удаленного доступа к этой машине, но все еще будет сложно выяснить, что происходит, поэтому мне интересно, видел ли кто-то что-то подобное раньше, или есть конкретные предложения конкретных способов проверки переполнение указателя растрового изображения или подобное?