5.2. Поддержка насыщенности

На верх  Назад  Вперёд

Одним из важных моментов MMX является поддержка насыщенных операций. Если операция приведёт к переполнению, то значение останется наибольшим или наименьшим из всех возможных значений для данного типа данных: Если вы используете тип byte, то в нормальном режиме вы получите 250+12=6. Это очень раздражает, когда выполняются операции с цветом или звуком, когда вам приходится использовать слово данных, чтобы проверить, что значение более 255. Насыщенные операции поддерживаются модулем MMX. Если вы хотите их использовать, вам нужно просто включить поддержку насыщенности: $saturation+

Пример:

Program SaturationDemo;
{
  Пример для насыщенности, шкала данных (например, для аудио)
  От 1.5 до минус бесконечности
}
uses mmx;
var
  audio1 : tmmxword;
  I: smallint;
const
  helpdata1 : tmmxword = ($c000,$c000,$c000,$c000);
  helpdata2 : tmmxword = ($8000,$8000,$8000,$8000);
begin
  { audio1 содержит четыре 16битных аудио-сэмпла }
{$mmx+}
  { преобразовать его в $8000, определить как 0, умножить данные на 0.75 }
  audio1:=(audio1+helpdata2)*(helpdata1);
{$saturation+}
  { избежать переполнения (все значения > $ffff будут $ffff) }
  audio1:=(audio1+helpdata2)-helpdata2;
{$saturation-}
  { теперь умножаем на 2 и преобразуем в целое }
  for i:=0 to 3 do
    audio1[i] := audio1[i] shl 1;
  audio1:=audio1-helpdata2;
{$mmx-}
end.