libmng-1.0.6 on FreeBSD/alpha

Matthew Luckie <[email protected]> Wed, 17 Mar 2004 22:20:44 +1300
Newsgroups gmane.comp.graphics.mng.general
Message-ID <[email protected]>
[non-member submission]

Hi mng-list

I have a FreeBSD DEC alpha system - a system with 64 bit pointers.  When 
compiling libmng on it, I get a series of compilation warnings.

I've detailed the warnings below, and also provided some kind of 
suggestion as to what I think it should be changed to.  I'm no expert in 
the mng field, but the code as it stands seems to be incorrect and seems 
to me that it would lead to unpredictable results on 64 bit platforms.

If there is some test suite available to check for correctness, could I 
be pointed at it so that I can check the library works on the alpha 
platform?  Please CC me on any response, I'm not subscribed.

i've put the patch up at 
http://voodoo.cs.waikato.ac.nz/~mjl12/patch-libmng-alpha

Thanks

cc -fpic -DPIC -O -pipe -mcpu=ev4 -I/usr/local/include -DMNG_FULL_CMS 
-DMNG_BUILD_SO  -c libmng_object_prc.c -o libmng_object_prc.So
libmng_object_prc.c: In function `mng_promote_imageobject':
libmng_object_prc.c:1665: warning: cast from pointer to integer of 
different size
libmng_object_prc.c:1665: warning: cast to pointer from integer of 
different size
libmng_object_prc.c:1666: warning: cast from pointer to integer of 
different size
libmng_object_prc.c:1666: warning: cast to pointer from integer of 
different size

The code for these warnings is a bit difficult for me to understand.  On 
an i386 machine, the following patch should lead to an equivalent result 
by my understanding

--- libmng-1.0.6.orig/libmng_object_prc.c	Mon Oct 20 04:20:13 2003
+++ libmng-1.0.6/libmng_object_prc.c	Wed Mar 17 20:30:39 2004
@@ -1662,8 +1662,8 @@
      while ((!iRetcode) && (iY < iH))
      {
        iRetcode         = ((mng_promoterow)pData->fPromoterow) (pData);
-      pData->pPromSrc  = (mng_ptr)((mng_uint32)pData->pPromSrc + 
pBuf->iRowsize);
-      pData->pPromDst  = (mng_ptr)((mng_uint32)pData->pPromDst + 
iNewrowsize);
+      pData->pPromSrc  = pData->pPromSrc + pBuf->iRowsize;
+      pData->pPromDst  = pData->pPromDst + iNewrowsize;
        iY++;
      }

the casts seem fairly pointless to me.  both casts are to 32 bit values. 
  exactly what should happen in the 64 bit case is unclear to me. 
perhaps this code should be looked into.

There is also

cc -fpic -DPIC -O -pipe -mcpu=ev4 -I/usr/local/include -DMNG_FULL_CMS 
-DMNG_BUILD_SO  -c libmng_pixels.c -o libmng_pixels.So
libmng_pixels.c: In function `mng_scale_g1_g16':
libmng_pixels.c:6763: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6763: warning: cast to pointer from integer of different 
size
libmng_pixels.c:6764: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6764: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_g2_g16':
libmng_pixels.c:6856: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6856: warning: cast to pointer from integer of different 
size
libmng_pixels.c:6857: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6857: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_g4_g16':
libmng_pixels.c:6921: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6921: warning: cast to pointer from integer of different 
size
libmng_pixels.c:6922: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6922: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_g8_g16':
libmng_pixels.c:6958: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6958: warning: cast to pointer from integer of different 
size
libmng_pixels.c:6959: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6959: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_ga8_ga16':
libmng_pixels.c:6995: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6995: warning: cast to pointer from integer of different 
size
libmng_pixels.c:6996: warning: cast from pointer to integer of different 
size
libmng_pixels.c:6996: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_rgb8_rgb16':
libmng_pixels.c:7034: warning: cast from pointer to integer of different 
size
libmng_pixels.c:7034: warning: cast to pointer from integer of different 
size
libmng_pixels.c:7035: warning: cast from pointer to integer of different 
size
libmng_pixels.c:7035: warning: cast to pointer from integer of different 
size
libmng_pixels.c: In function `mng_scale_rgba8_rgba16':
libmng_pixels.c:7075: warning: cast from pointer to integer of different 
size
libmng_pixels.c:7075: warning: cast to pointer from integer of different 
size
libmng_pixels.c:7076: warning: cast from pointer to integer of different 
size
libmng_pixels.c:7076: warning: cast to pointer from integer of different 
size

this is the patch I've come up with.  instead of casting to a 4 byte 
value and then indexing on that, I multiply the index value by 4.

  --- libmng-1.0.6.orig/libmng_pixels.c   Mon Oct 20 04:20:14 2003
+++ libmng-1.0.6/libmng_pixels.c        Wed Mar 17 20:14:52 2004
@@ -6760,8 +6760,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_G1_G16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1);
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 1));
+  pWorkrow = pWorkrow + ((pData->iRowsamples - 1) * 4);
+  pOutrow  = pOutrow + (((pData->iRowsamples - 1) << 1) * 4);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -6853,8 +6853,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_G2_G16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1);
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 1));
+  pWorkrow = pWorkrow + ((pData->iRowsamples - 1) * 4);
+  pOutrow  = pOutrow + (((pData->iRowsamples - 1) << 1) * 4);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -6918,8 +6918,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_G4_G16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1);
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 1));
+  pWorkrow = pWorkrow + ((pData->iRowsamples - 1) * 4);
+  pOutrow  = pOutrow + (((pData->iRowsamples - 1) << 1) * 4);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -6955,8 +6955,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_G8_G16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1);
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 1));
+  pWorkrow = pWorkrow + ((pData->iRowsamples - 1) * 4);
+  pOutrow  = pOutrow + (((pData->iRowsamples - 1) << 1) * 4);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -6992,8 +6992,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_GA8_GA16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 
1) << 1));
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 2));
+  pWorkrow = pWorkrow + (((pData->iRowsamples - 1) << 1) * 4);
+  pOutrow  = pOutrow  + (((pData->iRowsamples - 1) << 2) * 4);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -7031,8 +7031,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_RGB8_RGB16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + 3 * 
(pData->iRowsamples - 1));
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + 6 * 
(pData->iRowsamples - 1));
+  pWorkrow = pWorkrow + 12 * (pData->iRowsamples - 1);
+  pOutrow  = pOutrow + 24 * (pData->iRowsamples - 1);

  #ifdef MNG_DECREMENT_LOOPS
    for (iX = pData->iRowsamples; iX > 0; iX--)
@@ -7072,8 +7072,8 @@
    MNG_TRACE (pData, MNG_FN_SCALE_RGBA8_RGBA16, MNG_LC_START)
  #endif

-  pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 
1) << 2));
-  pOutrow  = (mng_uint8p)((mng_uint32)pOutrow  + ((pData->iRowsamples - 
1) << 3));
+  pWorkrow = pWorkrow + (((pData->iRowsamples - 1) << 2) * 4);
+  pOutrow  = pOutrow  + (((pData->iRowsamples - 1) << 3) * 4);


--
Send the message body "help" to [email protected]