void ParseOBJ::parse(BinaryInput& bi, const ParseOBJ::Options& options, const String& basePath) { m_filename = bi.getFilename(); String bp = basePath; if (bp == "<AUTO>") { bp = FilePath::parent(FileSystem::resolve(m_filename)); } parse((const char*)bi.getCArray() + bi.getPosition(), size_t(bi.getLength() - bi.getPosition()), bp, options); }
GFont::GFont(const String& filename, BinaryInput& b) { int ver = b.readInt32(); debugAssertM(ver == 1 || ver == 2, "Can't read font files other than version 1"); (void)ver; if (ver == 1) { charsetSize = 128; } else { charsetSize = b.readInt32(); } // Read the widths subWidth.resize(charsetSize); for (int c = 0; c < charsetSize; ++c) { subWidth[c] = b.readUInt16(); } baseline = b.readUInt16(); int texWidth = b.readUInt16(); charWidth = texWidth / 16; charHeight = texWidth / 16; // The input may not be a power of 2 int width = ceilPow2(charWidth * 16); int height = ceilPow2(charHeight * (charsetSize / 16)); // Create a texture const uint8* ptr = ((uint8*)b.getCArray()) + b.getPosition(); debugAssertM((b.getLength() - b.getPosition()) >= width * height, "File does not contain enough data for this size texture"); Texture::Preprocess preprocess; preprocess.computeMinMaxMean = false; const bool generateMipMaps = true; m_texture = Texture::fromMemory ( filename, ptr, ImageFormat::R8(), width, height, 1, 1, ImageFormat::R8(), Texture::DIM_2D, generateMipMaps, preprocess); m_textureMatrix[0] = 1.0f / m_texture->width(); m_textureMatrix[1] = 0; m_textureMatrix[2] = 0; m_textureMatrix[3] = 0; m_textureMatrix[4] = 0; m_textureMatrix[5] = 1.0f / m_texture->height(); m_textureMatrix[6] = 0; m_textureMatrix[7] = 0; m_textureMatrix[8] = 0; m_textureMatrix[9] = 0; m_textureMatrix[10] = 1; m_textureMatrix[11] = 0; m_textureMatrix[12] = 0; m_textureMatrix[13] = 0; m_textureMatrix[14] = 0; m_textureMatrix[15] = 1; m_name = filename; }
void GImage::decodeJPEG( BinaryInput& input) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; int loc = 0; channels = 3; // We have to set up the error handler, in case initialization fails. cinfo.err = jpeg_std_error(&jerr); // Initialize the JPEG decompression object. jpeg_create_decompress(&cinfo); // Specify data source (eg, a file, for us, memory) jpeg_memory_src(&cinfo, const_cast<uint8*>(input.getCArray()), input.size()); // Read the parameters with jpeg_read_header() jpeg_read_header(&cinfo, TRUE); // Set parameters for decompression // (We do nothing here since the defaults are fine) // Start decompressor jpeg_start_decompress(&cinfo); // Get and set the values of interest to this object this->width = cinfo.output_width; this->height = cinfo.output_height; // Prepare the pointer object for the pixel data _byte = (uint8*)System::malloc(width * height * 3); // JSAMPLEs per row in output buffer int bpp = cinfo.output_components; int row_stride = cinfo.output_width * bpp; // Make a one-row-high sample array that will go away when done with image JSAMPARRAY temp = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); // Read data on a scanline by scanline basis while (cinfo.output_scanline < cinfo.output_height) { // We may need to adjust the output based on the // number of channels it has. switch (bpp) { case 1: // Grayscale; decompress to temp. jpeg_read_scanlines(&cinfo, temp, 1); // Expand to three channels { uint8* scan = &(_byte[loc * 3]); uint8* endScan = scan + (width * 3); uint8* t = *temp; while (scan < endScan) { uint8 value = t[0]; // Spread the value 3x. scan[0] = value; scan[1] = value; scan[2] = value; scan += 3; t += 1; } } break; case 3: // Read directly into the array { // Need one extra level of indirection. uint8* scan = _byte + loc; JSAMPARRAY ptr = &scan; jpeg_read_scanlines(&cinfo, ptr, 1); } break; case 4: // RGBA; decompress to temp. jpeg_read_scanlines(&cinfo, temp, 1); // Drop the 3rd channel { uint8* scan = &(_byte[loc * 3]); uint8* endScan = scan + width * 3; uint8* t = *temp; while (scan < endScan) { scan[0] = t[0]; scan[1] = t[1]; scan[2] = t[2]; scan += 3; t += 4; } } break; default: throw Error("Unexpected number6 of channels.", input.getFilename()); } loc += row_stride; } // Finish decompression jpeg_finish_decompress(&cinfo); // Release JPEG decompression object jpeg_destroy_decompress(&cinfo); }