-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hello again,

suggested changes attached as patch.

Best regards, Adam.

Am 05.01.2015 um 21:24 schrieb Adam Reichold:
> Hello,
> 
> Am 04.01.2015 um 23:44 schrieb Albert Astals Cid:
>> El Dilluns, 5 de gener de 2015, a les 08:53:26, Adrian Johnson
>> va escriure:
>>> On 05/01/15 08:39, Albert Astals Cid wrote:
>>>> Adrian, any reason you de-inlined doGetChar in the patches
>>>> for openjpeg2?
>>>> 
>>>> As far as i remember when i made this function inline it got
>>>> us a not so bad free speed increase.
>>> 
>>> When I wrote the patch I moved all openjpeg specific types and 
>>> code into the .cc file. I could not figure out how to make an 
>>> inline function in the .h access the JPXStreamPrivate struct
>>> that is defined in the .cc file.
> 
>> I see :/
> 
>> Cheers, Albert
> 
> Looking at the implemenation, both "doGetChar" and "doLookChar"
> will always be called inside "JPEG2000Stream.cc" via the virtual
> methods "getChar(s)" and "lookChar", so I'd say we could just mark
> the implemenations as "inline" as the compiler can still inline
> within the compilation unit.
> 
> Actually, I think there is no compelling reason to have those
> present in the header at all, as they always seem to access the
> data via the "priv" pointer anyway, so I'd say the declarations
> like
> 
> static inline int doGetChar(JPXStreamPrivate* priv); static inline
> int doLookChar(JPXStreamPrivate* priv);
> 
> only within the source file could open even more possibilities for 
> compiler optimizations. (You could probably also make them inline 
> methods of "JPXStreamPrivate" as well, but then the compiler would 
> have to infer the effective linkage. Maybe we could put the whole 
> definition of "JPXStreamPrivate" within the anonymous namespace
> anyway?)
> 
> Best regards, Adam.
> 
>>> 
>>>> Cheers,
>>>> 
>>>> Albert
>>>> 
>>>> _______________________________________________ poppler
>>>> mailing list [email protected] 
>>>> http://lists.freedesktop.org/mailman/listinfo/poppler
>>> 
>>> _______________________________________________ poppler
>>> mailing list [email protected] 
>>> http://lists.freedesktop.org/mailman/listinfo/poppler
> 
>> _______________________________________________ poppler mailing 
>> list [email protected] 
>> http://lists.freedesktop.org/mailman/listinfo/poppler
> 
> _______________________________________________ poppler mailing
> list [email protected] 
> http://lists.freedesktop.org/mailman/listinfo/poppler
> 
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJUqvgiAAoJEPSSjE3STU34u7YIAKmkBl6AR6IcRd+9wWNMSHr5
XsEvqXlQWLk85YzKHR4lxXCK2y7N1+84sjIBYZK+CYbxnNbCFCJC4U8edLkW/oWP
5fMBipKLRJ+OKEwXqfSKmeOwithegTIHEK51J7Y2kW5kgrhrBtWm8Lo7aVvuVoqU
dZtegXKrqikNulK6zI3FlC/n77MVLll3Yxf5uAIv5kouch4HwNxwk2U3vwrlK/R+
m+5UJjb1o6r6AYy9ER50X3fOvveAbJZ91cg9aVDWDP0rzxVMLNYr1Nkz4YIKVnXB
avm76xXgP0cVol5AQB2/I8Be7EqWKt4Uo/1lG1SGrubaTis85/LNv9/cLqh0Oi4=
=aLA1
-----END PGP SIGNATURE-----
>From 486d9290f57097f84acc7a1d34495fa3cbb3f888 Mon Sep 17 00:00:00 2001
From: Adam Reichold <[email protected]>
Date: Mon, 5 Jan 2015 21:42:45 +0100
Subject: [PATCH] Inline 'doGet/LookChar' within 'JPXStream'

Make 'doGetChar' and 'doLookChar' static inline freestanding functions
instead of private methods to improve compiler optimization opportunities.
---
 poppler/JPEG2000Stream.cc | 44 ++++++++++++++++++++++----------------------
 poppler/JPEG2000Stream.h  |  4 ----
 2 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc
index 2d48899..beeb9d2 100644
--- a/poppler/JPEG2000Stream.cc
+++ b/poppler/JPEG2000Stream.cc
@@ -49,6 +49,25 @@ struct JPXStreamPrivate {
 #endif
 };
 
+static inline int doLookChar(JPXStreamPrivate* priv) {
+  if (unlikely(priv->inited == gFalse))
+    init();
+
+  if (unlikely(priv->counter >= priv->npixels))
+    return EOF;
+
+  return ((unsigned char *)priv->image->comps[priv->ccounter].data)[priv->counter];
+}
+
+static inline int doGetChar(JPXStreamPrivate* priv) {
+  int result = doLookChar(priv);
+  if (++priv->ccounter == priv->ncomps) {
+    priv->ccounter = 0;
+    ++priv->counter;
+  }
+  return result;
+}
+
 JPXStream::JPXStream(Stream *strA) : FilterStream(strA) {
   priv = new JPXStreamPrivate;
   priv->inited = gFalse;
@@ -92,7 +111,7 @@ Goffset JPXStream::getPos() {
 
 int JPXStream::getChars(int nChars, Guchar *buffer) {
   for (int i = 0; i < nChars; ++i) {
-    const int c = doGetChar();
+    const int c = doGetChar(priv);
     if (likely(c != EOF)) buffer[i] = c;
     else return i;
   }
@@ -100,30 +119,11 @@ int JPXStream::getChars(int nChars, Guchar *buffer) {
 }
 
 int JPXStream::getChar() {
-  return doGetChar();
-}
-
-int JPXStream::doLookChar() {
-  if (unlikely(priv->inited == gFalse))
-    init();
-
-  if (unlikely(priv->counter >= priv->npixels))
-    return EOF;
-
-  return ((unsigned char *)priv->image->comps[priv->ccounter].data)[priv->counter];
+  return doGetChar(priv);
 }
 
 int JPXStream::lookChar() {
-  return doLookChar();
-}
-
-int JPXStream::doGetChar() {
-  int result = doLookChar();
-  if (++priv->ccounter == priv->ncomps) {
-    priv->ccounter = 0;
-    ++priv->counter;
-  }
-  return result;
+  return doLookChar(priv);
 }
 
 GooString *JPXStream::getPSFilter(int psLevel, const char *indent) {
diff --git a/poppler/JPEG2000Stream.h b/poppler/JPEG2000Stream.h
index 50b7586..7223ce9 100644
--- a/poppler/JPEG2000Stream.h
+++ b/poppler/JPEG2000Stream.h
@@ -49,10 +49,6 @@ private:
   void init();
   virtual GBool hasGetChars() { return true; }
   virtual int getChars(int nChars, Guchar *buffer);
-
-  int doGetChar();
-
-  int doLookChar();
 };
 
 #endif
-- 
2.2.1

_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to