From cf34ed972c5d7ab855d76cc9d66eba9106e8e972 Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Apr 27 2023 02:30:55 +0000 Subject: fix crash on loading png in subbox --- diff --git a/toonz/sources/image/png/tiio_png.cpp b/toonz/sources/image/png/tiio_png.cpp index fc3d8b6..dcfd6c0 100644 --- a/toonz/sources/image/png/tiio_png.cpp +++ b/toonz/sources/image/png/tiio_png.cpp @@ -278,7 +278,7 @@ public: png_bytep row_pointer = m_rowBuffer.get(); png_read_row(m_png_ptr, row_pointer, NULL); - writeRow(buffer); + writeRow(buffer, x0, x1); if (m_tempBuffer && m_y == ly) { m_tempBuffer.reset(); @@ -320,7 +320,7 @@ public: png_bytep row_pointer = m_rowBuffer.get(); png_read_row(m_png_ptr, row_pointer, NULL); - writeRow(buffer); + writeRow(buffer, x0, x1); if (m_tempBuffer && m_y == ly) { m_tempBuffer.reset(); @@ -347,7 +347,7 @@ public: Tiio::RowOrder getRowOrder() const override { return Tiio::TOP2BOTTOM; } - void writeRow(char *buffer) { + void writeRow(char *buffer, int x0, int x1) { if (m_color_type == PNG_COLOR_TYPE_RGB_ALPHA || m_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || m_color_type == PNG_COLOR_TYPE_PALETTE) { // PNG_COLOR_TYPE_PALETTE is @@ -355,7 +355,8 @@ public: if (m_bit_depth == 16) { TPixel32 *pix = (TPixel32 *)buffer; int i = -2; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 2 * 4; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) pix[j].m = m_rowBuffer[i = i + 2]; pix[j].r = m_rowBuffer[i = i + 2]; @@ -386,7 +387,8 @@ public: } else { TPixel32 *pix = (TPixel32 *)buffer; int i = 0; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 4; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) pix[j].m = m_rowBuffer[i++]; pix[j].r = m_rowBuffer[i++]; @@ -419,7 +421,8 @@ public: if (m_bit_depth == 16) { TPixel32 *pix = (TPixel32 *)buffer; int i = -2; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 2 * 3; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) || \ defined(TNZ_MACHINE_CHANNEL_ORDER_RGBM) pix[j].r = m_rowBuffer[i = i + 2]; @@ -438,7 +441,8 @@ public: } else { TPixel32 *pix = (TPixel32 *)buffer; int i = 0; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 3; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) || \ defined(TNZ_MACHINE_CHANNEL_ORDER_RGBM) pix[j].r = m_rowBuffer[i++]; @@ -458,14 +462,15 @@ public: } } - void writeRow(short *buffer) { + void writeRow(short *buffer, int x0, int x1) { if (m_color_type == PNG_COLOR_TYPE_RGB_ALPHA || m_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || m_color_type == PNG_COLOR_TYPE_PALETTE) { // PNG_COLOR_TYPE_PALETTE is // expanded to RGBA TPixel64 *pix = (TPixel64 *)buffer; int i = -2; // 0; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 2 * 4; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) || \ defined(TNZ_MACHINE_CHANNEL_ORDER_RGBM) pix[j].r = mySwap(m_rowBuffer[i = i + 2]); // i++ @@ -490,7 +495,8 @@ public: { // grayscale e' gestito come RGB perche' si usa png_set_gray_to_rgb TPixel64 *pix = (TPixel64 *)buffer; int i = -2; - for (int j = 0; j < m_info.m_lx; j++) { + i += x0 * 2 * 3; + for (int j = x0; j <= x1; j++) { #if defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB) || \ defined(TNZ_MACHINE_CHANNEL_ORDER_RGBM) pix[j].r = mySwap(m_rowBuffer[i = i + 2]); @@ -662,8 +668,8 @@ public: // tutto quello che segue lo metto in una funzione in cui scrivo il buffer // di restituzione della readLine - //è una funzione comune alle ReadLine - writeRow(buffer); + // è una funzione comune alle ReadLine + writeRow(buffer, x0, x1); } void readLineInterlace(short *buffer, int x0, int x1, int shrink) { @@ -739,8 +745,8 @@ public: // tutto quello che segue lo metto in una funzione in cui scrivo il buffer // di restituzione della readLine - //è una funzione comune alle ReadLine - writeRow(buffer); + // è una funzione comune alle ReadLine + writeRow(buffer, x0, x1); } };