Panda3D

pnmWriter.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file pnmWriter.cxx
10 * @author drose
11 * @date 2000-06-14
12 */
13
14 #include "pnmWriter.h"
15 #include "thread.h"
16
17 /**
18 *
19 */
20 PNMWriter::
21 ~PNMWriter() {
22 if (_owns_file) {
23 delete _file;
24 }
25 _file = nullptr;
26 }
27
28 /**
29 * Returns true if this PNMFileType can accept a floating-point image type,
30 * false if it can only accept a normal, integer type. If this returns true,
31 * write_pfm() is implemented.
32 */
33 bool PNMWriter::
34 supports_floating_point() {
35 return false;
36 }
37
38 /**
39 * Returns true if this PNMFileType can accept an integer image type, false if
40 * it can only accept a floating-point type. If this returns true,
41 * write_data() or write_row() is implemented.
42 */
43 bool PNMWriter::
44 supports_integer() {
45 return true;
46 }
47
48 /**
49 * Writes floating-point data from the indicated PfmFile. Returns true on
50 * success, false on failure.
51 */
52 bool PNMWriter::
53 write_pfm(const PfmFile &pfm) {
54 return false;
55 }
56
57 /**
58 * Writes out an entire image all at once, including the header, based on the
59 * image data stored in the given _x_size * _y_size array and alpha pointers.
60 * (If the image type has no alpha channel, alpha is ignored.) Returns the
61 * number of rows correctly written.
62 *
63 * It is the user's responsibility to fill in the header data via calls to
64 * set_x_size(), set_num_channels(), etc., or copy_header_from(), before
65 * calling write_data().
66 *
67 * It is important to delete the PNMWriter class after successfully writing
68 * the data. Failing to do this may result in some data not getting flushed!
69 *
70 * Derived classes need not override this if they instead provide
71 * supports_streaming() and write_row(), below.
72 */
73 int PNMWriter::
74 write_data(xel *array, xelval *alpha) {
75 if (_x_size <= 0 || _y_size <= 0) {
76 return 0;
77 }
78
79 if (!write_header()) {
80 return 0;
81 }
82
83 int y;
84 for (y = 0; y < _y_size; y++) {
85 if (!write_row(array + y * _x_size, alpha + y * _x_size)) {
86 Thread::consider_yield();
87 return y;
88 }
89 }
90
91 return _y_size;
92 }
93
94 /**
95 * Returns true if this particular PNMWriter supports a streaming interface to
96 * writing the data: that is, it is capable of writing the image one row at a
97 * time, via repeated calls to write_row(). Returns false if the only way to
98 * write from this file is all at once, via write_data().
99 */
100 bool PNMWriter::
101 supports_write_row() const {
102 return false;
103 }
104
105 /**
106 * Returns true if this particular PNMWriter understands grayscale images. If
107 * this is false, then the rgb values of the xel array will be pre-filled with
108 * the same value across all three channels, to allow the writer to simply
109 * write out RGB data for a grayscale image.
110 */
111 bool PNMWriter::
112 supports_grayscale() const {
113 return true;
114 }
115
116 /**
117 * If supports_write_row(), above, returns true, this function may be called
118 * to write out the image header in preparation to writing out the image data
119 * one row at a time. Returns true if the header is successfully written,
120 * false if there is an error.
121 *
122 * It is the user's responsibility to fill in the header data via calls to
123 * set_x_size(), set_num_channels(), etc., or copy_header_from(), before
124 * calling write_header().
125 */
126 bool PNMWriter::
127 write_header() {
128 return false;
129 }
130
131 /**
132 * If supports_write_row(), above, returns true, this function may be called
133 * repeatedly to write the image, one horizontal row at a time, beginning from
134 * the top. Returns true if the row is successfully written, false if there
135 * is an error.
136 *
137 * You must first call write_header() before writing the individual rows. It
138 * is also important to delete the PNMWriter class after successfully writing
139 * the last row. Failing to do this may result in some data not getting
140 * flushed!
141 */
142 bool PNMWriter::
143 write_row(xel *, xelval *) {
144 return false;
145 }
146
147 /**
148 * Returns true if this particular PNMWriter can write to a general stream
149 * (including pipes, etc.), or false if the writer must occasionally fseek()
150 * on its output stream, and thus only disk streams are supported.
151 */
152 bool PNMWriter::
153 supports_stream_write() const {
154 return false;
155 }
PNMWriter::write_data
virtual int write_data(xel *array, xelval *alpha)
Writes out an entire image all at once, including the header, based on the image data stored in the g...
Definition: pnmWriter.cxx:74
PNMWriter::write_header
virtual bool write_header()
If supports_write_row(), above, returns true, this function may be called to write out the image head...
Definition: pnmWriter.cxx:127
PNMWriter::supports_write_row
virtual bool supports_write_row() const
Returns true if this particular PNMWriter supports a streaming interface to writing the data: that is...
Definition: pnmWriter.cxx:101
PNMWriter::write_pfm
virtual bool write_pfm(const PfmFile &pfm)
Writes floating-point data from the indicated PfmFile.
Definition: pnmWriter.cxx:53
PNMWriter::supports_stream_write
virtual bool supports_stream_write() const
Returns true if this particular PNMWriter can write to a general stream (including pipes,...
Definition: pnmWriter.cxx:153
PNMWriter::write_row
virtual bool write_row(xel *array, xelval *alpha)
If supports_write_row(), above, returns true, this function may be called repeatedly to write the ima...
Definition: pnmWriter.cxx:143
PNMWriter::supports_grayscale
virtual bool supports_grayscale() const
Returns true if this particular PNMWriter understands grayscale images.
Definition: pnmWriter.cxx:112
PNMWriter::supports_floating_point
virtual bool supports_floating_point()
Returns true if this PNMFileType can accept a floating-point image type, false if it can only accept ...
Definition: pnmWriter.cxx:34
PNMWriter::supports_integer
virtual bool supports_integer()
Returns true if this PNMFileType can accept an integer image type, false if it can only accept a floa...
Definition: pnmWriter.cxx:44
PfmFile
Defines a pfm file, a 2-d table of floating-point numbers, either 3-component or 1-component,...
Definition: pfmFile.h:31
Thread::consider_yield
static void consider_yield()
Possibly suspends the current thread for the rest of the current epoch, if it has run for enough this...
Definition: thread.I:212
pnmWriter.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pixel
Definition: pnmimage_base.h:41
thread.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.