fix utf-16 reading and make it work on android
This commit is contained in:
19
src/abr.h
19
src/abr.h
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user