Я сам изучил это год назад и быстро прибег к использованию черного слоя с прозрачными частями. Это соответствует моим потребностям. Но то, что вы хотите, возможно ..
Вы хотите соединить один TBitmapLayer с другим и считать его маской. Однако я хочу избежать этих ссылок (и их потенциальных проблем, а также доработки Graphics32) и рассматривать это только как последнее средство.
Есть способ обойтись без выделенного TBitmapLayer, используя свой собственный пиксельный сумматор. Но он не знает о TBitmapLayers и его пикселях XY.
Чтобы правильно перекрыть (или пропустить) части TBitmapLayer
во время рисования на экране, вы можете использовать метод создания типа TPixelCombineEvent
, назначив его как OnPixelCombine
и установив TBitmapLayer.DrawMode
до dmCustom
.
Внутри этого TPixelCombineEvent
метода вы решаете, какие пиксели получаются при заданном фоне B
и переднем плане F
при текущем M
мастер-альфа.
procedure TMyObj.MyPixCombine(F: TColor32; var B: TColor32; M: TColor32);
begin
if not PseudoThisPixelShouldBeMasked then B := F; // ugly and aliased
end;
Проблема здесь в том, что (псевдокод) PseudoThisPixelShouldBeMasked действительно не знает, к какому пикселю это относится и находится ли он внутри маски. Таким образом, вам придется извлечь это значение из компонента F
, например его альфа-значения.
Тогда я выбрал довольно быстрый B := ColorMin(F,B);
, где F черный или белый. Этот слой всегда сверху и, тем не менее, получается прозрачным, а не черным.
Это потому, что любой рендеринг на TBitmapLayer
разрушил бы данные маски, и мне нужно повторно применить их. Однако использование TByteMap
, как предложено ниже (кто это отрицал?) От iamjoosy, может быть интересным, возможно, снижение производительности окажется незначительным.