void HeightfieldData::write(Bitstream& out, bool color) { QMutexLocker locker(&_encodedMutex); if (_encoded.isEmpty()) { QImage image; if (color) { int size = glm::sqrt(_contents.size() / (float)BYTES_PER_PIXEL); image = QImage((uchar*)_contents.data(), size, size, QImage::Format_RGB888); } else { int size = glm::sqrt((float)_contents.size()); image = QImage(size, size, QImage::Format_RGB888); uchar* dest = image.bits(); for (const char* src = _contents.constData(), *end = src + _contents.size(); src != end; src++) { *dest++ = *src; *dest++ = *src; *dest++ = *src; } } QBuffer buffer(&_encoded); buffer.open(QIODevice::WriteOnly); image.save(&buffer, "JPG"); } out << _encoded.size(); out.writeAligned(_encoded); }