#include "IOStream.h" #include "GL2Encoder.h" #include <GLES3/gl31.h> #include <vector> void IOStream::readbackPixels(void* context, int width, int height, unsigned int format, unsigned int type, void* pixels) { GL2Encoder *ctx = (GL2Encoder *)context; assert (ctx->state() != NULL); int startOffset = 0; int pixelRowSize = 0; int totalRowSize = 0; int skipRows = 0; ctx->state()->getPackingOffsets2D(width, height, format, type, &startOffset, &pixelRowSize, &totalRowSize, &skipRows); size_t pixelDataSize = ctx->state()->pixelDataSize( width, height, 1, format, type, 1 /* is pack */); if (startOffset == 0 && pixelRowSize == totalRowSize) { // fast path readback(pixels, pixelDataSize); } else if (pixelRowSize == totalRowSize) { // fast path but with skip in the beginning std::vector<char> paddingToDiscard(startOffset, 0); readback(&paddingToDiscard[0], startOffset); readback((char*)pixels + startOffset, pixelDataSize - startOffset); } else { int totalReadback = 0; if (startOffset > 0) { std::vector<char> paddingToDiscard(startOffset, 0); readback(&paddingToDiscard[0], startOffset); totalReadback += startOffset; } // need to read back row by row size_t paddingSize = totalRowSize - pixelRowSize; std::vector<char> paddingToDiscard(paddingSize, 0); char* start = (char*)pixels + startOffset; for (int i = 0; i < height; i++) { readback(start, pixelRowSize); totalReadback += pixelRowSize; readback(&paddingToDiscard[0], paddingSize); totalReadback += paddingSize; start += totalRowSize; } } }