DEADSOFTWARE

hopefully no more windows
[d2df-editor.git] / src / lib / vampimg / JpegLib / imjcapistd.pas
1 unit imjcapistd;
3 { Original : jcapistd.c ; Copyright (C) 1994-1996, Thomas G. Lane. }
5 { This file is part of the Independent JPEG Group's software.
6 For conditions of distribution and use, see the accompanying README file.
8 This file contains application interface code for the compression half
9 of the JPEG library. These are the "standard" API routines that are
10 used in the normal full-compression case. They are not used by a
11 transcoding-only application. Note that if an application links in
12 jpeg_start_compress, it will end up linking in the entire compressor.
13 We thus must separate this file from jcapimin.c to avoid linking the
14 whole compression library into a transcoder. }
16 interface
18 {$I imjconfig.inc}
20 uses
21 imjmorecfg,
22 imjinclude,
23 imjdeferr,
24 imjerror,
25 imjpeglib,
26 imjcapimin, imjcinit;
30 { Compression initialization.
31 Before calling this, all parameters and a data destination must be set up.
33 We require a write_all_tables parameter as a failsafe check when writing
34 multiple datastreams from the same compression object. Since prior runs
35 will have left all the tables marked sent_table=TRUE, a subsequent run
36 would emit an abbreviated stream (no tables) by default. This may be what
37 is wanted, but for safety's sake it should not be the default behavior:
38 programmers should have to make a deliberate choice to emit abbreviated
39 images. Therefore the documentation and examples should encourage people
40 to pass write_all_tables=TRUE; then it will take active thought to do the
41 wrong thing. }
43 {GLOBAL}
44 procedure jpeg_start_compress (cinfo : j_compress_ptr;
45 write_all_tables : boolean);
48 { Write some scanlines of data to the JPEG compressor.
50 The return value will be the number of lines actually written.
51 This should be less than the supplied num_lines only in case that
52 the data destination module has requested suspension of the compressor,
53 or if more than image_height scanlines are passed in.
55 Note: we warn about excess calls to jpeg_write_scanlines() since
56 this likely signals an application programmer error. However,
57 excess scanlines passed in the last valid call are *silently* ignored,
58 so that the application need not adjust num_lines for end-of-image
59 when using a multiple-scanline buffer. }
61 {GLOBAL}
62 function jpeg_write_scanlines (cinfo : j_compress_ptr;
63 scanlines : JSAMPARRAY;
64 num_lines : JDIMENSION) : JDIMENSION;
66 { Alternate entry point to write raw data.
67 Processes exactly one iMCU row per call, unless suspended. }
69 {GLOBAL}
70 function jpeg_write_raw_data (cinfo : j_compress_ptr;
71 data : JSAMPIMAGE;
72 num_lines : JDIMENSION) : JDIMENSION;
74 implementation
76 { Compression initialization.
77 Before calling this, all parameters and a data destination must be set up.
79 We require a write_all_tables parameter as a failsafe check when writing
80 multiple datastreams from the same compression object. Since prior runs
81 will have left all the tables marked sent_table=TRUE, a subsequent run
82 would emit an abbreviated stream (no tables) by default. This may be what
83 is wanted, but for safety's sake it should not be the default behavior:
84 programmers should have to make a deliberate choice to emit abbreviated
85 images. Therefore the documentation and examples should encourage people
86 to pass write_all_tables=TRUE; then it will take active thought to do the
87 wrong thing. }
89 {GLOBAL}
90 procedure jpeg_start_compress (cinfo : j_compress_ptr;
91 write_all_tables : boolean);
92 begin
93 if (cinfo^.global_state <> CSTATE_START) then
94 ERREXIT1(j_common_ptr(cinfo), JERR_BAD_STATE, cinfo^.global_state);
96 if (write_all_tables) then
97 jpeg_suppress_tables(cinfo, FALSE); { mark all tables to be written }
99 { (Re)initialize error mgr and destination modules }
100 cinfo^.err^.reset_error_mgr (j_common_ptr(cinfo));
101 cinfo^.dest^.init_destination (cinfo);
102 { Perform master selection of active modules }
103 jinit_compress_master(cinfo);
104 { Set up for the first pass }
105 cinfo^.master^.prepare_for_pass (cinfo);
106 { Ready for application to drive first pass through jpeg_write_scanlines
107 or jpeg_write_raw_data. }
109 cinfo^.next_scanline := 0;
110 if cinfo^.raw_data_in then
111 cinfo^.global_state := CSTATE_RAW_OK
112 else
113 cinfo^.global_state := CSTATE_SCANNING;
114 end;
117 { Write some scanlines of data to the JPEG compressor.
119 The return value will be the number of lines actually written.
120 This should be less than the supplied num_lines only in case that
121 the data destination module has requested suspension of the compressor,
122 or if more than image_height scanlines are passed in.
124 Note: we warn about excess calls to jpeg_write_scanlines() since
125 this likely signals an application programmer error. However,
126 excess scanlines passed in the last valid call are *silently* ignored,
127 so that the application need not adjust num_lines for end-of-image
128 when using a multiple-scanline buffer. }
130 {GLOBAL}
131 function jpeg_write_scanlines (cinfo : j_compress_ptr;
132 scanlines : JSAMPARRAY;
133 num_lines : JDIMENSION) : JDIMENSION;
134 var
135 row_ctr, rows_left : JDIMENSION;
136 begin
137 if (cinfo^.global_state <> CSTATE_SCANNING) then
138 ERREXIT1(j_common_ptr(cinfo), JERR_BAD_STATE, cinfo^.global_state);
139 if (cinfo^.next_scanline >= cinfo^.image_height) then
140 WARNMS(j_common_ptr(cinfo), JWRN_TOO_MUCH_DATA);
142 { Call progress monitor hook if present }
143 if (cinfo^.progress <> NIL) then
144 begin
145 cinfo^.progress^.pass_counter := long (cinfo^.next_scanline);
146 cinfo^.progress^.pass_limit := long (cinfo^.image_height);
147 cinfo^.progress^.progress_monitor (j_common_ptr(cinfo));
148 end;
150 { Give master control module another chance if this is first call to
151 jpeg_write_scanlines. This lets output of the frame/scan headers be
152 delayed so that application can write COM, etc, markers between
153 jpeg_start_compress and jpeg_write_scanlines. }
154 if (cinfo^.master^.call_pass_startup) then
155 cinfo^.master^.pass_startup (cinfo);
157 { Ignore any extra scanlines at bottom of image. }
158 rows_left := cinfo^.image_height - cinfo^.next_scanline;
159 if (num_lines > rows_left) then
160 num_lines := rows_left;
162 row_ctr := 0;
163 cinfo^.main^.process_data (cinfo, scanlines, {var}row_ctr, num_lines);
164 Inc(cinfo^.next_scanline, row_ctr);
165 jpeg_write_scanlines := row_ctr;
166 end;
169 { Alternate entry point to write raw data.
170 Processes exactly one iMCU row per call, unless suspended. }
172 {GLOBAL}
173 function jpeg_write_raw_data (cinfo : j_compress_ptr;
174 data : JSAMPIMAGE;
175 num_lines : JDIMENSION) : JDIMENSION;
176 var
177 lines_per_iMCU_row : JDIMENSION;
178 begin
179 if (cinfo^.global_state <> CSTATE_RAW_OK) then
180 ERREXIT1(j_common_ptr(cinfo), JERR_BAD_STATE, cinfo^.global_state);
181 if (cinfo^.next_scanline >= cinfo^.image_height) then
182 begin
183 WARNMS(j_common_ptr(cinfo), JWRN_TOO_MUCH_DATA);
184 jpeg_write_raw_data := 0;
185 exit;
186 end;
188 { Call progress monitor hook if present }
189 if (cinfo^.progress <> NIL) then
190 begin
191 cinfo^.progress^.pass_counter := long(cinfo^.next_scanline);
192 cinfo^.progress^.pass_limit := long(cinfo^.image_height);
193 cinfo^.progress^.progress_monitor (j_common_ptr(cinfo));
194 end;
196 { Give master control module another chance if this is first call to
197 jpeg_write_raw_data. This lets output of the frame/scan headers be
198 delayed so that application can write COM, etc, markers between
199 jpeg_start_compress and jpeg_write_raw_data. }
201 if (cinfo^.master^.call_pass_startup) then
202 cinfo^.master^.pass_startup (cinfo);
204 { Verify that at least one iMCU row has been passed. }
205 lines_per_iMCU_row := cinfo^.max_v_samp_factor * DCTSIZE;
206 if (num_lines < lines_per_iMCU_row) then
207 ERREXIT(j_common_ptr(cinfo), JERR_BUFFER_SIZE);
209 { Directly compress the row. }
210 if (not cinfo^.coef^.compress_data (cinfo, data)) then
211 begin
212 { If compressor did not consume the whole row, suspend processing. }
213 jpeg_write_raw_data := 0;
214 exit;
215 end;
217 { OK, we processed one iMCU row. }
218 Inc(cinfo^.next_scanline, lines_per_iMCU_row);
219 jpeg_write_raw_data := lines_per_iMCU_row;
220 end;
222 end.