summaryrefslogtreecommitdiff
path: root/src/openjpeg_image.cc
blob: 5c03255bd40349e1910a4273754112c45ac273df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

/** @file  src/openjpeg_image.cc
 *  @brief OpenJPEGImage class.
 */

#include "openjpeg_image.h"
#include "dcp_assert.h"
#include <openjpeg.h>
#include <stdexcept>

using namespace dcp;

/** Construct an OpenJPEGImage, taking ownership of the opj_image_t */
OpenJPEGImage::OpenJPEGImage (opj_image_t* image)
	: _opj_image (image)
{
	DCP_ASSERT (_opj_image->numcomps == 3);
}

/** Construct a new OpenJPEGImage with undefined contents.
 *  @param size Size for the frame in pixels.
 */
OpenJPEGImage::OpenJPEGImage (Size size)
{
	opj_image_cmptparm_t cmptparm[3];

	for (int i = 0; i < 3; ++i) {
		cmptparm[i].dx = 1;
		cmptparm[i].dy = 1;
		cmptparm[i].w = size.width;
		cmptparm[i].h = size.height;
		cmptparm[i].x0 = 0;
		cmptparm[i].y0 = 0;
		cmptparm[i].prec = 12;
		cmptparm[i].bpp = 12;
		cmptparm[i].sgnd = 0;
	}

	/* XXX: is this _SRGB right? */
	_opj_image = opj_image_create (3, &cmptparm[0], OPJ_CLRSPC_SRGB);
	if (_opj_image == 0) {
		throw std::runtime_error ("could not create libopenjpeg image");
	}

	_opj_image->x0 = 0;
	_opj_image->y0 = 0;
	_opj_image->x1 = size.width;
	_opj_image->y1 = size.height;
}

/** OpenJPEGImage destructor */
OpenJPEGImage::~OpenJPEGImage ()
{
	opj_image_destroy (_opj_image);
}

/** @param c Component index (0, 1 or 2)
 *  @return Pointer to the data for component c.
 */
int *
OpenJPEGImage::data (int c) const
{
	DCP_ASSERT (c >= 0 && c < 3);
	return _opj_image->comps[c].data;
}

/** @return Size of the image in pixels */
Size
OpenJPEGImage::size () const
{
	/* XXX: this may not be right; x0 and y0 can presumably be non-zero */
	return Size (_opj_image->x1, _opj_image->y1);
}

int
OpenJPEGImage::precision (int component) const
{
	return _opj_image->comps[component].prec;
}

bool
OpenJPEGImage::srgb () const
{
	return _opj_image->color_space == OPJ_CLRSPC_SRGB;
}