HaarFeature::HaarFeature(const FloatRect& bb, int type) : m_bb(bb) { assert(type < 6); switch (type) { case 0: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height() / 2)); m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 2, bb.Width(), bb.Height() / 2)); m_weights.push_back(1.f); m_weights.push_back(-1.f); m_factor = 255 * 1.f / 2; break; } case 1: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 2, bb.Height())); m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin(), bb.Width() / 2, bb.Height())); m_weights.push_back(1.f); m_weights.push_back(-1.f); m_factor = 255 * 1.f / 2; break; } case 2: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 3, bb.Height())); m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 3, bb.YMin(), bb.Width() / 3, bb.Height())); m_rects.push_back(FloatRect(bb.XMin() + 2 * bb.Width() / 3, bb.YMin(), bb.Width() / 3, bb.Height())); m_weights.push_back(1.f); m_weights.push_back(-2.f); m_weights.push_back(1.f); m_factor = 255 * 2.f / 3; break; } case 3: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height() / 3)); m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 3, bb.Width(), bb.Height() / 3)); m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + 2 * bb.Height() / 3, bb.Width(), bb.Height() / 3)); m_weights.push_back(1.f); m_weights.push_back(-2.f); m_weights.push_back(1.f); m_factor = 255 * 2.f / 3; break; } case 4: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 2, bb.Height() / 2)); m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin() + bb.Height() / 2, bb.Width() / 2, bb.Height() / 2)); m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 2, bb.Width() / 2, bb.Height() / 2)); m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin(), bb.Width() / 2, bb.Height() / 2)); m_weights.push_back(1.f); m_weights.push_back(1.f); m_weights.push_back(-1.f); m_weights.push_back(-1.f); m_factor = 255 * 1.f / 2; break; } case 5: { m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height())); m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 4, bb.YMin() + bb.Height() / 4, bb.Width() / 2, bb.Height() / 2)); m_weights.push_back(1.f); m_weights.push_back(-4.f); m_factor = 255 * 3.f / 4; break; } } }