const PolyphaseFilter *MakePolyphaseFilter( int iUpFactor, float fCutoffFrequency ) { PolyphaseFiltersLock.Lock(); pair<int,float> params( make_pair(iUpFactor, fCutoffFrequency) ); FilterMap::const_iterator it = g_mapPolyphaseFilters.find(params); if( it != g_mapPolyphaseFilters.end() ) { /* We already have a filter for this upsampling factor and cutoff; use it. */ PolyphaseFilter *pPolyphase = it->second; PolyphaseFiltersLock.Unlock(); return pPolyphase; } int iWinSize = L*iUpFactor; float *pFIR = new float[iWinSize]; GenerateSincLowPassFilter( pFIR, iWinSize, fCutoffFrequency ); ApplyKaiserWindow( pFIR, iWinSize, 8 ); NormalizeVector( pFIR, iWinSize ); MultiplyVector( &pFIR[0], &pFIR[iWinSize], (float) iUpFactor ); PolyphaseFilter *pPolyphase = new PolyphaseFilter( iUpFactor ); pPolyphase->Generate( pFIR ); delete [] pFIR; g_mapPolyphaseFilters[params] = pPolyphase; PolyphaseFiltersLock.Unlock(); return pPolyphase; }
// Just checks whether style can be created without constructing actual style. void check(const std::vector<Tag>& tags, const FilterMap& filters) { FilterMap::const_iterator iter = filters.find(levelOfDetails_); if (iter != filters.end()) { for (const Filter& filter : iter->second) { bool isMatched = true; for (auto it = filter.conditions.cbegin(); it != filter.conditions.cend() && isMatched; ++it) { isMatched &= match_tags(tags.cbegin(), tags.cend(), *it); } if (isMatched) { canBuild_ = true; return; } } } }
// Builds style object. More expensive to call than check. void build(const std::vector<Tag>& tags, const FilterMap& filters) { FilterMap::const_iterator iter = filters.find(levelOfDetails_); if (iter != filters.end()) { for (const Filter &filter : iter->second) { bool isMatched = true; for (auto it = filter.conditions.cbegin(); it != filter.conditions.cend() && isMatched; ++it) { isMatched &= match_tags(tags.cbegin(), tags.cend(), *it); } // merge declarations to style if (isMatched) { canBuild_ = true; for (const auto &d : filter.declarations) { style_.put(d.second); } } } } }