diff options
author | ExMix <rahuba.youri@mapswithme.com> | 2014-08-13 16:56:55 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:24:47 +0300 |
commit | b2f5b1a26cacc3277c8026f38c8ef0810dd24ddb (patch) | |
tree | c21a1e1bce8d7f48ba54f2160a1c6b32eb9e7d2c /drape/stipple_pen_resource.cpp | |
parent | 3587e8ccc934fca003a04906f154c7d9ec43cb44 (diff) |
[drape] encode stipple pattern into uint64_t
Diffstat (limited to 'drape/stipple_pen_resource.cpp')
-rw-r--r-- | drape/stipple_pen_resource.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/drape/stipple_pen_resource.cpp b/drape/stipple_pen_resource.cpp index 266076901d..53e6f46f61 100644 --- a/drape/stipple_pen_resource.cpp +++ b/drape/stipple_pen_resource.cpp @@ -1,6 +1,7 @@ #include "stipple_pen_resource.hpp" #include "../std/numeric.hpp" +#include "../std/sstream.hpp" namespace dp { @@ -42,7 +43,34 @@ m2::RectU StipplePenPacker::PackResource(uint32_t width) return m2::RectU(xOffset, yOffset, xOffset + width, yOffset + 1); } -StipplePenResource::StipplePenResource(StipplePenKey const & key) +StipplePenKey::StipplePenKey(StipplePenInfo const & info) + : m_keyValue(0) +{ + // encoding scheme + // 63 - 61 bits = size of pattern in range [1 : 8] + // 60 - 53 bits = first value of pattern in range [1 : 128] + // 52 - 45 bits = second value of pattern + // .... + // 0 - 5 bits = reserved + + uint32_t patternSize = info.m_pattern.size(); + ASSERT(patternSize > 1, ()); + ASSERT(patternSize < 9, ()); + + m_keyValue = patternSize - 1; // we code value 1 as 000 and value 8 as 111 + for (size_t i = 0; i < patternSize; ++i) + { + m_keyValue <<=7; + ASSERT(info.m_pattern[i] > 0, ()); // we have 7 bytes for value. value = 1 encode like 0000000 + ASSERT(info.m_pattern[i] < 129, ()); // value = 128 encode like 1111111 + uint32_t value = info.m_pattern[i] - 1; + m_keyValue += value; + } + + m_keyValue <<= ((8 - patternSize) * 7 + 5); +} + +StipplePenResource::StipplePenResource(StipplePenInfo const & key) : m_key(key) { uint32_t fullPattern = accumulate(m_key.m_pattern.begin(), m_key.m_pattern.end(), 0); @@ -87,5 +115,12 @@ void StipplePenResource::Rasterize(void * buffer) } } +string DebugPrint(const StipplePenKey & key) +{ + ostringstream out; + out << "0x" << hex << key.m_keyValue; + return out.str(); +} + } |