+
+Image *
+readPNM(const char *buffer, size_t bufferSize)
+{
+ PNMInfo info;
+
+ const char *headerEnd = readPNMHeader(buffer, bufferSize, info);
+
+ // if invalid PNM header was encountered, ...
+ if (headerEnd == NULL) {
+ std::cerr << "error: invalid PNM header";
+ return NULL;
+ }
+
+ Image *image = new Image(info.width, info.height, info.channels, false, info.channelType);
+
+ size_t rowBytes = info.width * image->bytesPerPixel;
+ for (unsigned char *row = image->start(); row != image->end(); row += image->stride()) {
+ memcpy(row, headerEnd, rowBytes);
+ headerEnd += rowBytes;
+ }
+
+ return image;
+}
+
+
+