/* GLTexture::loadImagePortion * Loads a portion of a SImage to the texture. Only used internally, * the portion must be 128x128 in size *******************************************************************/ bool GLTexture::loadImagePortion(SImage* image, rect_t rect, Palette8bit* pal, bool add) { // Check image was given if (!image) return false; // Check image is valid if (!image->isValid()) return false; // Check portion rect is valid if (rect.width() <= 0 || rect.height() <= 0) return false; // Get RGBA image data MemChunk rgba; image->getRGBAData(rgba, pal); // Init texture data MemChunk portion; portion.reSize(rect.width() * rect.height() * 4, false); portion.fillData(0); // Read portion of image if rect isn't completely outside the image if (!(rect.left() >= image->getWidth() || rect.right() < 0 || rect.top() >= image->getHeight() || rect.bottom() < 0)) { // Determine start of each row to read uint32_t row_start = 0; if (rect.left() > 0) row_start = rect.left(); // Determine width of each row to read uint32_t row_width = rect.right() - row_start; if (rect.right() >= image->getWidth()) row_width = image->getWidth() - row_start; // Determine difference between the left of the portion and the left of the image uint32_t skip = 0; if (rect.left() < 0) skip = (0 - rect.left()) * 4; // Create temp row buffer uint8_t* buf = new uint8_t[rect.width() * 4]; // Go through each row for (int32_t row = rect.top(); row < rect.bottom(); row++) { // Clear row buffer memset(buf, 0, rect.width() * 4); // Check that the current row is within the image if (row >= 0 && row < image->getHeight()) { // Seek to current row in image data rgba.seek((row * image->getWidth() + row_start) * 4, SEEK_SET); // Copy the row data rgba.read(buf + skip, row_width * 4); } // Write the row portion.write(buf, rect.width() * 4); } // Free buffer delete[] buf; } scale_x = scale_y = 1.0; // Generate texture from rgba data return loadData(portion.getData(), rect.width(), rect.height(), add); }
tensor_t model_t::make_input(const image_t& image, const rect_t& region) const { return make_input(image, region.left(), region.top()); }