Merge branch 'issue91' into devel

This commit is contained in:
John Evans 2013-07-26 14:57:59 -04:00
commit 8f37579ffc
13 changed files with 62 additions and 31 deletions

View file

@ -1,3 +1,6 @@
Jul 25, 2013 - v0.2.7 Warns but no longer errors out when neither library is
found (issue89).
Jul 24, 2013 - v0.2.6 No longer warning when configuration file not found. Jul 24, 2013 - v0.2.6 No longer warning when configuration file not found.
Added read support for jpch, jplh boxes. Added testing of files in Added read support for jpch, jplh boxes. Added testing of files in
format-corpus repository. format-corpus repository.

View file

@ -78,7 +78,7 @@ copyright = u'2013, John Evans'
# The short X.Y version. # The short X.Y version.
version = '0.2' version = '0.2'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.2.6' release = '0.2.7'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View file

@ -1,5 +1,5 @@
---------------------------------- ----------------------------------
Detailed Installation Instructions Advanced Installation Instructions
---------------------------------- ----------------------------------
'''''''''''''''''''''' ''''''''''''''''''''''
@ -30,8 +30,22 @@ configparser module, i.e. ::
openjp2: /opt/openjp2-svn/lib/libopenjp2.so openjp2: /opt/openjp2-svn/lib/libopenjp2.so
This assumes, of course, that you've installed OpenJPEG into This assumes, of course, that you've installed OpenJPEG into
/opt/openjp2-svn on a linux system. You may also substitute /opt/openjp2-svn on a linux system. The location of the configuration file
**$XDG_CONFIG_HOME** for **$HOME/.config**. is platform-dependent (of course). If you use either linux or mac, the path
to the configuration file would normally be ::
$HOME/.config/glymur/glymurrc
but if you have **$XDG_CONFIG_HOME** defined, the path will be ::
$XDG_CONFIG_HOME/glymur/glymurrc
On windows, the path to the configuration file can be determined by starting up Python
and typing ::
import os
os.path.join(os.path.expanduser('~'), 'glymur', 'glymurrc')
You may also include a line for the version 1.x openjpeg library if you have it You may also include a line for the version 1.x openjpeg library if you have it
installed in a non-standard place, i.e. :: installed in a non-standard place, i.e. ::
@ -124,12 +138,11 @@ In addition, you must install contextlib2 and Pillow via pip. ::
Windows Windows
------- -------
The only configuration I've tested is Python(xy), which uses Python 2.7. I would recommend using WinPython, but Python(xy) also seems to work. WinPython 3.3
Python(xy) already comes with numpy, but you will have to install pip and then should work with no additional installations required, but 2.7 versions still require
contextlib2 and mock as well. Glymur seems to work with both 1.5.1 and the contextlib2 and mock to be installed via pip.
svn development versions of openjpeg.
Glymur has been tested **far less** extensively on Windows than on the other Glymur has been tested far less extensively on Windows than on the other
platforms. platforms.
@ -141,7 +154,7 @@ There are two environment variables you may wish to set before running the
tests. tests.
* **OPJ_DATA_ROOT** - points to directory for OpenJPEG test data * **OPJ_DATA_ROOT** - points to directory for OpenJPEG test data
* **FORMAT_CORPUS_ROOT** - points to directory for format-corpus repository (see https://github.com/openplanets/format-corpus) * **FORMAT_CORPUS_ROOT** - points to directory for format-corpus repository (see https://github.com/openplanets/format-corpus if you wish, but you really don't need to bother with this)
Setting these two environment variables is not required, as any tests using Setting these two environment variables is not required, as any tests using
either of them will be skipped. either of them will be skipped.

View file

@ -140,7 +140,6 @@ class Codestream(object):
fptr.seek(self._tile_offset[-1] + self._tile_length[-1]) fptr.seek(self._tile_offset[-1] + self._tile_length[-1])
def _process_marker_segment(self, fptr, marker_id): def _process_marker_segment(self, fptr, marker_id):
"""Process and return a segment from the codestream. """Process and return a segment from the codestream.
""" """
@ -207,7 +206,8 @@ class Codestream(object):
segment = _parse_sot_segment(fptr) segment = _parse_sot_segment(fptr)
self._tile_offset.append(segment.offset) self._tile_offset.append(segment.offset)
if segment.psot == 0: if segment.psot == 0:
tile_part_length = self.offset + self.length - segment.offset - 2 tile_part_length = (self.offset + self.length -
segment.offset - 2)
else: else:
tile_part_length = segment.psot tile_part_length = segment.psot
self._tile_length.append(tile_part_length) self._tile_length.append(tile_part_length)

View file

@ -571,7 +571,7 @@ class CodestreamHeaderBox(Jp2kBox):
""" """
box = CodestreamHeaderBox(length=length, offset=offset) box = CodestreamHeaderBox(length=length, offset=offset)
# The codestream header box is a superbox, so go ahead and parse its # The codestream header box is a superbox, so go ahead and parse its
# child boxes. # child boxes.
box.box = box.parse_superbox(fptr) box.box = box.parse_superbox(fptr)

View file

@ -170,7 +170,7 @@ class Jp2k(Jp2kBox):
if ftyp.brand == 'jp2 ': if ftyp.brand == 'jp2 ':
jp2h = [box for box in self.box if box.box_id == 'jp2h'][0] jp2h = [box for box in self.box if box.box_id == 'jp2h'][0]
colrs = [box for box in jp2h.box if box.box_id == 'colr'] colrs = [box for box in jp2h.box if box.box_id == 'colr']
for colr in colrs: for colr in colrs:
if colr.method not in (ENUMERATED_COLORSPACE, if colr.method not in (ENUMERATED_COLORSPACE,
RESTRICTED_ICC_PROFILE): RESTRICTED_ICC_PROFILE):
msg = "Color Specification box method must specify either " msg = "Color Specification box method must specify either "
@ -178,7 +178,6 @@ class Jp2k(Jp2kBox):
msg += "profile if the file type box brand is 'jp2 '." msg += "profile if the file type box brand is 'jp2 '."
warnings.warn(msg) warnings.warn(msg)
# pylint: disable-msg=W0221 # pylint: disable-msg=W0221
def write(self, img_array, cratios=None, eph=False, psnr=None, numres=None, def write(self, img_array, cratios=None, eph=False, psnr=None, numres=None,
cbsize=None, psizes=None, grid_offset=None, sop=False, cbsize=None, psizes=None, grid_offset=None, sop=False,

View file

@ -1,4 +1,3 @@
"""This package organizes individual libraries employed by glymur.""" """This package organizes individual libraries employed by glymur."""
from . import openjp2 as _openjp2 from . import openjp2 as _openjp2
from . import openjpeg as _openjpeg from . import openjpeg as _openjpeg
#from . import test

View file

@ -58,6 +58,9 @@ def load_openjpeg(libopenjpeg_path):
'bin', 'openjpeg.dll') 'bin', 'openjpeg.dll')
if os.path.exists(path): if os.path.exists(path):
libopenjpeg_path = path libopenjpeg_path = path
else:
# No sense trying further on Linux
return None
try: try:
if os.name == "nt": if os.name == "nt":
@ -124,6 +127,10 @@ def glymur_config():
libs = read_config_file() libs = read_config_file()
libopenjp2_handle = load_openjp2(libs['openjp2']) libopenjp2_handle = load_openjp2(libs['openjp2'])
libopenjpeg_handle = load_openjpeg(libs['openjpeg']) libopenjpeg_handle = load_openjpeg(libs['openjpeg'])
if libopenjp2_handle is None and libopenjpeg_handle is None:
msg = "Neither the openjp2 nor the openjpeg library could be loaded. "
msg += "Operating in severely degraded mode."
warnings.warn(msg, UserWarning)
return libopenjp2_handle, libopenjpeg_handle return libopenjp2_handle, libopenjpeg_handle
@ -136,10 +143,11 @@ def get_configdir():
if 'XDG_CONFIG_HOME' in os.environ: if 'XDG_CONFIG_HOME' in os.environ:
return os.path.join(os.environ['XDG_CONFIG_HOME'], 'glymur') return os.path.join(os.environ['XDG_CONFIG_HOME'], 'glymur')
if 'HOME' in os.environ: if 'HOME' in os.environ and os.name != 'nt':
# HOME is set by WinPython to something unusual, so we don't
# want that.
return os.path.join(os.environ['HOME'], '.config', 'glymur') return os.path.join(os.environ['HOME'], '.config', 'glymur')
if 'USERPROFILE' in os.environ: if os.name == 'nt':
# Windows? # Windows.
return os.path.join(os.environ['USERPROFILE'], 'Application Data', return os.path.join(os.path.expanduser('~'), 'glymur')
'glymur')

View file

@ -22,8 +22,15 @@ def version():
return library_version return library_version
# Need to get the minor version, make sure we are at least at 1.4.x # Need to get the minor version, make sure we are at least at 1.4.x
#import pdb; pdb.set_trace() if OPENJPEG is not None:
_MINOR = version().split('.')[1] _MINOR = version().split('.')[1]
else:
# Does not really matter. But version should not be called if there is no
# OpenJPEG library found.
_MINOR = 0
# Redefine version so that we can use it.
def version():
return '0.0.0'
class EventMgrType(ctypes.Structure): class EventMgrType(ctypes.Structure):

View file

@ -46,7 +46,7 @@ class TestSuiteFormatCorpus(unittest.TestCase):
j2k = Jp2k(jfile) j2k = Jp2k(jfile)
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
c = j2k.get_codestream(header_only=False) c = j2k.get_codestream(header_only=False)
# The last segment is truncated, so there should not be an EOC marker. # The last segment is truncated, so there should not be an EOC marker.
self.assertNotEqual(c.segment[-1].marker_id, 'EOC') self.assertNotEqual(c.segment[-1].marker_id, 'EOC')
@ -61,7 +61,7 @@ class TestSuiteFormatCorpus(unittest.TestCase):
j2k = Jp2k(jfile) j2k = Jp2k(jfile)
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
c = j2k.get_codestream(header_only=False) c = j2k.get_codestream(header_only=False)
# The last segment is truncated, so there should not be an EOC marker. # The last segment is truncated, so there should not be an EOC marker.
self.assertNotEqual(c.segment[-1].marker_id, 'EOC') self.assertNotEqual(c.segment[-1].marker_id, 'EOC')
@ -76,7 +76,7 @@ class TestSuiteFormatCorpus(unittest.TestCase):
j2k = Jp2k(jfile) j2k = Jp2k(jfile)
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
c = j2k.get_codestream(header_only=False) c = j2k.get_codestream(header_only=False)
# The last segment is truncated, so there should not be an EOC marker. # The last segment is truncated, so there should not be an EOC marker.
self.assertNotEqual(c.segment[-1].marker_id, 'EOC') self.assertNotEqual(c.segment[-1].marker_id, 'EOC')
@ -91,7 +91,7 @@ class TestSuiteFormatCorpus(unittest.TestCase):
'balloon_eciRGBv2_ps_adobeplugin.jpf') 'balloon_eciRGBv2_ps_adobeplugin.jpf')
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
j2k = Jp2k(jfile) j2k = Jp2k(jfile)
def test_jp2_brand_vs_any_icc_profile_multiple_colr(self): def test_jp2_brand_vs_any_icc_profile_multiple_colr(self):
# Has colr box, one that conforms, one that does not. # Has colr box, one that conforms, one that does not.
@ -104,7 +104,7 @@ class TestSuiteFormatCorpus(unittest.TestCase):
jfile = os.path.join(*lst) jfile = os.path.join(*lst)
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
j2k = Jp2k(jfile) j2k = Jp2k(jfile)
@unittest.skipIf(opj_data_root is None, @unittest.skipIf(opj_data_root is None,
"OPJ_DATA_ROOT environment variable not set") "OPJ_DATA_ROOT environment variable not set")
@ -124,6 +124,6 @@ class TestSuiteOpj(unittest.TestCase):
'input/nonregression/text_GBR.jp2') 'input/nonregression/text_GBR.jp2')
with self.assertWarns(UserWarning): with self.assertWarns(UserWarning):
j2k = Jp2k(filename) j2k = Jp2k(filename)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View file

@ -47,6 +47,9 @@ def load_tests(loader, tests, ignore):
return tests return tests
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None and
glymur.lib.openjpeg.OPENJPEG is None,
"Missing openjp2 library.")
class TestConfig(unittest.TestCase): class TestConfig(unittest.TestCase):
def setUp(self): def setUp(self):

View file

@ -832,7 +832,6 @@ class TestSuite(unittest.TestCase):
data = Jp2k(jfile).read() data = Jp2k(jfile).read()
self.assertTrue(True) self.assertTrue(True)
@unittest.skipIf(sys.hexversion < 0x03020000, @unittest.skipIf(sys.hexversion < 0x03020000,
"Uses features introduced in 3.2.") "Uses features introduced in 3.2.")
def test_NR_DEC_broken3_jp2_6_decode(self): def test_NR_DEC_broken3_jp2_6_decode(self):

View file

@ -2,7 +2,7 @@ from setuptools import setup, find_packages
import sys import sys
kwargs = {'name': 'Glymur', kwargs = {'name': 'Glymur',
'version': '0.2.6', 'version': '0.2.7',
'description': 'Tools for accessing JPEG2000 files', 'description': 'Tools for accessing JPEG2000 files',
'long_description': open('README.md').read(), 'long_description': open('README.md').read(),
'author': 'John Evans', 'author': 'John Evans',