forked from organicmaps/organicmaps
[Reduce mwm size] Add dynamic serial::CodingParams (coordinate bits) for different scale levels.
This commit is contained in:
parent
75daa7a5c7
commit
160e5ced67
8 changed files with 65 additions and 35 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
@ -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()); }
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
@ -39,6 +39,5 @@ namespace old_101 { namespace feature
|
|||
virtual uint32_t ParseGeometry(int scale);
|
||||
virtual uint32_t ParseTriangles(int scale);
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue