+5
-5
@@ -65,8 +65,8 @@ inline bool Failure(const char *f, int l, const char *fn) {
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
class Buffer {
|
class Buffer {
|
||||||
public:
|
public:
|
||||||
Buffer(const uint8_t *buffer, size_t len)
|
Buffer(const uint8_t *data, size_t len)
|
||||||
: buffer_(buffer),
|
: buffer_(data),
|
||||||
length_(len),
|
length_(len),
|
||||||
offset_(0) { }
|
offset_(0) { }
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ class Buffer {
|
|||||||
return Read(NULL, n_bytes);
|
return Read(NULL, n_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Read(uint8_t *buffer, size_t n_bytes) {
|
bool Read(uint8_t *data, size_t n_bytes) {
|
||||||
if (n_bytes > 1024 * 1024 * 1024) {
|
if (n_bytes > 1024 * 1024 * 1024) {
|
||||||
return FONT_COMPRESSION_FAILURE();
|
return FONT_COMPRESSION_FAILURE();
|
||||||
}
|
}
|
||||||
@@ -82,8 +82,8 @@ class Buffer {
|
|||||||
(offset_ > length_ - n_bytes)) {
|
(offset_ > length_ - n_bytes)) {
|
||||||
return FONT_COMPRESSION_FAILURE();
|
return FONT_COMPRESSION_FAILURE();
|
||||||
}
|
}
|
||||||
if (buffer) {
|
if (data) {
|
||||||
std::memcpy(buffer, buffer_ + offset_, n_bytes);
|
std::memcpy(data, buffer_ + offset_, n_bytes);
|
||||||
}
|
}
|
||||||
offset_ += n_bytes;
|
offset_ += n_bytes;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+17
-15
@@ -118,25 +118,27 @@ bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph) {
|
|||||||
|
|
||||||
// Read the run-length coded flags.
|
// Read the run-length coded flags.
|
||||||
std::vector<std::vector<uint8_t> > flags(num_contours);
|
std::vector<std::vector<uint8_t> > flags(num_contours);
|
||||||
uint8_t flag = 0;
|
{
|
||||||
uint8_t flag_repeat = 0;
|
uint8_t flag = 0;
|
||||||
for (int i = 0; i < num_contours; ++i) {
|
uint8_t flag_repeat = 0;
|
||||||
flags[i].resize(glyph->contours[i].size());
|
for (int i = 0; i < num_contours; ++i) {
|
||||||
for (size_t j = 0; j < glyph->contours[i].size(); ++j) {
|
flags[i].resize(glyph->contours[i].size());
|
||||||
if (flag_repeat == 0) {
|
for (size_t j = 0; j < glyph->contours[i].size(); ++j) {
|
||||||
if (!buffer.ReadU8(&flag)) {
|
if (flag_repeat == 0) {
|
||||||
return FONT_COMPRESSION_FAILURE();
|
if (!buffer.ReadU8(&flag)) {
|
||||||
}
|
|
||||||
if (flag & kFLAG_REPEAT) {
|
|
||||||
if (!buffer.ReadU8(&flag_repeat)) {
|
|
||||||
return FONT_COMPRESSION_FAILURE();
|
return FONT_COMPRESSION_FAILURE();
|
||||||
}
|
}
|
||||||
|
if (flag & kFLAG_REPEAT) {
|
||||||
|
if (!buffer.ReadU8(&flag_repeat)) {
|
||||||
|
return FONT_COMPRESSION_FAILURE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
flag_repeat--;
|
||||||
}
|
}
|
||||||
} else {
|
flags[i][j] = flag;
|
||||||
flag_repeat--;
|
glyph->contours[i][j].on_curve = flag & kFLAG_ONCURVE;
|
||||||
}
|
}
|
||||||
flags[i][j] = flag;
|
|
||||||
glyph->contours[i][j].on_curve = flag & kFLAG_ONCURVE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ void Write255UShort(std::vector<uint8_t>* out, int value) {
|
|||||||
void Store255UShort(int val, size_t* offset, uint8_t* dst) {
|
void Store255UShort(int val, size_t* offset, uint8_t* dst) {
|
||||||
std::vector<uint8_t> packed;
|
std::vector<uint8_t> packed;
|
||||||
Write255UShort(&packed, val);
|
Write255UShort(&packed, val);
|
||||||
for (uint8_t val : packed) {
|
for (uint8_t packed_byte : packed) {
|
||||||
dst[(*offset)++] = val;
|
dst[(*offset)++] = packed_byte;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user