[poppler] poppler/CMap.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Mar 16 17:53:37 UTC 2021


 poppler/CMap.cc |   48 ++++++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

New commits:
commit 57836ce2210183704f685ccc6b1820e16859a0c7
Author: Albert Astals Cid <aacid at kde.org>
Date:   Tue Mar 16 09:08:53 2021 +0100

    Fix rendering of text in some files
    
    Update CMap::addCIDs from xpdf 3.04
    
    Fixes issue #1052

diff --git a/poppler/CMap.cc b/poppler/CMap.cc
index 456cce5c..28c0c818 100644
--- a/poppler/CMap.cc
+++ b/poppler/CMap.cc
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2008 Koji Otani <sho at bbr.jp>
-// Copyright (C) 2008, 2009, 2017-2020 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2008, 2009, 2017-2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2013 Fabio D'Urso <fabiodurso at hotmail.it>
 // Copyright (C) 2017 Adrian Johnson <ajohnson at redneon.com>
 // Copyright (C) 2018 Adam Reichold <adam.reichold at t-online.de>
@@ -287,36 +287,36 @@ void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src)
 
 void CMap::addCIDs(unsigned int start, unsigned int end, unsigned int nBytes, CID firstCID)
 {
-    CMapVectorEntry *vec;
-    CID cid;
-    int byte;
-    unsigned int i, j;
-
     if (nBytes > 4) {
         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
         return;
     }
-    vec = vector;
-    for (i = nBytes - 1; i >= 1; --i) {
-        byte = (start >> (8 * i)) & 0xff;
-        if (!vec[byte].isVector) {
-            vec[byte].isVector = true;
-            vec[byte].vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry));
-            for (j = 0; j < 256; ++j) {
-                vec[byte].vector[j].isVector = false;
-                vec[byte].vector[j].cid = 0;
+
+    const unsigned int start1 = start & 0xffffff00;
+    const unsigned int end1 = end & 0xffffff00;
+    for (unsigned int i = start1; i <= end1; i += 0x100) {
+        CMapVectorEntry *vec = vector;
+        for (unsigned int j = nBytes - 1; j >= 1; --j) {
+            const int byte = (i >> (8 * j)) & 0xff;
+            if (!vec[byte].isVector) {
+                vec[byte].isVector = true;
+                vec[byte].vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry));
+                for (unsigned int k = 0; k < 256; ++k) {
+                    vec[byte].vector[k].isVector = false;
+                    vec[byte].vector[k].cid = 0;
+                }
             }
+            vec = vec[byte].vector;
         }
-        vec = vec[byte].vector;
-    }
-    cid = firstCID;
-    for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) {
-        if (vec[byte].isVector) {
-            error(errSyntaxError, -1, "Invalid CID ({0:ux} - {1:ux} [{2:ud} bytes]) in CMap", start, end, nBytes);
-        } else {
-            vec[byte].cid = cid;
+        const int byte0 = (i < start) ? (start & 0xff) : 0;
+        const int byte1 = (i + 0xff > end) ? (end & 0xff) : 0xff;
+        for (int byte = byte0; byte <= byte1; ++byte) {
+            if (vec[byte].isVector) {
+                error(errSyntaxError, -1, "Invalid CID ({0:ux} [{1:ud} bytes]) in CMap", i, nBytes);
+            } else {
+                vec[byte].cid = firstCID + ((i + byte) - start);
+            }
         }
-        ++cid;
     }
 }
 


More information about the poppler mailing list