@@ -211,10 +211,14 @@ def apply_png_predictor(
211211 # bytes already decoded, and Prior() refers to the decoded bytes of
212212 # the prior scanline.
213213 for j , average_x in enumerate (line_encoded ):
214- raw_x_bpp = 0 if j < bpp else raw [j - bpp ]
215- prior_x = line_above [j ]
216- raw_x = (average_x + (raw_x_bpp + prior_x ) // 2 ) & 255
217- raw .append (raw_x )
214+ raw_x_bpp = 0
215+ if 0 <= (j - bpp ) < len (raw ):
216+ raw_x_bpp = 0 if j < bpp else raw [j - bpp ]
217+
218+ if 0 <= j < len (line_above ):
219+ prior_x = line_above [j ]
220+ raw_x = (average_x + (raw_x_bpp + prior_x ) // 2 ) & 255
221+ raw .append (raw_x )
218222
219223 elif filter_type == 4 :
220224 # Filter type 4: Paeth
@@ -226,16 +230,20 @@ def apply_png_predictor(
226230 # already decoded. Exactly the same PaethPredictor() function is
227231 # used by both encoder and decoder.
228232 for j , paeth_x in enumerate (line_encoded ):
229- if j < bpp :
230- raw_x_bpp = 0
231- prior_x_bpp = 0
232- else :
233- raw_x_bpp = raw [j - bpp ]
234- prior_x_bpp = line_above [j - bpp ]
235- prior_x = line_above [j ]
236- paeth = paeth_predictor (raw_x_bpp , prior_x , prior_x_bpp )
237- raw_x = (paeth_x + paeth ) & 255
238- raw .append (raw_x )
233+ raw_x_bpp = 0
234+ prior_x_bpp = 0
235+
236+ if j >= bpp :
237+ if 0 <= (j - bpp ) < len (raw ):
238+ raw_x_bpp = raw [j - bpp ]
239+ if 0 <= (j - bpp ) < len (line_above ):
240+ prior_x_bpp = line_above [j - bpp ]
241+
242+ if 0 <= j < len (line_above ):
243+ prior_x = line_above [j ]
244+ paeth = paeth_predictor (raw_x_bpp , prior_x , prior_x_bpp )
245+ raw_x = (paeth_x + paeth ) & 255
246+ raw .append (raw_x )
239247
240248 else :
241249 raise PDFValueError (f"Unsupported predictor value: { filter_type } " )
0 commit comments