+ for (y = 0; y < height; ++y) {
+ png_bytep row;
+ int x = 0;
+
+ row = png_malloc(pPngStruct, sizeof(png_byte) * width * pixel_size);
+ if (!row) {
+ TBM_ERR("fail to allocate the png row.\n");
+ for (x = 0; x < y; x++)
+ png_free(pPngStruct, row_pointers[x]);
+ png_free(pPngStruct, row_pointers);
+ png_destroy_write_struct(&pPngStruct, &pPngInfo);
+ fclose(fp);
+ return;
+ }
+ row_pointers[y] = (png_bytep)row;
+
+ for (x = 0; x < width; ++x) {
+ unsigned int curBlock = blocks[y * width + x];
+
+ if (pixel_size == 3) { // XRGB8888
+ row[x * pixel_size] = (curBlock & 0xFF);
+ row[1 + x * pixel_size] = (curBlock >> 8) & 0xFF;
+ row[2 + x * pixel_size] = (curBlock >> 16) & 0xFF;
+ } else { // ARGB8888
+ row[x * pixel_size] = (curBlock & 0xFF);
+ row[1 + x * pixel_size] = (curBlock >> 8) & 0xFF;
+ row[2 + x * pixel_size] = (curBlock >> 16) & 0xFF;
+ row[3 + x * pixel_size] = (curBlock >> 24) & 0xFF;
+ }
+ }
+ }