From 2407bbe2aecebea87b2463fe4da8dcaf27871376 Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Tue, 4 Aug 2020 17:42:19 +0800 Subject: [PATCH 1/3] PDF-viewer: Calculate overlaps when exclude images Signed-off-by: Hollow Man --- app/pdf-viewer/buffer.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/pdf-viewer/buffer.py b/app/pdf-viewer/buffer.py index 9605f7f20..357280086 100755 --- a/app/pdf-viewer/buffer.py +++ b/app/pdf-viewer/buffer.py @@ -341,15 +341,40 @@ def get_page_pixmap(self, index, scale): # exclude images imagelist = page.getImageList() + imagebboxlist = [] + overlapbboxlist = [] for image in imagelist: try: # image[7] is the name of the picture imagerect = page.getImageBbox(image[7]) if imagerect.isInfinite or imagerect.isEmpty: continue - pixmap.invertIRect(imagerect * self.scale) + else: + imagebboxlist.append(imagerect) except Exception: pass + + # calculate overlaps + for i in range(len(imagebboxlist)): + for j in range(i+1,len(imagebboxlist)): + x0a = imagebboxlist[i].x0 + y0a = imagebboxlist[i].y0 + x1a = imagebboxlist[i].x1 + y1a = imagebboxlist[i].y1 + x0b = imagebboxlist[j].x0 + y0b = imagebboxlist[j].y0 + x1b = imagebboxlist[j].x1 + y1b = imagebboxlist[j].y1 + x0c = max(x0a,x0b) + y0c = max(y0a,y0b) + x1c = min(x1a,x1b) + y1c = min(y1a,y1b) + if x0c < x1c and y0c < y1c: + overlapbboxlist.append(fitz.Rect(x0c,y0c,x1c,y1c)) + for bbox in imagebboxlist: + pixmap.invertIRect(bbox * self.scale) + for bbox in overlapbboxlist: + pixmap.invertIRect(bbox * self.scale) img = QImage(pixmap.samples, pixmap.width, pixmap.height, pixmap.stride, QImage.Format_RGB888) qpixmap = QPixmap.fromImage(img) From 22eacbd10cff686d2c4ac3b102775899330f7857 Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Tue, 4 Aug 2020 22:35:40 +0800 Subject: [PATCH 2/3] Optimize so that it can calculate multiple rectangles' overlaps Signed-off-by: Hollow Man --- app/pdf-viewer/buffer.py | 72 ++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/app/pdf-viewer/buffer.py b/app/pdf-viewer/buffer.py index 357280086..6ff05a0f1 100755 --- a/app/pdf-viewer/buffer.py +++ b/app/pdf-viewer/buffer.py @@ -340,41 +340,65 @@ def get_page_pixmap(self, index, scale): pixmap.invertIRect(pixmap.irect) # exclude images - imagelist = page.getImageList() + imagelist = page.getImageList(full=True) imagebboxlist = [] - overlapbboxlist = [] for image in imagelist: try: - # image[7] is the name of the picture - imagerect = page.getImageBbox(image[7]) + imagerect = page.getImageBbox(image) if imagerect.isInfinite or imagerect.isEmpty: continue else: imagebboxlist.append(imagerect) except Exception: pass - - # calculate overlaps - for i in range(len(imagebboxlist)): - for j in range(i+1,len(imagebboxlist)): - x0a = imagebboxlist[i].x0 - y0a = imagebboxlist[i].y0 - x1a = imagebboxlist[i].x1 - y1a = imagebboxlist[i].y1 - x0b = imagebboxlist[j].x0 - y0b = imagebboxlist[j].y0 - x1b = imagebboxlist[j].x1 - y1b = imagebboxlist[j].y1 - x0c = max(x0a,x0b) - y0c = max(y0a,y0b) - x1c = min(x1a,x1b) - y1c = min(y1a,y1b) - if x0c < x1c and y0c < y1c: - overlapbboxlist.append(fitz.Rect(x0c,y0c,x1c,y1c)) + + newly_added_overlapbboxlist = imagebboxlist + + # Nth time of loop represents N+1 rectanges' intesects' overlaps + time = 0 + while len(newly_added_overlapbboxlist) > 1: + temp_overlapbboxlist = [] + time += 1 + # calculate overlap + for i in range(len(newly_added_overlapbboxlist)): + for j in range(i+1,len(newly_added_overlapbboxlist)): + x0a = newly_added_overlapbboxlist[i].x0 + y0a = newly_added_overlapbboxlist[i].y0 + x1a = newly_added_overlapbboxlist[i].x1 + y1a = newly_added_overlapbboxlist[i].y1 + x0b = newly_added_overlapbboxlist[j].x0 + y0b = newly_added_overlapbboxlist[j].y0 + x1b = newly_added_overlapbboxlist[j].x1 + y1b = newly_added_overlapbboxlist[j].y1 + x0c = max(x0a,x0b) + y0c = max(y0a,y0b) + x1c = min(x1a,x1b) + y1c = min(y1a,y1b) + if x0c < x1c and y0c < y1c: + temp_overlapbboxlist.append(fitz.Rect(x0c,y0c,x1c,y1c)) + # remove duplicate overlaps for one time + for item in set(temp_overlapbboxlist): + if temp_overlapbboxlist.count(item) % 2 == 0: + while item in temp_overlapbboxlist: + temp_overlapbboxlist.remove(item) + else: + while temp_overlapbboxlist.count(item) > 1: + temp_overlapbboxlist.remove(item) + newly_added_overlapbboxlist = temp_overlapbboxlist + imagebboxlist.extend(newly_added_overlapbboxlist) + if time%2 == 1 and time//2 > 0: + imagebboxlist.extend(newly_added_overlapbboxlist) + + # remove duplicate to make it run faster + for item in set(imagebboxlist): + if imagebboxlist.count(item) % 2 == 0: + while item in imagebboxlist: + imagebboxlist.remove(item) + else: + while imagebboxlist.count(item) > 1: + imagebboxlist.remove(item) for bbox in imagebboxlist: pixmap.invertIRect(bbox * self.scale) - for bbox in overlapbboxlist: - pixmap.invertIRect(bbox * self.scale) img = QImage(pixmap.samples, pixmap.width, pixmap.height, pixmap.stride, QImage.Format_RGB888) qpixmap = QPixmap.fromImage(img) From cad87ea77bbfc5eb4a650a04d1b4cbd5385e641b Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Tue, 4 Aug 2020 22:53:29 +0800 Subject: [PATCH 3/3] Further optimize Signed-off-by: Hollow Man --- app/pdf-viewer/buffer.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/pdf-viewer/buffer.py b/app/pdf-viewer/buffer.py index 6ff05a0f1..7c4725fa5 100755 --- a/app/pdf-viewer/buffer.py +++ b/app/pdf-viewer/buffer.py @@ -389,14 +389,15 @@ def get_page_pixmap(self, index, scale): if time%2 == 1 and time//2 > 0: imagebboxlist.extend(newly_added_overlapbboxlist) - # remove duplicate to make it run faster - for item in set(imagebboxlist): - if imagebboxlist.count(item) % 2 == 0: - while item in imagebboxlist: - imagebboxlist.remove(item) - else: - while imagebboxlist.count(item) > 1: - imagebboxlist.remove(item) + if len(imagebboxlist) != len(set(imagebboxlist)): + # remove duplicate to make it run faster + for item in set(imagebboxlist): + if imagebboxlist.count(item) % 2 == 0: + while item in imagebboxlist: + imagebboxlist.remove(item) + else: + while imagebboxlist.count(item) > 1: + imagebboxlist.remove(item) for bbox in imagebboxlist: pixmap.invertIRect(bbox * self.scale)