fix utf-16 reading and make it work on android

This commit is contained in:
2019-02-10 20:55:26 +01:00
parent 1d6c26f2ba
commit 6e41263600
9 changed files with 95 additions and 26 deletions

View File

@@ -5,6 +5,7 @@
#include "util.h"
#include "image.h"
#include "brush.h"
#include "log.h"
class BinaryStream
{
@@ -19,7 +20,7 @@ public:
return bint.c[0] == 1 ? ByteOrder::BigEndian : ByteOrder::LittleEndian;
}
BinaryStream(const BinaryParam&) = delete;
BinaryStream(const BinaryStream&) = delete;
BinaryStream() = default;
~BinaryStream()
{
@@ -66,13 +67,17 @@ public:
std::wstring rwstring(size_t len)
{
auto ptr = advance<char>(len * 2);
for (int i = 0; i < len; i++)
std::swap(ptr[i * 2], ptr[i * 2 + 1]);
//for (int i = 0; i < len; i++)
// std::swap(ptr[i * 2], ptr[i * 2 + 1]);
// right trim trailing zeroes
auto wptr = (wchar_t*)ptr;
auto wptr = (uint16_t*)ptr;
for (int i = len - 1; i >= 0; i--)
if (wptr[i] == 0) len--;
return std::wstring(wptr, len);
// wide to UTF-16le
std::wstring_convert<std::codecvt_utf16<wchar_t, 0x10ffff>> converter;
return converter.from_bytes(ptr, ptr + len * 2);
}
std::string rpascal()
{
@@ -168,7 +173,7 @@ protected:
return *reinterpret_cast<T*>(&y);
}
#else
auto p = reinterpret_cast<uint16_t*>(&x);
auto p = reinterpret_cast<uint8_t*>(&x);
if (sizeof(T) == 2)
{
std::swap(p[0], p[1]);
@@ -347,7 +352,7 @@ class ABR : private BinaryStream
uint8_t compression;
std::vector<uint8_t> data;
Channel() = default;
Channel(uint32_t depth, const Rectangle& rect, uint8_t compression, std::vector<uint8_t>& data) :
Channel(uint32_t depth, Rectangle rect, uint8_t compression, std::vector<uint8_t> data) :
depth(depth), rect(rect), compression(compression), data(std::move(data)) { }
};
struct VMArray : public Type