2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2020 by Christian Schoenebeck * |
* Copyright (C) 2003-2021 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
3807 |
* @throws gig::Exception if requested zone could not be deleted |
* @throws gig::Exception if requested zone could not be deleted |
3808 |
*/ |
*/ |
3809 |
void Region::DeleteDimensionZone(dimension_t type, int zone) { |
void Region::DeleteDimensionZone(dimension_t type, int zone) { |
3810 |
|
if (!Dimensions) |
3811 |
|
throw gig::Exception("Could not delete dimension zone, because there is no dimension at all."); |
3812 |
dimension_def_t* oldDef = GetDimensionDefinition(type); |
dimension_def_t* oldDef = GetDimensionDefinition(type); |
3813 |
if (!oldDef) |
if (!oldDef) |
3814 |
throw gig::Exception("Could not delete dimension zone, no such dimension of given type"); |
throw gig::Exception("Could not delete dimension zone, no such dimension of given type"); |
3837 |
// requested by the arguments of this method call) to the temporary |
// requested by the arguments of this method call) to the temporary |
3838 |
// region, and don't use Region::CopyAssign() here for this task, since |
// region, and don't use Region::CopyAssign() here for this task, since |
3839 |
// it would also alter fast lookup helper variables here and there |
// it would also alter fast lookup helper variables here and there |
3840 |
dimension_def_t newDef; |
dimension_def_t newDef = {}; |
3841 |
for (int i = 0; i < Dimensions; ++i) { |
for (int i = 0; i < Dimensions; ++i) { |
3842 |
dimension_def_t def = pDimensionDefinitions[i]; // copy, don't reference |
dimension_def_t def = pDimensionDefinitions[i]; // copy, don't reference |
3843 |
// is this the dimension requested by the method arguments? ... |
// is this the dimension requested by the method arguments? ... |
3848 |
} |
} |
3849 |
tempRgn->AddDimension(&def); |
tempRgn->AddDimension(&def); |
3850 |
} |
} |
3851 |
|
// silence clang sanitizer warning |
3852 |
|
if (newDef.dimension == dimension_none) |
3853 |
|
throw gig::Exception("Unexpected internal failure resolving dimension in DeleteDimensionZone() [this is a bug]."); |
3854 |
|
|
3855 |
// find the dimension index in the tempRegion which is the dimension |
// find the dimension index in the tempRegion which is the dimension |
3856 |
// type passed to this method (paranoidly expecting different order) |
// type passed to this method (paranoidly expecting different order) |
3951 |
* @throws gig::Exception if requested zone could not be splitted |
* @throws gig::Exception if requested zone could not be splitted |
3952 |
*/ |
*/ |
3953 |
void Region::SplitDimensionZone(dimension_t type, int zone) { |
void Region::SplitDimensionZone(dimension_t type, int zone) { |
3954 |
|
if (!Dimensions) |
3955 |
|
throw gig::Exception("Could not split dimension zone, because there is no dimension at all."); |
3956 |
dimension_def_t* oldDef = GetDimensionDefinition(type); |
dimension_def_t* oldDef = GetDimensionDefinition(type); |
3957 |
if (!oldDef) |
if (!oldDef) |
3958 |
throw gig::Exception("Could not split dimension zone, no such dimension of given type"); |
throw gig::Exception("Could not split dimension zone, no such dimension of given type"); |
3979 |
// requested by the arguments of this method call) to the temporary |
// requested by the arguments of this method call) to the temporary |
3980 |
// region, and don't use Region::CopyAssign() here for this task, since |
// region, and don't use Region::CopyAssign() here for this task, since |
3981 |
// it would also alter fast lookup helper variables here and there |
// it would also alter fast lookup helper variables here and there |
3982 |
dimension_def_t newDef; |
dimension_def_t newDef = {}; |
3983 |
for (int i = 0; i < Dimensions; ++i) { |
for (int i = 0; i < Dimensions; ++i) { |
3984 |
dimension_def_t def = pDimensionDefinitions[i]; // copy, don't reference |
dimension_def_t def = pDimensionDefinitions[i]; // copy, don't reference |
3985 |
// is this the dimension requested by the method arguments? ... |
// is this the dimension requested by the method arguments? ... |
3990 |
} |
} |
3991 |
tempRgn->AddDimension(&def); |
tempRgn->AddDimension(&def); |
3992 |
} |
} |
3993 |
|
// silence clang sanitizer warning |
3994 |
|
if (newDef.dimension == dimension_none) |
3995 |
|
throw gig::Exception("Unexpected internal failure resolving dimension in SplitDimensionZone() [this is a bug]."); |
3996 |
|
|
3997 |
// find the dimension index in the tempRegion which is the dimension |
// find the dimension index in the tempRegion which is the dimension |
3998 |
// type passed to this method (paranoidly expecting different order) |
// type passed to this method (paranoidly expecting different order) |
5968 |
PianoReleaseMode = orig->PianoReleaseMode; |
PianoReleaseMode = orig->PianoReleaseMode; |
5969 |
DimensionKeyRange = orig->DimensionKeyRange; |
DimensionKeyRange = orig->DimensionKeyRange; |
5970 |
scriptPoolFileOffsets = orig->scriptPoolFileOffsets; |
scriptPoolFileOffsets = orig->scriptPoolFileOffsets; |
5971 |
pScriptRefs = orig->pScriptRefs; |
// deep copy of pScriptRefs required (to avoid undefined behaviour) |
5972 |
|
if (pScriptRefs) delete pScriptRefs; |
5973 |
|
pScriptRefs = new std::vector<_ScriptPooolRef>; |
5974 |
|
if (orig->pScriptRefs) |
5975 |
|
*pScriptRefs = *orig->pScriptRefs; |
5976 |
scriptVars = orig->scriptVars; |
scriptVars = orig->scriptVars; |
5977 |
|
|
5978 |
// free old midi rules |
// free old midi rules |