1 |
/* |
/* |
2 |
Copyright (c) 2014-2016 Christian Schoenebeck |
Copyright (c) 2014-2017 Christian Schoenebeck |
3 |
|
|
4 |
This file is part of "gigedit" and released under the terms of the |
This file is part of "gigedit" and released under the terms of the |
5 |
GNU General Public License version 2. |
GNU General Public License version 2. |
33 |
typedef std::vector<DLS::range_t> DimensionZones; |
typedef std::vector<DLS::range_t> DimensionZones; |
34 |
typedef std::map<gig::dimension_t,DimensionZones> Dimensions; |
typedef std::map<gig::dimension_t,DimensionZones> Dimensions; |
35 |
|
|
|
typedef std::map<gig::dimension_t,int> DimensionCase; |
|
|
|
|
36 |
typedef std::map<gig::dimension_t, int> DimensionRegionUpperLimits; |
typedef std::map<gig::dimension_t, int> DimensionRegionUpperLimits; |
37 |
|
|
38 |
typedef std::set<Glib::ustring> Warnings; |
typedef std::set<Glib::ustring> Warnings; |
272 |
return dims; |
return dims; |
273 |
} |
} |
274 |
|
|
|
inline int getDimensionIndex(gig::dimension_t type, gig::Region* rgn) { |
|
|
for (uint i = 0; i < rgn->Dimensions; ++i) |
|
|
if (rgn->pDimensionDefinitions[i].dimension == type) |
|
|
return i; |
|
|
return -1; |
|
|
} |
|
|
|
|
275 |
static void fillDimValues(uint* values/*[8]*/, DimensionCase dimCase, gig::Region* rgn, bool bShouldHaveAllDimensionsPassed) { |
static void fillDimValues(uint* values/*[8]*/, DimensionCase dimCase, gig::Region* rgn, bool bShouldHaveAllDimensionsPassed) { |
276 |
#if DEBUG_COMBINE_INSTRUMENTS |
#if DEBUG_COMBINE_INSTRUMENTS |
277 |
printf("dimvalues = { "); |
printf("dimvalues = { "); |
313 |
} |
} |
314 |
} |
} |
315 |
|
|
|
/** |
|
|
* Returns the sum of all bits of all dimensions defined before the given |
|
|
* dimensions (@a type). This allows to access cases of that particular |
|
|
* dimension directly. |
|
|
* |
|
|
* @param type - dimension that shall be used |
|
|
* @param rgn - parent region of that dimension |
|
|
*/ |
|
|
inline int baseBits(gig::dimension_t type, gig::Region* rgn) { |
|
|
int previousBits = 0; |
|
|
for (uint i = 0; i < rgn->Dimensions; ++i) { |
|
|
if (rgn->pDimensionDefinitions[i].dimension == type) break; |
|
|
previousBits += rgn->pDimensionDefinitions[i].bits; |
|
|
} |
|
|
return previousBits; |
|
|
} |
|
|
|
|
316 |
inline int dimensionRegionIndex(gig::DimensionRegion* dimRgn) { |
inline int dimensionRegionIndex(gig::DimensionRegion* dimRgn) { |
317 |
gig::Region* rgn = dimRgn->GetParent(); |
gig::Region* rgn = dimRgn->GetParent(); |
318 |
int sz = sizeof(rgn->pDimensionRegions) / sizeof(gig::DimensionRegion*); |
int sz = sizeof(rgn->pDimensionRegions) / sizeof(gig::DimensionRegion*); |
345 |
const gig::dimension_def_t& def = rgn->pDimensionDefinitions[iDimension]; |
const gig::dimension_def_t& def = rgn->pDimensionDefinitions[iDimension]; |
346 |
int iDimRgn = dimensionRegionIndex(dimRgn); |
int iDimRgn = dimensionRegionIndex(dimRgn); |
347 |
int iBaseBits = baseBits(type, rgn); |
int iBaseBits = baseBits(type, rgn); |
348 |
|
assert(iBaseBits >= 0); |
349 |
int mask = ~(((1 << def.bits) - 1) << iBaseBits); |
int mask = ~(((1 << def.bits) - 1) << iBaseBits); |
350 |
|
|
351 |
#if DEBUG_COMBINE_INSTRUMENTS |
#if DEBUG_COMBINE_INSTRUMENTS |