[Reduce mwm size] Add dynamic serial::CodingParams (coordinate bits) for different scale levels.

This commit is contained in:
vng 2011-09-16 19:16:04 +03:00 committed by Alex Zolotarev
parent 75daa7a5c7
commit 160e5ced67
8 changed files with 65 additions and 35 deletions

View file

@ -161,13 +161,15 @@ namespace feature
points_t m_current;
serial::CodingParams m_codingParams;
DataHeader m_header;
void WriteOuterPoints(points_t const & points, int i)
{
serial::CodingParams const cp = m_header.GetCodingParams(i);
m_buffer.m_ptsMask |= (1 << i);
m_buffer.m_ptsOffset.push_back(m_rMain.GetFileSize(*m_rMain.m_geoFile[i]));
serial::SaveOuterPath(points, m_codingParams, *m_rMain.m_geoFile[i]);
serial::SaveOuterPath(points, cp, *m_rMain.m_geoFile[i]);
}
void WriteOuterTriangles(polygons_t const & polys, int i)
@ -182,19 +184,21 @@ namespace feature
return;
}
serial::TrianglesChainSaver saver(m_codingParams);
serial::CodingParams const cp = m_header.GetCodingParams(i);
serial::TrianglesChainSaver saver(cp);
// points conversion
tesselator::PointsInfo points;
m2::PointU (* D2U)(m2::PointD const &, uint32_t) = &PointD2PointU;
info.GetPointsInfo(saver.GetBasePoint(), saver.GetMaxPoint(),
bind(D2U, _1, m_codingParams.GetCoordBits()), points);
bind(D2U, _1, cp.GetCoordBits()), points);
// triangles processing (should be optimal)
info.ProcessPortions(points, saver, true);
// check triangles processing (to compare with optimal)
//serial::TrianglesChainSaver checkSaver(m_codingParams);
//serial::TrianglesChainSaver checkSaver(cp);
//info.ProcessPortions(points, checkSaver, false);
//CHECK_LESS_OR_EQUAL(saver.GetBufferSize(), checkSaver.GetBufferSize(), ());
@ -253,8 +257,8 @@ namespace feature
public:
GeometryHolder(FeaturesCollector2 & rMain,
FeatureBuilder2 & fb,
serial::CodingParams const & codingParams)
: m_rMain(rMain), m_rFB(fb), m_codingParams(codingParams),
DataHeader const & header)
: m_rMain(rMain), m_rFB(fb), m_header(header),
m_ptsInner(true), m_trgInner(true)
{
}
@ -452,7 +456,7 @@ namespace feature
public:
void operator() (FeatureBuilder2 & fb)
{
GeometryHolder holder(*this, fb, m_header.GetCodingParams());
GeometryHolder holder(*this, fb, m_header);
bool const isLine = fb.IsLine();
bool const isArea = fb.IsArea();
@ -504,7 +508,7 @@ namespace feature
if (fb.PreSerialize(holder.m_buffer))
{
fb.Serialize(holder.m_buffer, m_header.GetCodingParams());
fb.Serialize(holder.m_buffer, m_header.GetDefCodingParams());
WriteFeatureBase(holder.m_buffer.m_buffer, fb);
}

View file

@ -9,19 +9,24 @@ namespace serial
class CodingParams
{
public:
// TODO: Factor out?
/// @todo: Factor out?
//@{
CodingParams();
CodingParams(uint8_t coordBits, m2::PointD const & pt);
CodingParams(uint8_t coordBits, uint64_t basePointUint64);
//@}
m2::PointU GetBasePointPrediction(uint64_t offset) const;
/// @todo: Factor out.
//@{
inline m2::PointU GetBasePoint() const { return m_BasePoint; }
inline uint64_t GetBasePointUint64() const { return m_BasePointUint64; }
inline int64_t GetBasePointInt64() const
{
return static_cast<int64_t>(m_BasePointUint64);
}
//@}
// TODO: Factor out.
m2::PointU GetBasePoint() const { return m_BasePoint; }
// TODO: Factor out.
int64_t GetBasePointInt64() const { return static_cast<int64_t>(m_BasePointUint64); }
uint32_t GetCoordBits() const { return m_CoordBits; }
inline uint32_t GetCoordBits() const { return m_CoordBits; }
template <typename WriterT> void Save(WriterT & writer) const
{
@ -39,7 +44,6 @@ namespace serial
private:
uint64_t m_BasePointUint64;
// TODO: Factor out.
m2::PointU m_BasePoint;
uint8_t m_CoordBits;
};

View file

@ -15,6 +15,12 @@
namespace feature
{
serial::CodingParams DataHeader::GetCodingParams(int scaleIndex) const
{
return serial::CodingParams(m_codingParams.GetCoordBits() - (m_scales[3] - m_scales[scaleIndex]),
m_codingParams.GetBasePointUint64());
}
m2::RectD const DataHeader::GetBounds() const
{
return Int64ToRect(m_bounds, m_codingParams.GetCoordBits());

View file

@ -22,8 +22,15 @@ namespace feature
public:
void SetCodingParams(serial::CodingParams const & params) { m_codingParams = params; }
serial::CodingParams const & GetCodingParams() const { return m_codingParams; }
inline void SetCodingParams(serial::CodingParams const & cp)
{
m_codingParams = cp;
}
inline serial::CodingParams const & GetDefCodingParams() const
{
return m_codingParams;
}
serial::CodingParams GetCodingParams(int scaleIndex) const;
m2::RectD const GetBounds() const;
void SetBounds(m2::RectD const & r);

View file

@ -46,7 +46,7 @@ void LoaderCurrent::ParseCommon()
if (type == GEOM_POINT)
{
serial::CodingParams const & cp = GetCodingParams();
serial::CodingParams const & cp = GetDefCodingParams();
CoordPointT const center = PointU2PointD(
DecodeDelta(ReadVarUint<uint64_t>(source), cp.GetBasePoint()), cp.GetCoordBits());
@ -147,7 +147,8 @@ void LoaderCurrent::ParseHeader2()
char const * start = static_cast<char const *>(src.Ptr());
src = ArrayByteSource(serial::LoadInnerPath(src.Ptr(), ptsCount, GetCodingParams(), m_pF->m_Points));
src = ArrayByteSource(serial::LoadInnerPath(
src.Ptr(), ptsCount, GetDefCodingParams(), m_pF->m_Points));
m_pF->m_InnerStats.m_Points = static_cast<char const *>(src.Ptr()) - start;
}
@ -164,7 +165,8 @@ void LoaderCurrent::ParseHeader2()
char const * start = static_cast<char const *>(src.Ptr());
FeatureType::points_t points;
src = ArrayByteSource(serial::LoadInnerTriangles(src.Ptr(), trgCount, GetCodingParams(), points));
src = ArrayByteSource(serial::LoadInnerTriangles(
src.Ptr(), trgCount, GetDefCodingParams(), points));
m_pF->m_InnerStats.m_Strips = static_cast<char const *>(src.Ptr()) - start;
@ -195,7 +197,7 @@ uint32_t LoaderCurrent::ParseGeometry(int scale)
{
ReaderSource<FilesContainerR::ReaderT> src(m_Info.GetGeometryReader(ind));
src.Skip(m_ptsOffsets[ind]);
serial::LoadOuterPath(src, GetCodingParams(), m_pF->m_Points);
serial::LoadOuterPath(src, GetCodingParams(ind), m_pF->m_Points);
sz = static_cast<uint32_t>(src.Pos() - m_ptsOffsets[ind]);
}
@ -241,7 +243,7 @@ uint32_t LoaderCurrent::ParseTriangles(int scale)
{
ReaderSource<FilesContainerR::ReaderT> src(m_Info.GetTrianglesReader(ind));
src.Skip(m_trgOffsets[ind]);
serial::LoadOuterTriangles(src, GetCodingParams(), m_pF->m_Triangles);
serial::LoadOuterTriangles(src, GetCodingParams(ind), m_pF->m_Triangles);
sz = static_cast<uint32_t>(src.Pos() - m_trgOffsets[ind]);
}

View file

@ -29,9 +29,13 @@ namespace feature
LoaderBase * CreateLoader() const;
inline serial::CodingParams const & GetCodingParams() const
inline serial::CodingParams const & GetDefCodingParams() const
{
return m_header.GetCodingParams();
return m_header.GetDefCodingParams();
}
inline serial::CodingParams GetCodingParams(int scaleIndex) const
{
return m_header.GetCodingParams(scaleIndex);
}
inline int GetScalesCount() const { return m_header.GetScalesCount(); }
inline int GetScale(int i) const { return m_header.GetScale(i); }
@ -65,9 +69,13 @@ namespace feature
uint32_t CalcOffset(ArrayByteSource const & source) const;
inline serial::CodingParams const & GetCodingParams() const
inline serial::CodingParams const & GetDefCodingParams() const
{
return m_Info.GetCodingParams();
return m_Info.GetDefCodingParams();
}
inline serial::CodingParams GetCodingParams(int scaleIndex) const
{
return m_Info.GetCodingParams(scaleIndex);
}
uint8_t Header() const { return static_cast<uint8_t>(*DataPtr()); }

View file

@ -67,7 +67,7 @@ void LoaderImpl::ParseCommon()
if (h & HEADER_HAS_POINT)
{
CoordPointT const center = Int64ToPoint(
ReadVarInt<int64_t>(source) + m_Info.GetCodingParams().GetBasePointInt64(), POINT_COORD_BITS);
ReadVarInt<int64_t>(source) + GetDefCodingParams().GetBasePointInt64(), POINT_COORD_BITS);
m_pF->m_Center = m2::PointD(center.first, center.second);
m_pF->m_LimitRect.Add(m_pF->m_Center);
@ -208,7 +208,7 @@ void LoaderImpl::ParseHeader2()
char const * start = static_cast<char const *>(src.Ptr());
src = ArrayByteSource(serial::LoadInnerPath(
src.Ptr(), ptsCount, m_Info.GetCodingParams(), m_pF->m_Points));
src.Ptr(), ptsCount, GetDefCodingParams(), m_pF->m_Points));
m_pF->m_InnerStats.m_Points = static_cast<char const *>(src.Ptr()) - start;
}
@ -226,7 +226,7 @@ void LoaderImpl::ParseHeader2()
FeatureType::points_t points;
src = ArrayByteSource(serial::LoadInnerTriangles(
src.Ptr(), trgCount, m_Info.GetCodingParams(), points));
src.Ptr(), trgCount, GetDefCodingParams(), points));
m_pF->m_InnerStats.m_Strips = static_cast<char const *>(src.Ptr()) - start;
@ -257,7 +257,7 @@ uint32_t LoaderImpl::ParseGeometry(int scale)
{
ReaderSource<FilesContainerR::ReaderT> src(m_Info.GetGeometryReader(ind));
src.Skip(m_ptsOffsets[ind]);
serial::LoadOuterPath(src, m_Info.GetCodingParams(), m_pF->m_Points);
serial::LoadOuterPath(src, GetDefCodingParams(), m_pF->m_Points);
sz = static_cast<uint32_t>(src.Pos() - m_ptsOffsets[ind]);
}
@ -303,7 +303,7 @@ uint32_t LoaderImpl::ParseTriangles(int scale)
{
ReaderSource<FilesContainerR::ReaderT> src(m_Info.GetTrianglesReader(ind));
src.Skip(m_trgOffsets[ind]);
serial::LoadOuterTriangles(src, m_Info.GetCodingParams(), m_pF->m_Triangles);
serial::LoadOuterTriangles(src, GetDefCodingParams(), m_pF->m_Triangles);
sz = static_cast<uint32_t>(src.Pos() - m_trgOffsets[ind]);
}

View file

@ -39,6 +39,5 @@ namespace old_101 { namespace feature
virtual uint32_t ParseGeometry(int scale);
virtual uint32_t ParseTriangles(int scale);
};
}
}