void initPropRanges(Ranges &propRanges, const ColorRanges &ranges, int p) { propRanges.clear(); int min = ranges.min(p); int max = ranges.max(p); int mind = min - max, maxd = max - min; if (p < 3) { // alpha channel first for (int pp = 0; pp < p; pp++) { propRanges.push_back(std::make_pair(ranges.min(pp), ranges.max(pp))); // pixels on previous planes } if (ranges.numPlanes()>3) propRanges.push_back(std::make_pair(ranges.min(3), ranges.max(3))); // pixel on alpha plane } //if (p<1 || p>2) propRanges.push_back(std::make_pair(0,2)); // median predictor: which of the three values is the median? if (p==1 || p==2) propRanges.push_back(std::make_pair(ranges.min(0)-ranges.max(0),ranges.max(0)-ranges.min(0))); // luma prediction miss propRanges.push_back(std::make_pair(mind,maxd)); // neighbor A - neighbor B (top-bottom or left-right) propRanges.push_back(std::make_pair(mind,maxd)); // top/left prediction miss (previous pixel) propRanges.push_back(std::make_pair(mind,maxd)); // left/top prediction miss (other direction) propRanges.push_back(std::make_pair(mind,maxd)); // bottom/right prediction miss propRanges.push_back(std::make_pair(min,max)); // guess // propRanges.push_back(std::make_pair(mind,maxd)); // left - topleft // propRanges.push_back(std::make_pair(mind,maxd)); // topleft - top // if (p == 0 || p > 2) // propRanges.push_back(std::make_pair(mind,maxd)); // top - topright if (p != 2) { propRanges.push_back(std::make_pair(mind,maxd)); // toptop - top propRanges.push_back(std::make_pair(mind,maxd)); // leftleft - left } }
void initPropRanges_scanlines(Ranges &propRanges, const ColorRanges &ranges, int p) { propRanges.clear(); int min = ranges.min(p); int max = ranges.max(p); int mind = min - max, maxd = max - min; if (p < 3) { for (int pp = 0; pp < p; pp++) { propRanges.push_back(std::make_pair(ranges.min(pp), ranges.max(pp))); // pixels on previous planes } if (ranges.numPlanes()>3) propRanges.push_back(std::make_pair(ranges.min(3), ranges.max(3))); // pixel on alpha plane } propRanges.push_back(std::make_pair(min,max)); // guess (median of 3) propRanges.push_back(std::make_pair(0,2)); // which predictor was it propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); }
void initPropRanges(Ranges &propRanges, const ColorRanges &ranges, int p) { propRanges.clear(); int min = ranges.min(p); int max = ranges.max(p); int mind = min - max, maxd = max - min; if (p < 3) { // alpha channel first for (int pp = 0; pp < p; pp++) { propRanges.push_back(std::make_pair(ranges.min(pp), ranges.max(pp))); // pixels on previous planes } if (ranges.numPlanes()>3) propRanges.push_back(std::make_pair(ranges.min(3), ranges.max(3))); // pixel on alpha plane } propRanges.push_back(std::make_pair(mind,maxd)); // neighbor A - neighbor B (top-bottom or left-right) propRanges.push_back(std::make_pair(min,max)); // guess (median of 3) propRanges.push_back(std::make_pair(0,2)); // which predictor was it propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); if (p < 2 || p >= 3) { propRanges.push_back(std::make_pair(mind,maxd)); propRanges.push_back(std::make_pair(mind,maxd)); } }