void BuildAndEditEffectsList() {
short childCount, index;
OSErr err;
QTAtomContainer effectsList, effectSample;
QTParameterDialog effectsDialog;
/* これらがリストに表示したいエフェクト */
const OSType supportedEffects[] = {
kBlurImageFilterType,
kBrightnessContrastImageFilterType
};
/* エフェクトの現在のリストを取得 */
/* 最小値 == 最大値 == -1、つまり最小値も最大値もなし */
err = QTGetEffectsList( &effectsList, -1, -1, 0 );
if (err != noErr) goto bailError;
/* リスト中のエフェクト数のカウントを取得 */
childCount = QTCountChildrenOfType(
effectsList, kParentAtomIsContainer, kEffectNameAtom );
/* 反復処理を実行してリスト中の各エフェクトを処理し、
上であらかじめ選択したエフェクトと一致しないものを削除 */
for( index = childCount; index > 0 ; index -- )
{
QTAtom effectTypeAtom;
QTAtomID id;
long effectCodeSize;
Ptr effectCodePtr;
OSType effectCode;
short j;
Boolean effectIsSupported;
effectTypeAtom = QTFindChildByIndex( effectsList,
kParentAtomIsContainer,
kEffectTypeAtom, index, &id );
err = QTLockContainer( effectsList );
if (err != noErr) goto bailError;
err = QTGetAtomDataPtr( effectsList,
effectTypeAtom,
&effectCodeSize,
&effectCodePtr);
if (err != noErr) goto bailError;
/* 実際のエフェクトコードを取得 */
effectCode = *(OSType *)effectCodePtr;
err = QTUnlockContainer( effectsList );
/* 現在のエフェクトが、上で選択したリストに
あるかどうかチェック */
for( j=0, effectIsSupported=false ;
j<sizeof(supportedEffects)/sizeof(OSType) ; j++ )
{
if ( effectCode == supportedEffects[j] )
{
effectIsSupported = true;
break;
}
}
/* 上記のカスタムリストに一致するものがなかった場合は、
このエフェクトを削除 */
if ( !effectIsSupported )
{
QTAtom effectNameAtom;
effectNameAtom = QTFindChildByIndex( effectsList,
kParentAtomIsContainer, kEffectNameAtom, index, &id );
err = QTRemoveAtom( effectsList, effectTypeAtom );
err = QTRemoveAtom( effectsList, effectNameAtom );
}
}
/* 新しく作成されたエフェクトリストを使用して、
その後で使用するダイアログを作成 */
err = QTNewAtomContainer( &effectSample );
err = QTCreateStandardParameterDialog( effectsList,
effectSample, 0, &effectsDialog );
bailError:
return;
}
|