diff --git a/jtlsrv-cpp/.cursor/rules/no-background-servers.mdc b/jtlsrv-cpp/.cursor/rules/no-background-servers.mdc new file mode 100644 index 0000000..54f38ba --- /dev/null +++ b/jtlsrv-cpp/.cursor/rules/no-background-servers.mdc @@ -0,0 +1,29 @@ +--- +description: Server testing must use isolated bind address and non-default ports +alwaysApply: true +--- + +# Server testing — isolated bind only + +## Never use the user's ports + +Do NOT start servers on: + +- Ports from the project's `.env` (e.g. `PORT=4447`) +- Well-known or project defaults (`4443`, `8080`, `3000`, etc.) +- `0.0.0.0` when the user's server may already be running there + +Do NOT leave test servers running in the background (`&`, `nohup`, etc.). Stop them before ending the turn. + +## OK for agent runtime tests + +When a live test is truly needed: + +- Bind to **`127.0.0.2`** (or another non-default loopback alias), not `127.0.0.1` / `0.0.0.0` +- Use a **high ephemeral port** (e.g. `19443`, `38447`) — never the project's configured port +- Override via env, e.g. `BIND_ADDRESS=127.0.0.2 PORT=19443 ./build/jtlsrv` +- Kill the test process when done + +Prefer compile-only verification (`make`) when that is enough. + +If the user is already running the real server, ask them to test and share logs rather than starting another listener. diff --git a/jtlsrv-cpp/.dockerignore b/jtlsrv-cpp/.dockerignore deleted file mode 100644 index 9da07a9..0000000 --- a/jtlsrv-cpp/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -build/ -odbc-driver/ -logs/ -*.log diff --git a/jtlsrv-cpp/.gitignore b/jtlsrv-cpp/.gitignore index 3e9e7e6..45b90c2 100644 --- a/jtlsrv-cpp/.gitignore +++ b/jtlsrv-cpp/.gitignore @@ -5,9 +5,6 @@ build/ jtlsrv jtlsrv-debug -# Compiled commands -compile_commands.json - # ODBC driver (downloaded, not source) odbc-driver/ diff --git a/jtlsrv-cpp/.static-build/bin/vips b/jtlsrv-cpp/.static-build/bin/vips new file mode 100755 index 0000000..9a9a6c9 Binary files /dev/null and b/jtlsrv-cpp/.static-build/bin/vips differ diff --git a/jtlsrv-cpp/.static-build/bin/vipsedit b/jtlsrv-cpp/.static-build/bin/vipsedit new file mode 100755 index 0000000..537bdf5 Binary files /dev/null and b/jtlsrv-cpp/.static-build/bin/vipsedit differ diff --git a/jtlsrv-cpp/.static-build/bin/vipsheader b/jtlsrv-cpp/.static-build/bin/vipsheader new file mode 100755 index 0000000..e45aae2 Binary files /dev/null and b/jtlsrv-cpp/.static-build/bin/vipsheader differ diff --git a/jtlsrv-cpp/.static-build/bin/vipsprofile b/jtlsrv-cpp/.static-build/bin/vipsprofile new file mode 100755 index 0000000..acc0f2e --- /dev/null +++ b/jtlsrv-cpp/.static-build/bin/vipsprofile @@ -0,0 +1,462 @@ +#!/usr/bin/python3 + +import re +import cairo +from io import open + +class ReadFile: + def __init__(self, filename): + self.filename = filename + + def __enter__(self): + self.f = open(self.filename, 'r', encoding='utf-8') + self.lineno = 0 + self.getnext(); + return self + + def __exit__(self, type, value, traceback): + self.f.close() + + def __bool__(self): + return self.line != "" + + __nonzero__ = __bool__ + + def getnext(self): + self.lineno += 1 + self.line = self.f.readline() + +def read_times(rf): + times = [] + + while True: + match = re.match('[+-]?[0-9]+ ', rf.line) + if not match: + break + times += [int(x) for x in re.split(' ', rf.line.rstrip())] + rf.getnext() + + return times[::-1] + +class Thread: + thread_number = 0 + + def __init__(self, thread_name): + # no one cares about the thread address + match = re.match(r'(.*) \(0x.*?\) (.*)', thread_name) + if match: + thread_name = match.group(1) + " " + match.group(2) + + self.thread_name = thread_name + self.thread_number = Thread.thread_number + self.all_events = [] + self.workwait_events = [] + self.memory_events = [] + self.other_events = [] + Thread.thread_number += 1 + +all_events = [] + +class Event: + def __init__(self, thread, gate_location, gate_name, start, stop): + self.thread = thread + self.gate_location = gate_location + self.gate_name = gate_name + + self.work = False + self.wait = False + self.memory = False + if gate_location == "memory": + self.memory = True + elif re.match('.*work.*', gate_name): + self.work = True + elif re.match('.*wait.*', gate_name): + self.wait = True + + if self.memory: + self.start = start + self.stop = start + self.size = stop + else: + self.start = start + self.stop = stop + + thread.all_events.append(self) + all_events.append(self) + if self.wait or self.work: + thread.workwait_events.append(self) + elif self.memory: + thread.memory_events.append(self) + else: + thread.other_events.append(self) + +input_filename = 'vips-profile.txt' + +thread_id = 0 +threads = [] +n_events = 0 +print('reading from', input_filename) +with ReadFile(input_filename) as rf: + while rf: + if rf.line.rstrip() == "": + rf.getnext() + continue + if rf.line[0] == "#": + rf.getnext() + continue + + match = re.match('thread: (.*)', rf.line) + if not match: + print('parse error line %d, expected "thread"' % rf.lineno) + thread_name = match.group(1) + " " + str(thread_id) + thread_id += 1 + thread = Thread(thread_name) + threads.append(thread) + rf.getnext() + + while True: + match = re.match('^gate: (.*?)(: (.*))?$', rf.line) + if not match: + break + gate_location = match.group(1) + gate_name = match.group(3) + rf.getnext() + + match = re.match('start:', rf.line) + if not match: + continue + rf.getnext() + + start = read_times(rf) + + match = re.match('stop:', rf.line) + if not match: + continue + rf.getnext() + + stop = read_times(rf) + + if len(start) != len(stop): + print('start and stop length mismatch') + + for a, b in zip(start, stop): + Event(thread, gate_location, gate_name, a, b) + n_events += 1 + +for thread in threads: + thread.all_events.sort(key=lambda x: x.start) + thread.workwait_events.sort(key=lambda x: x.start) + thread.memory_events.sort(key=lambda x: x.start) + thread.other_events.sort(key=lambda x: x.start) + +all_events.sort(key=lambda x: x.start) + +print(f'loaded {n_events} events') + +# move time axis to secs of computation +ticks_per_sec = 1000000.0 +first_time = all_events[0].start +last_time = 0 +for event in all_events: + if event.start < first_time: + first_time = event.start + if event.stop > last_time: + last_time = event.stop + +for event in all_events: + event.start = (event.start - first_time) / ticks_per_sec + event.stop = (event.stop - first_time) / ticks_per_sec + +last_time = (last_time - first_time) / ticks_per_sec +first_time = 0 + +print(f'total time = {last_time}') + +# calculate some simple stats +for thread in threads: + thread.start = last_time + thread.stop = 0 + thread.wait = 0 + thread.work = 0 + thread.mem = 0 + thread.peak_mem = 0 + for event in thread.all_events: + if event.start < thread.start: + thread.start = event.start + if event.stop > thread.stop: + thread.stop = event.stop + if event.wait: + thread.wait += event.stop - event.start + if event.work: + thread.work += event.stop - event.start + if event.memory: + thread.mem += event.size + if thread.mem > thread.peak_mem: + thread.peak_mem = thread.mem + + thread.alive = thread.stop - thread.start + + # hide very short-lived threads + thread.hide = thread.alive < 0.01 + +print('name alive wait% work% unkn% mem peakm') +for thread in threads: + if thread.hide: + continue + + wait_percent = 100 * thread.wait / thread.alive + work_percent = 100 * thread.work / thread.alive + unkn_percent = 100 - 100 * (thread.work + thread.wait) / thread.alive + + print((f'{thread.thread_name:>13}\t{thread.alive:6.2f}\t' + f'{wait_percent:>4.1f}\t{work_percent:>4.1f}\t{unkn_percent:>4.1f}\t' + f'{thread.mem / (1024 * 1024):>4.1f}\t' + f'{thread.peak_mem / (1024 * 1024):>4.1f}')) + +mem = 0 +peak_mem = 0 +for event in all_events: + if event.memory: + mem += event.size + if mem > peak_mem: + peak_mem = mem + +print(f'peak memory = {peak_mem / (1024 * 1024):.1f} MB') +if mem != 0: + print(f'leak! final memory = {mem / (1024 * 1024):.1f} MB') + +# does a list of events contain an overlap? +# assume the list of events has been sorted by start time +def events_overlap(events): + for i in range(0, len(events) - 1): + # we can't just test for stop1 > start2 since one (or both) events + # might have duration zero + event1 = events[i] + event2 = events[i + 1] + overlap_start = max(event1.start, event2.start) + overlap_stop = min(event1.stop, event2.stop) + if overlap_stop - overlap_start > 0: + return True + + return False + +# do the events on two gates overlap? +def gates_overlap(events, gate_name1, gate_name2): + merged = [] + + for event in events: + if event.gate_name == gate_name1 or event.gate_name == gate_name2: + merged.append(event) + + merged.sort(key=lambda x: x.start) + + return events_overlap(merged) + +# show top 10 waits +wait = {} +for thread in threads: + for event in thread.all_events: + if event.wait: + name = f'{event.gate_location}::{event.gate_name}' + if name not in wait: + wait[name] = 0 + + wait[name] += event.stop - event.start + +print('name wait') +for [name, time] in sorted(wait.items(), reverse=True, key=lambda x: x[1])[:10]: + print(f'{name:>35}\t{time:.2f}') + +# allocate a y position for each gate +total_y = 0 +for thread in threads: + if thread.hide: + continue + + thread.total_y = total_y + + gate_positions = {} + + # first pass .. move work and wait events to y == 0 + if events_overlap(thread.workwait_events): + print('gate overlap on thread', thread.thread_name) + for i in range(0, len(thread.workwait_events) - 1): + event1 = thread.workwait_events[i] + event2 = thread.workwait_events[i + 1] + overlap_start = max(event1.start, event2.start) + overlap_stop = min(event1.stop, event2.stop) + if overlap_stop - overlap_start > 0: + print('overlap:') + print('event', event1.gate_location, event1.gate_name, end=' ') + print('starts at', event1.start, 'stops at', event1.stop) + print('event', event2.gate_location, event2.gate_name, end=' ') + print('starts at', event2.start, 'stops at', event2.stop) + + for event in thread.workwait_events: + gate_positions[event.gate_name] = 0 + event.y = 0 + event.total_y = total_y + + for event in thread.memory_events: + gate_positions[event.gate_name] = 0 + event.y = 0 + event.total_y = total_y + + # second pass: move all other events to non-overlapping ys + y = 1 + for event in thread.other_events: + if not event.gate_name in gate_positions: + # look at all the ys we've allocated previously and see if we can + # add this gate to one of them + for gate_y in range(1, y): + found_overlap = False + for gate_name in gate_positions: + if gate_positions[gate_name] != gate_y: + continue + + if gates_overlap(thread.other_events, + event.gate_name, gate_name): + found_overlap = True + break + + if not found_overlap: + gate_positions[event.gate_name] = gate_y + break + + # failure? add a new y + if not event.gate_name in gate_positions: + gate_positions[event.gate_name] = y + y += 1 + + event.y = gate_positions[event.gate_name] + + # third pass: flip the order of the ys to get the lowest-level ones at the + # top, next to the wait/work line + for event in thread.other_events: + event.y = y - event.y + event.total_y = total_y + event.y + + total_y += y + +PIXELS_PER_SECOND = 1000 +PIXELS_PER_GATE = 20 +LEFT_BORDER = 130 +BAR_HEIGHT = 5 +MEM_HEIGHT = 100 +WIDTH = int(LEFT_BORDER + last_time * PIXELS_PER_SECOND) + 20 +HEIGHT = int(total_y * PIXELS_PER_GATE) + MEM_HEIGHT + 30 + +output_filename = "vips-profile.svg" +print('writing to', output_filename) + +surface = cairo.SVGSurface(output_filename, WIDTH, HEIGHT) + +ctx = cairo.Context(surface) +ctx.select_font_face('Sans') +ctx.set_font_size(15) + +ctx.rectangle(0, 0, WIDTH, HEIGHT) +ctx.set_source_rgba(0.0, 0.0, 0.3, 1.0) +ctx.fill() + +def draw_event(ctx, event): + left = event.start * PIXELS_PER_SECOND + LEFT_BORDER + top = event.total_y * PIXELS_PER_GATE + BAR_HEIGHT // 2 + width = (event.stop - event.start) * PIXELS_PER_SECOND + height = BAR_HEIGHT + + if event.memory: + width = 1 + height /= 2 + top += BAR_HEIGHT + + ctx.rectangle(left, top, width, height) + + if event.wait: + ctx.set_source_rgb(0.9, 0.1, 0.1) + elif event.work: + ctx.set_source_rgb(0.1, 0.9, 0.1) + elif event.memory: + ctx.set_source_rgb(1.0, 1.0, 1.0) + else: + ctx.set_source_rgb(0.1, 0.1, 0.9) + + ctx.fill() + if not event.wait and not event.work and not event.memory: + xbearing, ybearing, twidth, theight, xadvance, yadvance = \ + ctx.text_extents(event.gate_name) + ctx.move_to(left + width // 2 - twidth // 2, top + 3 * BAR_HEIGHT) + ctx.set_source_rgb(1.00, 0.83, 0.00) + ctx.show_text(event.gate_name) + +for thread in threads: + if thread.hide: + continue + + ctx.rectangle(0, thread.total_y * PIXELS_PER_GATE, WIDTH, 1) + ctx.set_source_rgb(1.00, 1.00, 1.00) + ctx.fill() + + xbearing, ybearing, twidth, theight, xadvance, yadvance = \ + ctx.text_extents(thread.thread_name) + ctx.move_to(0, theight + thread.total_y * PIXELS_PER_GATE + BAR_HEIGHT // 2) + ctx.set_source_rgb(1.00, 1.00, 1.00) + ctx.show_text(thread.thread_name) + + for event in thread.all_events: + draw_event(ctx, event) + +memory_y = total_y * PIXELS_PER_GATE + +label = "memory" +xbearing, ybearing, twidth, theight, xadvance, yadvance = \ + ctx.text_extents(label) +ctx.move_to(0, memory_y + theight + 8) +ctx.set_source_rgb(1.00, 1.00, 1.00) +ctx.show_text(label) + +mem = 0 +ctx.move_to(LEFT_BORDER, memory_y + MEM_HEIGHT) + +for event in all_events: + if event.memory: + mem += event.size + + left = LEFT_BORDER + event.start * PIXELS_PER_SECOND + top = memory_y + MEM_HEIGHT - (MEM_HEIGHT * mem / peak_mem) + + ctx.line_to(left, top) + +ctx.set_line_width(1) +ctx.set_source_rgb(1.00, 1.00, 1.00) +ctx.stroke() + +axis_y = total_y * PIXELS_PER_GATE + MEM_HEIGHT + +ctx.rectangle(LEFT_BORDER, axis_y, last_time * PIXELS_PER_SECOND, 1) +ctx.set_source_rgb(1.00, 1.00, 1.00) +ctx.fill() + +label = "time" +xbearing, ybearing, twidth, theight, xadvance, yadvance = \ + ctx.text_extents(label) +ctx.move_to(0, axis_y + theight + 8) +ctx.set_source_rgb(1.00, 1.00, 1.00) +ctx.show_text(label) + +for t in range(0, int(last_time * PIXELS_PER_SECOND), PIXELS_PER_SECOND // 10): + left = t + LEFT_BORDER + top = axis_y + + ctx.rectangle(left, top, 1, 5) + ctx.set_source_rgb(1.00, 1.00, 1.00) + ctx.fill() + + label = str(t / PIXELS_PER_SECOND) + xbearing, ybearing, twidth, theight, xadvance, yadvance = \ + ctx.text_extents(label) + ctx.move_to(left - twidth // 2, top + theight + 8) + ctx.set_source_rgb(1.00, 1.00, 1.00) + ctx.show_text(label) + +surface.finish() diff --git a/jtlsrv-cpp/.static-build/bin/vipsthumbnail b/jtlsrv-cpp/.static-build/bin/vipsthumbnail new file mode 100755 index 0000000..489b1c6 Binary files /dev/null and b/jtlsrv-cpp/.static-build/bin/vipsthumbnail differ diff --git a/jtlsrv-cpp/.static-build/include/vips/VConnection8.h b/jtlsrv-cpp/.static-build/include/vips/VConnection8.h new file mode 100644 index 0000000..3d5b6e4 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/VConnection8.h @@ -0,0 +1,144 @@ +// VIPS connection wrapper + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VCONNECTION_H +#define VIPS_VCONNECTION_H + +#include + +VIPS_NAMESPACE_START + +/** + * A generic source object. These supply a stream of bytes that loaders can + * use to fetch image files, see VImage::new_from_source(). + * + * Methods let you can connect a source up to memory, a file or + * a file descriptor. Use vips::VSourceCustom to implement custom sources + * using GObject signals. + */ +class VSource : public VObject { +public: + /** + * Wrap a VSource around an underlying VipsSource object. + */ + explicit VSource(VipsSource *input, VSteal steal = STEAL) + : VObject((VipsObject *) input, steal) + { + } + + /** + * Make a new VSource from a file descriptor. + */ + static VSource + new_from_descriptor(int descriptor); + + /** + * Make a new VSource from a file on disc. + */ + static VSource + new_from_file(const char *filename); + + /** + * Make a new VSource from a binary object. + */ + static VSource + new_from_blob(VipsBlob *blob); + + /** + * Make a new VSource from an area of memory. + */ + static VSource + new_from_memory(const void *data, size_t size); + + /** + * Make a new VSource from a set of options encoded as a string. See + * vips_source_new(). + */ + static VSource + new_from_options(const char *options); + + /** + * Get a pointer to the underlying VipsSoure object. + */ + VipsSource * + get_source() const + { + return (VipsSource *) VObject::get_object(); + } +}; + +/** + * A generic target object. Savers can use these to write a stream of bytes + * somewhere, see VImage::write_to_target(). + * + * Methods let you can connect a target up to memory, a file or + * a file descriptor. Use vips::VTargetCustom to implement custom targets + * using GObject signals. + */ +class VTarget : public VObject { +public: + /** + * Wrap a VTarget around an underlying VipsTarget object. + */ + explicit VTarget(VipsTarget *output, VSteal steal = STEAL) + : VObject((VipsObject *) output, steal) + { + } + + /** + * Make a new VTarget which, when written to, will write to a file + * descriptor. + */ + static VTarget + new_to_descriptor(int descriptor); + + /** + * Make a new VTarget which, when written to, will write to a file. + */ + static VTarget new_to_file(const char *filename); + + /** + * Make a new VTarget which, when written to, will write to a file + * descriptor. + */ + static VTarget new_to_memory(); + + /** + * Get a pointer to the underlying VipsTarget object. + */ + VipsTarget * + get_target() const + { + return (VipsTarget *) VObject::get_object(); + } +}; + +VIPS_NAMESPACE_END + +#endif /*VIPS_VCONNECTION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/VError8.h b/jtlsrv-cpp/.static-build/include/vips/VError8.h new file mode 100644 index 0000000..1dfd72e --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/VError8.h @@ -0,0 +1,79 @@ +// Header for error type + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VERROR_H +#define VIPS_VERROR_H + +#include +#include +#include + +#include + +VIPS_NAMESPACE_START + +/** + * The libvips error class. It holds a single string containing an + * internationalized error message in utf-8 encoding. + */ +class VIPS_CPLUSPLUS_API VError : public std::exception { + std::string _what; + +public: + /** + * Construct a VError, setting the error message. + */ + VError(const std::string &what) : _what(what) {} + + /** + * Construct a VError, fetching the error message from the libvips + * error buffer. + */ + VError() : _what(vips_error_buffer()) {} + + virtual ~VError() throw() {} + + /** + * Get a reference to the underlying C string. + */ + virtual const char * + what() const throw() + { + return _what.c_str(); + } + + /** + * Print the error message to a stream. + */ + void ostream_print(std::ostream &) const; +}; + +VIPS_NAMESPACE_END + +#endif /*VIPS_VERROR_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/VImage8.h b/jtlsrv-cpp/.static-build/include/vips/VImage8.h new file mode 100644 index 0000000..4d61d9b --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/VImage8.h @@ -0,0 +1,6439 @@ +// VIPS image wrapper + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VIMAGE_H +#define VIPS_VIMAGE_H + +#include +#include +#include + +#include + +#include + +VIPS_NAMESPACE_START + +/* Small utility things. + */ + +VIPS_CPLUSPLUS_API std::vector to_vectorv(int n, ...); +VIPS_CPLUSPLUS_API std::vector to_vector(double value); +VIPS_CPLUSPLUS_API std::vector to_vector(int n, double array[]); +VIPS_CPLUSPLUS_API std::vector negate(std::vector value); +VIPS_CPLUSPLUS_API std::vector invert(std::vector value); + +/** + * Whether or not VObject should take over the reference that you pass in. See + * VObject(). + */ +enum VSteal { + NOSTEAL = 0, + STEAL = 1 +}; + +/** + * A smart VipsObject pointer. It calls g_object_ref()/_unref() for you + * automatically. + * + * VObjects can be null (have no value set). See is_null(). + */ +class VObject { +private: + // can be NULL, see eg. VObject() + VipsObject *vobject; + +public: + /** + * Wrap a VObject around the underlying VipsObject pointer. + * + * If steal is STEAL, then the new VObject takes over the reference + * that you pass in. + */ + explicit VObject(VipsObject *new_vobject, VSteal steal = STEAL) + : vobject(new_vobject) + { + // we allow NULL init, eg. "VImage a;" + g_assert(!new_vobject || + VIPS_IS_OBJECT(new_vobject)); + +#ifdef VIPS_DEBUG_VERBOSE + printf("VObject constructor, obj = %p, steal = %d\n", + new_vobject, steal); + if (new_vobject) { + printf(" obj "); + vips_object_print_name(VIPS_OBJECT(new_vobject)); + printf("\n"); + } +#endif /*VIPS_DEBUG_VERBOSE*/ + + if (!steal && vobject) { +#ifdef VIPS_DEBUG_VERBOSE + printf(" reffing object\n"); +#endif /*VIPS_DEBUG_VERBOSE*/ + g_object_ref(vobject); + } + } + + VObject() : vobject(nullptr) + { + } + + VObject(const VObject &a) : vobject(a.vobject) + { + g_assert(!vobject || + VIPS_IS_OBJECT(vobject)); + +#ifdef VIPS_DEBUG_VERBOSE + printf("VObject copy constructor, obj = %p\n", + vobject); + printf(" reffing object\n"); +#endif /*VIPS_DEBUG_VERBOSE*/ + if (vobject) + g_object_ref(vobject); + } + + // assignment ... we must delete the old ref + VObject & + operator=(const VObject &a) + { +#ifdef VIPS_DEBUG_VERBOSE + printf("VObject assignment\n"); + printf(" reffing %p\n", a.vobject); + printf(" unreffing %p\n", vobject); +#endif /*VIPS_DEBUG_VERBOSE*/ + + g_assert(!vobject || + VIPS_IS_OBJECT(vobject)); + g_assert(!a.vobject || + VIPS_IS_OBJECT(a.vobject)); + + // delete the old ref at the end ... otherwise "a = a;" could + // unref before reffing again + if (a.vobject) + g_object_ref(a.vobject); + if (vobject) + g_object_unref(vobject); + vobject = a.vobject; + + return *this; + } + + // this mustn't be virtual: we want this class to only be a pointer, + // no vtable allowed + ~VObject() + { +#ifdef VIPS_DEBUG_VERBOSE + printf("VObject destructor\n"); + printf(" unreffing %p\n", vobject); +#endif /*VIPS_DEBUG_VERBOSE*/ + + g_assert(!vobject || + VIPS_IS_OBJECT(vobject)); + + if (vobject) + g_object_unref(vobject); + } + + /** + * Return the underlying VipsObject pointer. This does not make a new + * reference -- you'll need to g_object_ref() the result if you want + * to keep it. + */ + VipsObject * + get_object() const + { + g_assert(!vobject || + VIPS_IS_OBJECT(vobject)); + + return vobject; + } + + /** + * TRUE if this is a null VObject. + */ + bool + is_null() const + { + return vobject == nullptr; + } +}; + +class VIPS_CPLUSPLUS_API VImage; +class VIPS_CPLUSPLUS_API VInterpolate; +class VIPS_CPLUSPLUS_API VRegion; +class VIPS_CPLUSPLUS_API VSource; +class VIPS_CPLUSPLUS_API VTarget; +class VIPS_CPLUSPLUS_API VOption; + +/** + * A list of name-value pairs. Pass these to libvips operations to set + * options. For example: + * + * VImage out = in.embed(10, 10, 1000, 1000, VImage::option() + * ->set("extend", "background") + * ->set("background", 128)); + * + * The `set` member functions will take copies (or hold references to) + * compound objects, so you can free them immediately afterwards if necessary. + * + * You can get values back from operations by using the * form of the set + * member functions. For example: + * + * VImage in = VImage::new_from_file(argv[1]); + * int x, y; + * double value = in.max(VImage::option() + * ->set("x", &x) + * ->set("y", &y)); + * + */ +class VOption { +private: + struct Pair { + const char *name; + + // the thing we pass to and from our caller + GValue value; + + // an input or output parameter ... we guess the direction + // from the arg to set() + bool input; + + // the pointer we write output values to + union { + bool *vbool; + int *vint; + double *vdouble; + VImage *vimage; + std::vector *vvector; + VipsBlob **vblob; + }; + + explicit Pair(const char *name) : name(name), value(G_VALUE_INIT), + input(false), vimage(nullptr) + { + } + + ~Pair() + { + g_value_unset(&value); + } + }; + + std::list options; + +public: + VOption() = default; + + virtual ~VOption(); + + /** + * Set an input boolean option. + */ + VOption * + set(const char *name, bool value); + + /** + * Set an input int option. This is used for enums as well, or you can + * use the string version. + */ + VOption * + set(const char *name, int value); + + /** + * Set an input unsigned 64-bit integer option. + */ + VOption * + set(const char *name, guint64 value); + + /** + * Set an input double option. + */ + VOption * + set(const char *name, double value); + + /** + * Set an input string option. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, const char *value); + + /** + * Set a libvips object as an option. These can be images, sources, + * targets, etc. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, const VObject value); + + /** + * Set an array of integers as an input option. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, std::vector value); + + /** + * Set an array of doubles as an input option. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, std::vector value); + + /** + * Set an array of images as an input option. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, std::vector value); + + /** + * Set a binary object an input option. Use vips_blob_new() to make + * blobs. + * + * A copy is taken of the object. + */ + VOption * + set(const char *name, VipsBlob *value); + + /** + * Set an option which will return a bool value. + */ + VOption * + set(const char *name, bool *value); + + /** + * Set an option which will return an integer value. + */ + VOption * + set(const char *name, int *value); + + /** + * Set an option which will return a double value. + */ + VOption * + set(const char *name, double *value); + + /** + * Set an option which will return a reference to an image. + */ + VOption * + set(const char *name, VImage *value); + + /** + * Set an option which will return an array of doubles. + */ + VOption * + set(const char *name, std::vector *value); + + /** + * Set an option which will return a binary object, such as an ICC + * profile. + */ + VOption * + set(const char *name, VipsBlob **blob); + + /** + * Walk the set of options, setting options on the operation. This is + * used internally by VImage::call(). + */ + void + set_operation(VipsOperation *operation); + + /** + * Walk the set of options, fetching any output values. This is used + * internally by VImage::call(). + */ + void + get_operation(VipsOperation *operation); +}; + +/** + * An image object. + * + * Image processing operations on images are member functions of VImage. For + * example: + * + * VImage in = VImage::new_from_file(argv[1], VImage::option() + * ->set("access", "sequential")); + * VImage out = in.embed(10, 10, 1000, 1000, VImage::option() + * ->set("extend", "copy")); + * out.write_to_file(argv[2]); + * + * VImage objects are smart pointers over the underlying VipsImage objects. + * They manage the complications of GLib's ref and unref system for you. + */ +class VImage : public VObject { +public: + using VObject::is_null; + + /** + * Wrap a VImage around an underlying VipsImage object. + * + * If steal is STEAL, then the VImage will take ownership of the + * reference to the VipsImage. + */ + explicit VImage(VipsImage *image, VSteal steal = STEAL) + : VObject((VipsObject *) image, steal) + { + } + + /** + * An empty (NULL) VImage, eg. "VImage a;" + */ + VImage() : VObject(nullptr) + { + } + + /** + * Return the underlying VipsImage reference that this VImage holds. + * This does not make a new reference -- you'll need to g_object_ref() + * the pointer if you need it to last. + */ + VipsImage * + get_image() const + { + return (VipsImage *) VObject::get_object(); + } + + /** + * Return the width of the image in pixels. + */ + int + width() const + { + return vips_image_get_width(get_image()); + } + + /** + * Return the height of the image in pixels. + */ + int + height() const + { + return vips_image_get_height(get_image()); + } + + /** + * Return the number of image bands. + */ + int + bands() const + { + return vips_image_get_bands(get_image()); + } + + /** + * Return the image format, for example VIPS_FORMAT_UCHAR. + */ + VipsBandFormat + format() const + { + return vips_image_get_format(get_image()); + } + + /** + * Return the image coding, for example VIPS_CODING_NONE. + */ + VipsCoding + coding() const + { + return vips_image_get_coding(get_image()); + } + + /** + * Return the image interpretation, for example + * VIPS_INTERPRETATION_sRGB. + */ + VipsInterpretation + interpretation() const + { + return vips_image_get_interpretation(get_image()); + } + + /** + * Try to guess the image interpretation from other fields. This is + * handy if the interpretation has not been set correctly. + */ + VipsInterpretation + guess_interpretation() const + { + return vips_image_guess_interpretation(get_image()); + } + + /** + * The horizontal resolution in pixels per millimeter. + */ + double + xres() const + { + return vips_image_get_xres(get_image()); + } + + /** + * The vertical resolution in pixels per millimeter. + */ + double + yres() const + { + return vips_image_get_yres(get_image()); + } + + /** + * The horizontal offset of the origin in pixels. + */ + int + xoffset() const + { + return vips_image_get_xoffset(get_image()); + } + + /** + * The vertical offset of the origin in pixels. + */ + int + yoffset() const + { + return vips_image_get_yoffset(get_image()); + } + + /** + * TRUE if the image has an alpha channel. + */ + bool + has_alpha() const + { + return vips_image_hasalpha(get_image()); + } + + /** + * The name of the file this image originally came from, or NULL if + * it's not a file image. + */ + const char * + filename() const + { + return vips_image_get_filename(get_image()); + } + + /** + * Gets an VImage ready for an in-place operation, such as draw_circle(). + * After calling this function you can both read and write the image with + * VIPS_IMAGE_ADDR(). + * + * This method is called for you by the draw operations, + * there's no need to call it yourself. + * + * Since this function modifies the image, it is not thread-safe. Only call it on + * images which you are sure have not been shared with another thread. + * All in-place operations are inherently not thread-safe, so you need to take + * great care in any case. + */ + void + inplace() + { + if (vips_image_inplace(this->get_image())) + throw(VError()); + } + + /** + * Arrange for the underlying object to be entirely in memory, then + * return a pointer to the first pixel. + * + * This can take a long time and need a very large amount of RAM. + */ + const void * + data() const + { + return vips_image_get_data(get_image()); + } + + /** + * Set the value of an int metadata item on an image. + */ + void + set(const char *field, int value) + { + vips_image_set_int(this->get_image(), field, value); + } + + /** + * Set the value of an int array metadata item on an image. + * + * A copy of the array is taken. + */ + void + set(const char *field, int *value, int n) + { + vips_image_set_array_int(this->get_image(), field, value, n); + } + + /** + * Set the value of an int array metadata item on an image. + * + * A copy of the array is taken. + */ + void + set(const char *field, std::vector value) + { + vips_image_set_array_int(this->get_image(), field, &value[0], + static_cast(value.size())); + } + + /** + * Set the value of an double array metadata item on an image. + * + * A copy of the array is taken. + */ + void + set(const char *field, double *value, int n) + { + vips_image_set_array_double(this->get_image(), field, value, n); + } + + /** + * Set the value of an double array metadata item on an image. + * + * A copy of the array is taken. + */ + void + set(const char *field, std::vector value) + { + vips_image_set_array_double(this->get_image(), field, &value[0], + static_cast(value.size())); + } + + /** + * Set the value of a double metadata item on an image. + */ + void + set(const char *field, double value) + { + vips_image_set_double(this->get_image(), field, value); + } + + /** + * Set the value of a string metadata item on an image. + * + * A copy of the string is taken. + */ + void + set(const char *field, const char *value) + { + vips_image_set_string(this->get_image(), field, value); + } + + /** + * Set the value of a binary object metadata item on an image, such as + * an ICC profile. + * + * When libvips no longer needs the value, it will be disposed with + * the free function. This can be NULL. + */ + void + set(const char *field, + VipsCallbackFn free_fn, void *data, size_t length) + { + vips_image_set_blob(this->get_image(), field, + free_fn, data, length); + } + + /** + * Return the GType of a metadata item, or 0 if the named item does not + * exist. + */ + GType + get_typeof(const char *field) const + { + return vips_image_get_typeof(this->get_image(), field); + } + + /** + * Get the value of a metadata item as an int. + * + * If the item is not of this type, an exception is thrown. + */ + int + get_int(const char *field) const + { + int value; + + if (vips_image_get_int(this->get_image(), field, &value)) + throw(VError()); + + return value; + } + + /** + * Get the value of a metadata item as an array of ints. Do not free + * the result. + * + * If the item is not of this type, an exception is thrown. + */ + void + get_array_int(const char *field, int **out, int *n) const + { + if (vips_image_get_array_int(this->get_image(), + field, out, n)) + throw(VError()); + } + + /** + * Get the value of a metadata item as an array of ints. + * + * If the item is not of this type, an exception is thrown. + */ + std::vector + get_array_int(const char *field) const + { + int length; + int *array; + + if (vips_image_get_array_int(this->get_image(), + field, &array, &length)) + throw(VError()); + + std::vector vector(array, array + length); + + return vector; + } + + /** + * Get the value of a metadata item as an array of doubles. Do not free + * the result. + * + * If the item is not of this type, an exception is thrown. + */ + void + get_array_double(const char *field, double **out, int *n) const + { + if (vips_image_get_array_double(this->get_image(), + field, out, n)) + throw(VError()); + } + + /** + * Get the value of a metadata item as an array of doubles. + * + * If the item is not of this type, an exception is thrown. + */ + std::vector + get_array_double(const char *field) const + { + int length; + double *array; + + if (vips_image_get_array_double(this->get_image(), + field, &array, &length)) + throw(VError()); + + std::vector vector(array, array + length); + + return vector; + } + + /** + * Get the value of a metadata item as a double. + * + * If the item is not of this type, an exception is thrown. + */ + double + get_double(const char *field) const + { + double value; + + if (vips_image_get_double(this->get_image(), field, &value)) + throw(VError()); + + return value; + } + + /** + * Get the value of a metadata item as a string. You must not free the + * result. + * + * If the item is not of this type, an exception is thrown. + */ + const char * + get_string(const char *field) const + { + const char *value; + + if (vips_image_get_string(this->get_image(), field, &value)) + throw(VError()); + + return value; + } + + /** + * Get the value of a metadata item as a binary object. You must not + * free the result. + * + * If the item is not of this type, an exception is thrown. + */ + const void * + get_blob(const char *field, size_t *length) const + { + const void *value; + + if (vips_image_get_blob(this->get_image(), field, + &value, length)) + throw(VError()); + + return value; + } + + /** + * Remove a metadata item. This does nothing if the item does not + * exist. + */ + bool + remove(const char *name) const + { + return vips_image_remove(get_image(), name); + } + + /** + * Make a new VOption. Can save some typing. + */ + static VOption * + option() + { + return new VOption(); + } + + /** + * Call any libvips operation, with a set of string-encoded options as + * well as VOption. + */ + static void + call_option_string(const char *operation_name, + const char *option_string, VOption *options = nullptr); + + /** + * Call any libvips operation. + */ + static void + call(const char *operation_name, VOption *options = nullptr); + + /** + * Make a new image which, when written to, will create a large memory + * object. See VImage::write(). + */ + static VImage + new_memory() + { + return VImage(vips_image_new_memory()); + } + + /** + * Make a new VImage which, when written to, will create a temporary + * file on disc. See VImage::write(). + */ + static VImage + new_temp_file(const char *file_format = ".v") + { + VipsImage *image; + + if (!(image = vips_image_new_temp_file(file_format))) + throw(VError()); + + return VImage(image); + } + + /** + * Create a new VImage object from a file on disc. + * + * The available options depends on the image format. See for example + * VImage::jpegload(). + */ + static VImage + new_from_file(const char *name, VOption *options = nullptr); + + /** + * Create a new VImage object from an area of memory containing an + * image encoded in some format such as JPEG. + * + * The available options depends on the image format. See for example + * VImage::jpegload(). + */ + static VImage + new_from_buffer(const void *buf, size_t len, + const char *option_string, VOption *options = nullptr); + + /** + * Create a new VImage object from an area of memory containing an + * image encoded in some format such as JPEG. + * + * The available options depends on the image format. See for example + * VImage::jpegload(). + */ + static VImage + new_from_buffer(const std::string &buf, + const char *option_string, VOption *options = nullptr); + + /** + * Create a new VImage object from a generic source object. + * + * The available options depends on the image format. See for example + * VImage::jpegload(). + */ + static VImage + new_from_source(VSource source, + const char *option_string, VOption *options = nullptr); + + /** + * Create a new VImage object from an area of memory containing a + * C-style array. + */ + static VImage + new_from_memory(const void *data, size_t size, + int width, int height, int bands, VipsBandFormat format) + { + VipsImage *image; + + if (!(image = vips_image_new_from_memory(data, size, + width, height, bands, format))) + throw(VError()); + + return VImage(image); + } + + /** + * Create a new VImage object from an area of memory containing a + * C-style array. + * The VImage makes a copy of @data. + */ + static VImage + new_from_memory_copy(const void *data, size_t size, + int width, int height, int bands, VipsBandFormat format) + { + VipsImage *image; + + if (!(image = vips_image_new_from_memory_copy(data, size, + width, height, bands, format))) + throw(VError()); + + return VImage(image); + } + + /** + * Create a new VImage object from an area of memory containing a + * C-style array. + * + * The VImage steals ownership of @data and will free() it when it + * goes out of scope. + */ + static VImage + new_from_memory_steal(const void *data, size_t size, + int width, int height, int bands, VipsBandFormat format); + + /** + * Create a matrix image of a specified size. All elements will be + * zero. + */ + static VImage + new_matrix(int width, int height); + + /** + * Create a matrix image of a specified size, initialized from the + * array. + */ + static VImage + new_matrix(int width, int height, double *array, int size) + { + VipsImage *image; + + if (!(image = vips_image_new_matrix_from_array(width, height, + array, size))) + throw(VError()); + + return VImage(image); + } + + /** + * Create a matrix image of a specified size, initialized from the + * function parameters. + */ + static VImage + new_matrixv(int width, int height, ...); + + /** + * Make a new image of the same size and type as self, but with each + * pixel initialized with the constant. + */ + VImage + new_from_image(std::vector pixel) const + { + VipsImage *image; + + if (!(image = vips_image_new_from_image(this->get_image(), + &pixel[0], static_cast(pixel.size())))) + throw(VError()); + + return VImage(image); + } + + /** + * Make a new image of the same size and type as self, but with each + * pixel initialized with the constant. + */ + VImage + new_from_image(double pixel) const + { + return new_from_image(to_vectorv(1, pixel)); + } + + /** + * This operation allocates memory, renders self into it, builds a new + * image around the memory area, and returns that. + * + * If the image is already a simple area of memory, it does nothing. + * + * Call this before using the draw operations to make sure you have a + * memory image that can be modified. + * + * VImage::copy() adds a null "copy" node to a pipeline. Use that + * instead if you want to change metadata and not pixels. + */ + VImage + copy_memory() const + { + VipsImage *image; + + if (!(image = vips_image_copy_memory(this->get_image()))) + throw(VError()); + + return VImage(image); + } + + /** + * Write self to out. See VImage::new_memory() etc. + */ + VImage write(VImage out) const; + + /** + * Write an image to a file. + * + * The available options depends on the file format. See + * VImage::jpegsave(), for example. + */ + void write_to_file(const char *name, VOption *options = nullptr) const; + + /** + * Write an image to an area of memory in the specified format. You + * must free() the memory area once you are done with it. + * + * For example: + * + * void *buf; + * size_t size; + * image.write_to_buffer(".jpg", &buf, &size); + * + * The available options depends on the file format. See + * VImage::jpegsave(), for example. + */ + void write_to_buffer(const char *suffix, void **buf, size_t *size, + VOption *options = nullptr) const; + + /** + * Write an image to a generic target object in the specified format. + * + * The available options depends on the file format. See + * VImage::jpegsave(), for example. + */ + void write_to_target(const char *suffix, VTarget target, + VOption *options = nullptr) const; + + /** + * Write an image to an area of memory as a C-style array. + */ + void * + write_to_memory(size_t *size) const + { + void *result; + + if (!(result = vips_image_write_to_memory(this->get_image(), + size))) + throw(VError()); + + return result; + } + + /** + * Acquire an unprepared VRegion. + */ + VRegion + region() const; + + /** + * Acquire VRegion covering the given VipsRect. + */ + VRegion + region(VipsRect *rect) const; + + /** + * Acquire VRegion covering the given coordinates. + */ + VRegion + region(int left, int top, int width, int height) const; + + /** + * Apply a linear transform to an image. For every pixel, + * + * out = in * a + b + */ + VImage + linear(double a, double b, VOption *options = nullptr) const + { + return this->linear(to_vector(a), to_vector(b), + options); + } + + /** + * Apply a linear transform to an image. For every pixel, + * + * out = in * a + b + */ + VImage + linear(std::vector a, double b, VOption *options = nullptr) const + { + return this->linear(a, to_vector(b), options); + } + + /** + * Apply a linear transform to an image. For every pixel, + * + * out = in * a + b + */ + VImage + linear(double a, std::vector b, VOption *options = nullptr) const + { + return this->linear(to_vector(a), b, options); + } + + /** + * Split a many-band image into an array of one-band images. + */ + std::vector bandsplit(VOption *options = nullptr) const; + + /** + * Join two images bandwise. + */ + VImage bandjoin(VImage other, VOption *options = nullptr) const; + + /** + * Append a band to an image, with each element initialized to the + * constant value. + */ + VImage + bandjoin(double other, VOption *options = nullptr) const + { + return bandjoin(to_vector(other), options); + } + + /** + * Append a series of bands to an image, with each element initialized + * to the constant values. + */ + VImage + bandjoin(std::vector other, VOption *options = nullptr) const + { + return bandjoin_const(other, options); + } + + /** + * Composite other on top of self using the specified blending mode. + */ + VImage composite(VImage other, VipsBlendMode mode, + VOption *options = nullptr) const; + + /** + * Find the position of the image minimum as (x, y). + */ + std::complex minpos(VOption *options = nullptr) const; + + /** + * Find the position of the image maximum as (x, y). + */ + std::complex maxpos(VOption *options = nullptr) const; + + /** + * Flip the image left-right. + */ + VImage + fliphor(VOption *options = nullptr) const + { + return flip(VIPS_DIRECTION_HORIZONTAL, options); + } + + /** + * Flip the image top-bottom. + */ + VImage + flipver(VOption *options = nullptr) const + { + return flip(VIPS_DIRECTION_VERTICAL, options); + } + + /** + * Rotate the image by 90 degrees clockwise. + */ + VImage + rot90(VOption *options = nullptr) const + { + return rot(VIPS_ANGLE_D90, options); + } + + /** + * Rotate the image by 180 degrees. + */ + VImage + rot180(VOption *options = nullptr) const + { + return rot(VIPS_ANGLE_D180, options); + } + + /** + * Rotate the image by 270 degrees clockwise. + */ + VImage + rot270(VOption *options = nullptr) const + { + return rot(VIPS_ANGLE_D270, options); + } + + /** + * Dilate the image with the specified structuring element, see + * VImage::new_matrix(). Structuring element values can be 0 for + * black, 255 for white and 128 for don't care. See VImage::morph(). + */ + VImage + dilate(VImage mask, VOption *options = nullptr) const + { + return morph(mask, VIPS_OPERATION_MORPHOLOGY_DILATE, + options); + } + + /** + * Erode the image with the specified structuring element, see + * VImage::new_matrix(). Structuring element values can be 0 for + * black, 255 for white and 128 for don't care. See VImage::morph(). + */ + VImage + erode(VImage mask, VOption *options = nullptr) const + { + return morph(mask, VIPS_OPERATION_MORPHOLOGY_ERODE, + options); + } + + /** + * A median filter of the specified size. See VImage::rank(). + */ + VImage + median(int size = 3, VOption *options = nullptr) const + { + return rank(size, size, (size * size) / 2, options); + } + + /** + * Convert to integer, rounding down. + */ + VImage + floor(VOption *options = nullptr) const + { + return round(VIPS_OPERATION_ROUND_FLOOR, options); + } + + /** + * Convert to integer, rounding up. + */ + VImage + ceil(VOption *options = nullptr) const + { + return round(VIPS_OPERATION_ROUND_CEIL, options); + } + + /** + * Convert to integer, rounding to nearest. + */ + VImage + rint(VOption *options = nullptr) const + { + return round(VIPS_OPERATION_ROUND_RINT, options); + } + + /** + * AND all bands of an image together to make a one-band image. Useful + * with the relational operators, for example: + * + * VImage mask = (in > 128).bandand() + */ + VImage + bandand(VOption *options = nullptr) const + { + return bandbool(VIPS_OPERATION_BOOLEAN_AND, options); + } + + /** + * OR all bands of an image together to make a one-band image. Useful + * with the relational operators, for example: + * + * VImage mask = (in > 128).bandand() + */ + VImage + bandor(VOption *options = nullptr) const + { + return bandbool(VIPS_OPERATION_BOOLEAN_OR, options); + } + + /** + * EOR all bands of an image together to make a one-band image. Useful + * with the relational operators, for example: + * + * VImage mask = (in > 128).bandand() + */ + VImage + bandeor(VOption *options = nullptr) const + { + return bandbool(VIPS_OPERATION_BOOLEAN_EOR, options); + } + + /** + * Return the real part of a complex image. + */ + VImage + real(VOption *options = nullptr) const + { + return complexget(VIPS_OPERATION_COMPLEXGET_REAL, options); + } + + /** + * Return the imaginary part of a complex image. + */ + VImage + imag(VOption *options = nullptr) const + { + return complexget(VIPS_OPERATION_COMPLEXGET_IMAG, options); + } + + /** + * Convert a complex image to polar coordinates. + */ + VImage + polar(VOption *options = nullptr) const + { + return complex(VIPS_OPERATION_COMPLEX_POLAR, options); + } + + /** + * Convert a complex image to rectangular coordinates. + */ + VImage + rect(VOption *options = nullptr) const + { + return complex(VIPS_OPERATION_COMPLEX_RECT, options); + } + + /** + * Find the complex conjugate. + */ + VImage + conj(VOption *options = nullptr) const + { + return complex(VIPS_OPERATION_COMPLEX_CONJ, options); + } + + /** + * Find the sine of each pixel. Angles are in degrees. + */ + VImage + sin(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_SIN, options); + } + + /** + * Find the cosine of each pixel. Angles are in degrees. + */ + VImage + cos(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_COS, options); + } + + /** + * Find the tangent of each pixel. Angles are in degrees. + */ + VImage + tan(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_TAN, options); + } + + /** + * Find the arc sine of each pixel. Angles are in degrees. + */ + VImage + asin(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ASIN, options); + } + + /** + * Find the arc cosine of each pixel. Angles are in degrees. + */ + VImage + acos(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ACOS, options); + } + + /** + * Find the arc tangent of each pixel. Angles are in degrees. + */ + VImage + atan(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ATAN, options); + } + + /** + * Find the hyperbolic sine of each pixel. Angles are in degrees. + */ + VImage + sinh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_SINH, options); + } + + /** + * Find the hyperbolic cosine of each pixel. Angles are in degrees. + */ + VImage + cosh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_COSH, options); + } + + /** + * Find the hyperbolic tangent of each pixel. Angles are in degrees. + */ + VImage + tanh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_TANH, options); + } + + /** + * Find the hyperbolic arc sine of each pixel. Angles are in radians. + */ + VImage + asinh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ASINH, options); + } + + /** + * Find the hyperbolic arc cosine of each pixel. Angles are in radians. + */ + VImage + acosh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ACOSH, options); + } + + /** + * Find the hyperbolic arc tangent of each pixel. Angles are in radians. + */ + VImage + atanh(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_ATANH, options); + } + + /** + * Find the natural log of each pixel. + */ + VImage + log(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_LOG, options); + } + + /** + * Find the base 10 log of each pixel. + */ + VImage + log10(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_LOG10, options); + } + + /** + * Find e to the power of each pixel. + */ + VImage + exp(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_EXP, options); + } + + /** + * Find 10 to the power of each pixel. + */ + VImage + exp10(VOption *options = nullptr) const + { + return math(VIPS_OPERATION_MATH_EXP10, options); + } + + /** + * Raise each pixel to the specified power. + */ + VImage + pow(VImage other, VOption *options = nullptr) const + { + return math2(other, VIPS_OPERATION_MATH2_POW, options); + } + + /** + * Raise each pixel to the specified power. + */ + VImage + pow(double other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_POW, + to_vector(other), options); + } + + /** + * Raise each pixel to the specified power. + */ + VImage + pow(std::vector other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_POW, + other, options); + } + + /** + * Raise other to the power of each pixel (the opposite of pow). + */ + VImage + wop(VImage other, VOption *options = nullptr) const + { + return math2(other, VIPS_OPERATION_MATH2_WOP, options); + } + + /** + * Raise the constant to the power of each pixel (the opposite of pow). + */ + VImage + wop(double other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_WOP, + to_vector(other), options); + } + + /** + * Raise the constant to the power of each pixel (the opposite of pow). + */ + VImage + wop(std::vector other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_WOP, + other, options); + } + + /** + * Calculate atan2 of each pixel. + */ + VImage + atan2(VImage other, VOption *options = nullptr) const + { + return math2(other, VIPS_OPERATION_MATH2_ATAN2, options); + } + + /** + * Calculate atan2 of each pixel. + */ + VImage + atan2(double other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_ATAN2, + to_vector(other), options); + } + + /** + * Calculate atan2 of each pixel. + */ + VImage + atan2(std::vector other, VOption *options = nullptr) const + { + return math2_const(VIPS_OPERATION_MATH2_ATAN2, + other, options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(std::vector th, VImage el, + VOption *options = nullptr) const + { + return ifthenelse(el.new_from_image(th), el, options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(VImage th, std::vector el, + VOption *options = nullptr) const + { + return ifthenelse(th, th.new_from_image(el), options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(std::vector th, std::vector el, + VOption *options = nullptr) const + { + return ifthenelse(new_from_image(th), new_from_image(el), + options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(double th, VImage el, VOption *options = nullptr) const + { + return ifthenelse(to_vector(th), el, options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(VImage th, double el, VOption *options = nullptr) const + { + return ifthenelse(th, to_vector(el), options); + } + + /** + * Use self as a conditional image (not zero meaning TRUE) to pick + * pixels from th (then) or el (else). + */ + VImage + ifthenelse(double th, double el, VOption *options = nullptr) const + { + return ifthenelse(to_vector(th), to_vector(el), + options); + } + + /** + * Draw a circle on an image. + * + * **Optional parameters** + * - **fill** -- Draw a solid object, bool. + * + * @param ink Color for pixels. + * @param cx Centre of draw_circle. + * @param cy Centre of draw_circle. + * @param radius Radius in pixels. + * @param options Set of options. + */ + void + draw_circle(double ink, int cx, int cy, int radius, VOption *options = nullptr) const + { + return draw_circle(to_vector(ink), cx, cy, radius, options); + } + + /** + * Draw a line on an image. + * @param ink Color for pixels. + * @param x1 Start of draw_line. + * @param y1 Start of draw_line. + * @param x2 End of draw_line. + * @param y2 End of draw_line. + * @param options Set of options. + */ + void + draw_line(double ink, int x1, int y1, int x2, int y2, VOption *options = nullptr) const + { + return draw_line(to_vector(ink), x1, y1, x2, y2, options); + } + + /** + * Paint a rectangle on an image. + * + * **Optional parameters** + * - **fill** -- Draw a solid object, bool. + * + * @param ink Color for pixels. + * @param left Rect to fill. + * @param top Rect to fill. + * @param width Rect to fill. + * @param height Rect to fill. + * @param options Set of options. + */ + void + draw_rect(double ink, int left, int top, int width, int height, VOption *options = nullptr) const + { + return draw_rect(to_vector(ink), left, top, width, height, options); + } + + /** + * Paint a single pixel on an image. + * + * @param ink Color for pixels. + * @param x Point to paint. + * @param y Point to paint. + */ + void + draw_point(double ink, int x, int y, VOption *options = nullptr) const + { + return draw_rect(ink, x, y, 1, 1, options); + } + + /** + * Paint a single pixel on an image. + * + * @param ink Color for pixels. + * @param x Point to paint. + * @param y Point to paint. + */ + void + draw_point(std::vector ink, int x, int y, VOption *options = nullptr) const + { + return draw_rect(ink, x, y, 1, 1, options); + } + + /** + * Flood-fill an area. + * + * **Optional parameters** + * - **test** -- Test pixels in this image, VImage. + * - **equal** -- DrawFlood while equal to edge, bool. + * + * @param ink Color for pixels. + * @param x DrawFlood start point. + * @param y DrawFlood start point. + * @param options Set of options. + */ + void + draw_flood(double ink, int x, int y, VOption *options = nullptr) const + { + return draw_flood(to_vector(ink), x, y, options); + } + + /** + * Draw a mask on an image. + * @param ink Color for pixels. + * @param mask Mask of pixels to draw. + * @param x Draw mask here. + * @param y Draw mask here. + * @param options Set of options. + */ + void + draw_mask(double ink, VImage mask, int x, int y, VOption *options = nullptr) const + { + return draw_mask(to_vector(ink), mask, x, y, options); + } + + /** + * Generate thumbnail from buffer. + * + * **Optional parameters** + * - **option_string** -- Options that are passed on to the underlying loader, const char *. + * - **height** -- Size to this height, int. + * - **size** -- Only upsize, only downsize, or both, VipsSize. + * - **no_rotate** -- Don't use orientation tags to rotate image upright, bool. + * - **crop** -- Reduce to fill target rectangle, then crop, VipsInteresting. + * - **linear** -- Reduce in linear light, bool. + * - **import_profile** -- Fallback import profile, const char *. + * - **export_profile** -- Fallback export profile, const char *. + * - **intent** -- Rendering intent, VipsIntent. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * + * @param buf Buffer to load from. + * @param len Size of buffer. + * @param width Size to this width. + * @param options Set of options. + * @return Output image. + */ + static VImage thumbnail_buffer(void *buf, size_t len, int width, VOption *options = nullptr); + + // Operator overloads + + VImage operator[](int index) const; + + std::vector operator()(int x, int y) const; + + friend VIPS_CPLUSPLUS_API VImage + operator+(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator+(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator+(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator+(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator+(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator+=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator+=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator+=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator-(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator-(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator-(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator-(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator-(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator-=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator-=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator-=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator-(const VImage a); + + friend VIPS_CPLUSPLUS_API VImage + operator*(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator*(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator*(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator*(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator*(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator*=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator*=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator*=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator/(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator/(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator/(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator/(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator/(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator/=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator/=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator/=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator%(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator%(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator%(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator%=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator%=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator%=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator<(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator<(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator<=(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<=(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<=(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator<=(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<=(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator>(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator>(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator>=(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>=(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>=(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator>=(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>=(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator==(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator==(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator==(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator==(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator==(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator!=(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator!=(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator!=(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator!=(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator!=(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator&(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator&(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator&(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator&(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator&(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator&=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator&=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator&=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator|(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator|(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator|(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator|(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator|(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator|=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator|=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator|=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator^(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator^(const double a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator^(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator^(const std::vector a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator^(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator^=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator^=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator^=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator<<(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator<<(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator<<(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator<<=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator<<=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator<<=(VImage &a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage + operator>>(const VImage a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage + operator>>(const VImage a, const double b); + friend VIPS_CPLUSPLUS_API VImage + operator>>(const VImage a, const std::vector b); + + friend VIPS_CPLUSPLUS_API VImage & + operator>>=(VImage &a, const VImage b); + friend VIPS_CPLUSPLUS_API VImage & + operator>>=(VImage &a, const double b); + friend VIPS_CPLUSPLUS_API VImage & + operator>>=(VImage &a, const std::vector b); + + // Compat operations + + static VImage + new_from_memory_steal(void *data, size_t size, + int width, int height, int bands, VipsBandFormat format); + + /** + * Write raw image to file descriptor. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param fd File descriptor to write to. + * @param options Set of options. + */ + G_DEPRECATED_FOR(rawsave_target) + void rawsave_fd(int fd, VOption *options = nullptr) const; + + /* Automatically generated members. + * + * Rebuild with: + * + * meson compile -Cbuild vips-operators-header + * + * Then delete from here to the end of the class and paste in + * vips-operators.h. We could just #include "vips-operators.h", but + * that confuses doxygen. + */ + + // headers for vips operations + // this file is generated automatically, do not edit! + + /** + * Transform lch to cmc. + * @param options Set of options. + * @return Output image. + */ + VImage CMC2LCh(VOption *options = nullptr) const; + + /** + * Transform cmyk to xyz. + * @param options Set of options. + * @return Output image. + */ + VImage CMYK2XYZ(VOption *options = nullptr) const; + + /** + * Transform hsv to srgb. + * @param options Set of options. + * @return Output image. + */ + VImage HSV2sRGB(VOption *options = nullptr) const; + + /** + * Transform lch to cmc. + * @param options Set of options. + * @return Output image. + */ + VImage LCh2CMC(VOption *options = nullptr) const; + + /** + * Transform lch to lab. + * @param options Set of options. + * @return Output image. + */ + VImage LCh2Lab(VOption *options = nullptr) const; + + /** + * Transform lab to lch. + * @param options Set of options. + * @return Output image. + */ + VImage Lab2LCh(VOption *options = nullptr) const; + + /** + * Transform float lab to labq coding. + * @param options Set of options. + * @return Output image. + */ + VImage Lab2LabQ(VOption *options = nullptr) const; + + /** + * Transform float lab to signed short. + * @param options Set of options. + * @return Output image. + */ + VImage Lab2LabS(VOption *options = nullptr) const; + + /** + * Transform cielab to xyz. + * + * **Optional parameters** + * - **temp** -- Color temperature, std::vector. + * + * @param options Set of options. + * @return Output image. + */ + VImage Lab2XYZ(VOption *options = nullptr) const; + + /** + * Unpack a labq image to float lab. + * @param options Set of options. + * @return Output image. + */ + VImage LabQ2Lab(VOption *options = nullptr) const; + + /** + * Unpack a labq image to short lab. + * @param options Set of options. + * @return Output image. + */ + VImage LabQ2LabS(VOption *options = nullptr) const; + + /** + * Convert a labq image to srgb. + * @param options Set of options. + * @return Output image. + */ + VImage LabQ2sRGB(VOption *options = nullptr) const; + + /** + * Transform signed short lab to float. + * @param options Set of options. + * @return Output image. + */ + VImage LabS2Lab(VOption *options = nullptr) const; + + /** + * Transform short lab to labq coding. + * @param options Set of options. + * @return Output image. + */ + VImage LabS2LabQ(VOption *options = nullptr) const; + + /** + * Transform xyz to cmyk. + * @param options Set of options. + * @return Output image. + */ + VImage XYZ2CMYK(VOption *options = nullptr) const; + + /** + * Transform xyz to lab. + * + * **Optional parameters** + * - **temp** -- Colour temperature, std::vector. + * + * @param options Set of options. + * @return Output image. + */ + VImage XYZ2Lab(VOption *options = nullptr) const; + + /** + * Transform xyz to yxy. + * @param options Set of options. + * @return Output image. + */ + VImage XYZ2Yxy(VOption *options = nullptr) const; + + /** + * Transform xyz to scrgb. + * @param options Set of options. + * @return Output image. + */ + VImage XYZ2scRGB(VOption *options = nullptr) const; + + /** + * Transform yxy to xyz. + * @param options Set of options. + * @return Output image. + */ + VImage Yxy2XYZ(VOption *options = nullptr) const; + + /** + * Absolute value of an image. + * @param options Set of options. + * @return Output image. + */ + VImage abs(VOption *options = nullptr) const; + + /** + * Add two images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage add(VImage right, VOption *options = nullptr) const; + + /** + * Append an alpha channel. + * @param options Set of options. + * @return Output image. + */ + VImage addalpha(VOption *options = nullptr) const; + + /** + * Affine transform of an image. + * + * **Optional parameters** + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * - **oarea** -- Area of output to generate, std::vector. + * - **odx** -- Horizontal output displacement, double. + * - **ody** -- Vertical output displacement, double. + * - **idx** -- Horizontal input displacement, double. + * - **idy** -- Vertical input displacement, double. + * - **background** -- Background value, std::vector. + * - **premultiplied** -- Images have premultiplied alpha, bool. + * - **extend** -- How to generate the extra pixels, VipsExtend. + * + * @param matrix Transformation matrix. + * @param options Set of options. + * @return Output image. + */ + VImage affine(std::vector matrix, VOption *options = nullptr) const; + + /** + * Load an analyze6 image. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage analyzeload(const char *filename, VOption *options = nullptr); + + /** + * Join an array of images. + * + * **Optional parameters** + * - **across** -- Number of images across grid, int. + * - **shim** -- Pixels between images, int. + * - **background** -- Colour for new pixels, std::vector. + * - **halign** -- Align on the left, centre or right, VipsAlign. + * - **valign** -- Align on the top, centre or bottom, VipsAlign. + * - **hspacing** -- Horizontal spacing between images, int. + * - **vspacing** -- Vertical spacing between images, int. + * + * @param in Array of input images. + * @param options Set of options. + * @return Output image. + */ + static VImage arrayjoin(std::vector in, VOption *options = nullptr); + + /** + * Autorotate image by exif tag. + * @param options Set of options. + * @return Output image. + */ + VImage autorot(VOption *options = nullptr) const; + + /** + * Find image average. + * @param options Set of options. + * @return Output value. + */ + double avg(VOption *options = nullptr) const; + + /** + * Boolean operation across image bands. + * @param boolean Boolean to perform. + * @param options Set of options. + * @return Output image. + */ + VImage bandbool(VipsOperationBoolean boolean, VOption *options = nullptr) const; + + /** + * Fold up x axis into bands. + * + * **Optional parameters** + * - **factor** -- Fold by this factor, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage bandfold(VOption *options = nullptr) const; + + /** + * Bandwise join a set of images. + * @param in Array of input images. + * @param options Set of options. + * @return Output image. + */ + static VImage bandjoin(std::vector in, VOption *options = nullptr); + + /** + * Append a constant band to an image. + * @param c Array of constants to add. + * @param options Set of options. + * @return Output image. + */ + VImage bandjoin_const(std::vector c, VOption *options = nullptr) const; + + /** + * Band-wise average. + * @param options Set of options. + * @return Output image. + */ + VImage bandmean(VOption *options = nullptr) const; + + /** + * Band-wise rank of a set of images. + * + * **Optional parameters** + * - **index** -- Select this band element from sorted list, int. + * + * @param in Array of input images. + * @param options Set of options. + * @return Output image. + */ + static VImage bandrank(std::vector in, VOption *options = nullptr); + + /** + * Unfold image bands into x axis. + * + * **Optional parameters** + * - **factor** -- Unfold by this factor, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage bandunfold(VOption *options = nullptr) const; + + /** + * Make a black image. + * + * **Optional parameters** + * - **bands** -- Number of bands in image, int. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage black(int width, int height, VOption *options = nullptr); + + /** + * Boolean operation on two images. + * @param right Right-hand image argument. + * @param boolean Boolean to perform. + * @param options Set of options. + * @return Output image. + */ + VImage boolean(VImage right, VipsOperationBoolean boolean, VOption *options = nullptr) const; + + /** + * Boolean operations against a constant. + * @param boolean Boolean to perform. + * @param c Array of constants. + * @param options Set of options. + * @return Output image. + */ + VImage boolean_const(VipsOperationBoolean boolean, std::vector c, VOption *options = nullptr) const; + + /** + * Build a look-up table. + * @param options Set of options. + * @return Output image. + */ + VImage buildlut(VOption *options = nullptr) const; + + /** + * Byteswap an image. + * @param options Set of options. + * @return Output image. + */ + VImage byteswap(VOption *options = nullptr) const; + + /** + * Cache an image. + * + * **Optional parameters** + * - **max_tiles** -- Maximum number of tiles to cache, int. + * - **tile_height** -- Tile height in pixels, int. + * - **tile_width** -- Tile width in pixels, int. + * + * @param options Set of options. + * @return Output image. + */ + G_DEPRECATED + VImage cache(VOption *options = nullptr) const; + + /** + * Canny edge detector. + * + * **Optional parameters** + * - **sigma** -- Sigma of Gaussian, double. + * - **precision** -- Convolve with this precision, VipsPrecision. + * + * @param options Set of options. + * @return Output image. + */ + VImage canny(VOption *options = nullptr) const; + + /** + * Use pixel values to pick cases from an array of images. + * @param cases Array of case images. + * @param options Set of options. + * @return Output image. + */ + VImage case_image(std::vector cases, VOption *options = nullptr) const; + + /** + * Cast an image. + * + * **Optional parameters** + * - **shift** -- Shift integer values up and down, bool. + * + * @param format Format to cast to. + * @param options Set of options. + * @return Output image. + */ + VImage cast(VipsBandFormat format, VOption *options = nullptr) const; + + /** + * Clamp values of an image. + * + * **Optional parameters** + * - **min** -- Minimum value, double. + * - **max** -- Maximum value, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage clamp(VOption *options = nullptr) const; + + /** + * Convert to a new colorspace. + * + * **Optional parameters** + * - **source_space** -- Source color space, VipsInterpretation. + * + * @param space Destination color space. + * @param options Set of options. + * @return Output image. + */ + VImage colourspace(VipsInterpretation space, VOption *options = nullptr) const; + + /** + * Convolve with rotating mask. + * + * **Optional parameters** + * - **times** -- Rotate and convolve this many times, int. + * - **angle** -- Rotate mask by this much between convolutions, VipsAngle45. + * - **combine** -- Combine convolution results like this, VipsCombine. + * - **precision** -- Convolve with this precision, VipsPrecision. + * - **layers** -- Use this many layers in approximation, int. + * - **cluster** -- Cluster lines closer than this in approximation, int. + * + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage compass(VImage mask, VOption *options = nullptr) const; + + /** + * Perform a complex operation on an image. + * @param cmplx Complex to perform. + * @param options Set of options. + * @return Output image. + */ + VImage complex(VipsOperationComplex cmplx, VOption *options = nullptr) const; + + /** + * Complex binary operations on two images. + * @param right Right-hand image argument. + * @param cmplx Binary complex operation to perform. + * @param options Set of options. + * @return Output image. + */ + VImage complex2(VImage right, VipsOperationComplex2 cmplx, VOption *options = nullptr) const; + + /** + * Form a complex image from two real images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage complexform(VImage right, VOption *options = nullptr) const; + + /** + * Get a component from a complex image. + * @param get Complex to perform. + * @param options Set of options. + * @return Output image. + */ + VImage complexget(VipsOperationComplexget get, VOption *options = nullptr) const; + + /** + * Blend an array of images with an array of blend modes. + * + * **Optional parameters** + * - **x** -- Array of x coordinates to join at, std::vector. + * - **y** -- Array of y coordinates to join at, std::vector. + * - **compositing_space** -- Composite images in this colour space, VipsInterpretation. + * - **premultiplied** -- Images have premultiplied alpha, bool. + * + * @param in Array of input images. + * @param mode Array of VipsBlendMode to join with. + * @param options Set of options. + * @return Output image. + */ + static VImage composite(std::vector in, std::vector mode, VOption *options = nullptr); + + /** + * Blend a pair of images with a blend mode. + * + * **Optional parameters** + * - **x** -- x position of overlay, int. + * - **y** -- y position of overlay, int. + * - **compositing_space** -- Composite images in this colour space, VipsInterpretation. + * - **premultiplied** -- Images have premultiplied alpha, bool. + * + * @param overlay Overlay image. + * @param mode VipsBlendMode to join with. + * @param options Set of options. + * @return Output image. + */ + VImage composite2(VImage overlay, VipsBlendMode mode, VOption *options = nullptr) const; + + /** + * Convolution operation. + * + * **Optional parameters** + * - **precision** -- Convolve with this precision, VipsPrecision. + * - **layers** -- Use this many layers in approximation, int. + * - **cluster** -- Cluster lines closer than this in approximation, int. + * + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage conv(VImage mask, VOption *options = nullptr) const; + + /** + * Approximate integer convolution. + * + * **Optional parameters** + * - **layers** -- Use this many layers in approximation, int. + * - **cluster** -- Cluster lines closer than this in approximation, int. + * + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage conva(VImage mask, VOption *options = nullptr) const; + + /** + * Approximate separable integer convolution. + * + * **Optional parameters** + * - **layers** -- Use this many layers in approximation, int. + * + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage convasep(VImage mask, VOption *options = nullptr) const; + + /** + * Float convolution operation. + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage convf(VImage mask, VOption *options = nullptr) const; + + /** + * Int convolution operation. + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage convi(VImage mask, VOption *options = nullptr) const; + + /** + * Separable convolution operation. + * + * **Optional parameters** + * - **precision** -- Convolve with this precision, VipsPrecision. + * - **layers** -- Use this many layers in approximation, int. + * - **cluster** -- Cluster lines closer than this in approximation, int. + * + * @param mask Input matrix image. + * @param options Set of options. + * @return Output image. + */ + VImage convsep(VImage mask, VOption *options = nullptr) const; + + /** + * Copy an image. + * + * **Optional parameters** + * - **width** -- Image width in pixels, int. + * - **height** -- Image height in pixels, int. + * - **bands** -- Number of bands in image, int. + * - **format** -- Pixel format in image, VipsBandFormat. + * - **coding** -- Pixel coding, VipsCoding. + * - **interpretation** -- Pixel interpretation, VipsInterpretation. + * - **xres** -- Horizontal resolution in pixels/mm, double. + * - **yres** -- Vertical resolution in pixels/mm, double. + * - **xoffset** -- Horizontal offset of origin, int. + * - **yoffset** -- Vertical offset of origin, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage copy(VOption *options = nullptr) const; + + /** + * Count lines in an image. + * @param direction Countlines left-right or up-down. + * @param options Set of options. + * @return Number of lines. + */ + double countlines(VipsDirection direction, VOption *options = nullptr) const; + + /** + * Extract an area from an image. + * @param left Left edge of extract area. + * @param top Top edge of extract area. + * @param width Width of extract area. + * @param height Height of extract area. + * @param options Set of options. + * @return Output image. + */ + VImage crop(int left, int top, int width, int height, VOption *options = nullptr) const; + + /** + * Load csv. + * + * **Optional parameters** + * - **skip** -- Skip this many lines at the start of the file, int. + * - **lines** -- Read this many lines from the file, int. + * - **whitespace** -- Set of whitespace characters, const char *. + * - **separator** -- Set of separator characters, const char *. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage csvload(const char *filename, VOption *options = nullptr); + + /** + * Load csv. + * + * **Optional parameters** + * - **skip** -- Skip this many lines at the start of the file, int. + * - **lines** -- Read this many lines from the file, int. + * - **whitespace** -- Set of whitespace characters, const char *. + * - **separator** -- Set of separator characters, const char *. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage csvload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to csv. + * + * **Optional parameters** + * - **separator** -- Separator characters, const char *. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void csvsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to csv. + * + * **Optional parameters** + * - **separator** -- Separator characters, const char *. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void csvsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Calculate de00. + * @param right Right-hand input image. + * @param options Set of options. + * @return Output image. + */ + VImage dE00(VImage right, VOption *options = nullptr) const; + + /** + * Calculate de76. + * @param right Right-hand input image. + * @param options Set of options. + * @return Output image. + */ + VImage dE76(VImage right, VOption *options = nullptr) const; + + /** + * Calculate decmc. + * @param right Right-hand input image. + * @param options Set of options. + * @return Output image. + */ + VImage dECMC(VImage right, VOption *options = nullptr) const; + + /** + * Find image standard deviation. + * @param options Set of options. + * @return Output value. + */ + double deviate(VOption *options = nullptr) const; + + /** + * Divide two images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage divide(VImage right, VOption *options = nullptr) const; + + /** + * Draw a circle on an image. + * + * **Optional parameters** + * - **fill** -- Draw a solid object, bool. + * + * @param ink Color for pixels. + * @param cx Centre of draw_circle. + * @param cy Centre of draw_circle. + * @param radius Radius in pixels. + * @param options Set of options. + */ + void draw_circle(std::vector ink, int cx, int cy, int radius, VOption *options = nullptr) const; + + /** + * Flood-fill an area. + * + * **Optional parameters** + * - **test** -- Test pixels in this image, VImage. + * - **equal** -- DrawFlood while equal to edge, bool. + * + * @param ink Color for pixels. + * @param x DrawFlood start point. + * @param y DrawFlood start point. + * @param options Set of options. + */ + void draw_flood(std::vector ink, int x, int y, VOption *options = nullptr) const; + + /** + * Paint an image into another image. + * + * **Optional parameters** + * - **mode** -- Combining mode, VipsCombineMode. + * + * @param sub Sub-image to insert into main image. + * @param x Draw image here. + * @param y Draw image here. + * @param options Set of options. + */ + void draw_image(VImage sub, int x, int y, VOption *options = nullptr) const; + + /** + * Draw a line on an image. + * @param ink Color for pixels. + * @param x1 Start of draw_line. + * @param y1 Start of draw_line. + * @param x2 End of draw_line. + * @param y2 End of draw_line. + * @param options Set of options. + */ + void draw_line(std::vector ink, int x1, int y1, int x2, int y2, VOption *options = nullptr) const; + + /** + * Draw a mask on an image. + * @param ink Color for pixels. + * @param mask Mask of pixels to draw. + * @param x Draw mask here. + * @param y Draw mask here. + * @param options Set of options. + */ + void draw_mask(std::vector ink, VImage mask, int x, int y, VOption *options = nullptr) const; + + /** + * Paint a rectangle on an image. + * + * **Optional parameters** + * - **fill** -- Draw a solid object, bool. + * + * @param ink Color for pixels. + * @param left Rect to fill. + * @param top Rect to fill. + * @param width Rect to fill. + * @param height Rect to fill. + * @param options Set of options. + */ + void draw_rect(std::vector ink, int left, int top, int width, int height, VOption *options = nullptr) const; + + /** + * Blur a rectangle on an image. + * @param left Rect to fill. + * @param top Rect to fill. + * @param width Rect to fill. + * @param height Rect to fill. + * @param options Set of options. + */ + void draw_smudge(int left, int top, int width, int height, VOption *options = nullptr) const; + + /** + * Save image to deepzoom file. + * + * **Optional parameters** + * - **imagename** -- Image name, const char *. + * - **layout** -- Directory layout, VipsForeignDzLayout. + * - **suffix** -- Filename suffix for tiles, const char *. + * - **overlap** -- Tile overlap in pixels, int. + * - **tile_size** -- Tile size in pixels, int. + * - **centre** -- Center image in tile, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **angle** -- Rotate image during save, VipsAngle. + * - **container** -- Pyramid container type, VipsForeignDzContainer. + * - **compression** -- ZIP deflate compression level, int. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **skip_blanks** -- Skip tiles which are nearly equal to the background, int. + * - **id** -- Resource ID, const char *. + * - **Q** -- Q factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void dzsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to dz buffer. + * + * **Optional parameters** + * - **imagename** -- Image name, const char *. + * - **layout** -- Directory layout, VipsForeignDzLayout. + * - **suffix** -- Filename suffix for tiles, const char *. + * - **overlap** -- Tile overlap in pixels, int. + * - **tile_size** -- Tile size in pixels, int. + * - **centre** -- Center image in tile, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **angle** -- Rotate image during save, VipsAngle. + * - **container** -- Pyramid container type, VipsForeignDzContainer. + * - **compression** -- ZIP deflate compression level, int. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **skip_blanks** -- Skip tiles which are nearly equal to the background, int. + * - **id** -- Resource ID, const char *. + * - **Q** -- Q factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *dzsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to deepzoom target. + * + * **Optional parameters** + * - **imagename** -- Image name, const char *. + * - **layout** -- Directory layout, VipsForeignDzLayout. + * - **suffix** -- Filename suffix for tiles, const char *. + * - **overlap** -- Tile overlap in pixels, int. + * - **tile_size** -- Tile size in pixels, int. + * - **centre** -- Center image in tile, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **angle** -- Rotate image during save, VipsAngle. + * - **container** -- Pyramid container type, VipsForeignDzContainer. + * - **compression** -- ZIP deflate compression level, int. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **skip_blanks** -- Skip tiles which are nearly equal to the background, int. + * - **id** -- Resource ID, const char *. + * - **Q** -- Q factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void dzsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Embed an image in a larger image. + * + * **Optional parameters** + * - **extend** -- How to generate the extra pixels, VipsExtend. + * - **background** -- Color for background pixels, std::vector. + * + * @param x Left edge of input in output. + * @param y Top edge of input in output. + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + VImage embed(int x, int y, int width, int height, VOption *options = nullptr) const; + + /** + * Extract an area from an image. + * @param left Left edge of extract area. + * @param top Top edge of extract area. + * @param width Width of extract area. + * @param height Height of extract area. + * @param options Set of options. + * @return Output image. + */ + VImage extract_area(int left, int top, int width, int height, VOption *options = nullptr) const; + + /** + * Extract band from an image. + * + * **Optional parameters** + * - **n** -- Number of bands to extract, int. + * + * @param band Band to extract. + * @param options Set of options. + * @return Output image. + */ + VImage extract_band(int band, VOption *options = nullptr) const; + + /** + * Make an image showing the eye's spatial response. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **factor** -- Maximum spatial frequency, double. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage eye(int width, int height, VOption *options = nullptr); + + /** + * False-color an image. + * @param options Set of options. + * @return Output image. + */ + VImage falsecolour(VOption *options = nullptr) const; + + /** + * Fast correlation. + * @param ref Input reference image. + * @param options Set of options. + * @return Output image. + */ + VImage fastcor(VImage ref, VOption *options = nullptr) const; + + /** + * Fill image zeros with nearest non-zero pixel. + * @param options Set of options. + * @return Value of nearest non-zero pixel. + */ + VImage fill_nearest(VOption *options = nullptr) const; + + /** + * Search an image for non-edge areas. + * + * **Optional parameters** + * - **threshold** -- Object threshold, double. + * - **background** -- Color for background pixels, std::vector. + * - **line_art** -- Enable line art mode, bool. + * + * @param top Top edge of extract area. + * @param width Width of extract area. + * @param height Height of extract area. + * @param options Set of options. + * @return Left edge of image. + */ + int find_trim(int *top, int *width, int *height, VOption *options = nullptr) const; + + /** + * Load a fits image. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage fitsload(const char *filename, VOption *options = nullptr); + + /** + * Load fits from a source. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage fitsload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to fits file. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void fitssave(const char *filename, VOption *options = nullptr) const; + + /** + * Flatten alpha out of an image. + * + * **Optional parameters** + * - **background** -- Background value, std::vector. + * - **max_alpha** -- Maximum value of alpha channel, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage flatten(VOption *options = nullptr) const; + + /** + * Flip an image. + * @param direction Direction to flip image. + * @param options Set of options. + * @return Output image. + */ + VImage flip(VipsDirection direction, VOption *options = nullptr) const; + + /** + * Transform float rgb to radiance coding. + * @param options Set of options. + * @return Output image. + */ + VImage float2rad(VOption *options = nullptr) const; + + /** + * Make a fractal surface. + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param fractal_dimension Fractal dimension. + * @param options Set of options. + * @return Output image. + */ + static VImage fractsurf(int width, int height, double fractal_dimension, VOption *options = nullptr); + + /** + * Frequency-domain filtering. + * @param mask Input mask image. + * @param options Set of options. + * @return Output image. + */ + VImage freqmult(VImage mask, VOption *options = nullptr) const; + + /** + * Forward fft. + * @param options Set of options. + * @return Output image. + */ + VImage fwfft(VOption *options = nullptr) const; + + /** + * Gamma an image. + * + * **Optional parameters** + * - **exponent** -- Gamma factor, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage gamma(VOption *options = nullptr) const; + + /** + * Gaussian blur. + * + * **Optional parameters** + * - **min_ampl** -- Minimum amplitude of Gaussian, double. + * - **precision** -- Convolve with this precision, VipsPrecision. + * + * @param sigma Sigma of Gaussian. + * @param options Set of options. + * @return Output image. + */ + VImage gaussblur(double sigma, VOption *options = nullptr) const; + + /** + * Make a gaussian image. + * + * **Optional parameters** + * - **separable** -- Generate separable Gaussian, bool. + * - **precision** -- Generate with this precision, VipsPrecision. + * + * @param sigma Sigma of Gaussian. + * @param min_ampl Minimum amplitude of Gaussian. + * @param options Set of options. + * @return Output image. + */ + static VImage gaussmat(double sigma, double min_ampl, VOption *options = nullptr); + + /** + * Make a gaussnoise image. + * + * **Optional parameters** + * - **sigma** -- Standard deviation of pixels in generated image, double. + * - **mean** -- Mean of pixels in generated image, double. + * - **seed** -- Random number seed, int. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage gaussnoise(int width, int height, VOption *options = nullptr); + + /** + * Read a point from an image. + * + * **Optional parameters** + * - **unpack_complex** -- Complex pixels should be unpacked, bool. + * + * @param x Point to read. + * @param y Point to read. + * @param options Set of options. + * @return Array of output values. + */ + std::vector getpoint(int x, int y, VOption *options = nullptr) const; + + /** + * Load gif with libnsgif. + * + * **Optional parameters** + * - **n** -- Number of pages to load, -1 for all, int. + * - **page** -- First page to load, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage gifload(const char *filename, VOption *options = nullptr); + + /** + * Load gif with libnsgif. + * + * **Optional parameters** + * - **n** -- Number of pages to load, -1 for all, int. + * - **page** -- First page to load, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage gifload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load gif from source. + * + * **Optional parameters** + * - **n** -- Number of pages to load, -1 for all, int. + * - **page** -- First page to load, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage gifload_source(VSource source, VOption *options = nullptr); + + /** + * Save as gif. + * + * **Optional parameters** + * - **dither** -- Amount of dithering, double. + * - **effort** -- Quantisation effort, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **interframe_maxerror** -- Maximum inter-frame error for transparency, double. + * - **reuse** -- Reuse palette from input, bool. + * - **interpalette_maxerror** -- Maximum inter-palette error for palette reusage, double. + * - **interlace** -- Generate an interlaced (progressive) GIF, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void gifsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save as gif. + * + * **Optional parameters** + * - **dither** -- Amount of dithering, double. + * - **effort** -- Quantisation effort, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **interframe_maxerror** -- Maximum inter-frame error for transparency, double. + * - **reuse** -- Reuse palette from input, bool. + * - **interpalette_maxerror** -- Maximum inter-palette error for palette reusage, double. + * - **interlace** -- Generate an interlaced (progressive) GIF, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *gifsave_buffer(VOption *options = nullptr) const; + + /** + * Save as gif. + * + * **Optional parameters** + * - **dither** -- Amount of dithering, double. + * - **effort** -- Quantisation effort, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **interframe_maxerror** -- Maximum inter-frame error for transparency, double. + * - **reuse** -- Reuse palette from input, bool. + * - **interpalette_maxerror** -- Maximum inter-palette error for palette reusage, double. + * - **interlace** -- Generate an interlaced (progressive) GIF, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void gifsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Global balance an image mosaic. + * + * **Optional parameters** + * - **gamma** -- Image gamma, double. + * - **int_output** -- Integer output, bool. + * + * @param options Set of options. + * @return Output image. + */ + VImage globalbalance(VOption *options = nullptr) const; + + /** + * Place an image within a larger image with a certain gravity. + * + * **Optional parameters** + * - **extend** -- How to generate the extra pixels, VipsExtend. + * - **background** -- Color for background pixels, std::vector. + * + * @param direction Direction to place image within width/height. + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + VImage gravity(VipsCompassDirection direction, int width, int height, VOption *options = nullptr) const; + + /** + * Make a grey ramp image. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage grey(int width, int height, VOption *options = nullptr); + + /** + * Grid an image. + * @param tile_height Chop into tiles this high. + * @param across Number of tiles across. + * @param down Number of tiles down. + * @param options Set of options. + * @return Output image. + */ + VImage grid(int tile_height, int across, int down, VOption *options = nullptr) const; + + /** + * Load a heif image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **thumbnail** -- Fetch thumbnail image, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage heifload(const char *filename, VOption *options = nullptr); + + /** + * Load a heif image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **thumbnail** -- Fetch thumbnail image, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage heifload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load a heif image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **thumbnail** -- Fetch thumbnail image, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage heifload_source(VSource source, VOption *options = nullptr); + + /** + * Save image in heif format. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **lossless** -- Enable lossless compression, bool. + * - **compression** -- Compression format, VipsForeignHeifCompression. + * - **effort** -- CPU effort, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **encoder** -- Select encoder to use, VipsForeignHeifEncoder. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void heifsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image in heif format. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **lossless** -- Enable lossless compression, bool. + * - **compression** -- Compression format, VipsForeignHeifCompression. + * - **effort** -- CPU effort, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **encoder** -- Select encoder to use, VipsForeignHeifEncoder. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *heifsave_buffer(VOption *options = nullptr) const; + + /** + * Save image in heif format. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **bitdepth** -- Number of bits per pixel, int. + * - **lossless** -- Enable lossless compression, bool. + * - **compression** -- Compression format, VipsForeignHeifCompression. + * - **effort** -- CPU effort, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **encoder** -- Select encoder to use, VipsForeignHeifEncoder. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void heifsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Form cumulative histogram. + * @param options Set of options. + * @return Output image. + */ + VImage hist_cum(VOption *options = nullptr) const; + + /** + * Estimate image entropy. + * @param options Set of options. + * @return Output value. + */ + double hist_entropy(VOption *options = nullptr) const; + + /** + * Histogram equalisation. + * + * **Optional parameters** + * - **band** -- Equalise with this band, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage hist_equal(VOption *options = nullptr) const; + + /** + * Find image histogram. + * + * **Optional parameters** + * - **band** -- Find histogram of band, int. + * + * @param options Set of options. + * @return Output histogram. + */ + VImage hist_find(VOption *options = nullptr) const; + + /** + * Find indexed image histogram. + * + * **Optional parameters** + * - **combine** -- Combine bins like this, VipsCombine. + * + * @param index Index image. + * @param options Set of options. + * @return Output histogram. + */ + VImage hist_find_indexed(VImage index, VOption *options = nullptr) const; + + /** + * Find n-dimensional image histogram. + * + * **Optional parameters** + * - **bins** -- Number of bins in each dimension, int. + * + * @param options Set of options. + * @return Output histogram. + */ + VImage hist_find_ndim(VOption *options = nullptr) const; + + /** + * Test for monotonicity. + * @param options Set of options. + * @return true if in is monotonic. + */ + bool hist_ismonotonic(VOption *options = nullptr) const; + + /** + * Local histogram equalisation. + * + * **Optional parameters** + * - **max_slope** -- Maximum slope (CLAHE), int. + * + * @param width Window width in pixels. + * @param height Window height in pixels. + * @param options Set of options. + * @return Output image. + */ + VImage hist_local(int width, int height, VOption *options = nullptr) const; + + /** + * Match two histograms. + * @param ref Reference histogram. + * @param options Set of options. + * @return Output image. + */ + VImage hist_match(VImage ref, VOption *options = nullptr) const; + + /** + * Normalise histogram. + * @param options Set of options. + * @return Output image. + */ + VImage hist_norm(VOption *options = nullptr) const; + + /** + * Plot histogram. + * @param options Set of options. + * @return Output image. + */ + VImage hist_plot(VOption *options = nullptr) const; + + /** + * Find hough circle transform. + * + * **Optional parameters** + * - **scale** -- Scale down dimensions by this factor, int. + * - **min_radius** -- Smallest radius to search for, int. + * - **max_radius** -- Largest radius to search for, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage hough_circle(VOption *options = nullptr) const; + + /** + * Find hough line transform. + * + * **Optional parameters** + * - **width** -- Horizontal size of parameter space, int. + * - **height** -- Vertical size of parameter space, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage hough_line(VOption *options = nullptr) const; + + /** + * Output to device with icc profile. + * + * **Optional parameters** + * - **pcs** -- Set Profile Connection Space, VipsPCS. + * - **intent** -- Rendering intent, VipsIntent. + * - **black_point_compensation** -- Enable black point compensation, bool. + * - **output_profile** -- Filename to load output profile from, const char *. + * - **depth** -- Output device space depth in bits, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage icc_export(VOption *options = nullptr) const; + + /** + * Import from device with icc profile. + * + * **Optional parameters** + * - **pcs** -- Set Profile Connection Space, VipsPCS. + * - **intent** -- Rendering intent, VipsIntent. + * - **black_point_compensation** -- Enable black point compensation, bool. + * - **embedded** -- Use embedded input profile, if available, bool. + * - **input_profile** -- Filename to load input profile from, const char *. + * + * @param options Set of options. + * @return Output image. + */ + VImage icc_import(VOption *options = nullptr) const; + + /** + * Transform between devices with icc profiles. + * + * **Optional parameters** + * - **pcs** -- Set Profile Connection Space, VipsPCS. + * - **intent** -- Rendering intent, VipsIntent. + * - **black_point_compensation** -- Enable black point compensation, bool. + * - **embedded** -- Use embedded input profile, if available, bool. + * - **input_profile** -- Filename to load input profile from, const char *. + * - **depth** -- Output device space depth in bits, int. + * + * @param output_profile Filename to load output profile from. + * @param options Set of options. + * @return Output image. + */ + VImage icc_transform(const char *output_profile, VOption *options = nullptr) const; + + /** + * Make a 1d image where pixel values are indexes. + * + * **Optional parameters** + * - **bands** -- Number of bands in LUT, int. + * - **ushort** -- Create a 16-bit LUT, bool. + * - **size** -- Size of 16-bit LUT, int. + * + * @param options Set of options. + * @return Output image. + */ + static VImage identity(VOption *options = nullptr); + + /** + * Ifthenelse an image. + * + * **Optional parameters** + * - **blend** -- Blend smoothly between then and else parts, bool. + * + * @param in1 Source for TRUE pixels. + * @param in2 Source for FALSE pixels. + * @param options Set of options. + * @return Output image. + */ + VImage ifthenelse(VImage in1, VImage in2, VOption *options = nullptr) const; + + /** + * Insert image @sub into @main at @x, @y. + * + * **Optional parameters** + * - **expand** -- Expand output to hold all of both inputs, bool. + * - **background** -- Color for new pixels, std::vector. + * + * @param sub Sub-image to insert into main image. + * @param x Left edge of sub in main. + * @param y Top edge of sub in main. + * @param options Set of options. + * @return Output image. + */ + VImage insert(VImage sub, int x, int y, VOption *options = nullptr) const; + + /** + * Invert an image. + * @param options Set of options. + * @return Output image. + */ + VImage invert(VOption *options = nullptr) const; + + /** + * Build an inverted look-up table. + * + * **Optional parameters** + * - **size** -- LUT size to generate, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage invertlut(VOption *options = nullptr) const; + + /** + * Inverse fft. + * + * **Optional parameters** + * - **real** -- Output only the real part of the transform, bool. + * + * @param options Set of options. + * @return Output image. + */ + VImage invfft(VOption *options = nullptr) const; + + /** + * Join a pair of images. + * + * **Optional parameters** + * - **expand** -- Expand output to hold all of both inputs, bool. + * - **shim** -- Pixels between images, int. + * - **background** -- Colour for new pixels, std::vector. + * - **align** -- Align on the low, centre or high coordinate edge, VipsAlign. + * + * @param in2 Second input image. + * @param direction Join left-right or up-down. + * @param options Set of options. + * @return Output image. + */ + VImage join(VImage in2, VipsDirection direction, VOption *options = nullptr) const; + + /** + * Load jpeg2000 image. + * + * **Optional parameters** + * - **page** -- Load this page from the image, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jp2kload(const char *filename, VOption *options = nullptr); + + /** + * Load jpeg2000 image. + * + * **Optional parameters** + * - **page** -- Load this page from the image, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jp2kload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load jpeg2000 image. + * + * **Optional parameters** + * - **page** -- Load this page from the image, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jp2kload_source(VSource source, VOption *options = nullptr); + + /** + * Save image in jpeg2000 format. + * + * **Optional parameters** + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Q factor, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void jp2ksave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image in jpeg2000 format. + * + * **Optional parameters** + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Q factor, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *jp2ksave_buffer(VOption *options = nullptr) const; + + /** + * Save image in jpeg2000 format. + * + * **Optional parameters** + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Q factor, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void jp2ksave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Load jpeg from file. + * + * **Optional parameters** + * - **shrink** -- Shrink factor on load, int. + * - **autorotate** -- Rotate image using exif orientation, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jpegload(const char *filename, VOption *options = nullptr); + + /** + * Load jpeg from buffer. + * + * **Optional parameters** + * - **shrink** -- Shrink factor on load, int. + * - **autorotate** -- Rotate image using exif orientation, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jpegload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load image from jpeg source. + * + * **Optional parameters** + * - **shrink** -- Shrink factor on load, int. + * - **autorotate** -- Rotate image using exif orientation, bool. + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jpegload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to jpeg file. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **optimize_coding** -- Compute optimal Huffman coding tables, bool. + * - **interlace** -- Generate an interlaced (progressive) jpeg, bool. + * - **trellis_quant** -- Apply trellis quantisation to each 8x8 block, bool. + * - **overshoot_deringing** -- Apply overshooting to samples with extreme values, bool. + * - **optimize_scans** -- Split spectrum of DCT coefficients into separate scans, bool. + * - **quant_table** -- Use predefined quantization table with given index, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **restart_interval** -- Add restart markers every specified number of mcu, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void jpegsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to jpeg buffer. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **optimize_coding** -- Compute optimal Huffman coding tables, bool. + * - **interlace** -- Generate an interlaced (progressive) jpeg, bool. + * - **trellis_quant** -- Apply trellis quantisation to each 8x8 block, bool. + * - **overshoot_deringing** -- Apply overshooting to samples with extreme values, bool. + * - **optimize_scans** -- Split spectrum of DCT coefficients into separate scans, bool. + * - **quant_table** -- Use predefined quantization table with given index, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **restart_interval** -- Add restart markers every specified number of mcu, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *jpegsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to jpeg mime. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **optimize_coding** -- Compute optimal Huffman coding tables, bool. + * - **interlace** -- Generate an interlaced (progressive) jpeg, bool. + * - **trellis_quant** -- Apply trellis quantisation to each 8x8 block, bool. + * - **overshoot_deringing** -- Apply overshooting to samples with extreme values, bool. + * - **optimize_scans** -- Split spectrum of DCT coefficients into separate scans, bool. + * - **quant_table** -- Use predefined quantization table with given index, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **restart_interval** -- Add restart markers every specified number of mcu, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + */ + void jpegsave_mime(VOption *options = nullptr) const; + + /** + * Save image to jpeg target. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **optimize_coding** -- Compute optimal Huffman coding tables, bool. + * - **interlace** -- Generate an interlaced (progressive) jpeg, bool. + * - **trellis_quant** -- Apply trellis quantisation to each 8x8 block, bool. + * - **overshoot_deringing** -- Apply overshooting to samples with extreme values, bool. + * - **optimize_scans** -- Split spectrum of DCT coefficients into separate scans, bool. + * - **quant_table** -- Use predefined quantization table with given index, int. + * - **subsample_mode** -- Select chroma subsample operation mode, VipsForeignSubsample. + * - **restart_interval** -- Add restart markers every specified number of mcu, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void jpegsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Load jpeg-xl image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jxlload(const char *filename, VOption *options = nullptr); + + /** + * Load jpeg-xl image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jxlload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load jpeg-xl image. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage jxlload_source(VSource source, VOption *options = nullptr); + + /** + * Save image in jpeg-xl format. + * + * **Optional parameters** + * - **tier** -- Decode speed tier, int. + * - **distance** -- Target butteraugli distance, double. + * - **effort** -- Encoding effort, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Quality factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void jxlsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image in jpeg-xl format. + * + * **Optional parameters** + * - **tier** -- Decode speed tier, int. + * - **distance** -- Target butteraugli distance, double. + * - **effort** -- Encoding effort, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Quality factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *jxlsave_buffer(VOption *options = nullptr) const; + + /** + * Save image in jpeg-xl format. + * + * **Optional parameters** + * - **tier** -- Decode speed tier, int. + * - **distance** -- Target butteraugli distance, double. + * - **effort** -- Encoding effort, int. + * - **lossless** -- Enable lossless compression, bool. + * - **Q** -- Quality factor, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void jxlsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Label regions in an image. + * @param options Set of options. + * @return Mask of region labels. + */ + VImage labelregions(VOption *options = nullptr) const; + + /** + * Calculate (a * in + b). + * + * **Optional parameters** + * - **uchar** -- Output should be uchar, bool. + * + * @param a Multiply by this. + * @param b Add this. + * @param options Set of options. + * @return Output image. + */ + VImage linear(std::vector a, std::vector b, VOption *options = nullptr) const; + + /** + * Cache an image as a set of lines. + * + * **Optional parameters** + * - **tile_height** -- Tile height in pixels, int. + * - **access** -- Expected access pattern, VipsAccess. + * - **threaded** -- Allow threaded access, bool. + * - **persistent** -- Keep cache between evaluations, bool. + * + * @param options Set of options. + * @return Output image. + */ + VImage linecache(VOption *options = nullptr) const; + + /** + * Make a laplacian of gaussian image. + * + * **Optional parameters** + * - **separable** -- Generate separable Gaussian, bool. + * - **precision** -- Generate with this precision, VipsPrecision. + * + * @param sigma Radius of Gaussian. + * @param min_ampl Minimum amplitude of Gaussian. + * @param options Set of options. + * @return Output image. + */ + static VImage logmat(double sigma, double min_ampl, VOption *options = nullptr); + + /** + * Load file with imagemagick. + * + * **Optional parameters** + * - **density** -- Canvas resolution for rendering vector formats like SVG, const char *. + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage magickload(const char *filename, VOption *options = nullptr); + + /** + * Load buffer with imagemagick. + * + * **Optional parameters** + * - **density** -- Canvas resolution for rendering vector formats like SVG, const char *. + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage magickload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Save file with imagemagick. + * + * **Optional parameters** + * - **format** -- Format to save in, const char *. + * - **quality** -- Quality to use, int. + * - **optimize_gif_frames** -- Apply GIF frames optimization, bool. + * - **optimize_gif_transparency** -- Apply GIF transparency optimization, bool. + * - **bitdepth** -- Number of bits per pixel, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void magicksave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to magick buffer. + * + * **Optional parameters** + * - **format** -- Format to save in, const char *. + * - **quality** -- Quality to use, int. + * - **optimize_gif_frames** -- Apply GIF frames optimization, bool. + * - **optimize_gif_transparency** -- Apply GIF transparency optimization, bool. + * - **bitdepth** -- Number of bits per pixel, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *magicksave_buffer(VOption *options = nullptr) const; + + /** + * Resample with a map image. + * + * **Optional parameters** + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * - **background** -- Background value, std::vector. + * - **premultiplied** -- Images have premultiplied alpha, bool. + * - **extend** -- How to generate the extra pixels, VipsExtend. + * + * @param index Index pixels with this. + * @param options Set of options. + * @return Output image. + */ + VImage mapim(VImage index, VOption *options = nullptr) const; + + /** + * Map an image though a lut. + * + * **Optional parameters** + * - **band** -- Apply one-band lut to this band of in, int. + * + * @param lut Look-up table image. + * @param options Set of options. + * @return Output image. + */ + VImage maplut(VImage lut, VOption *options = nullptr) const; + + /** + * Make a butterworth filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param order Filter order. + * @param frequency_cutoff Frequency cutoff. + * @param amplitude_cutoff Amplitude cutoff. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_butterworth(int width, int height, double order, double frequency_cutoff, double amplitude_cutoff, VOption *options = nullptr); + + /** + * Make a butterworth_band filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param order Filter order. + * @param frequency_cutoff_x Frequency cutoff x. + * @param frequency_cutoff_y Frequency cutoff y. + * @param radius Radius of circle. + * @param amplitude_cutoff Amplitude cutoff. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_butterworth_band(int width, int height, double order, double frequency_cutoff_x, double frequency_cutoff_y, double radius, double amplitude_cutoff, VOption *options = nullptr); + + /** + * Make a butterworth ring filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param order Filter order. + * @param frequency_cutoff Frequency cutoff. + * @param amplitude_cutoff Amplitude cutoff. + * @param ringwidth Ringwidth. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_butterworth_ring(int width, int height, double order, double frequency_cutoff, double amplitude_cutoff, double ringwidth, VOption *options = nullptr); + + /** + * Make fractal filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param fractal_dimension Fractal dimension. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_fractal(int width, int height, double fractal_dimension, VOption *options = nullptr); + + /** + * Make a gaussian filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff Frequency cutoff. + * @param amplitude_cutoff Amplitude cutoff. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_gaussian(int width, int height, double frequency_cutoff, double amplitude_cutoff, VOption *options = nullptr); + + /** + * Make a gaussian filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff_x Frequency cutoff x. + * @param frequency_cutoff_y Frequency cutoff y. + * @param radius Radius of circle. + * @param amplitude_cutoff Amplitude cutoff. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_gaussian_band(int width, int height, double frequency_cutoff_x, double frequency_cutoff_y, double radius, double amplitude_cutoff, VOption *options = nullptr); + + /** + * Make a gaussian ring filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff Frequency cutoff. + * @param amplitude_cutoff Amplitude cutoff. + * @param ringwidth Ringwidth. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_gaussian_ring(int width, int height, double frequency_cutoff, double amplitude_cutoff, double ringwidth, VOption *options = nullptr); + + /** + * Make an ideal filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff Frequency cutoff. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_ideal(int width, int height, double frequency_cutoff, VOption *options = nullptr); + + /** + * Make an ideal band filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff_x Frequency cutoff x. + * @param frequency_cutoff_y Frequency cutoff y. + * @param radius Radius of circle. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_ideal_band(int width, int height, double frequency_cutoff_x, double frequency_cutoff_y, double radius, VOption *options = nullptr); + + /** + * Make an ideal ring filter. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **nodc** -- Remove DC component, bool. + * - **reject** -- Invert the sense of the filter, bool. + * - **optical** -- Rotate quadrants to optical space, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param frequency_cutoff Frequency cutoff. + * @param ringwidth Ringwidth. + * @param options Set of options. + * @return Output image. + */ + static VImage mask_ideal_ring(int width, int height, double frequency_cutoff, double ringwidth, VOption *options = nullptr); + + /** + * First-order match of two images. + * + * **Optional parameters** + * - **hwindow** -- Half window size, int. + * - **harea** -- Half area size, int. + * - **search** -- Search to improve tie-points, bool. + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * + * @param sec Secondary image. + * @param xr1 Position of first reference tie-point. + * @param yr1 Position of first reference tie-point. + * @param xs1 Position of first secondary tie-point. + * @param ys1 Position of first secondary tie-point. + * @param xr2 Position of second reference tie-point. + * @param yr2 Position of second reference tie-point. + * @param xs2 Position of second secondary tie-point. + * @param ys2 Position of second secondary tie-point. + * @param options Set of options. + * @return Output image. + */ + VImage match(VImage sec, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, VOption *options = nullptr) const; + + /** + * Apply a math operation to an image. + * @param math Math to perform. + * @param options Set of options. + * @return Output image. + */ + VImage math(VipsOperationMath math, VOption *options = nullptr) const; + + /** + * Binary math operations. + * @param right Right-hand image argument. + * @param math2 Math to perform. + * @param options Set of options. + * @return Output image. + */ + VImage math2(VImage right, VipsOperationMath2 math2, VOption *options = nullptr) const; + + /** + * Binary math operations with a constant. + * @param math2 Math to perform. + * @param c Array of constants. + * @param options Set of options. + * @return Output image. + */ + VImage math2_const(VipsOperationMath2 math2, std::vector c, VOption *options = nullptr) const; + + /** + * Load mat from file. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage matload(const char *filename, VOption *options = nullptr); + + /** + * Invert an matrix. + * @param options Set of options. + * @return Output matrix. + */ + VImage matrixinvert(VOption *options = nullptr) const; + + /** + * Load matrix. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage matrixload(const char *filename, VOption *options = nullptr); + + /** + * Load matrix. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage matrixload_source(VSource source, VOption *options = nullptr); + + /** + * Print matrix. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + */ + void matrixprint(VOption *options = nullptr) const; + + /** + * Save image to matrix. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void matrixsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to matrix. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void matrixsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Find image maximum. + * + * **Optional parameters** + * - **size** -- Number of maximum values to find, int. + * + * @param options Set of options. + * @return Output value. + */ + double max(VOption *options = nullptr) const; + + /** + * Maximum of a pair of images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage maxpair(VImage right, VOption *options = nullptr) const; + + /** + * Measure a set of patches on a color chart. + * + * **Optional parameters** + * - **left** -- Left edge of extract area, int. + * - **top** -- Top edge of extract area, int. + * - **width** -- Width of extract area, int. + * - **height** -- Height of extract area, int. + * + * @param h Number of patches across chart. + * @param v Number of patches down chart. + * @param options Set of options. + * @return Output array of statistics. + */ + VImage measure(int h, int v, VOption *options = nullptr) const; + + /** + * Merge two images. + * + * **Optional parameters** + * - **mblend** -- Maximum blend size, int. + * + * @param sec Secondary image. + * @param direction Horizontal or vertical merge. + * @param dx Horizontal displacement from sec to ref. + * @param dy Vertical displacement from sec to ref. + * @param options Set of options. + * @return Output image. + */ + VImage merge(VImage sec, VipsDirection direction, int dx, int dy, VOption *options = nullptr) const; + + /** + * Find image minimum. + * + * **Optional parameters** + * - **size** -- Number of minimum values to find, int. + * + * @param options Set of options. + * @return Output value. + */ + double min(VOption *options = nullptr) const; + + /** + * Minimum of a pair of images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage minpair(VImage right, VOption *options = nullptr) const; + + /** + * Morphology operation. + * @param mask Input matrix image. + * @param morph Morphological operation to perform. + * @param options Set of options. + * @return Output image. + */ + VImage morph(VImage mask, VipsOperationMorphology morph, VOption *options = nullptr) const; + + /** + * Mosaic two images. + * + * **Optional parameters** + * - **hwindow** -- Half window size, int. + * - **harea** -- Half area size, int. + * - **mblend** -- Maximum blend size, int. + * - **bandno** -- Band to search for features on, int. + * + * @param sec Secondary image. + * @param direction Horizontal or vertical mosaic. + * @param xref Position of reference tie-point. + * @param yref Position of reference tie-point. + * @param xsec Position of secondary tie-point. + * @param ysec Position of secondary tie-point. + * @param options Set of options. + * @return Output image. + */ + VImage mosaic(VImage sec, VipsDirection direction, int xref, int yref, int xsec, int ysec, VOption *options = nullptr) const; + + /** + * First-order mosaic of two images. + * + * **Optional parameters** + * - **hwindow** -- Half window size, int. + * - **harea** -- Half area size, int. + * - **search** -- Search to improve tie-points, bool. + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * - **mblend** -- Maximum blend size, int. + * + * @param sec Secondary image. + * @param direction Horizontal or vertical mosaic. + * @param xr1 Position of first reference tie-point. + * @param yr1 Position of first reference tie-point. + * @param xs1 Position of first secondary tie-point. + * @param ys1 Position of first secondary tie-point. + * @param xr2 Position of second reference tie-point. + * @param yr2 Position of second reference tie-point. + * @param xs2 Position of second secondary tie-point. + * @param ys2 Position of second secondary tie-point. + * @param options Set of options. + * @return Output image. + */ + VImage mosaic1(VImage sec, VipsDirection direction, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, VOption *options = nullptr) const; + + /** + * Pick most-significant byte from an image. + * + * **Optional parameters** + * - **band** -- Band to msb, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage msb(VOption *options = nullptr) const; + + /** + * Multiply two images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage multiply(VImage right, VOption *options = nullptr) const; + + /** + * Load nifti volume. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage niftiload(const char *filename, VOption *options = nullptr); + + /** + * Load nifti volumes. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage niftiload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to nifti file. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void niftisave(const char *filename, VOption *options = nullptr) const; + + /** + * Load an openexr image. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage openexrload(const char *filename, VOption *options = nullptr); + + /** + * Load file with openslide. + * + * **Optional parameters** + * - **level** -- Load this level from the file, int. + * - **autocrop** -- Crop to image bounds, bool. + * - **associated** -- Load this associated image, const char *. + * - **attach_associated** -- Attach all associated images, bool. + * - **rgb** -- Output RGB (not RGBA), bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage openslideload(const char *filename, VOption *options = nullptr); + + /** + * Load source with openslide. + * + * **Optional parameters** + * - **level** -- Load this level from the file, int. + * - **autocrop** -- Crop to image bounds, bool. + * - **associated** -- Load this associated image, const char *. + * - **attach_associated** -- Attach all associated images, bool. + * - **rgb** -- Output RGB (not RGBA), bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage openslideload_source(VSource source, VOption *options = nullptr); + + /** + * Load pdf from file. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **dpi** -- DPI to render at, double. + * - **scale** -- Factor to scale by, double. + * - **background** -- Background colour, std::vector. + * - **password** -- Password to decrypt with, const char *. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pdfload(const char *filename, VOption *options = nullptr); + + /** + * Load pdf from buffer. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **dpi** -- DPI to render at, double. + * - **scale** -- Factor to scale by, double. + * - **background** -- Background colour, std::vector. + * - **password** -- Password to decrypt with, const char *. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pdfload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load pdf from source. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **dpi** -- DPI to render at, double. + * - **scale** -- Factor to scale by, double. + * - **background** -- Background colour, std::vector. + * - **password** -- Password to decrypt with, const char *. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pdfload_source(VSource source, VOption *options = nullptr); + + /** + * Find threshold for percent of pixels. + * @param percent Percent of pixels. + * @param options Set of options. + * @return Threshold above which lie percent of pixels. + */ + int percent(double percent, VOption *options = nullptr) const; + + /** + * Make a perlin noise image. + * + * **Optional parameters** + * - **cell_size** -- Size of Perlin cells, int. + * - **uchar** -- Output an unsigned char image, bool. + * - **seed** -- Random number seed, int. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage perlin(int width, int height, VOption *options = nullptr); + + /** + * Calculate phase correlation. + * @param in2 Second input image. + * @param options Set of options. + * @return Output image. + */ + VImage phasecor(VImage in2, VOption *options = nullptr) const; + + /** + * Load png from file. + * + * **Optional parameters** + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pngload(const char *filename, VOption *options = nullptr); + + /** + * Load png from buffer. + * + * **Optional parameters** + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pngload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load png from source. + * + * **Optional parameters** + * - **unlimited** -- Remove all denial of service limits, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage pngload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to file as png. + * + * **Optional parameters** + * - **compression** -- Compression factor, int. + * - **interlace** -- Interlace image, bool. + * - **filter** -- libspng row filter flag(s), VipsForeignPngFilter. + * - **palette** -- Quantise to 8bpp palette, bool. + * - **Q** -- Quantisation quality, int. + * - **dither** -- Amount of dithering, double. + * - **bitdepth** -- Write as a 1, 2, 4, 8 or 16 bit image, int. + * - **effort** -- Quantisation CPU effort, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void pngsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to buffer as png. + * + * **Optional parameters** + * - **compression** -- Compression factor, int. + * - **interlace** -- Interlace image, bool. + * - **filter** -- libspng row filter flag(s), VipsForeignPngFilter. + * - **palette** -- Quantise to 8bpp palette, bool. + * - **Q** -- Quantisation quality, int. + * - **dither** -- Amount of dithering, double. + * - **bitdepth** -- Write as a 1, 2, 4, 8 or 16 bit image, int. + * - **effort** -- Quantisation CPU effort, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *pngsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to target as png. + * + * **Optional parameters** + * - **compression** -- Compression factor, int. + * - **interlace** -- Interlace image, bool. + * - **filter** -- libspng row filter flag(s), VipsForeignPngFilter. + * - **palette** -- Quantise to 8bpp palette, bool. + * - **Q** -- Quantisation quality, int. + * - **dither** -- Amount of dithering, double. + * - **bitdepth** -- Write as a 1, 2, 4, 8 or 16 bit image, int. + * - **effort** -- Quantisation CPU effort, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void pngsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Load ppm from file. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage ppmload(const char *filename, VOption *options = nullptr); + + /** + * Load ppm base class. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage ppmload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to ppm file. + * + * **Optional parameters** + * - **format** -- Format to save in, VipsForeignPpmFormat. + * - **ascii** -- Save as ascii, bool. + * - **bitdepth** -- Set to 1 to write as a 1 bit image, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void ppmsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save to ppm. + * + * **Optional parameters** + * - **format** -- Format to save in, VipsForeignPpmFormat. + * - **ascii** -- Save as ascii, bool. + * - **bitdepth** -- Set to 1 to write as a 1 bit image, int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void ppmsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Premultiply image alpha. + * + * **Optional parameters** + * - **max_alpha** -- Maximum value of alpha channel, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage premultiply(VOption *options = nullptr) const; + + /** + * Prewitt edge detector. + * @param options Set of options. + * @return Output image. + */ + VImage prewitt(VOption *options = nullptr) const; + + /** + * Find image profiles. + * @param rows First non-zero pixel in row. + * @param options Set of options. + * @return First non-zero pixel in column. + */ + VImage profile(VImage *rows, VOption *options = nullptr) const; + + /** + * Load named icc profile. + * @param name Profile name. + * @param options Set of options. + * @return Loaded profile. + */ + static VipsBlob *profile_load(const char *name, VOption *options = nullptr); + + /** + * Find image projections. + * @param rows Sums of rows. + * @param options Set of options. + * @return Sums of columns. + */ + VImage project(VImage *rows, VOption *options = nullptr) const; + + /** + * Resample an image with a quadratic transform. + * + * **Optional parameters** + * - **interpolate** -- Interpolate values with this, VInterpolate. + * + * @param coeff Coefficient matrix. + * @param options Set of options. + * @return Output image. + */ + VImage quadratic(VImage coeff, VOption *options = nullptr) const; + + /** + * Unpack radiance coding to float rgb. + * @param options Set of options. + * @return Output image. + */ + VImage rad2float(VOption *options = nullptr) const; + + /** + * Load a radiance image from a file. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage radload(const char *filename, VOption *options = nullptr); + + /** + * Load rad from buffer. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage radload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load rad from source. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage radload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to radiance file. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void radsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to radiance buffer. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *radsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to radiance target. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void radsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Rank filter. + * @param width Window width in pixels. + * @param height Window height in pixels. + * @param index Select pixel at index. + * @param options Set of options. + * @return Output image. + */ + VImage rank(int width, int height, int index, VOption *options = nullptr) const; + + /** + * Load raw data from a file. + * + * **Optional parameters** + * - **offset** -- Offset in bytes from start of file, guint64. + * - **format** -- Pixel format in image, VipsBandFormat. + * - **interpretation** -- Pixel interpretation, VipsInterpretation. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param bands Number of bands in image. + * @param options Set of options. + * @return Output image. + */ + static VImage rawload(const char *filename, int width, int height, int bands, VOption *options = nullptr); + + /** + * Save image to raw file. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void rawsave(const char *filename, VOption *options = nullptr) const; + + /** + * Write raw image to buffer. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *rawsave_buffer(VOption *options = nullptr) const; + + /** + * Write raw image to target. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void rawsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Linear recombination with matrix. + * @param m Matrix of coefficients. + * @param options Set of options. + * @return Output image. + */ + VImage recomb(VImage m, VOption *options = nullptr) const; + + /** + * Reduce an image. + * + * **Optional parameters** + * - **kernel** -- Resampling kernel, VipsKernel. + * - **gap** -- Reducing gap, double. + * + * @param hshrink Horizontal shrink factor. + * @param vshrink Vertical shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage reduce(double hshrink, double vshrink, VOption *options = nullptr) const; + + /** + * Shrink an image horizontally. + * + * **Optional parameters** + * - **kernel** -- Resampling kernel, VipsKernel. + * - **gap** -- Reducing gap, double. + * + * @param hshrink Horizontal shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage reduceh(double hshrink, VOption *options = nullptr) const; + + /** + * Shrink an image vertically. + * + * **Optional parameters** + * - **kernel** -- Resampling kernel, VipsKernel. + * - **gap** -- Reducing gap, double. + * + * @param vshrink Vertical shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage reducev(double vshrink, VOption *options = nullptr) const; + + /** + * Relational operation on two images. + * @param right Right-hand image argument. + * @param relational Relational to perform. + * @param options Set of options. + * @return Output image. + */ + VImage relational(VImage right, VipsOperationRelational relational, VOption *options = nullptr) const; + + /** + * Relational operations against a constant. + * @param relational Relational to perform. + * @param c Array of constants. + * @param options Set of options. + * @return Output image. + */ + VImage relational_const(VipsOperationRelational relational, std::vector c, VOption *options = nullptr) const; + + /** + * Remainder after integer division of two images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage remainder(VImage right, VOption *options = nullptr) const; + + /** + * Remainder after integer division of an image and a constant. + * @param c Array of constants. + * @param options Set of options. + * @return Output image. + */ + VImage remainder_const(std::vector c, VOption *options = nullptr) const; + + /** + * Replicate an image. + * @param across Repeat this many times horizontally. + * @param down Repeat this many times vertically. + * @param options Set of options. + * @return Output image. + */ + VImage replicate(int across, int down, VOption *options = nullptr) const; + + /** + * Resize an image. + * + * **Optional parameters** + * - **kernel** -- Resampling kernel, VipsKernel. + * - **gap** -- Reducing gap, double. + * - **vscale** -- Vertical scale image by this factor, double. + * + * @param scale Scale image by this factor. + * @param options Set of options. + * @return Output image. + */ + VImage resize(double scale, VOption *options = nullptr) const; + + /** + * Rotate an image. + * @param angle Angle to rotate image. + * @param options Set of options. + * @return Output image. + */ + VImage rot(VipsAngle angle, VOption *options = nullptr) const; + + /** + * Rotate an image. + * + * **Optional parameters** + * - **angle** -- Angle to rotate image, VipsAngle45. + * + * @param options Set of options. + * @return Output image. + */ + VImage rot45(VOption *options = nullptr) const; + + /** + * Rotate an image by a number of degrees. + * + * **Optional parameters** + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * - **background** -- Background value, std::vector. + * - **odx** -- Horizontal output displacement, double. + * - **ody** -- Vertical output displacement, double. + * - **idx** -- Horizontal input displacement, double. + * - **idy** -- Vertical input displacement, double. + * + * @param angle Rotate clockwise by this many degrees. + * @param options Set of options. + * @return Output image. + */ + VImage rotate(double angle, VOption *options = nullptr) const; + + /** + * Perform a round function on an image. + * @param round Rounding operation to perform. + * @param options Set of options. + * @return Output image. + */ + VImage round(VipsOperationRound round, VOption *options = nullptr) const; + + /** + * Transform srgb to hsv. + * @param options Set of options. + * @return Output image. + */ + VImage sRGB2HSV(VOption *options = nullptr) const; + + /** + * Convert an srgb image to scrgb. + * @param options Set of options. + * @return Output image. + */ + VImage sRGB2scRGB(VOption *options = nullptr) const; + + /** + * Convert scrgb to bw. + * + * **Optional parameters** + * - **depth** -- Output device space depth in bits, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage scRGB2BW(VOption *options = nullptr) const; + + /** + * Transform scrgb to xyz. + * @param options Set of options. + * @return Output image. + */ + VImage scRGB2XYZ(VOption *options = nullptr) const; + + /** + * Convert an scrgb image to srgb. + * + * **Optional parameters** + * - **depth** -- Output device space depth in bits, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage scRGB2sRGB(VOption *options = nullptr) const; + + /** + * Scale an image to uchar. + * + * **Optional parameters** + * - **exp** -- Exponent for log scale, double. + * - **log** -- Log scale, bool. + * + * @param options Set of options. + * @return Output image. + */ + VImage scale(VOption *options = nullptr) const; + + /** + * Scharr edge detector. + * @param options Set of options. + * @return Output image. + */ + VImage scharr(VOption *options = nullptr) const; + + /** + * Create an sdf image. + * + * **Optional parameters** + * - **r** -- Radius, double. + * - **a** -- Point a, std::vector. + * - **b** -- Point b, std::vector. + * - **corners** -- Corner radii, std::vector. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param shape SDF shape to create. + * @param options Set of options. + * @return Output image. + */ + static VImage sdf(int width, int height, VipsSdfShape shape, VOption *options = nullptr); + + /** + * Check sequential access. + * + * **Optional parameters** + * - **tile_height** -- Tile height in pixels, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage sequential(VOption *options = nullptr) const; + + /** + * Unsharp masking for print. + * + * **Optional parameters** + * - **sigma** -- Sigma of Gaussian, double. + * - **x1** -- Flat/jaggy threshold, double. + * - **y2** -- Maximum brightening, double. + * - **y3** -- Maximum darkening, double. + * - **m1** -- Slope for flat areas, double. + * - **m2** -- Slope for jaggy areas, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage sharpen(VOption *options = nullptr) const; + + /** + * Shrink an image. + * + * **Optional parameters** + * - **ceil** -- Round-up output dimensions, bool. + * + * @param hshrink Horizontal shrink factor. + * @param vshrink Vertical shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage shrink(double hshrink, double vshrink, VOption *options = nullptr) const; + + /** + * Shrink an image horizontally. + * + * **Optional parameters** + * - **ceil** -- Round-up output dimensions, bool. + * + * @param hshrink Horizontal shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage shrinkh(int hshrink, VOption *options = nullptr) const; + + /** + * Shrink an image vertically. + * + * **Optional parameters** + * - **ceil** -- Round-up output dimensions, bool. + * + * @param vshrink Vertical shrink factor. + * @param options Set of options. + * @return Output image. + */ + VImage shrinkv(int vshrink, VOption *options = nullptr) const; + + /** + * Unit vector of pixel. + * @param options Set of options. + * @return Output image. + */ + VImage sign(VOption *options = nullptr) const; + + /** + * Similarity transform of an image. + * + * **Optional parameters** + * - **scale** -- Scale by this factor, double. + * - **angle** -- Rotate clockwise by this many degrees, double. + * - **interpolate** -- Interpolate pixels with this, VInterpolate. + * - **background** -- Background value, std::vector. + * - **odx** -- Horizontal output displacement, double. + * - **ody** -- Vertical output displacement, double. + * - **idx** -- Horizontal input displacement, double. + * - **idy** -- Vertical input displacement, double. + * + * @param options Set of options. + * @return Output image. + */ + VImage similarity(VOption *options = nullptr) const; + + /** + * Make a 2d sine wave. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * - **hfreq** -- Horizontal spatial frequency, double. + * - **vfreq** -- Vertical spatial frequency, double. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage sines(int width, int height, VOption *options = nullptr); + + /** + * Extract an area from an image. + * + * **Optional parameters** + * - **interesting** -- How to measure interestingness, VipsInteresting. + * - **premultiplied** -- Input image already has premultiplied alpha, bool. + * + * @param width Width of extract area. + * @param height Height of extract area. + * @param options Set of options. + * @return Output image. + */ + VImage smartcrop(int width, int height, VOption *options = nullptr) const; + + /** + * Sobel edge detector. + * @param options Set of options. + * @return Output image. + */ + VImage sobel(VOption *options = nullptr) const; + + /** + * Spatial correlation. + * @param ref Input reference image. + * @param options Set of options. + * @return Output image. + */ + VImage spcor(VImage ref, VOption *options = nullptr) const; + + /** + * Make displayable power spectrum. + * @param options Set of options. + * @return Output image. + */ + VImage spectrum(VOption *options = nullptr) const; + + /** + * Find many image stats. + * @param options Set of options. + * @return Output array of statistics. + */ + VImage stats(VOption *options = nullptr) const; + + /** + * Statistical difference. + * + * **Optional parameters** + * - **s0** -- New deviation, double. + * - **b** -- Weight of new deviation, double. + * - **m0** -- New mean, double. + * - **a** -- Weight of new mean, double. + * + * @param width Window width in pixels. + * @param height Window height in pixels. + * @param options Set of options. + * @return Output image. + */ + VImage stdif(int width, int height, VOption *options = nullptr) const; + + /** + * Subsample an image. + * + * **Optional parameters** + * - **point** -- Point sample, bool. + * + * @param xfac Horizontal subsample factor. + * @param yfac Vertical subsample factor. + * @param options Set of options. + * @return Output image. + */ + VImage subsample(int xfac, int yfac, VOption *options = nullptr) const; + + /** + * Subtract two images. + * @param right Right-hand image argument. + * @param options Set of options. + * @return Output image. + */ + VImage subtract(VImage right, VOption *options = nullptr) const; + + /** + * Sum an array of images. + * @param in Array of input images. + * @param options Set of options. + * @return Output image. + */ + static VImage sum(std::vector in, VOption *options = nullptr); + + /** + * Load svg with rsvg. + * + * **Optional parameters** + * - **dpi** -- Render at this DPI, double. + * - **scale** -- Scale output by this factor, double. + * - **unlimited** -- Allow SVG of any size, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage svgload(const char *filename, VOption *options = nullptr); + + /** + * Load svg with rsvg. + * + * **Optional parameters** + * - **dpi** -- Render at this DPI, double. + * - **scale** -- Scale output by this factor, double. + * - **unlimited** -- Allow SVG of any size, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage svgload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load svg from source. + * + * **Optional parameters** + * - **dpi** -- Render at this DPI, double. + * - **scale** -- Scale output by this factor, double. + * - **unlimited** -- Allow SVG of any size, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage svgload_source(VSource source, VOption *options = nullptr); + + /** + * Find the index of the first non-zero pixel in tests. + * @param tests Table of images to test. + * @param options Set of options. + * @return Output image. + */ + static VImage switch_image(std::vector tests, VOption *options = nullptr); + + /** + * Run an external command. + * + * **Optional parameters** + * - **in** -- Array of input images, std::vector. + * - **out_format** -- Format for output filename, const char *. + * - **in_format** -- Format for input filename, const char *. + * + * @param cmd_format Command to run. + * @param options Set of options. + */ + static void system(const char *cmd_format, VOption *options = nullptr); + + /** + * Make a text image. + * + * **Optional parameters** + * - **font** -- Font to render with, const char *. + * - **width** -- Maximum image width in pixels, int. + * - **height** -- Maximum image height in pixels, int. + * - **align** -- Align on the low, centre or high edge, VipsAlign. + * - **justify** -- Justify lines, bool. + * - **dpi** -- DPI to render at, int. + * - **spacing** -- Line spacing, int. + * - **fontfile** -- Load this font file, const char *. + * - **rgba** -- Enable RGBA output, bool. + * - **wrap** -- Wrap lines on word or character boundaries, VipsTextWrap. + * + * @param text Text to render. + * @param options Set of options. + * @return Output image. + */ + static VImage text(const char *text, VOption *options = nullptr); + + /** + * Generate thumbnail from file. + * + * **Optional parameters** + * - **height** -- Size to this height, int. + * - **size** -- Only upsize, only downsize, or both, VipsSize. + * - **no_rotate** -- Don't use orientation tags to rotate image upright, bool. + * - **crop** -- Reduce to fill target rectangle, then crop, VipsInteresting. + * - **linear** -- Reduce in linear light, bool. + * - **import_profile** -- Fallback import profile, const char *. + * - **export_profile** -- Fallback export profile, const char *. + * - **intent** -- Rendering intent, VipsIntent. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * + * @param filename Filename to read from. + * @param width Size to this width. + * @param options Set of options. + * @return Output image. + */ + static VImage thumbnail(const char *filename, int width, VOption *options = nullptr); + + /** + * Generate thumbnail from buffer. + * + * **Optional parameters** + * - **option_string** -- Options that are passed on to the underlying loader, const char *. + * - **height** -- Size to this height, int. + * - **size** -- Only upsize, only downsize, or both, VipsSize. + * - **no_rotate** -- Don't use orientation tags to rotate image upright, bool. + * - **crop** -- Reduce to fill target rectangle, then crop, VipsInteresting. + * - **linear** -- Reduce in linear light, bool. + * - **import_profile** -- Fallback import profile, const char *. + * - **export_profile** -- Fallback export profile, const char *. + * - **intent** -- Rendering intent, VipsIntent. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * + * @param buffer Buffer to load from. + * @param width Size to this width. + * @param options Set of options. + * @return Output image. + */ + static VImage thumbnail_buffer(VipsBlob *buffer, int width, VOption *options = nullptr); + + /** + * Generate thumbnail from image. + * + * **Optional parameters** + * - **height** -- Size to this height, int. + * - **size** -- Only upsize, only downsize, or both, VipsSize. + * - **no_rotate** -- Don't use orientation tags to rotate image upright, bool. + * - **crop** -- Reduce to fill target rectangle, then crop, VipsInteresting. + * - **linear** -- Reduce in linear light, bool. + * - **import_profile** -- Fallback import profile, const char *. + * - **export_profile** -- Fallback export profile, const char *. + * - **intent** -- Rendering intent, VipsIntent. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * + * @param width Size to this width. + * @param options Set of options. + * @return Output image. + */ + VImage thumbnail_image(int width, VOption *options = nullptr) const; + + /** + * Generate thumbnail from source. + * + * **Optional parameters** + * - **option_string** -- Options that are passed on to the underlying loader, const char *. + * - **height** -- Size to this height, int. + * - **size** -- Only upsize, only downsize, or both, VipsSize. + * - **no_rotate** -- Don't use orientation tags to rotate image upright, bool. + * - **crop** -- Reduce to fill target rectangle, then crop, VipsInteresting. + * - **linear** -- Reduce in linear light, bool. + * - **import_profile** -- Fallback import profile, const char *. + * - **export_profile** -- Fallback export profile, const char *. + * - **intent** -- Rendering intent, VipsIntent. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * + * @param source Source to load from. + * @param width Size to this width. + * @param options Set of options. + * @return Output image. + */ + static VImage thumbnail_source(VSource source, int width, VOption *options = nullptr); + + /** + * Load tiff from file. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **subifd** -- Subifd index, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **autorotate** -- Rotate image using orientation tag, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage tiffload(const char *filename, VOption *options = nullptr); + + /** + * Load tiff from buffer. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **subifd** -- Subifd index, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **autorotate** -- Rotate image using orientation tag, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage tiffload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load tiff from source. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **subifd** -- Subifd index, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **autorotate** -- Rotate image using orientation tag, bool. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage tiffload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to tiff file. + * + * **Optional parameters** + * - **compression** -- Compression for this file, VipsForeignTiffCompression. + * - **Q** -- Q factor, int. + * - **predictor** -- Compression prediction, VipsForeignTiffPredictor. + * - **tile** -- Write a tiled tiff, bool. + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **pyramid** -- Write a pyramidal tiff, bool. + * - **miniswhite** -- Use 0 for white in 1-bit images, bool. + * - **bitdepth** -- Write as a 1, 2, 4 or 8 bit image, int. + * - **resunit** -- Resolution unit, VipsForeignTiffResunit. + * - **xres** -- Horizontal resolution in pixels/mm, double. + * - **yres** -- Vertical resolution in pixels/mm, double. + * - **bigtiff** -- Write a bigtiff image, bool. + * - **properties** -- Write a properties document to IMAGEDESCRIPTION, bool. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **level** -- Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level, int. + * - **lossless** -- Enable WEBP lossless mode, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **subifd** -- Save pyr layers as sub-IFDs, bool. + * - **premultiply** -- Save with premultiplied alpha, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void tiffsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to tiff buffer. + * + * **Optional parameters** + * - **compression** -- Compression for this file, VipsForeignTiffCompression. + * - **Q** -- Q factor, int. + * - **predictor** -- Compression prediction, VipsForeignTiffPredictor. + * - **tile** -- Write a tiled tiff, bool. + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **pyramid** -- Write a pyramidal tiff, bool. + * - **miniswhite** -- Use 0 for white in 1-bit images, bool. + * - **bitdepth** -- Write as a 1, 2, 4 or 8 bit image, int. + * - **resunit** -- Resolution unit, VipsForeignTiffResunit. + * - **xres** -- Horizontal resolution in pixels/mm, double. + * - **yres** -- Vertical resolution in pixels/mm, double. + * - **bigtiff** -- Write a bigtiff image, bool. + * - **properties** -- Write a properties document to IMAGEDESCRIPTION, bool. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **level** -- Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level, int. + * - **lossless** -- Enable WEBP lossless mode, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **subifd** -- Save pyr layers as sub-IFDs, bool. + * - **premultiply** -- Save with premultiplied alpha, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *tiffsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to tiff target. + * + * **Optional parameters** + * - **compression** -- Compression for this file, VipsForeignTiffCompression. + * - **Q** -- Q factor, int. + * - **predictor** -- Compression prediction, VipsForeignTiffPredictor. + * - **tile** -- Write a tiled tiff, bool. + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **pyramid** -- Write a pyramidal tiff, bool. + * - **miniswhite** -- Use 0 for white in 1-bit images, bool. + * - **bitdepth** -- Write as a 1, 2, 4 or 8 bit image, int. + * - **resunit** -- Resolution unit, VipsForeignTiffResunit. + * - **xres** -- Horizontal resolution in pixels/mm, double. + * - **yres** -- Vertical resolution in pixels/mm, double. + * - **bigtiff** -- Write a bigtiff image, bool. + * - **properties** -- Write a properties document to IMAGEDESCRIPTION, bool. + * - **region_shrink** -- Method to shrink regions, VipsRegionShrink. + * - **level** -- Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level, int. + * - **lossless** -- Enable WEBP lossless mode, bool. + * - **depth** -- Pyramid depth, VipsForeignDzDepth. + * - **subifd** -- Save pyr layers as sub-IFDs, bool. + * - **premultiply** -- Save with premultiplied alpha, bool. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void tiffsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Cache an image as a set of tiles. + * + * **Optional parameters** + * - **tile_width** -- Tile width in pixels, int. + * - **tile_height** -- Tile height in pixels, int. + * - **max_tiles** -- Maximum number of tiles to cache, int. + * - **access** -- Expected access pattern, VipsAccess. + * - **threaded** -- Allow threaded access, bool. + * - **persistent** -- Keep cache between evaluations, bool. + * + * @param options Set of options. + * @return Output image. + */ + VImage tilecache(VOption *options = nullptr) const; + + /** + * Build a look-up table. + * + * **Optional parameters** + * - **in_max** -- Size of LUT to build, int. + * - **out_max** -- Maximum value in output LUT, int. + * - **Lb** -- Lowest value in output, double. + * - **Lw** -- Highest value in output, double. + * - **Ps** -- Position of shadow, double. + * - **Pm** -- Position of mid-tones, double. + * - **Ph** -- Position of highlights, double. + * - **S** -- Adjust shadows by this much, double. + * - **M** -- Adjust mid-tones by this much, double. + * - **H** -- Adjust highlights by this much, double. + * + * @param options Set of options. + * @return Output image. + */ + static VImage tonelut(VOption *options = nullptr); + + /** + * Transpose3d an image. + * + * **Optional parameters** + * - **page_height** -- Height of each input page, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage transpose3d(VOption *options = nullptr) const; + + /** + * Unpremultiply image alpha. + * + * **Optional parameters** + * - **max_alpha** -- Maximum value of alpha channel, double. + * - **alpha_band** -- Unpremultiply with this alpha, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage unpremultiply(VOption *options = nullptr) const; + + /** + * Load vips from file. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage vipsload(const char *filename, VOption *options = nullptr); + + /** + * Load vips from source. + * + * **Optional parameters** + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage vipsload_source(VSource source, VOption *options = nullptr); + + /** + * Save image to file in vips format. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void vipssave(const char *filename, VOption *options = nullptr) const; + + /** + * Save image to target in vips format. + * + * **Optional parameters** + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void vipssave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Load webp from file. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **scale** -- Factor to scale by, double. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param filename Filename to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage webpload(const char *filename, VOption *options = nullptr); + + /** + * Load webp from buffer. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **scale** -- Factor to scale by, double. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param buffer Buffer to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage webpload_buffer(VipsBlob *buffer, VOption *options = nullptr); + + /** + * Load webp from source. + * + * **Optional parameters** + * - **page** -- First page to load, int. + * - **n** -- Number of pages to load, -1 for all, int. + * - **scale** -- Factor to scale by, double. + * - **memory** -- Force open via memory, bool. + * - **access** -- Required access pattern for this file, VipsAccess. + * - **fail_on** -- Error level to fail on, VipsFailOn. + * - **revalidate** -- Don't use a cached result for this operation, bool. + * + * @param source Source to load from. + * @param options Set of options. + * @return Output image. + */ + static VImage webpload_source(VSource source, VOption *options = nullptr); + + /** + * Save as webp. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **lossless** -- Enable lossless compression, bool. + * - **preset** -- Preset for lossy compression, VipsForeignWebpPreset. + * - **smart_subsample** -- Enable high quality chroma subsampling, bool. + * - **near_lossless** -- Enable preprocessing in lossless mode (uses Q), bool. + * - **alpha_q** -- Change alpha plane fidelity for lossy compression, int. + * - **min_size** -- Optimise for minimum size, bool. + * - **kmin** -- Minimum number of frames between key frames, int. + * - **kmax** -- Maximum number of frames between key frames, int. + * - **effort** -- Level of CPU effort to reduce file size, int. + * - **target_size** -- Desired target size in bytes, int. + * - **mixed** -- Allow mixed encoding (might reduce file size), bool. + * - **smart_deblock** -- Enable auto-adjusting of the deblocking filter, bool. + * - **passes** -- Number of entropy-analysis passes (in [1..10]), int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param filename Filename to save to. + * @param options Set of options. + */ + void webpsave(const char *filename, VOption *options = nullptr) const; + + /** + * Save as webp. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **lossless** -- Enable lossless compression, bool. + * - **preset** -- Preset for lossy compression, VipsForeignWebpPreset. + * - **smart_subsample** -- Enable high quality chroma subsampling, bool. + * - **near_lossless** -- Enable preprocessing in lossless mode (uses Q), bool. + * - **alpha_q** -- Change alpha plane fidelity for lossy compression, int. + * - **min_size** -- Optimise for minimum size, bool. + * - **kmin** -- Minimum number of frames between key frames, int. + * - **kmax** -- Maximum number of frames between key frames, int. + * - **effort** -- Level of CPU effort to reduce file size, int. + * - **target_size** -- Desired target size in bytes, int. + * - **mixed** -- Allow mixed encoding (might reduce file size), bool. + * - **smart_deblock** -- Enable auto-adjusting of the deblocking filter, bool. + * - **passes** -- Number of entropy-analysis passes (in [1..10]), int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + * @return Buffer to save to. + */ + VipsBlob *webpsave_buffer(VOption *options = nullptr) const; + + /** + * Save image to webp mime. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **lossless** -- Enable lossless compression, bool. + * - **preset** -- Preset for lossy compression, VipsForeignWebpPreset. + * - **smart_subsample** -- Enable high quality chroma subsampling, bool. + * - **near_lossless** -- Enable preprocessing in lossless mode (uses Q), bool. + * - **alpha_q** -- Change alpha plane fidelity for lossy compression, int. + * - **min_size** -- Optimise for minimum size, bool. + * - **kmin** -- Minimum number of frames between key frames, int. + * - **kmax** -- Maximum number of frames between key frames, int. + * - **effort** -- Level of CPU effort to reduce file size, int. + * - **target_size** -- Desired target size in bytes, int. + * - **mixed** -- Allow mixed encoding (might reduce file size), bool. + * - **smart_deblock** -- Enable auto-adjusting of the deblocking filter, bool. + * - **passes** -- Number of entropy-analysis passes (in [1..10]), int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param options Set of options. + */ + void webpsave_mime(VOption *options = nullptr) const; + + /** + * Save as webp. + * + * **Optional parameters** + * - **Q** -- Q factor, int. + * - **lossless** -- Enable lossless compression, bool. + * - **preset** -- Preset for lossy compression, VipsForeignWebpPreset. + * - **smart_subsample** -- Enable high quality chroma subsampling, bool. + * - **near_lossless** -- Enable preprocessing in lossless mode (uses Q), bool. + * - **alpha_q** -- Change alpha plane fidelity for lossy compression, int. + * - **min_size** -- Optimise for minimum size, bool. + * - **kmin** -- Minimum number of frames between key frames, int. + * - **kmax** -- Maximum number of frames between key frames, int. + * - **effort** -- Level of CPU effort to reduce file size, int. + * - **target_size** -- Desired target size in bytes, int. + * - **mixed** -- Allow mixed encoding (might reduce file size), bool. + * - **smart_deblock** -- Enable auto-adjusting of the deblocking filter, bool. + * - **passes** -- Number of entropy-analysis passes (in [1..10]), int. + * - **keep** -- Which metadata to retain, VipsForeignKeep. + * - **background** -- Background value, std::vector. + * - **page_height** -- Set page height for multipage save, int. + * - **profile** -- Filename of ICC profile to embed, const char *. + * + * @param target Target to save to. + * @param options Set of options. + */ + void webpsave_target(VTarget target, VOption *options = nullptr) const; + + /** + * Make a worley noise image. + * + * **Optional parameters** + * - **cell_size** -- Size of Worley cells, int. + * - **seed** -- Random number seed, int. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage worley(int width, int height, VOption *options = nullptr); + + /** + * Wrap image origin. + * + * **Optional parameters** + * - **x** -- Left edge of input in output, int. + * - **y** -- Top edge of input in output, int. + * + * @param options Set of options. + * @return Output image. + */ + VImage wrap(VOption *options = nullptr) const; + + /** + * Make an image where pixel values are coordinates. + * + * **Optional parameters** + * - **csize** -- Size of third dimension, int. + * - **dsize** -- Size of fourth dimension, int. + * - **esize** -- Size of fifth dimension, int. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage xyz(int width, int height, VOption *options = nullptr); + + /** + * Make a zone plate. + * + * **Optional parameters** + * - **uchar** -- Output an unsigned char image, bool. + * + * @param width Image width in pixels. + * @param height Image height in pixels. + * @param options Set of options. + * @return Output image. + */ + static VImage zone(int width, int height, VOption *options = nullptr); + + /** + * Zoom an image. + * @param xfac Horizontal zoom factor. + * @param yfac Vertical zoom factor. + * @param options Set of options. + * @return Output image. + */ + VImage zoom(int xfac, int yfac, VOption *options = nullptr) const; +}; + +VIPS_NAMESPACE_END + +#endif /*VIPS_VIMAGE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/VInterpolate8.h b/jtlsrv-cpp/.static-build/include/vips/VInterpolate8.h new file mode 100644 index 0000000..bc6507c --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/VInterpolate8.h @@ -0,0 +1,74 @@ +// VIPS interpolate wrapper + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VINTERPOLATE_H +#define VIPS_VINTERPOLATE_H + +#include + +VIPS_NAMESPACE_START + +/** + * An interpolation. You can pass one of these to something like + * VImage::affine for it to use to interpolate pixels. + * + * The available interpolators vary a bit with your libvips version and how it + * was built, but will include `nearest`, `bilinear` and `bicubic`. Run + * vips -l interpolate` to see them all. + */ +class VInterpolate : public VObject { +public: + /** + * Create a VInterpolate that wraps a VipsInterpolate object. If steal + * is STEAL, then this VInterpolate takes over ownership of the libvips + * object and will automatically unref it. + */ + explicit VInterpolate(VipsInterpolate *interpolate, VSteal steal = STEAL) + : VObject((VipsObject *) interpolate, steal) + { + } + + /** + * Create a VInterpolate from a name, for example `"bicubic"`. + */ + static VInterpolate new_from_name(const char *name, VOption *options = nullptr); + + /** + * Get a pointer to the underlying VipsInterpolate object. + */ + VipsInterpolate * + get_interpolate() const + { + return (VipsInterpolate *) VObject::get_object(); + } +}; + +VIPS_NAMESPACE_END + +#endif /*VIPS_VINTERPOLATE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/VRegion8.h b/jtlsrv-cpp/.static-build/include/vips/VRegion8.h new file mode 100644 index 0000000..e0675f2 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/VRegion8.h @@ -0,0 +1,154 @@ +// VIPS region wrapper + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VREGION_H +#define VIPS_VREGION_H + +#include + +VIPS_NAMESPACE_START + +/** + * A region of an image. Can be used to access raw pixel data. + * */ +class VRegion : public VObject { +public: + /** + * Create a VRegion that wraps a VipsRegion object. If steal + * is STEAL, then this VRegion takes over ownership of the libvips + * object and will automatically unref it. + */ + explicit VRegion(VipsRegion *region, VSteal steal = STEAL) + : VObject((VipsObject *) region, steal) + { + } + + /** + * Create a VRegion from an image. + */ + static VRegion + new_from_image(VImage image); + + /** + * Get a pointer to the underlying VipsRegion object. + */ + VipsRegion * + get_region() const + { + return (VipsRegion *) VObject::get_object(); + } + + /** + * Prepare the region from VipsRect. + */ + void + prepare(const VipsRect *rect) const + { + if (vips_region_prepare(get_region(), rect)) + throw VError(); + } + + /** + * Prepare the region from rectangle coordinates. + */ + void + prepare(int left, int top, int width, int height) const + { + VipsRect rect = { left, top, width, height }; + + prepare(&rect); + } + + /** + * Get valid bounds of the region. + */ + VipsRect + valid() const + { + return get_region()->valid; + } + + /** + * Get pointer to the start of the region. + */ + VipsPel * + addr() const + { + return addr(0); + } + + /** + * Get pointer at the given index of the region. + */ + VipsPel * + addr(size_t i) const + { + return &VIPS_REGION_ADDR_TOPLEFT(get_region())[i]; + } + + /** + * Get pointer at the given coordinates of the region. + */ + VipsPel * + addr(int x, int y) const + { + return VIPS_REGION_ADDR(get_region(), x, y); + } + + /** + * Get the stride (bytes per row, including padding) of the region. + */ + size_t + stride() const + { + return VIPS_REGION_LSKIP(get_region()); + } + + /** + * Get VipsPel at the given index of the region. + */ + VipsPel + operator[](size_t i) const + { + return *addr(i); + } + + /** + * Get VipsPel at the given coordinates of the region. + */ + VipsPel + operator()(int x, int y) const + { + return *addr(x, y); + } +}; + +VIPS_NAMESPACE_END + +#endif /*VIPS_VREGION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/almostdeprecated.h b/jtlsrv-cpp/.static-build/include/vips/almostdeprecated.h new file mode 100644 index 0000000..e18cb26 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/almostdeprecated.h @@ -0,0 +1,467 @@ +/* Old and broken stuff that we still enable by default, but don't document + * and certainly don't recommend. + * + * 30/6/09 + * - from vips.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef IM_ALMOSTDEPRECATED_H +#define IM_ALMOSTDEPRECATED_H + +#ifndef VIPS_VIPS7COMPAT_H +#error Should not be included directly use vips7compat.h instead +#endif + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Was public, now deprecated. + */ +typedef enum /*< skip >*/ { + IM_BBITS_BYTE = 8, + IM_BBITS_SHORT = 16, + IM_BBITS_INT = 32, + IM_BBITS_FLOAT = 32, + IM_BBITS_COMPLEX = 64, + IM_BBITS_DOUBLE = 64, + IM_BBITS_DPCOMPLEX = 128 +} VipsBBits; + +/* Used to define a region of interest for im_extract() etc. Too boring to be + * public API, see im_extract_area() etc. + */ +typedef struct { + int xstart; + int ystart; + int xsize; + int ysize; + int chsel; /* 1 2 3 or 0, for r g b or all respectively + *(channel select) */ +} IMAGE_BOX; + +VIPS_DEPRECATED +int im_extract(IMAGE *, IMAGE *, IMAGE_BOX *); +VIPS_DEPRECATED +DOUBLEMASK *im_measure(IMAGE *im, IMAGE_BOX *box, int h, int v, + int *sel, int nsel, const char *name); + +VIPS_DEPRECATED +gboolean im_isuint(IMAGE *im); +VIPS_DEPRECATED +gboolean im_isint(IMAGE *im); +VIPS_DEPRECATED +gboolean im_isfloat(IMAGE *im); +VIPS_DEPRECATED +gboolean im_isscalar(IMAGE *im); +VIPS_DEPRECATED +gboolean im_iscomplex(IMAGE *im); + +VIPS_DEPRECATED +int im_c2ps(IMAGE *in, IMAGE *out); + +VIPS_DEPRECATED +int im_clip(IMAGE *in, IMAGE *out); + +#define MASK_IDEAL_HIGHPASS IM_MASK_IDEAL_HIGHPASS +#define MASK_IDEAL_LOWPASS IM_MASK_IDEAL_LOWPASS +#define MASK_BUTTERWORTH_HIGHPASS IM_MASK_BUTTERWORTH_HIGHPASS +#define MASK_BUTTERWORTH_LOWPASS IM_MASK_BUTTERWORTH_LOWPASS +#define MASK_GAUSS_HIGHPASS IM_MASK_GAUSS_HIGHPASS +#define MASK_GAUSS_LOWPASS IM_MASK_GAUSS_LOWPASS + +#define MASK_IDEAL_RINGPASS IM_MASK_IDEAL_RINGPASS +#define MASK_IDEAL_RINGREJECT IM_MASK_IDEAL_RINGREJECT +#define MASK_BUTTERWORTH_RINGPASS IM_MASK_BUTTERWORTH_RINGPASS +#define MASK_BUTTERWORTH_RINGREJECT IM_MASK_BUTTERWORTH_RINGREJECT +#define MASK_GAUSS_RINGPASS IM_MASK_GAUSS_RINGPASS +#define MASK_GAUSS_RINGREJECT IM_MASK_GAUSS_RINGREJECT + +#define MASK_IDEAL_BANDPASS IM_MASK_IDEAL_BANDPASS +#define MASK_IDEAL_BANDREJECT IM_MASK_IDEAL_BANDREJECT +#define MASK_BUTTERWORTH_BANDPASS IM_MASK_BUTTERWORTH_BANDPASS +#define MASK_BUTTERWORTH_BANDREJECT IM_MASK_BUTTERWORTH_BANDREJECT +#define MASK_GAUSS_BANDPASS IM_MASK_GAUSS_BANDPASS +#define MASK_GAUSS_BANDREJECT IM_MASK_GAUSS_BANDREJECT + +#define MASK_FRACTAL_FLT IM_MASK_FRACTAL_FLT + +#define MaskType ImMaskType + +/* Copy and swap types. + */ +typedef enum /*< skip >*/ { + IM_ARCH_NATIVE, + IM_ARCH_BYTE_SWAPPED, + IM_ARCH_LSB_FIRST, + IM_ARCH_MSB_FIRST +} im_arch_type; + +VIPS_DEPRECATED +gboolean im_isnative(im_arch_type arch); +VIPS_DEPRECATED +int im_copy_from(IMAGE *in, IMAGE *out, im_arch_type architecture); + +/* Backwards compatibility macros. + */ +#define im_clear_error_string() im_error_clear() +#define im_errorstring() im_error_buffer() + +/* Deprecated API. + */ +VIPS_DEPRECATED_FOR(vips_error) +void im_errormsg(const char *fmt, ...) + G_GNUC_PRINTF(1, 2); +VIPS_DEPRECATED_FOR(vips_verror) +void im_verrormsg(const char *fmt, va_list ap); +VIPS_DEPRECATED_FOR(vips_error_system) +void im_errormsg_system(int err, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_DEPRECATED_FOR(g_info) +void im_diagnostics(const char *fmt, ...) + G_GNUC_PRINTF(1, 2); +VIPS_DEPRECATED_FOR(g_warning) +void im_warning(const char *fmt, ...) + G_GNUC_PRINTF(1, 2); + +VIPS_DEPRECATED_FOR(g_thread_join) +void *vips_g_thread_join(GThread *thread); + +VIPS_DEPRECATED +int im_iterate(VipsImage *im, + VipsStartFn start, im_generate_fn generate, VipsStopFn stop, + void *a, void *b); + +/* Async rendering. + */ +VIPS_DEPRECATED_FOR(vips_sink_screen) +int im_render_priority(VipsImage *in, VipsImage *out, VipsImage *mask, + int width, int height, int max, + int priority, + void (*notify)(VipsImage *, VipsRect *, void *), void *client); +VIPS_DEPRECATED_FOR(vips_sink_screen) +int im_cache(VipsImage *in, VipsImage *out, int width, int height, int max); + +/* Deprecated operations. + */ +VIPS_DEPRECATED +int im_cmulnorm(IMAGE *in1, IMAGE *in2, IMAGE *out); +VIPS_DEPRECATED +int im_fav4(IMAGE **, IMAGE *); +VIPS_DEPRECATED +int im_gadd(double, IMAGE *, double, IMAGE *, double, IMAGE *); +VIPS_DEPRECATED +int im_litecor(IMAGE *, IMAGE *, IMAGE *, int, double); +VIPS_DEPRECATED_FOR(vips_sink_screen) +int im_render_fade(IMAGE *in, IMAGE *out, IMAGE *mask, + int width, int height, int max, + int fps, int steps, + int priority, + void (*notify)(IMAGE *, VipsRect *, void *), void *client); +VIPS_DEPRECATED_FOR(vips_sink_screen) +int im_render(IMAGE *in, IMAGE *out, IMAGE *mask, + int width, int height, int max, + void (*notify)(IMAGE *, VipsRect *, void *), void *client); + +VIPS_DEPRECATED +int im_cooc_matrix(IMAGE *im, IMAGE *m, + int xp, int yp, int xs, int ys, int dx, int dy, int flag); +VIPS_DEPRECATED +int im_cooc_asm(IMAGE *m, double *asmoment); +VIPS_DEPRECATED +int im_cooc_contrast(IMAGE *m, double *contrast); +VIPS_DEPRECATED +int im_cooc_correlation(IMAGE *m, double *correlation); +VIPS_DEPRECATED +int im_cooc_entropy(IMAGE *m, double *entropy); + +VIPS_DEPRECATED +int im_glds_matrix(IMAGE *im, IMAGE *m, + int xpos, int ypos, int xsize, int ysize, int dx, int dy); +VIPS_DEPRECATED +int im_glds_asm(IMAGE *m, double *asmoment); +VIPS_DEPRECATED +int im_glds_contrast(IMAGE *m, double *contrast); +VIPS_DEPRECATED +int im_glds_entropy(IMAGE *m, double *entropy); +VIPS_DEPRECATED +int im_glds_mean(IMAGE *m, double *mean); + +VIPS_DEPRECATED +int im_dif_std(IMAGE *im, int xpos, int ypos, int xsize, int ysize, int dx, int dy, double *pmean, double *pstd); +VIPS_DEPRECATED +int im_simcontr(IMAGE *out, int xsize, int ysize); +VIPS_DEPRECATED +int im_spatres(IMAGE *in, IMAGE *out, int step); + +VIPS_DEPRECATED +int im_stretch3(IMAGE *in, IMAGE *out, double dx, double dy); + +/* Renamed operations. + */ + +/* arithmetic + */ +VIPS_DEPRECATED_FOR(vips_remainder_const) +int im_remainderconst_vec(IMAGE *in, IMAGE *out, int n, double *c); + +/* boolean + */ +VIPS_DEPRECATED_FOR(vips_andimage_const1) +int im_andconst(IMAGE *, IMAGE *, double); +VIPS_DEPRECATED_FOR(vips_andimage_const) +int im_and_vec(IMAGE *, IMAGE *, int, double *); +VIPS_DEPRECATED_FOR(vips_orimage_const1) +int im_orconst(IMAGE *, IMAGE *, double); +VIPS_DEPRECATED_FOR(vips_orimage_const) +int im_or_vec(IMAGE *, IMAGE *, int, double *); +VIPS_DEPRECATED_FOR(vips_eorimage_const1) +int im_eorconst(IMAGE *, IMAGE *, double); +VIPS_DEPRECATED_FOR(vips_eorimage_const) +int im_eor_vec(IMAGE *, IMAGE *, int, double *); + +/* mosaicing + */ +VIPS_DEPRECATED_FOR(vips_affine) +int im_affine(IMAGE *in, IMAGE *out, + double a, double b, double c, double d, double dx, double dy, + int ox, int oy, int ow, int oh); +VIPS_DEPRECATED_FOR(vips_similarity) +int im_similarity(IMAGE *in, IMAGE *out, + double a, double b, double dx, double dy); +VIPS_DEPRECATED_FOR(vips_similarity) +int im_similarity_area(IMAGE *in, IMAGE *out, + double a, double b, double dx, double dy, + int ox, int oy, int ow, int oh); + +/* colour + */ +VIPS_DEPRECATED_FOR(vips_icc_export) +int im_icc_export(IMAGE *in, IMAGE *out, + const char *output_profile_filename, int intent); + +/* conversion + */ +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2dcm(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2cm(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2us(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2ui(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2s(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2i(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2d(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2f(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2c(IMAGE *in, IMAGE *out); + +VIPS_DEPRECATED_FOR(vips_tilecache) +int vips_cache(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_DEPRECATED +int im_slice(IMAGE *in, IMAGE *out, double, double); +VIPS_DEPRECATED +int im_thresh(IMAGE *in, IMAGE *out, double); + +VIPS_DEPRECATED_FOR(printf) +int im_print(const char *message); + +VIPS_DEPRECATED +int im_convsub(IMAGE *in, IMAGE *out, INTMASK *mask, int xskip, int yskip); + +VIPS_DEPRECATED +int im_bernd(const char *tiffname, int x, int y, int w, int h); + +VIPS_DEPRECATED +int im_resize_linear(IMAGE *, IMAGE *, int, int); + +VIPS_DEPRECATED_FOR(vips_convf) +int im_convf(IMAGE *in, IMAGE *out, DOUBLEMASK *mask); +VIPS_DEPRECATED_FOR(vips_convsep) +int im_convsepf(IMAGE *in, IMAGE *out, DOUBLEMASK *mask); +VIPS_DEPRECATED +int im_conv_raw(IMAGE *in, IMAGE *out, INTMASK *mask); +VIPS_DEPRECATED +int im_convf_raw(IMAGE *in, IMAGE *out, DOUBLEMASK *mask); +VIPS_DEPRECATED +int im_convsep_raw(IMAGE *in, IMAGE *out, INTMASK *mask); +VIPS_DEPRECATED +int im_convsepf_raw(IMAGE *in, IMAGE *out, DOUBLEMASK *mask); +VIPS_DEPRECATED +int im_fastcor_raw(IMAGE *in, IMAGE *ref, IMAGE *out); +VIPS_DEPRECATED +int im_spcor_raw(IMAGE *in, IMAGE *ref, IMAGE *out); +VIPS_DEPRECATED +int im_gradcor_raw(IMAGE *in, IMAGE *ref, IMAGE *out); +VIPS_DEPRECATED +int im_contrast_surface_raw(IMAGE *in, IMAGE *out, + int half_win_size, int spacing); + +VIPS_DEPRECATED_FOR(vips_stdif) +int im_stdif_raw(IMAGE *in, IMAGE *out, + double a, double m0, double b, double s0, int xwin, int ywin); +VIPS_DEPRECATED_FOR(vips_hist_local) +int im_lhisteq_raw(IMAGE *in, IMAGE *out, int xwin, int ywin); + +VIPS_DEPRECATED_FOR(vips_morph) +int im_erode_raw(IMAGE *in, IMAGE *out, INTMASK *m); +VIPS_DEPRECATED_FOR(vips_morph) +int im_dilate_raw(IMAGE *in, IMAGE *out, INTMASK *m); +VIPS_DEPRECATED +int im_rank_raw(IMAGE *in, IMAGE *out, int xsize, int ysize, int order); + +/* foreign + */ +/** + * VipsForeignJpegSubsample: + * @VIPS_FOREIGN_JPEG_SUBSAMPLE_AUTO: default preset + * @VIPS_FOREIGN_JPEG_SUBSAMPLE_ON: always perform subsampling + * @VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF: never perform subsampling + * + * Set jpeg subsampling mode. + * + * DEPRECATED: use #VipsForeignSubsample + */ +typedef enum { + VIPS_FOREIGN_JPEG_SUBSAMPLE_AUTO, + VIPS_FOREIGN_JPEG_SUBSAMPLE_ON, + VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF, + VIPS_FOREIGN_JPEG_SUBSAMPLE_LAST +} VipsForeignJpegSubsample; + +VIPS_DEPRECATED_FOR(vips_rawsave_target) +int vips_rawsave_fd(VipsImage *in, int fd, ...) + G_GNUC_NULL_TERMINATED; + +/* inplace + */ +VIPS_DEPRECATED_FOR(vips_draw_circle) +int im_circle(IMAGE *im, int cx, int cy, int radius, int intensity); +VIPS_DEPRECATED_FOR(vips_draw_line1) +int im_line(IMAGE *, int, int, int, int, int); +VIPS_DEPRECATED_FOR(vips_labelregions) +int im_segment(IMAGE *test, IMAGE *mask, int *segments); +VIPS_DEPRECATED_FOR(vips_draw_rect) +int im_paintrect(IMAGE *im, VipsRect *r, PEL *ink); +VIPS_DEPRECATED_FOR(vips_draw_image) +int im_insertplace(IMAGE *main, IMAGE *sub, int x, int y); + +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood_copy(IMAGE *in, IMAGE *out, int x, int y, PEL *ink); +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood_blob_copy(IMAGE *in, IMAGE *out, int x, int y, PEL *ink); +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood_other_copy(IMAGE *test, IMAGE *mark, IMAGE *out, + int x, int y, int serial); + +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood(IMAGE *im, int x, int y, PEL *ink, VipsRect *dout); +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood_blob(IMAGE *im, int x, int y, PEL *ink, VipsRect *dout); +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_flood_other(IMAGE *test, IMAGE *mark, + int x, int y, int serial, VipsRect *dout); + +VIPS_DEPRECATED_FOR(vips_draw_line) +int im_fastline(IMAGE *im, int x1, int y1, int x2, int y2, PEL *pel); +VIPS_DEPRECATED_FOR(vips_draw_line) +int im_fastlineuser(IMAGE *im, + int x1, int y1, int x2, int y2, + VipsPlotFn fn, void *client1, void *client2, void *client3); + +VIPS_DEPRECATED_FOR(vips_draw_mask) +int im_plotmask(IMAGE *im, int ix, int iy, PEL *ink, PEL *mask, VipsRect *r); +VIPS_DEPRECATED_FOR(vips_getpoint) +int im_readpoint(IMAGE *im, int x, int y, PEL *pel); +VIPS_DEPRECATED_FOR(vips_draw_point) +int im_plotpoint(IMAGE *im, int x, int y, PEL *pel); + +VIPS_DEPRECATED_FOR(vips_draw_smudge) +int im_smudge(IMAGE *image, int ix, int iy, VipsRect *r); +VIPS_DEPRECATED +int im_smear(IMAGE *im, int ix, int iy, VipsRect *r); + +VIPS_DEPRECATED_FOR(g_warning) +void vips_warn(const char *domain, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_DEPRECATED_FOR(g_warning) +void vips_vwarn(const char *domain, const char *fmt, va_list ap); +VIPS_DEPRECATED +void vips_info_set(gboolean info); +VIPS_DEPRECATED_FOR(g_info) +void vips_info(const char *domain, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_DEPRECATED_FOR(g_info) +void vips_vinfo(const char *domain, const char *fmt, va_list ap); + +VIPS_DEPRECATED_FOR(vips_autorot) +VipsAngle vips_autorot_get_angle(VipsImage *image); + +VIPS_DEPRECATED_FOR(vips_thread_isvips) +gboolean vips_thread_isworker(void); + +/* iofuncs + */ +VIPS_DEPRECATED_FOR(g_free) +int vips_free(void *buf); + +VIPS_DEPRECATED_FOR(vips_target_end) +void vips_target_finish(VipsTarget *target); + +VIPS_DEPRECATED_FOR(vips_cache_operation_buildp) +VipsOperation *vips_cache_operation_lookup(VipsOperation *operation); +VIPS_DEPRECATED_FOR(vips_cache_operation_buildp) +void vips_cache_operation_add(VipsOperation *operation); + +VIPS_DEPRECATED_FOR(g_strlcpy) +char *vips_strncpy(char *dest, const char *src, int n); +VIPS_DEPRECATED_FOR(g_strrstr) +char *vips_strrstr(const char *haystack, const char *needle); +VIPS_DEPRECATED_FOR(g_str_has_suffix) +gboolean vips_ispostfix(const char *a, const char *b); + +VIPS_DEPRECATED_FOR(g_vsnprintf) +int vips_vsnprintf(char *str, size_t size, const char *format, va_list ap); +VIPS_DEPRECATED_FOR(g_snprintf) +int vips_snprintf(char *str, size_t size, const char *format, ...) + G_GNUC_PRINTF(3, 4); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*IM_ALMOSTDEPRECATED_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/arithmetic.h b/jtlsrv-cpp/.static-build/include/vips/arithmetic.h new file mode 100644 index 0000000..239abba --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/arithmetic.h @@ -0,0 +1,580 @@ +/* Headers for arithmetic + * + * 30/6/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_ARITHMETIC_H +#define VIPS_ARITHMETIC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/** + * VipsOperationMath: + * @VIPS_OPERATION_MATH_SIN: sin(), angles in degrees + * @VIPS_OPERATION_MATH_COS: cos(), angles in degrees + * @VIPS_OPERATION_MATH_TAN: tan(), angles in degrees + * @VIPS_OPERATION_MATH_ASIN: asin(), angles in degrees + * @VIPS_OPERATION_MATH_ACOS: acos(), angles in degrees + * @VIPS_OPERATION_MATH_ATAN: atan(), angles in degrees + * @VIPS_OPERATION_MATH_LOG: log base e + * @VIPS_OPERATION_MATH_LOG10: log base 10 + * @VIPS_OPERATION_MATH_EXP: e to the something + * @VIPS_OPERATION_MATH_EXP10: 10 to the something + * @VIPS_OPERATION_MATH_SINH: sinh(), angles in radians + * @VIPS_OPERATION_MATH_COSH: cosh(), angles in radians + * @VIPS_OPERATION_MATH_TANH: tanh(), angles in radians + * @VIPS_OPERATION_MATH_ASINH: asinh(), angles in radians + * @VIPS_OPERATION_MATH_ACOSH: acosh(), angles in radians + * @VIPS_OPERATION_MATH_ATANH: atanh(), angles in radians + * + * See also: vips_math(). + */ +typedef enum { + VIPS_OPERATION_MATH_SIN, + VIPS_OPERATION_MATH_COS, + VIPS_OPERATION_MATH_TAN, + VIPS_OPERATION_MATH_ASIN, + VIPS_OPERATION_MATH_ACOS, + VIPS_OPERATION_MATH_ATAN, + VIPS_OPERATION_MATH_LOG, + VIPS_OPERATION_MATH_LOG10, + VIPS_OPERATION_MATH_EXP, + VIPS_OPERATION_MATH_EXP10, + VIPS_OPERATION_MATH_SINH, + VIPS_OPERATION_MATH_COSH, + VIPS_OPERATION_MATH_TANH, + VIPS_OPERATION_MATH_ASINH, + VIPS_OPERATION_MATH_ACOSH, + VIPS_OPERATION_MATH_ATANH, + VIPS_OPERATION_MATH_LAST +} VipsOperationMath; + +/** + * VipsOperationMath2: + * @VIPS_OPERATION_MATH2_POW: pow(left, right) + * @VIPS_OPERATION_MATH2_WOP: pow(right, left) + * @VIPS_OPERATION_MATH2_ATAN2: atan2(left, right) + * + * See also: vips_math(). + */ +typedef enum { + VIPS_OPERATION_MATH2_POW, + VIPS_OPERATION_MATH2_WOP, + VIPS_OPERATION_MATH2_ATAN2, + VIPS_OPERATION_MATH2_LAST +} VipsOperationMath2; + +/** + * VipsOperationRound: + * @VIPS_OPERATION_ROUND_RINT: round to nearest + * @VIPS_OPERATION_ROUND_FLOOR: largest integral value not greater than + * @VIPS_OPERATION_ROUND_CEIL: the smallest integral value not less than + * + * See also: vips_round(). + */ +typedef enum { + VIPS_OPERATION_ROUND_RINT, + VIPS_OPERATION_ROUND_CEIL, + VIPS_OPERATION_ROUND_FLOOR, + VIPS_OPERATION_ROUND_LAST +} VipsOperationRound; + +/** + * VipsOperationRelational: + * @VIPS_OPERATION_RELATIONAL_EQUAL: == + * @VIPS_OPERATION_RELATIONAL_NOTEQ: != + * @VIPS_OPERATION_RELATIONAL_LESS: < + * @VIPS_OPERATION_RELATIONAL_LESSEQ: <= + * @VIPS_OPERATION_RELATIONAL_MORE: > + * @VIPS_OPERATION_RELATIONAL_MOREEQ: >= + * + * See also: vips_relational(). + */ +typedef enum { + VIPS_OPERATION_RELATIONAL_EQUAL, + VIPS_OPERATION_RELATIONAL_NOTEQ, + VIPS_OPERATION_RELATIONAL_LESS, + VIPS_OPERATION_RELATIONAL_LESSEQ, + VIPS_OPERATION_RELATIONAL_MORE, + VIPS_OPERATION_RELATIONAL_MOREEQ, + VIPS_OPERATION_RELATIONAL_LAST +} VipsOperationRelational; + +/** + * VipsOperationBoolean: + * @VIPS_OPERATION_BOOLEAN_AND: & + * @VIPS_OPERATION_BOOLEAN_OR: | + * @VIPS_OPERATION_BOOLEAN_EOR: ^ + * @VIPS_OPERATION_BOOLEAN_LSHIFT: >> + * @VIPS_OPERATION_BOOLEAN_RSHIFT: << + * + * See also: vips_boolean(). + */ +typedef enum { + VIPS_OPERATION_BOOLEAN_AND, + VIPS_OPERATION_BOOLEAN_OR, + VIPS_OPERATION_BOOLEAN_EOR, + VIPS_OPERATION_BOOLEAN_LSHIFT, + VIPS_OPERATION_BOOLEAN_RSHIFT, + VIPS_OPERATION_BOOLEAN_LAST +} VipsOperationBoolean; + +/** + * VipsOperationComplex: + * @VIPS_OPERATION_COMPLEX_POLAR: convert to polar coordinates + * @VIPS_OPERATION_COMPLEX_RECT: convert to rectangular coordinates + * @VIPS_OPERATION_COMPLEX_CONJ: complex conjugate + * + * See also: vips_complex(). + */ +typedef enum { + VIPS_OPERATION_COMPLEX_POLAR, + VIPS_OPERATION_COMPLEX_RECT, + VIPS_OPERATION_COMPLEX_CONJ, + VIPS_OPERATION_COMPLEX_LAST +} VipsOperationComplex; + +/** + * VipsOperationComplex2: + * @VIPS_OPERATION_COMPLEX2_CROSS_PHASE: convert to polar coordinates + * + * See also: vips_complex2(). + */ +typedef enum { + VIPS_OPERATION_COMPLEX2_CROSS_PHASE, + VIPS_OPERATION_COMPLEX2_LAST +} VipsOperationComplex2; + +/** + * VipsOperationComplexget: + * @VIPS_OPERATION_COMPLEXGET_REAL: get real component + * @VIPS_OPERATION_COMPLEXGET_IMAG: get imaginary component + * + * See also: vips_complexget(). + */ +typedef enum { + VIPS_OPERATION_COMPLEXGET_REAL, + VIPS_OPERATION_COMPLEXGET_IMAG, + VIPS_OPERATION_COMPLEXGET_LAST +} VipsOperationComplexget; + +VIPS_API +int vips_add(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sum(VipsImage **in, VipsImage **out, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_subtract(VipsImage *in1, VipsImage *in2, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_multiply(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_divide(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_linear(VipsImage *in, VipsImage **out, + const double *a, const double *b, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_linear1(VipsImage *in, VipsImage **out, double a, double b, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_remainder(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_remainder_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_remainder_const1(VipsImage *in, VipsImage **out, + double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_invert(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_abs(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sign(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_clamp(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_maxpair(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_minpair(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_round(VipsImage *in, VipsImage **out, VipsOperationRound round, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_floor(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_ceil(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rint(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_math(VipsImage *in, VipsImage **out, + VipsOperationMath math, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sin(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cos(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tan(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_asin(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_acos(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_atan(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_exp(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_exp10(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_log(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_log10(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sinh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cosh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tanh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_asinh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_acosh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_atanh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_complex(VipsImage *in, VipsImage **out, + VipsOperationComplex cmplx, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_polar(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rect(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_conj(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_complex2(VipsImage *left, VipsImage *right, VipsImage **out, + VipsOperationComplex2 cmplx, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cross_phase(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_complexget(VipsImage *in, VipsImage **out, + VipsOperationComplexget get, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_real(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_imag(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_complexform(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_relational(VipsImage *left, VipsImage *right, VipsImage **out, + VipsOperationRelational relational, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_equal(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_notequal(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_less(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lesseq(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_more(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_moreeq(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_relational_const(VipsImage *in, VipsImage **out, + VipsOperationRelational relational, const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_equal_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_notequal_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_less_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lesseq_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_more_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_moreeq_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_relational_const1(VipsImage *in, VipsImage **out, + VipsOperationRelational relational, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_equal_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_notequal_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_less_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lesseq_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_more_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_moreeq_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_boolean(VipsImage *left, VipsImage *right, VipsImage **out, + VipsOperationBoolean boolean, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_andimage(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_orimage(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_eorimage(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lshift(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rshift(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_boolean_const(VipsImage *in, VipsImage **out, + VipsOperationBoolean boolean, const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_andimage_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_orimage_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_eorimage_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lshift_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rshift_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_boolean_const1(VipsImage *in, VipsImage **out, + VipsOperationBoolean boolean, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_andimage_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_orimage_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_eorimage_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_lshift_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rshift_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_math2(VipsImage *left, VipsImage *right, VipsImage **out, + VipsOperationMath2 math2, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pow(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_wop(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_atan2(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_math2_const(VipsImage *in, VipsImage **out, + VipsOperationMath2 math2, const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pow_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_wop_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_atan2_const(VipsImage *in, VipsImage **out, + const double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_math2_const1(VipsImage *in, VipsImage **out, + VipsOperationMath2 math2, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pow_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_wop_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_atan2_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_avg(VipsImage *in, double *out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_deviate(VipsImage *in, double *out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_min(VipsImage *in, double *out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_max(VipsImage *in, double *out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_stats(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_measure(VipsImage *in, VipsImage **out, int h, int v, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_find_trim(VipsImage *in, + int *left, int *top, int *width, int *height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_getpoint(VipsImage *in, double **vector, int *n, int x, int y, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_find(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_find_ndim(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_find_indexed(VipsImage *in, VipsImage *index, + VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hough_line(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hough_circle(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_project(VipsImage *in, VipsImage **columns, VipsImage **rows, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_profile(VipsImage *in, VipsImage **columns, VipsImage **rows, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_ARITHMETIC_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/basic.h b/jtlsrv-cpp/.static-build/include/vips/basic.h new file mode 100644 index 0000000..26c4e3f --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/basic.h @@ -0,0 +1,117 @@ +/* A few basic types needed everywhere. + * + * 27/10/11 + * - from type.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_BASIC_H +#define VIPS_BASIC_H + +/* Defined in config.h + */ +#ifndef _VIPS_PUBLIC +#define _VIPS_PUBLIC +#endif + +#define VIPS_API _VIPS_PUBLIC extern + +/* VIPS_DISABLE_DEPRECATION_WARNINGS: + * + * Disable deprecation warnings from VIPS API. + * + * Must be defined before including `vips/vips.h`. + */ +#ifdef VIPS_DISABLE_DEPRECATION_WARNINGS +#define VIPS_DEPRECATED VIPS_API +#define VIPS_DEPRECATED_FOR(f) VIPS_API +#else +#define VIPS_DEPRECATED G_DEPRECATED VIPS_API +#define VIPS_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) VIPS_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/** + * VipsPel: + * + * A picture element. Cast this to whatever the associated VipsBandFormat says + * to get the value. + */ +typedef unsigned char VipsPel; + +/* Also used for eg. vips_local() and friends. + */ +typedef int (*VipsCallbackFn)(void *a, void *b); + +/* Like GFunc, but return a value. + */ +typedef void *(*VipsSListMap2Fn)(void *item, + void *a, void *b); +typedef void *(*VipsSListMap4Fn)(void *item, + void *a, void *b, void *c, void *d); +typedef void *(*VipsSListFold2Fn)(void *item, + void *a, void *b, void *c); + +typedef enum { + VIPS_PRECISION_INTEGER, + VIPS_PRECISION_FLOAT, + VIPS_PRECISION_APPROXIMATE, + VIPS_PRECISION_LAST +} VipsPrecision; + +/* Just for testing. + */ +VIPS_API +char *vips_path_filename7(const char *path); +VIPS_API +char *vips_path_mode7(const char *path); + +struct _VipsImage; +typedef struct _VipsImage VipsImage; +struct _VipsRegion; +typedef struct _VipsRegion VipsRegion; +struct _VipsBuf; +typedef struct _VipsBuf VipsBuf; +struct _VipsSource; +typedef struct _VipsSource VipsSource; +struct _VipsTarget; +typedef struct _VipsTarget VipsTarget; +struct _VipsInterpolate; +typedef struct _VipsInterpolate VipsInterpolate; +struct _VipsOperation; +typedef struct _VipsOperation VipsOperation; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_BASIC_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/buf.h b/jtlsrv-cpp/.static-build/include/vips/buf.h new file mode 100644 index 0000000..3951369 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/buf.h @@ -0,0 +1,118 @@ +/* A static string buffer, with overflow protection. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_BUF_H +#define VIPS_BUF_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* A string in the process of being written to ... multiple calls to + * vips_buf_append add to it. On overflow append "..." and block further + * writes. + */ + +struct _VipsBuf { + /* All fields are private. + */ + /*< private >*/ + char *base; /* String base */ + int mx; /* Maximum length */ + int i; /* Current write point */ + gboolean full; /* String has filled, block writes */ + int lasti; /* For read-recent */ + gboolean dynamic; /* We own the string with malloc() */ +}; + +#define VIPS_BUF_STATIC(TEXT) \ + { \ + &TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \ + } + +/* Init and append to one of the above. + */ +VIPS_API +void vips_buf_rewind(VipsBuf *buf); +VIPS_API +void vips_buf_destroy(VipsBuf *buf); +VIPS_API +void vips_buf_init(VipsBuf *buf); +VIPS_API +void vips_buf_set_static(VipsBuf *buf, char *base, int mx); +VIPS_API +void vips_buf_set_dynamic(VipsBuf *buf, int mx); +VIPS_API +void vips_buf_init_static(VipsBuf *buf, char *base, int mx); +VIPS_API +void vips_buf_init_dynamic(VipsBuf *buf, int mx); +VIPS_API +gboolean vips_buf_appendns(VipsBuf *buf, const char *str, int sz); +VIPS_API +gboolean vips_buf_appends(VipsBuf *buf, const char *str); +VIPS_API +gboolean vips_buf_appendf(VipsBuf *buf, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_API +gboolean vips_buf_vappendf(VipsBuf *buf, const char *fmt, va_list ap); +VIPS_API +gboolean vips_buf_appendc(VipsBuf *buf, char ch); +VIPS_API +gboolean vips_buf_appendgv(VipsBuf *buf, GValue *value); +VIPS_API +gboolean vips_buf_append_size(VipsBuf *buf, size_t n); +VIPS_API +gboolean vips_buf_removec(VipsBuf *buf, char ch); +VIPS_API +gboolean vips_buf_change(VipsBuf *buf, const char *o, const char *n); +VIPS_API +gboolean vips_buf_is_empty(VipsBuf *buf); +VIPS_API +gboolean vips_buf_is_full(VipsBuf *buf); +VIPS_API +const char *vips_buf_all(VipsBuf *buf); +VIPS_API +const char *vips_buf_firstline(VipsBuf *buf); +VIPS_API +gboolean vips_buf_appendg(VipsBuf *buf, double g); +VIPS_API +gboolean vips_buf_appendd(VipsBuf *buf, int d); +VIPS_API +int vips_buf_len(VipsBuf *buf); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_BUF_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/colour.h b/jtlsrv-cpp/.static-build/include/vips/colour.h new file mode 100644 index 0000000..ed52ccf --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/colour.h @@ -0,0 +1,308 @@ +/* Definitions for VIPS colour package. + * + * J.Cupitt, 8/4/93 + * 15/7/96 JC + * - C++ stuff added + * 20/2/98 JC + * - new display calibration added + * 26/9/05 + * - added IM_ prefix to colour temps + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_COLOUR_H +#define VIPS_COLOUR_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Areas under curves for Dxx. 2 degree observer. + */ +#define VIPS_D93_X0 (89.7400) +#define VIPS_D93_Y0 (100.0) +#define VIPS_D93_Z0 (130.7700) + +#define VIPS_D75_X0 (94.9682) +#define VIPS_D75_Y0 (100.0) +#define VIPS_D75_Z0 (122.5710) + +/* D65 temp 6504. + */ +#define VIPS_D65_X0 (95.0470) +#define VIPS_D65_Y0 (100.0) +#define VIPS_D65_Z0 (108.8827) + +#define VIPS_D55_X0 (95.6831) +#define VIPS_D55_Y0 (100.0) +#define VIPS_D55_Z0 (92.0871) + +#define VIPS_D50_X0 (96.4250) +#define VIPS_D50_Y0 (100.0) +#define VIPS_D50_Z0 (82.4680) + +/* A temp 2856k. + */ +#define VIPS_A_X0 (109.8503) +#define VIPS_A_Y0 (100.0) +#define VIPS_A_Z0 (35.5849) + +/* B temp 4874k. + */ +#define VIPS_B_X0 (99.0720) +#define VIPS_B_Y0 (100.0) +#define VIPS_B_Z0 (85.2230) + +/* C temp 6774k. + */ +#define VIPS_C_X0 (98.0700) +#define VIPS_C_Y0 (100.0) +#define VIPS_C_Z0 (118.2300) + +#define VIPS_E_X0 (100.0) +#define VIPS_E_Y0 (100.0) +#define VIPS_E_Z0 (100.0) + +#define VIPS_D3250_X0 (105.6590) +#define VIPS_D3250_Y0 (100.0) +#define VIPS_D3250_Z0 (45.8501) + +/* Note: constants align with those defined in lcms2.h. + */ +typedef enum { + VIPS_INTENT_PERCEPTUAL = 0, + VIPS_INTENT_RELATIVE, + VIPS_INTENT_SATURATION, + VIPS_INTENT_ABSOLUTE, + VIPS_INTENT_LAST +} VipsIntent; + +typedef enum { + VIPS_PCS_LAB, + VIPS_PCS_XYZ, + VIPS_PCS_LAST +} VipsPCS; + +VIPS_API +gboolean vips_colourspace_issupported(const VipsImage *image); +VIPS_API +int vips_colourspace(VipsImage *in, VipsImage **out, + VipsInterpretation space, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_LabQ2sRGB(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rad2float(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_float2rad(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_LabS2LabQ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_LabQ2LabS(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_LabQ2Lab(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Lab2LabQ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_LCh2Lab(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Lab2LCh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Yxy2Lab(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_CMC2XYZ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Lab2XYZ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_XYZ2Lab(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_XYZ2scRGB(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_scRGB2sRGB(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_scRGB2BW(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sRGB2scRGB(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_scRGB2XYZ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_HSV2sRGB(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sRGB2HSV(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_LCh2CMC(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_CMC2LCh(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_XYZ2Yxy(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Yxy2XYZ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_LabS2Lab(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_Lab2LabS(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_CMYK2XYZ(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_XYZ2CMYK(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_profile_load(const char *name, VipsBlob **profile, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_icc_present(void); +VIPS_API +int vips_icc_transform(VipsImage *in, VipsImage **out, + const char *output_profile, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_icc_import(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_icc_export(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_icc_ac2rc(VipsImage *in, VipsImage **out, + const char *profile_filename); +VIPS_API +gboolean vips_icc_is_compatible_profile(VipsImage *image, + const void *data, size_t data_length); + +VIPS_API +int vips_dE76(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_dE00(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_dECMC(VipsImage *left, VipsImage *right, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +void vips_col_Lab2XYZ(float L, float a, float b, + float *X, float *Y, float *Z); +VIPS_API +void vips_col_XYZ2Lab(float X, float Y, float Z, + float *L, float *a, float *b); +VIPS_API +double vips_col_ab2h(double a, double b); +VIPS_API +void vips_col_ab2Ch(float a, float b, float *C, float *h); +VIPS_API +void vips_col_Ch2ab(float C, float h, float *a, float *b); + +VIPS_API +float vips_col_L2Lcmc(float L); +VIPS_API +float vips_col_C2Ccmc(float C); +VIPS_API +float vips_col_Ch2hcmc(float C, float h); + +VIPS_API +void vips_col_make_tables_CMC(void); +VIPS_API +float vips_col_Lcmc2L(float Lcmc); +VIPS_API +float vips_col_Ccmc2C(float Ccmc); +VIPS_API +float vips_col_Chcmc2h(float C, float hcmc); + +VIPS_API +int vips_col_sRGB2scRGB_8(int r, int g, int b, float *R, float *G, float *B); +VIPS_API +int vips_col_sRGB2scRGB_16(int r, int g, int b, float *R, float *G, float *B); +VIPS_API +int vips_col_sRGB2scRGB_8_noclip(int r, int g, int b, + float *R, float *G, float *B); +VIPS_API +int vips_col_sRGB2scRGB_16_noclip(int r, int g, int b, + float *R, float *G, float *B); + +VIPS_API +int vips_col_scRGB2XYZ(float R, float G, float B, + float *X, float *Y, float *Z); +VIPS_API +int vips_col_XYZ2scRGB(float X, float Y, float Z, + float *R, float *G, float *B); + +VIPS_API +int vips_col_scRGB2sRGB_8(float R, float G, float B, + int *r, int *g, int *b, int *og); +VIPS_API +int vips_col_scRGB2sRGB_16(float R, float G, float B, + int *r, int *g, int *b, int *og); +VIPS_API +int vips_col_scRGB2BW_16(float R, float G, float B, int *g, int *og); +VIPS_API +int vips_col_scRGB2BW_8(float R, float G, float B, int *g, int *og); + +VIPS_API +float vips_pythagoras(float L1, float a1, float b1, + float L2, float a2, float b2); +VIPS_API +float vips_col_dE00( + float L1, float a1, float b1, float L2, float a2, float b2); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_COLOUR_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/connection.h b/jtlsrv-cpp/.static-build/include/vips/connection.h new file mode 100644 index 0000000..ef4995b --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/connection.h @@ -0,0 +1,571 @@ +/* A byte source/sink .. it can be a pipe, socket, or perhaps a node.js stream. + * + * J.Cupitt, 19/6/14 + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_CONNECTION_H +#define VIPS_CONNECTION_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_CONNECTION (vips_connection_get_type()) +#define VIPS_CONNECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_CONNECTION, VipsConnection)) +#define VIPS_CONNECTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_CONNECTION, VipsConnectionClass)) +#define VIPS_IS_CONNECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_CONNECTION)) +#define VIPS_IS_CONNECTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_CONNECTION)) +#define VIPS_CONNECTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_CONNECTION, VipsConnectionClass)) + +/* Communicate with something like a socket or pipe. + */ +typedef struct _VipsConnection { + VipsObject parent_object; + + /*< private >*/ + + /* Read/write this fd if connected to a system pipe/socket. Override + * ::read() and ::write() to do something else. + */ + int descriptor; + + /* A descriptor we close with vips_tracked_close(). + */ + int tracked_descriptor; + + /* A descriptor we close with close(). + */ + int close_descriptor; + + /* If descriptor is a file, the filename we opened. Handy for error + * messages. + */ + char *filename; + +} VipsConnection; + +typedef struct _VipsConnectionClass { + VipsObjectClass parent_class; + +} VipsConnectionClass; + +VIPS_API +GType vips_connection_get_type(void); + +VIPS_API +const char *vips_connection_filename(VipsConnection *connection); +VIPS_API +const char *vips_connection_nick(VipsConnection *connection); + +VIPS_API +void vips_pipe_read_limit_set(gint64 limit); + +#define VIPS_TYPE_SOURCE (vips_source_get_type()) +#define VIPS_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_SOURCE, VipsSource)) +#define VIPS_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_SOURCE, VipsSourceClass)) +#define VIPS_IS_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_SOURCE)) +#define VIPS_IS_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_SOURCE)) +#define VIPS_SOURCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_SOURCE, VipsSourceClass)) + +/* Read from something like a socket, file or memory area and present the data + * with a unified seek / read / map interface. + * + * During the header phase, we save data from unseekable sources in a buffer + * so readers can rewind and read again. We don't buffer data during the + * decode stage. + */ +struct _VipsSource { + VipsConnection parent_object; + + /* We have two phases: + * + * During the header phase, we save bytes read from the input (if this + * is an unseekable source) so that we can rewind and try again, if + * necessary. + * + * Once we reach decode phase, we no longer support rewind and the + * buffer of saved data is discarded. + */ + gboolean decode; + + /* TRUE if this input is something like a pipe. These don't support + * seek or map -- all you can do is read() bytes sequentially. + * + * If you attempt to map or get the size of a pipe-style input, it'll + * get read entirely into memory. Seeks will cause read up to the seek + * point. + */ + gboolean have_tested_seek; + gboolean is_pipe; + + /* The current read point and length. + * + * length is -1 for is_pipe sources. + * + * off_t can be 32 bits on some platforms, so make sure we have a + * full 64. + */ + gint64 read_position; + gint64 length; + + /*< private >*/ + + /* For sources where we have the whole image in memory (from a memory + * buffer, from mmaping the file, from reading the pipe into memory), + * a pointer to the start. + */ + const void *data; + + /* For is_pipe sources, save data read during header phase here. If + * we rewind and try again, serve data from this until it runs out. + * + * If we need to force the whole pipe into memory, read everything to + * this and put a copy of the pointer in data. + */ + GByteArray *header_bytes; + + /* Save the first few bytes here for file type sniffing. + */ + GByteArray *sniff; + + /* For a memory source, the blob we read from. + */ + VipsBlob *blob; + + /* If we mmaped the file, what we need to unmmap on finalize. + */ + void *mmap_baseaddr; + size_t mmap_length; +}; + +typedef struct _VipsSourceClass { + VipsConnectionClass parent_class; + + /* Subclasses can define these to implement other source methods. + */ + + /* Read from the source into the supplied buffer, args exactly as + * read(2). Set errno on error. + * + * We must return gint64, since ssize_t is often defined as unsigned + * on Windows. + */ + gint64 (*read)(VipsSource *, void *, size_t); + + /* Seek to a certain position, args exactly as lseek(2). Set errno on + * error. + * + * Unseekable sources should always return -1. VipsSource will then + * seek by _read()ing bytes into memory as required. + * + * We have to use int64 rather than off_t, since we must work on + * Windows, where off_t can be 32-bits. + */ + gint64 (*seek)(VipsSource *, gint64, int); + +} VipsSourceClass; + +VIPS_API +GType vips_source_get_type(void); + +VIPS_API +VipsSource *vips_source_new_from_descriptor(int descriptor); +VIPS_API +VipsSource *vips_source_new_from_file(const char *filename); +VIPS_API +VipsSource *vips_source_new_from_blob(VipsBlob *blob); +VIPS_API +VipsSource *vips_source_new_from_target(VipsTarget *target); +VIPS_API +VipsSource *vips_source_new_from_memory(const void *data, size_t size); +VIPS_API +VipsSource *vips_source_new_from_options(const char *options); + +VIPS_API +void vips_source_minimise(VipsSource *source); +VIPS_API +int vips_source_unminimise(VipsSource *source); +VIPS_API +int vips_source_decode(VipsSource *source); +VIPS_API +gint64 vips_source_read(VipsSource *source, void *data, size_t length); +VIPS_API +gboolean vips_source_is_mappable(VipsSource *source); +VIPS_API +gboolean vips_source_is_file(VipsSource *source); +VIPS_API +const void *vips_source_map(VipsSource *source, size_t *length); +VIPS_API +VipsBlob *vips_source_map_blob(VipsSource *source); +VIPS_API +gint64 vips_source_seek(VipsSource *source, gint64 offset, int whence); +VIPS_API +int vips_source_rewind(VipsSource *source); +VIPS_API +gint64 vips_source_sniff_at_most(VipsSource *source, + unsigned char **data, size_t length); +VIPS_API +unsigned char *vips_source_sniff(VipsSource *source, size_t length); +VIPS_API +gint64 vips_source_length(VipsSource *source); + +#define VIPS_TYPE_SOURCE_CUSTOM (vips_source_custom_get_type()) +#define VIPS_SOURCE_CUSTOM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustom)) +#define VIPS_SOURCE_CUSTOM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustomClass)) +#define VIPS_IS_SOURCE_CUSTOM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_SOURCE_CUSTOM)) +#define VIPS_IS_SOURCE_CUSTOM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_SOURCE_CUSTOM)) +#define VIPS_SOURCE_CUSTOM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustomClass)) + +/* Subclass of source_custom with signals for handlers. This is supposed to be + * useful for language bindings. + */ +typedef struct _VipsSourceCustom { + VipsSource parent_object; + +} VipsSourceCustom; + +typedef struct _VipsSourceCustomClass { + VipsSourceClass parent_class; + + /* The action signals clients can use to implement read and seek. + * We must use gint64 everywhere since there's no G_TYPE_SIZE. + */ + + gint64 (*read)(VipsSourceCustom *, void *, gint64); + gint64 (*seek)(VipsSourceCustom *, gint64, int); + +} VipsSourceCustomClass; + +VIPS_API +GType vips_source_custom_get_type(void); +VIPS_API +VipsSourceCustom *vips_source_custom_new(void); + +/* A GInputStream that wraps a VipsSource. This lets us eg. + * hook librsvg up to libvips using their GInputStream interface. + */ + +#define VIPS_TYPE_G_INPUT_STREAM (vips_g_input_stream_get_type()) +#define VIPS_G_INPUT_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_G_INPUT_STREAM, VipsGInputStream)) +#define VIPS_G_INPUT_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_G_INPUT_STREAM, VipsGInputStreamClass)) +#define VIPS_IS_G_INPUT_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_G_INPUT_STREAM)) +#define VIPS_IS_G_INPUT_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_G_INPUT_STREAM)) +#define VIPS_G_INPUT_STREAM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_G_INPUT_STREAM, VipsGInputStreamClass)) + +typedef struct _VipsGInputStream { + GInputStream parent_instance; + + /*< private >*/ + + /* The VipsSource we wrap. + */ + VipsSource *source; + +} VipsGInputStream; + +typedef struct _VipsGInputStreamClass { + GInputStreamClass parent_class; + +} VipsGInputStreamClass; + +VIPS_API +GInputStream *vips_g_input_stream_new_from_source(VipsSource *source); + +/* A VipsSource that wraps a GInputStream. This lets us eg. load PNGs from + * GFile objects. + */ + +#define VIPS_TYPE_SOURCE_G_INPUT_STREAM (vips_source_g_input_stream_get_type()) +#define VIPS_SOURCE_G_INPUT_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_SOURCE_G_INPUT_STREAM, VipsSourceGInputStream)) +#define VIPS_SOURCE_G_INPUT_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_SOURCE_G_INPUT_STREAM, VipsSourceGInputStreamClass)) +#define VIPS_IS_SOURCE_G_INPUT_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_SOURCE_G_INPUT_STREAM)) +#define VIPS_IS_SOURCE_G_INPUT_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_SOURCE_G_INPUT_STREAM)) +#define VIPS_SOURCE_G_INPUT_STREAM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_SOURCE_G_INPUT_STREAM, VipsSourceGInputStreamClass)) + +typedef struct _VipsSourceGInputStream { + VipsSource parent_instance; + + /*< private >*/ + + /* The GInputStream we wrap. + */ + GInputStream *stream; + + GSeekable *seekable; + GFileInfo *info; + +} VipsSourceGInputStream; + +typedef struct _VipsSourceGInputStreamClass { + VipsSourceClass parent_class; + +} VipsSourceGInputStreamClass; + +VIPS_API +VipsSourceGInputStream *vips_source_g_input_stream_new(GInputStream *stream); + +#define VIPS_TYPE_TARGET (vips_target_get_type()) +#define VIPS_TARGET(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_TARGET, VipsTarget)) +#define VIPS_TARGET_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_TARGET, VipsTargetClass)) +#define VIPS_IS_TARGET(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_TARGET)) +#define VIPS_IS_TARGET_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_TARGET)) +#define VIPS_TARGET_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_TARGET, VipsTargetClass)) + +/* PNG writes in 8kb chunks, so we need to be a little larger than that. + */ +#define VIPS_TARGET_BUFFER_SIZE (8500) + +/* Output to something like a socket, pipe or memory area. + */ +struct _VipsTarget { + VipsConnection parent_object; + + /*< private >*/ + + /* This target should write to memory. + */ + gboolean memory; + + /* The target has been ended and can no longer be written. + */ + gboolean ended; + + /* Write memory output here. We use a GString rather than a + * GByteArray since we need eg. g_string_overwrite_len(). + * @position tracks the current write position in this. + */ + GString *memory_buffer; + + /* And return memory via this blob. + */ + VipsBlob *blob; + + /* Buffer small writes here. write_point is the index of the next + * character to write. + */ + unsigned char output_buffer[VIPS_TARGET_BUFFER_SIZE]; + int write_point; + + /* Write position in memory_buffer. + * + * off_t can be 32 bits on some platforms, so make sure we have a + * full 64. + */ + gint64 position; + + /* Temp targets on the filesystem need deleting, sometimes. + */ + gboolean delete_on_close; + char *delete_on_close_filename; +}; + +typedef struct _VipsTargetClass { + VipsConnectionClass parent_class; + + /* Write to output. Args exactly as write(2). + * + * We must return gint64, since ssize_t is often defined as unsigned + * on Windows. + */ + gint64 (*write)(VipsTarget *, const void *, size_t); + + /* Deprecated in favour of ::end. + */ + void (*finish)(VipsTarget *); + + /* libtiff needs to be able to seek and read on targets, + * unfortunately. + * + * This will not work for eg. pipes, of course. + */ + + /* Read from the target into the supplied buffer, args exactly as + * read(2). Set errno on error. + * + * We must return gint64, since ssize_t is often defined as unsigned + * on Windows. + */ + gint64 (*read)(VipsTarget *, void *, size_t); + + /* Seek output. Args exactly as lseek(2). + * + * We have to use int64 rather than off_t, since we must work on + * Windows, where off_t can be 32-bits. + */ + gint64 (*seek)(VipsTarget *, gint64 offset, int whence); + + /* Output has been generated, so do any clearing up, + * eg. copy the bytes we saved in memory to the target blob. + */ + int (*end)(VipsTarget *); + +} VipsTargetClass; + +VIPS_API +GType vips_target_get_type(void); + +VIPS_API +VipsTarget *vips_target_new_to_descriptor(int descriptor); +VIPS_API +VipsTarget *vips_target_new_to_file(const char *filename); +VIPS_API +VipsTarget *vips_target_new_to_memory(void); +VIPS_API +VipsTarget *vips_target_new_temp(VipsTarget *target); +VIPS_API +int vips_target_write(VipsTarget *target, const void *data, size_t length); +VIPS_API +gint64 vips_target_read(VipsTarget *target, void *buffer, size_t length); +VIPS_API +gint64 vips_target_seek(VipsTarget *target, gint64 offset, int whence); +VIPS_API +int vips_target_end(VipsTarget *target); +VIPS_API +unsigned char *vips_target_steal(VipsTarget *target, size_t *length); +VIPS_API +char *vips_target_steal_text(VipsTarget *target); + +VIPS_API +int vips_target_putc(VipsTarget *target, int ch); +#define VIPS_TARGET_PUTC(S, C) ( \ + (S)->write_point < VIPS_TARGET_BUFFER_SIZE \ + ? ((S)->output_buffer[(S)->write_point++] = (C), 0) \ + : vips_target_putc((S), (C))) +VIPS_API +int vips_target_writes(VipsTarget *target, const char *str); +VIPS_API +int vips_target_writef(VipsTarget *target, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_API +int vips_target_write_amp(VipsTarget *target, const char *str); + +#define VIPS_TYPE_TARGET_CUSTOM (vips_target_custom_get_type()) +#define VIPS_TARGET_CUSTOM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustom)) +#define VIPS_TARGET_CUSTOM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustomClass)) +#define VIPS_IS_TARGET_CUSTOM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_TARGET_CUSTOM)) +#define VIPS_IS_TARGET_CUSTOM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_TARGET_CUSTOM)) +#define VIPS_TARGET_CUSTOM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustomClass)) + +#define VIPS_TARGET_CUSTOM_BUFFER_SIZE (4096) + +/* Output to something like a socket, pipe or memory area. + */ +typedef struct _VipsTargetCustom { + VipsTarget parent_object; + +} VipsTargetCustom; + +typedef struct _VipsTargetCustomClass { + VipsTargetClass parent_class; + + /* The action signals clients can use to implement write and finish. + * We must use gint64 everywhere since there's no G_TYPE_SIZE. + */ + + gint64 (*write)(VipsTargetCustom *, const void *, gint64); + void (*finish)(VipsTargetCustom *); + gint64 (*read)(VipsTargetCustom *, void *, gint64); + gint64 (*seek)(VipsTargetCustom *, gint64, int); + int (*end)(VipsTargetCustom *); + +} VipsTargetCustomClass; + +VIPS_API +GType vips_target_custom_get_type(void); +VIPS_API +VipsTargetCustom *vips_target_custom_new(void); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_CONNECTION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/conversion.h b/jtlsrv-cpp/.static-build/include/vips/conversion.h new file mode 100644 index 0000000..1eb5ad0 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/conversion.h @@ -0,0 +1,354 @@ +/* conversion.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_CONVERSION_H +#define VIPS_CONVERSION_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_EXTEND_BLACK, + VIPS_EXTEND_COPY, + VIPS_EXTEND_REPEAT, + VIPS_EXTEND_MIRROR, + VIPS_EXTEND_WHITE, + VIPS_EXTEND_BACKGROUND, + VIPS_EXTEND_LAST +} VipsExtend; + +typedef enum { + VIPS_COMPASS_DIRECTION_CENTRE, + VIPS_COMPASS_DIRECTION_NORTH, + VIPS_COMPASS_DIRECTION_EAST, + VIPS_COMPASS_DIRECTION_SOUTH, + VIPS_COMPASS_DIRECTION_WEST, + VIPS_COMPASS_DIRECTION_NORTH_EAST, + VIPS_COMPASS_DIRECTION_SOUTH_EAST, + VIPS_COMPASS_DIRECTION_SOUTH_WEST, + VIPS_COMPASS_DIRECTION_NORTH_WEST, + VIPS_COMPASS_DIRECTION_LAST +} VipsCompassDirection; + +typedef enum { + VIPS_DIRECTION_HORIZONTAL, + VIPS_DIRECTION_VERTICAL, + VIPS_DIRECTION_LAST +} VipsDirection; + +typedef enum { + VIPS_ALIGN_LOW, + VIPS_ALIGN_CENTRE, + VIPS_ALIGN_HIGH, + VIPS_ALIGN_LAST +} VipsAlign; + +typedef enum { + VIPS_ANGLE_D0, + VIPS_ANGLE_D90, + VIPS_ANGLE_D180, + VIPS_ANGLE_D270, + VIPS_ANGLE_LAST +} VipsAngle; + +typedef enum { + VIPS_ANGLE45_D0, + VIPS_ANGLE45_D45, + VIPS_ANGLE45_D90, + VIPS_ANGLE45_D135, + VIPS_ANGLE45_D180, + VIPS_ANGLE45_D225, + VIPS_ANGLE45_D270, + VIPS_ANGLE45_D315, + VIPS_ANGLE45_LAST +} VipsAngle45; + +typedef enum { + VIPS_INTERESTING_NONE, + VIPS_INTERESTING_CENTRE, + VIPS_INTERESTING_ENTROPY, + VIPS_INTERESTING_ATTENTION, + VIPS_INTERESTING_LOW, + VIPS_INTERESTING_HIGH, + VIPS_INTERESTING_ALL, + VIPS_INTERESTING_LAST +} VipsInteresting; + +typedef enum { + VIPS_BLEND_MODE_CLEAR, + VIPS_BLEND_MODE_SOURCE, + VIPS_BLEND_MODE_OVER, + VIPS_BLEND_MODE_IN, + VIPS_BLEND_MODE_OUT, + VIPS_BLEND_MODE_ATOP, + VIPS_BLEND_MODE_DEST, + VIPS_BLEND_MODE_DEST_OVER, + VIPS_BLEND_MODE_DEST_IN, + VIPS_BLEND_MODE_DEST_OUT, + VIPS_BLEND_MODE_DEST_ATOP, + VIPS_BLEND_MODE_XOR, + VIPS_BLEND_MODE_ADD, + VIPS_BLEND_MODE_SATURATE, + VIPS_BLEND_MODE_MULTIPLY, + VIPS_BLEND_MODE_SCREEN, + VIPS_BLEND_MODE_OVERLAY, + VIPS_BLEND_MODE_DARKEN, + VIPS_BLEND_MODE_LIGHTEN, + VIPS_BLEND_MODE_COLOUR_DODGE, + VIPS_BLEND_MODE_COLOUR_BURN, + VIPS_BLEND_MODE_HARD_LIGHT, + VIPS_BLEND_MODE_SOFT_LIGHT, + VIPS_BLEND_MODE_DIFFERENCE, + VIPS_BLEND_MODE_EXCLUSION, + VIPS_BLEND_MODE_LAST +} VipsBlendMode; + +VIPS_API +int vips_copy(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tilecache(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_linecache(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sequential(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_copy_file(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_embed(VipsImage *in, VipsImage **out, + int x, int y, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gravity(VipsImage *in, VipsImage **out, + VipsCompassDirection direction, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_flip(VipsImage *in, VipsImage **out, VipsDirection direction, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_insert(VipsImage *main, VipsImage *sub, VipsImage **out, + int x, int y, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_join(VipsImage *in1, VipsImage *in2, VipsImage **out, + VipsDirection direction, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_arrayjoin(VipsImage **in, VipsImage **out, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_extract_area(VipsImage *in, VipsImage **out, + int left, int top, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_crop(VipsImage *in, VipsImage **out, + int left, int top, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_smartcrop(VipsImage *in, VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_extract_band(VipsImage *in, VipsImage **out, int band, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_replicate(VipsImage *in, VipsImage **out, int across, int down, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_grid(VipsImage *in, VipsImage **out, + int tile_height, int across, int down, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_transpose3d(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_wrap(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rot(VipsImage *in, VipsImage **out, VipsAngle angle, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rot90(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rot180(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rot270(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rot45(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +void vips_autorot_remove_angle(VipsImage *image); +VIPS_API +int vips_autorot(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_zoom(VipsImage *in, VipsImage **out, int xfac, int yfac, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_subsample(VipsImage *in, VipsImage **out, int xfac, int yfac, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_cast(VipsImage *in, VipsImage **out, VipsBandFormat format, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_uchar(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_char(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_ushort(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_short(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_uint(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_int(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_float(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_double(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_complex(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_cast_dpcomplex(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_scale(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_msb(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_byteswap(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_bandjoin(VipsImage **in, VipsImage **out, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandjoin2(VipsImage *in1, VipsImage *in2, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandjoin_const(VipsImage *in, VipsImage **out, double *c, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandjoin_const1(VipsImage *in, VipsImage **out, double c, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandrank(VipsImage **in, VipsImage **out, int n, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandfold(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandunfold(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_bandbool(VipsImage *in, VipsImage **out, + VipsOperationBoolean boolean, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandand(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandor(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandeor(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_bandmean(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_recomb(VipsImage *in, VipsImage **out, VipsImage *m, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_ifthenelse(VipsImage *cond, VipsImage *in1, VipsImage *in2, + VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_switch(VipsImage **tests, VipsImage **out, int n, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_flatten(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_addalpha(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_premultiply(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_unpremultiply(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_composite(VipsImage **in, VipsImage **out, int n, int *mode, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_composite2(VipsImage *base, VipsImage *overlay, VipsImage **out, + VipsBlendMode mode, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_falsecolour(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gamma(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_CONVERSION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/convolution.h b/jtlsrv-cpp/.static-build/include/vips/convolution.h new file mode 100644 index 0000000..7141446 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/convolution.h @@ -0,0 +1,101 @@ +/* convolution.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_CONVOLUTION_H +#define VIPS_CONVOLUTION_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_COMBINE_MAX, + VIPS_COMBINE_SUM, + VIPS_COMBINE_MIN, + VIPS_COMBINE_LAST +} VipsCombine; + +VIPS_API +int vips_conv(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_convf(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_convi(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_conva(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_convsep(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_convasep(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_compass(VipsImage *in, VipsImage **out, VipsImage *mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gaussblur(VipsImage *in, VipsImage **out, double sigma, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sharpen(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_spcor(VipsImage *in, VipsImage *ref, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_fastcor(VipsImage *in, VipsImage *ref, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_sobel(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_scharr(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_prewitt(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_canny(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_CONVOLUTION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/create.h b/jtlsrv-cpp/.static-build/include/vips/create.h new file mode 100644 index 0000000..f7dd524 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/create.h @@ -0,0 +1,172 @@ +/* create.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_CREATE_H +#define VIPS_CREATE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_TEXT_WRAP_WORD = 0, + VIPS_TEXT_WRAP_CHAR, + VIPS_TEXT_WRAP_WORD_CHAR, + VIPS_TEXT_WRAP_NONE, + VIPS_TEXT_WRAP_LAST +} VipsTextWrap; + +typedef enum { + VIPS_SDF_SHAPE_CIRCLE = 0, + VIPS_SDF_SHAPE_BOX, + VIPS_SDF_SHAPE_ROUNDED_BOX, + VIPS_SDF_SHAPE_LINE, + VIPS_SDF_SHAPE_LAST +} VipsSdfShape; + +VIPS_API +int vips_black(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_xyz(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_grey(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gaussmat(VipsImage **out, double sigma, double min_ampl, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_logmat(VipsImage **out, double sigma, double min_ampl, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_text(VipsImage **out, const char *text, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_gaussnoise(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_eye(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sines(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_zone(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_sdf(VipsImage **out, int width, int height, VipsSdfShape shape, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_identity(VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_buildlut(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_invertlut(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tonelut(VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_mask_ideal(VipsImage **out, int width, int height, + double frequency_cutoff, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_ideal_ring(VipsImage **out, int width, int height, + double frequency_cutoff, double ringwidth, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_ideal_band(VipsImage **out, int width, int height, + double frequency_cutoff_x, double frequency_cutoff_y, + double radius, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_butterworth(VipsImage **out, int width, int height, + double order, + double frequency_cutoff, double amplitude_cutoff, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_butterworth_ring(VipsImage **out, int width, int height, + double order, + double frequency_cutoff, double amplitude_cutoff, + double ringwidth, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_butterworth_band(VipsImage **out, int width, int height, + double order, + double frequency_cutoff_x, double frequency_cutoff_y, double radius, + double amplitude_cutoff, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_gaussian(VipsImage **out, int width, int height, + double frequency_cutoff, double amplitude_cutoff, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_gaussian_ring(VipsImage **out, int width, int height, + double frequency_cutoff, double amplitude_cutoff, + double ringwidth, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_gaussian_band(VipsImage **out, int width, int height, + double frequency_cutoff_x, double frequency_cutoff_y, double radius, + double amplitude_cutoff, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mask_fractal(VipsImage **out, int width, int height, + double fractal_dimension, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_fractsurf(VipsImage **out, + int width, int height, double fractal_dimension, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_worley(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_perlin(VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_CREATE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/dbuf.h b/jtlsrv-cpp/.static-build/include/vips/dbuf.h new file mode 100644 index 0000000..89c825c --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/dbuf.h @@ -0,0 +1,101 @@ +/* A dynamic memory buffer that expands as you write. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_DBUF_H +#define VIPS_DBUF_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#include + +/* A buffer in the process of being written to. + */ + +typedef struct _VipsDbuf { + /* All fields are private. + */ + /*< private >*/ + + /* The current base, and the size of the allocated memory area. + */ + unsigned char *data; + size_t allocated_size; + + /* The size of the actual data that's been written. This will usually + * be <= allocated_size, but always >= write_point. + */ + size_t data_size; + + /* The write point. + */ + size_t write_point; + +} VipsDbuf; + +VIPS_API +void vips_dbuf_init(VipsDbuf *dbuf); +VIPS_API +gboolean vips_dbuf_minimum_size(VipsDbuf *dbuf, size_t size); +VIPS_API +gboolean vips_dbuf_allocate(VipsDbuf *dbuf, size_t size); +VIPS_API +size_t vips_dbuf_read(VipsDbuf *dbuf, unsigned char *data, size_t size); +VIPS_API +unsigned char *vips_dbuf_get_write(VipsDbuf *dbuf, size_t *size); +VIPS_API +gboolean vips_dbuf_write(VipsDbuf *dbuf, + const unsigned char *data, size_t size); +VIPS_API +gboolean vips_dbuf_writef(VipsDbuf *dbuf, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_API +gboolean vips_dbuf_write_amp(VipsDbuf *dbuf, const char *str); +VIPS_API +void vips_dbuf_reset(VipsDbuf *dbuf); +VIPS_API +void vips_dbuf_destroy(VipsDbuf *dbuf); +VIPS_API +gboolean vips_dbuf_seek(VipsDbuf *dbuf, off_t offset, int whence); +VIPS_API +void vips_dbuf_truncate(VipsDbuf *dbuf); +VIPS_API +off_t vips_dbuf_tell(VipsDbuf *dbuf); +VIPS_API +unsigned char *vips_dbuf_string(VipsDbuf *dbuf, size_t *size); +VIPS_API +unsigned char *vips_dbuf_steal(VipsDbuf *dbuf, size_t *size); + +#endif /*VIPS_DBUF_H*/ + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/debug.h b/jtlsrv-cpp/.static-build/include/vips/debug.h new file mode 100644 index 0000000..667587d --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/debug.h @@ -0,0 +1,106 @@ +/* Support for debug.c in iofuncs. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_DEBUG_H +#define VIPS_DEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#ifdef VIPS_DEBUG +#define VIPS_DEBUG_MSG(...) \ + G_STMT_START \ + { \ + printf(__VA_ARGS__); \ + } \ + G_STMT_END +#else +#define VIPS_DEBUG_MSG(...) \ + G_STMT_START \ + { \ + ; \ + } \ + G_STMT_END +#endif /*VIPS_DEBUG*/ + +#ifdef VIPS_DEBUG_RED +#define VIPS_DEBUG_MSG_RED(...) \ + G_STMT_START \ + { \ + printf("red: " __VA_ARGS__); \ + } \ + G_STMT_END +#else +#define VIPS_DEBUG_MSG_RED(...) \ + G_STMT_START \ + { \ + ; \ + } \ + G_STMT_END +#endif /*VIPS_DEBUG_RED*/ + +#ifdef VIPS_DEBUG_AMBER +#define VIPS_DEBUG_MSG_AMBER(...) \ + G_STMT_START \ + { \ + printf("amber: " __VA_ARGS__); \ + } \ + G_STMT_END +#else +#define VIPS_DEBUG_MSG_AMBER(...) \ + G_STMT_START \ + { \ + ; \ + } \ + G_STMT_END +#endif /*VIPS_DEBUG_AMBER*/ + +#ifdef VIPS_DEBUG_GREEN +#define VIPS_DEBUG_MSG_GREEN(...) \ + G_STMT_START \ + { \ + printf("green: " __VA_ARGS__); \ + } \ + G_STMT_END +#else +#define VIPS_DEBUG_MSG_GREEN(...) \ + G_STMT_START \ + { \ + ; \ + } \ + G_STMT_END +#endif /*VIPS_DEBUG_GREEN*/ + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /* VIPS_DEBUG_H */ diff --git a/jtlsrv-cpp/.static-build/include/vips/deprecated.h b/jtlsrv-cpp/.static-build/include/vips/deprecated.h new file mode 100644 index 0000000..e4fb038 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/deprecated.h @@ -0,0 +1,155 @@ +/* Old and broken stuff we do not enable by default + * + * 30/6/09 + * - from vips.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef IM_DEPRECATED_H +#define IM_DEPRECATED_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* On win32, need to override the wingdi defs for these. Yuk! + */ +#ifdef G_OS_WIN32 +#ifdef RGB +#undef RGB +#endif +#ifdef CMYK +#undef CMYK +#endif +#endif /*G_OS_WIN32*/ + +/* Bits per Band */ +#define BBBYTE 8 +#define BBSHORT 16 +#define BBINT 32 +#define BBFLOAT 32 +#define BBCOMPLEX 64 /* complex consisting of two floats */ +#define BBDOUBLE 64 +#define BBDPCOMPLEX 128 /* complex consisting of two doubles */ + +/* picture Type */ +#define MULTIBAND 0 +#define B_W 1 +#define LUMINACE 2 +#define XRAY 3 +#define IR 4 +#define YUV 5 +#define RED_ONLY 6 /* red channel only */ +#define GREEN_ONLY 7 /* green channel only */ +#define BLUE_ONLY 8 /* blue channel only */ +#define POWER_SPECTRUM 9 +#define HISTOGRAM 10 +#define FOURIER 24 + +/* Colour spaces. + */ +#define LUT 11 +#define XYZ 12 +#define LAB 13 +#define CMC 14 +#define CMYK 15 +#define LABQ 16 +#define RGB 17 +#define UCS 18 +#define LCH 19 +#define LABS 21 +#define sRGB 22 +#define YXY 23 + +/* BandFmt + */ +#define FMTNOTSET -1 +#define FMTUCHAR 0 /* pels interpreted as unsigned chars */ +#define FMTCHAR 1 /* pels interpreted as signed chars */ +#define FMTUSHORT 2 /* pels interpreted as unsigned shorts */ +#define FMTSHORT 3 /* pels interpreted as signed shorts */ +#define FMTUINT 4 /* pels interpreted as unsigned ints */ +#define FMTINT 5 /* pels interpreted as signed ints */ +#define FMTFLOAT 6 /* pels interpreted as floats */ +#define FMTCOMPLEX 7 /* pels interpreted as complex (2 float each) */ +#define FMTDOUBLE 8 /* pels interpreted as unsigned double */ +#define FMTDPCOMPLEX 9 /* pels interpreted as complex (2 double each)*/ + +/* Coding type + */ +#define NOCODING 0 +#define COLQUANT 1 +#define LABPACK 2 +#define LABPACK_COMPRESSED 3 +#define RGB_COMPRESSED 4 +#define LUM_COMPRESSED 5 + +/* Compression type + */ +#define NO_COMPRESSION 0 +#define TCSF_COMPRESSION 1 +#define JPEG_COMPRESSION 2 + +#define esize(I) IM_IMAGE_SIZEOF_ELEMENT(I) +#define psize(I) IM_IMAGE_SIZEOF_PEL(I) +#define lsize(I) IM_IMAGE_SIZEOF_LINE(I) +#define niele(I) IM_IMAGE_N_ELEMENTS(I) + +#define lskip(B) IM_REGION_LSKIP(B) +#define nele(B) IM_REGION_N_ELEMENTS(B) +#define rsize(B) IM_REGION_SIZEOF_LINE(B) + +#define addr(B, X, Y) IM_REGION_ADDR(B, X, Y) + +#ifndef MAX +#define MAX(A, B) IM_MAX(A, B) +#define MIN(A, B) IM_MIN(A, B) +#endif /*MAX*/ + +#define CLIP(A, V, B) IM_CLIP(A, V, B) +#define NEW(IM, A) IM_NEW(IM, A) +#define NUMBER(R) IM_NUMBER(R) +#define ARRAY(IM, N, T) IM_ARRAY(IM, N, T) + +#define RINT(R) IM_RINT(R) + +#define CLIP_UCHAR(V, SEQ) IM_CLIP_UCHAR(V, SEQ) +#define CLIP_USHORT(V, SEQ) IM_CLIP_USHORT(V, SEQ) +#define CLIP_CHAR(V, SEQ) IM_CLIP_CHAR(V, SEQ) +#define CLIP_SHORT(V, SEQ) IM_CLIP_SHORT(V, SEQ) +#define CLIP_NONE(V, SEQ) IM_CLIP_NONE(V, SEQ) + +#define right(R) IM_RECT_RIGHT(R) +#define bottom(R) IM_RECT_BOTTOM(R) + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*IM_DEPRECATED_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/dispatch.h b/jtlsrv-cpp/.static-build/include/vips/dispatch.h new file mode 100644 index 0000000..bbe5954 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/dispatch.h @@ -0,0 +1,388 @@ +/* VIPS function dispatch. + * + * J. Cupitt, 8/4/93. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef IM_DISPATCH_H +#define IM_DISPATCH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#include +#include + +/* Type names. You may define your own, but if you use one of these, then + * you should use the built-in VIPS type converters. + */ +#define IM_TYPE_IMAGEVEC "imagevec" /* im_object is ptr to IMAGE[] */ +#define IM_TYPE_DOUBLEVEC "doublevec" /* im_object is ptr to double[] */ +#define IM_TYPE_INTVEC "intvec" /* im_object is ptr to int[] */ +#define IM_TYPE_DOUBLE "double" /* im_object is ptr to double */ +#define IM_TYPE_INT "integer" /* 32-bit integer */ +#define IM_TYPE_COMPLEX "complex" /* Pair of doubles */ +#define IM_TYPE_STRING "string" /* Zero-terminated char array */ +#define IM_TYPE_IMASK "intmask" /* Integer mask type */ +#define IM_TYPE_DMASK "doublemask" /* Double mask type */ +#define IM_TYPE_IMAGE "image" /* IMAGE descriptor */ +#define IM_TYPE_DISPLAY "display" /* Display descriptor */ +#define IM_TYPE_GVALUE "gvalue" /* GValue wrapper */ +#define IM_TYPE_INTERPOLATE "interpolate" /* A subclass of VipsInterpolate */ +typedef char *im_arg_type; /* Type of argument id */ + +/* Internal representation of an argument to an image processing function. + */ +typedef void *im_object; + +/* These bits are ored together to make the flags in a type descriptor. + * + * IM_TYPE_OUTPUT: set to indicate output, otherwise input. If the IM_TYPE_RW + * bit is set and IM_TYPE_OUTPUT is not set, both input and output (ie. the + * operation side-effects this argument). + * + * IM_TYPE_ARG: Two ways of making an im_object --- with and without a + * command-line string to help you along. Arguments with a string are thing + * like IMAGE descriptors, which require a filename to initialise. + * Arguments without are things like output numbers, where making the object + * simply involves allocating storage. + */ +typedef enum { + IM_TYPE_NONE = 0, /* No flags */ + IM_TYPE_OUTPUT = 0x1, /* Output/input object */ + IM_TYPE_ARG = 0x2, /* Uses a str arg in construction */ + IM_TYPE_RW = 0x4 /* Read-write */ +} im_type_flags; + +/* Initialise, destroy and write objects. The "str" argument to the + * init function will not be supplied if this is not an ARG type. The + * write function writes to the GString. + */ +typedef int (*im_init_obj_fn)(im_object *obj, char *str); +typedef int (*im_dest_obj_fn)(im_object obj); + +/* Describe a VIPS type. + */ +typedef struct { + im_arg_type type; /* Type of argument */ + int size; /* sizeof(im_object repres.) */ + im_type_flags flags; /* Flags */ + im_init_obj_fn init; /* Operation functions */ + im_dest_obj_fn dest; /* Destroy object */ +} im_type_desc; + +/* Success on an argument. This is called if the image processing function + * succeeds and should be used to (for example) print output. + */ +typedef int (*im_print_obj_fn)(im_object obj); + +/* Describe a VIPS command argument. + */ +typedef struct { + char *name; /* eg. "width" */ + im_type_desc *desc; /* Type description */ + im_print_obj_fn print; /* Print some output objects */ +} im_arg_desc; + +/* Type of VIPS dispatch function. + */ +typedef int (*im_dispatch_fn)(im_object *argv); + +/* Maximum size of arg table. + */ +#define IM_MAX_ARGS (1000) + +/* Flags for functions. These are for information only, and more may be + * added. + */ +typedef enum { + IM_FN_NONE = 0, /* No flags set */ + IM_FN_PIO = 0x1, /* Is a partial function */ + IM_FN_TRANSFORM = 0x2, /* Performs coordinate transformations */ + IM_FN_PTOP = 0x4, /* Point-to-point ... can be done with a LUT */ + IM_FN_NOCACHE = 0x8 /* Result should not be cached */ +} im_fn_flags; + +/* Describe a VIPS function. + */ +typedef struct { + char *name; /* eg "im_invert" */ + char *desc; /* Description - eg "photographic negative" */ + im_fn_flags flags; /* Flags for this function */ + im_dispatch_fn disp; /* Dispatch */ + int argc; /* Number of args */ + im_arg_desc *argv; /* Arg table */ +} im_function; + +/* A set of VIPS functions forming a package. + */ +typedef struct { + char *name; /* Package name (eg "arithmetic") */ + int nfuncs; /* Number of functions in package */ + im_function **table; /* Array of function descriptors */ +} im_package; + +/* Externs for dispatch. + */ + +/* Struct for mask IO to a file. + */ +typedef struct { + char *name; /* Command-line name in */ + void *mask; /* Mask --- DOUBLE or INT */ +} im_mask_object; + +/* Struct for doublevec IO + */ +typedef struct { + int n; /* Vector length */ + double *vec; /* Vector */ +} im_doublevec_object; + +/* Struct for intvec IO + */ +typedef struct { + int n; /* Vector length */ + int *vec; /* Vector */ +} im_intvec_object; + +/* Struct for imagevec IO + */ +typedef struct { + int n; /* Vector length */ + IMAGE **vec; /* Vector */ +} im_imagevec_object; + +/* Built-in VIPS types. + */ +VIPS_DEPRECATED im_type_desc im__input_int; +VIPS_DEPRECATED im_type_desc im__input_intvec; +VIPS_DEPRECATED im_type_desc im__input_imask; +VIPS_DEPRECATED im_type_desc im__output_int; +VIPS_DEPRECATED im_type_desc im__output_intvec; +VIPS_DEPRECATED im_type_desc im__output_imask; + +VIPS_DEPRECATED im_type_desc im__input_double; +VIPS_DEPRECATED im_type_desc im__input_doublevec; +VIPS_DEPRECATED im_type_desc im__input_dmask; +VIPS_DEPRECATED im_type_desc im__output_double; +VIPS_DEPRECATED im_type_desc im__output_doublevec; +VIPS_DEPRECATED im_type_desc im__output_dmask; +VIPS_DEPRECATED im_type_desc im__output_dmask_screen; + +VIPS_DEPRECATED im_type_desc im__output_complex; + +VIPS_DEPRECATED im_type_desc im__input_string; +VIPS_DEPRECATED im_type_desc im__output_string; + +VIPS_DEPRECATED im_type_desc im__input_imagevec; +VIPS_DEPRECATED im_type_desc im__input_image; +VIPS_DEPRECATED im_type_desc im__output_image; +VIPS_DEPRECATED im_type_desc im__rw_image; + +VIPS_DEPRECATED im_type_desc im__input_display; +VIPS_DEPRECATED im_type_desc im__output_display; + +VIPS_DEPRECATED im_type_desc im__input_gvalue; +VIPS_DEPRECATED im_type_desc im__output_gvalue; + +VIPS_DEPRECATED im_type_desc im__input_interpolate; + +/* VIPS print functions. + */ +VIPS_DEPRECATED int im__iprint(im_object obj); /* int */ +VIPS_DEPRECATED int im__ivprint(im_object obj); /* intvec */ +VIPS_DEPRECATED int im__dprint(im_object obj); /* double */ +VIPS_DEPRECATED int im__dvprint(im_object obj); /* doublevec */ +VIPS_DEPRECATED int im__dmsprint(im_object obj); /* DOUBLEMASK as stats */ +VIPS_DEPRECATED int im__cprint(im_object obj); /* complex */ +VIPS_DEPRECATED int im__sprint(im_object obj); /* string */ +VIPS_DEPRECATED int im__displayprint(im_object obj);/* im_col_display */ +VIPS_DEPRECATED int im__gprint(im_object obj); /* GValue */ + +/* Macros for convenient creation. + */ +#define IM_INPUT_INT(S) \ + { \ + S, &im__input_int, NULL \ + } +#define IM_INPUT_INTVEC(S) \ + { \ + S, &im__input_intvec, NULL \ + } +#define IM_INPUT_IMASK(S) \ + { \ + S, &im__input_imask, NULL \ + } +#define IM_OUTPUT_INT(S) \ + { \ + S, &im__output_int, im__iprint \ + } +#define IM_OUTPUT_INTVEC(S) \ + { \ + S, &im__output_intvec, im__ivprint \ + } +#define IM_OUTPUT_IMASK(S) \ + { \ + S, &im__output_imask, NULL \ + } + +#define IM_INPUT_DOUBLE(S) \ + { \ + S, &im__input_double, NULL \ + } +#define IM_INPUT_DOUBLEVEC(S) \ + { \ + S, &im__input_doublevec, NULL \ + } +#define IM_INPUT_DMASK(S) \ + { \ + S, &im__input_dmask, NULL \ + } +#define IM_OUTPUT_DOUBLE(S) \ + { \ + S, &im__output_double, im__dprint \ + } +#define IM_OUTPUT_DOUBLEVEC(S) \ + { \ + S, &im__output_doublevec, im__dvprint \ + } +#define IM_OUTPUT_DMASK(S) \ + { \ + S, &im__output_dmask, NULL \ + } +#define IM_OUTPUT_DMASK_STATS(S) \ + { \ + S, &im__output_dmask_screen, im__dmsprint \ + } + +#define IM_OUTPUT_COMPLEX(S) \ + { \ + S, &im__output_complex, im__cprint \ + } + +#define IM_INPUT_STRING(S) \ + { \ + S, &im__input_string, NULL \ + } +#define IM_OUTPUT_STRING(S) \ + { \ + S, &im__output_string, im__sprint \ + } + +#define IM_INPUT_IMAGE(S) \ + { \ + S, &im__input_image, NULL \ + } +#define IM_INPUT_IMAGEVEC(S) \ + { \ + S, &im__input_imagevec, NULL \ + } +#define IM_OUTPUT_IMAGE(S) \ + { \ + S, &im__output_image, NULL \ + } +#define IM_RW_IMAGE(S) \ + { \ + S, &im__rw_image, NULL \ + } + +#define IM_INPUT_DISPLAY(S) \ + { \ + S, &im__input_display, NULL \ + } +#define IM_OUTPUT_DISPLAY(S) \ + { \ + S, &im__output_display, im__displayprint \ + } + +#define IM_INPUT_GVALUE(S) \ + { \ + S, &im__input_gvalue, NULL \ + } +#define IM_OUTPUT_GVALUE(S) \ + { \ + S, &im__output_gvalue, im__gprint \ + } + +#define IM_INPUT_INTERPOLATE(S) \ + { \ + S, &im__input_interpolate, NULL \ + } + +/* Add a plug-in package. + */ +VIPS_DEPRECATED +im_package *im_load_plugin(const char *name); +VIPS_DEPRECATED +int im_load_plugins(const char *fmt, ...) + G_GNUC_PRINTF(1, 2); + +/* Close all plug-ins. + */ +VIPS_DEPRECATED +int im_close_plugins(void); + +/* Loop over all loaded packages. + */ +VIPS_DEPRECATED +void *im_map_packages(VipsSListMap2Fn fn, void *a); + +/* Convenience functions for finding packages, functions, etc. + */ +VIPS_DEPRECATED +im_function *im_find_function(const char *name); +VIPS_DEPRECATED +im_package *im_find_package(const char *name); +VIPS_DEPRECATED +im_package *im_package_of_function(const char *name); + +/* Allocate space for, and free im_object argument lists. + */ +VIPS_DEPRECATED +int im_free_vargv(im_function *fn, im_object *vargv); +VIPS_DEPRECATED +int im_allocate_vargv(im_function *fn, im_object *vargv); + +/* Run a VIPS command by name. + */ +VIPS_DEPRECATED +int im_run_command(char *name, int argc, char **argv); + +VIPS_DEPRECATED +int vips__input_interpolate_init(im_object *obj, char *str); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*IM_DISPATCH_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/draw.h b/jtlsrv-cpp/.static-build/include/vips/draw.h new file mode 100644 index 0000000..486c90f --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/draw.h @@ -0,0 +1,113 @@ +/* draw.h + * + * 3/11/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_DRAW_H +#define VIPS_DRAW_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_COMBINE_MODE_SET, + VIPS_COMBINE_MODE_ADD, + VIPS_COMBINE_MODE_LAST +} VipsCombineMode; + +VIPS_API +int vips_draw_rect(VipsImage *image, + double *ink, int n, int left, int top, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_rect1(VipsImage *image, + double ink, int left, int top, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_point(VipsImage *image, double *ink, int n, int x, int y, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_point1(VipsImage *image, double ink, int x, int y, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_image(VipsImage *image, VipsImage *sub, int x, int y, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_mask(VipsImage *image, + double *ink, int n, VipsImage *mask, int x, int y, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_mask1(VipsImage *image, + double ink, VipsImage *mask, int x, int y, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_line(VipsImage *image, + double *ink, int n, int x1, int y1, int x2, int y2, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_line1(VipsImage *image, + double ink, int x1, int y1, int x2, int y2, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_circle(VipsImage *image, + double *ink, int n, int cx, int cy, int radius, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_circle1(VipsImage *image, + double ink, int cx, int cy, int radius, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_flood(VipsImage *image, double *ink, int n, int x, int y, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_draw_flood1(VipsImage *image, double ink, int x, int y, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_draw_smudge(VipsImage *image, + int left, int top, int width, int height, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_DRAW_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/enumtypes.h b/jtlsrv-cpp/.static-build/include/vips/enumtypes.h new file mode 100644 index 0000000..59e3fa0 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/enumtypes.h @@ -0,0 +1,188 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + +#ifndef VIPS_ENUM_TYPES_H +#define VIPS_ENUM_TYPES_H + +G_BEGIN_DECLS +/* enumerations from "almostdeprecated.h" */ +VIPS_API +GType vips_foreign_jpeg_subsample_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_JPEG_SUBSAMPLE (vips_foreign_jpeg_subsample_get_type()) +/* enumerations from "arithmetic.h" */ +VIPS_API +GType vips_operation_math_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_MATH (vips_operation_math_get_type()) +VIPS_API +GType vips_operation_math2_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_MATH2 (vips_operation_math2_get_type()) +VIPS_API +GType vips_operation_round_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_ROUND (vips_operation_round_get_type()) +VIPS_API +GType vips_operation_relational_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_RELATIONAL (vips_operation_relational_get_type()) +VIPS_API +GType vips_operation_boolean_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_BOOLEAN (vips_operation_boolean_get_type()) +VIPS_API +GType vips_operation_complex_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_COMPLEX (vips_operation_complex_get_type()) +VIPS_API +GType vips_operation_complex2_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_COMPLEX2 (vips_operation_complex2_get_type()) +VIPS_API +GType vips_operation_complexget_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_COMPLEXGET (vips_operation_complexget_get_type()) +/* enumerations from "basic.h" */ +VIPS_API +GType vips_precision_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_PRECISION (vips_precision_get_type()) +/* enumerations from "colour.h" */ +VIPS_API +GType vips_intent_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_INTENT (vips_intent_get_type()) +VIPS_API +GType vips_pcs_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_PCS (vips_pcs_get_type()) +/* enumerations from "conversion.h" */ +VIPS_API +GType vips_extend_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_EXTEND (vips_extend_get_type()) +VIPS_API +GType vips_compass_direction_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_COMPASS_DIRECTION (vips_compass_direction_get_type()) +VIPS_API +GType vips_direction_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_DIRECTION (vips_direction_get_type()) +VIPS_API +GType vips_align_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_ALIGN (vips_align_get_type()) +VIPS_API +GType vips_angle_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_ANGLE (vips_angle_get_type()) +VIPS_API +GType vips_angle45_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_ANGLE45 (vips_angle45_get_type()) +VIPS_API +GType vips_interesting_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_INTERESTING (vips_interesting_get_type()) +VIPS_API +GType vips_blend_mode_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_BLEND_MODE (vips_blend_mode_get_type()) +/* enumerations from "convolution.h" */ +VIPS_API +GType vips_combine_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_COMBINE (vips_combine_get_type()) +/* enumerations from "create.h" */ +VIPS_API +GType vips_text_wrap_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_TEXT_WRAP (vips_text_wrap_get_type()) +VIPS_API +GType vips_sdf_shape_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_SDF_SHAPE (vips_sdf_shape_get_type()) +/* enumerations from "draw.h" */ +VIPS_API +GType vips_combine_mode_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_COMBINE_MODE (vips_combine_mode_get_type()) +/* enumerations from "foreign.h" */ +VIPS_API +GType vips_foreign_flags_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_FLAGS (vips_foreign_flags_get_type()) +VIPS_API +GType vips_fail_on_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FAIL_ON (vips_fail_on_get_type()) +VIPS_API +GType vips_saveable_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_SAVEABLE (vips_saveable_get_type()) +VIPS_API +GType vips_foreign_keep_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_KEEP (vips_foreign_keep_get_type()) +VIPS_API +GType vips_foreign_subsample_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_SUBSAMPLE (vips_foreign_subsample_get_type()) +VIPS_API +GType vips_foreign_webp_preset_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_WEBP_PRESET (vips_foreign_webp_preset_get_type()) +VIPS_API +GType vips_foreign_tiff_compression_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_TIFF_COMPRESSION (vips_foreign_tiff_compression_get_type()) +VIPS_API +GType vips_foreign_tiff_predictor_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_TIFF_PREDICTOR (vips_foreign_tiff_predictor_get_type()) +VIPS_API +GType vips_foreign_tiff_resunit_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_TIFF_RESUNIT (vips_foreign_tiff_resunit_get_type()) +VIPS_API +GType vips_foreign_png_filter_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_PNG_FILTER (vips_foreign_png_filter_get_type()) +VIPS_API +GType vips_foreign_ppm_format_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_PPM_FORMAT (vips_foreign_ppm_format_get_type()) +VIPS_API +GType vips_foreign_dz_layout_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_DZ_LAYOUT (vips_foreign_dz_layout_get_type()) +VIPS_API +GType vips_foreign_dz_depth_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_DZ_DEPTH (vips_foreign_dz_depth_get_type()) +VIPS_API +GType vips_foreign_dz_container_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_DZ_CONTAINER (vips_foreign_dz_container_get_type()) +VIPS_API +GType vips_foreign_heif_compression_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type()) +VIPS_API +GType vips_foreign_heif_encoder_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_HEIF_ENCODER (vips_foreign_heif_encoder_get_type()) +/* enumerations from "image.h" */ +VIPS_API +GType vips_demand_style_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type()) +VIPS_API +GType vips_image_type_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_IMAGE_TYPE (vips_image_type_get_type()) +VIPS_API +GType vips_interpretation_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type()) +VIPS_API +GType vips_band_format_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_BAND_FORMAT (vips_band_format_get_type()) +VIPS_API +GType vips_coding_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_CODING (vips_coding_get_type()) +VIPS_API +GType vips_access_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_ACCESS (vips_access_get_type()) +/* enumerations from "morphology.h" */ +VIPS_API +GType vips_operation_morphology_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_MORPHOLOGY (vips_operation_morphology_get_type()) +/* enumerations from "object.h" */ +VIPS_API +GType vips_argument_flags_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_ARGUMENT_FLAGS (vips_argument_flags_get_type()) +/* enumerations from "operation.h" */ +VIPS_API +GType vips_operation_flags_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_OPERATION_FLAGS (vips_operation_flags_get_type()) +/* enumerations from "region.h" */ +VIPS_API +GType vips_region_shrink_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_REGION_SHRINK (vips_region_shrink_get_type()) +/* enumerations from "resample.h" */ +VIPS_API +GType vips_kernel_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_KERNEL (vips_kernel_get_type()) +VIPS_API +GType vips_size_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_SIZE (vips_size_get_type()) +/* enumerations from "util.h" */ +VIPS_API +GType vips_token_get_type(void) G_GNUC_CONST; +#define VIPS_TYPE_TOKEN (vips_token_get_type()) +G_END_DECLS + +#endif /*VIPS_ENUM_TYPES_H*/ + +/* Generated data ends here */ + diff --git a/jtlsrv-cpp/.static-build/include/vips/error.h b/jtlsrv-cpp/.static-build/include/vips/error.h new file mode 100644 index 0000000..4da6985 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/error.h @@ -0,0 +1,142 @@ +/* Error handling. + */ + +/* + + Copyright (C) 1991-2005 The National Gallery + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_ERROR_H +#define VIPS_ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +VIPS_API +const char *vips_error_buffer(void); +VIPS_API +char *vips_error_buffer_copy(void); +VIPS_API +void vips_error_clear(void); + +VIPS_API +void vips_error_freeze(void); +VIPS_API +void vips_error_thaw(void); + +VIPS_API +void vips_error(const char *domain, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); +VIPS_API +void vips_verror(const char *domain, const char *fmt, va_list ap); +VIPS_API +void vips_error_system(int err, const char *domain, const char *fmt, ...) + G_GNUC_PRINTF(3, 4); +VIPS_API +void vips_verror_system(int err, const char *domain, + const char *fmt, va_list ap); +VIPS_API +void vips_error_g(GError **error); +VIPS_API +void vips_g_error(GError **error); + +VIPS_API +void vips_error_exit(const char *fmt, ...) + G_GNUC_NORETURN G_GNUC_PRINTF(1, 2); + +VIPS_API +int vips_check_uncoded(const char *domain, VipsImage *im); +VIPS_API +int vips_check_coding(const char *domain, VipsImage *im, VipsCoding coding); +VIPS_API +int vips_check_coding_known(const char *domain, VipsImage *im); +VIPS_API +int vips_check_coding_noneorlabq(const char *domain, VipsImage *im); +VIPS_API +int vips_check_coding_same(const char *domain, VipsImage *im1, VipsImage *im2); +VIPS_API +int vips_check_mono(const char *domain, VipsImage *im); +VIPS_API +int vips_check_bands(const char *domain, VipsImage *im, int bands); +VIPS_API +int vips_check_bands_1or3(const char *domain, VipsImage *im); +VIPS_API +int vips_check_bands_atleast(const char *domain, VipsImage *im, int bands); +VIPS_API +int vips_check_bands_1orn(const char *domain, VipsImage *im1, VipsImage *im2); +VIPS_API +int vips_check_bands_1orn_unary(const char *domain, VipsImage *im, int n); +VIPS_API +int vips_check_bands_same(const char *domain, VipsImage *im1, VipsImage *im2); +VIPS_API +int vips_check_bandno(const char *domain, VipsImage *im, int bandno); + +VIPS_API +int vips_check_int(const char *domain, VipsImage *im); +VIPS_API +int vips_check_uint(const char *domain, VipsImage *im); +VIPS_API +int vips_check_uintorf(const char *domain, VipsImage *im); +VIPS_API +int vips_check_noncomplex(const char *domain, VipsImage *im); +VIPS_API +int vips_check_complex(const char *domain, VipsImage *im); +VIPS_API +int vips_check_twocomponents(const char *domain, VipsImage *im); +VIPS_API +int vips_check_format(const char *domain, VipsImage *im, VipsBandFormat fmt); +VIPS_API +int vips_check_u8or16(const char *domain, VipsImage *im); +VIPS_API +int vips_check_8or16(const char *domain, VipsImage *im); +VIPS_API +int vips_check_u8or16orf(const char *domain, VipsImage *im); +VIPS_API +int vips_check_format_same(const char *domain, VipsImage *im1, VipsImage *im2); +VIPS_API +int vips_check_size_same(const char *domain, VipsImage *im1, VipsImage *im2); +VIPS_API +int vips_check_oddsquare(const char *domain, VipsImage *im); +VIPS_API +int vips_check_vector_length(const char *domain, int n, int len); +VIPS_API +int vips_check_vector(const char *domain, int n, VipsImage *im); +VIPS_API +int vips_check_hist(const char *domain, VipsImage *im); +VIPS_API +int vips_check_matrix(const char *domain, VipsImage *im, VipsImage **out); +VIPS_API +int vips_check_separable(const char *domain, VipsImage *im); + +VIPS_API +int vips_check_precision_intfloat(const char *domain, + VipsPrecision precision); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_ERROR_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/foreign.h b/jtlsrv-cpp/.static-build/include/vips/foreign.h new file mode 100644 index 0000000..f2e7134 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/foreign.h @@ -0,0 +1,1019 @@ +/* Base type for supported image formats. Subclass this to add a new + * format. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_FOREIGN_H +#define VIPS_FOREIGN_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_FOREIGN (vips_foreign_get_type()) +#define VIPS_FOREIGN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_FOREIGN, VipsForeign)) +#define VIPS_FOREIGN_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_FOREIGN, VipsForeignClass)) +#define VIPS_IS_FOREIGN(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_FOREIGN)) +#define VIPS_IS_FOREIGN_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_FOREIGN)) +#define VIPS_FOREIGN_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_FOREIGN, VipsForeignClass)) + +typedef struct _VipsForeign { + VipsOperation parent_object; + + /*< public >*/ + +} VipsForeign; + +typedef struct _VipsForeignClass { + VipsOperationClass parent_class; + + /*< public >*/ + + /* Loop over formats in this order, default 0. We need this because + * some formats can be read by several loaders (eg. tiff can be read + * by the libMagick loader as well as by the tiff loader), and we want + * to make sure the better loader comes first. + */ + int priority; + + /* Null-terminated list of recommended suffixes, eg. ".tif", ".tiff". + * This can be used by both load and save, so it's in the base class. + */ + const char **suffs; + +} VipsForeignClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_foreign_get_type(void); + +/* Map over and find formats. This uses type introspection to loop over + * subclasses of VipsForeign. + */ +VIPS_API +void *vips_foreign_map(const char *base, + VipsSListMap2Fn fn, void *a, void *b); + +/* Image file load properties. + * + * Keep in sync with the deprecated VipsFormatFlags, we need to be able to + * cast between them. + */ +typedef enum /*< flags >*/ { + VIPS_FOREIGN_NONE = 0, /* No flags set */ + VIPS_FOREIGN_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ + VIPS_FOREIGN_BIGENDIAN = 2, /* Most-significant byte first */ + VIPS_FOREIGN_SEQUENTIAL = 4, /* Top-to-bottom lazy read OK */ + VIPS_FOREIGN_ALL = 7 /* All flags set */ +} VipsForeignFlags; + +/** + * VipsFailOn: + * @VIPS_FAIL_ON_NONE: never stop + * @VIPS_FAIL_ON_TRUNCATED: stop on image truncated, nothing else + * @VIPS_FAIL_ON_ERROR: stop on serious error or truncation + * @VIPS_FAIL_ON_WARNING: stop on anything, even warnings + * + * How sensitive loaders are to errors, from never stop (very insensitive), to + * stop on the smallest warning (very sensitive). + * + * Each one implies the ones before it, so #VIPS_FAIL_ON_ERROR implies + * #VIPS_FAIL_ON_TRUNCATED. + */ +typedef enum { + VIPS_FAIL_ON_NONE, + VIPS_FAIL_ON_TRUNCATED, + VIPS_FAIL_ON_ERROR, + VIPS_FAIL_ON_WARNING, + VIPS_FAIL_ON_LAST +} VipsFailOn; + +#define VIPS_TYPE_FOREIGN_LOAD (vips_foreign_load_get_type()) +#define VIPS_FOREIGN_LOAD(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad)) +#define VIPS_FOREIGN_LOAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass)) +#define VIPS_IS_FOREIGN_LOAD(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_FOREIGN_LOAD)) +#define VIPS_IS_FOREIGN_LOAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_FOREIGN_LOAD)) +#define VIPS_FOREIGN_LOAD_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass)) + +typedef struct _VipsForeignLoad { + VipsForeign parent_object; + /*< private >*/ + + /* Set TRUE to force open via memory. + */ + gboolean memory; + + /* Type of access upstream wants and the loader must supply. + */ + VipsAccess access; + + /* Flags for this load operation. + */ + VipsForeignFlags flags; + + /* Behaviour on error. + */ + VipsFailOn fail_on; + + /* Deprecated and unused. Just here for compat. + */ + gboolean fail; + gboolean sequential; + + /*< public >*/ + + /* The image we generate. This must be set by ->header(). + */ + VipsImage *out; + + /* The behind-the-scenes real image we decompress to. This can be a + * disc file or a memory buffer. This must be set by ->load(). + */ + VipsImage *real; + + /* Set this to tag the operation as nocache. + */ + gboolean nocache; + + /* Deprecated: the memory option used to be called disc and default + * TRUE. + */ + gboolean disc; + + /* Set if a start function fails. We want to prevent the other starts + * from also triggering the load. + */ + gboolean error; + + /* Set by "revalidate": set the REVALIDATE flag for this operation to + * force it to execute. + */ + gboolean revalidate; +} VipsForeignLoad; + +typedef struct _VipsForeignLoadClass { + VipsForeignClass parent_class; + /*< public >*/ + + /* Is a file in this format. + * + * This function should return %TRUE if the file contains an image of + * this type. If you don't define this function, #VipsForeignLoad + * will use @suffs instead. + */ + gboolean (*is_a)(const char *filename); + + /* Is a buffer in this format. + * + * This function should return %TRUE if the buffer contains an image of + * this type. + */ + gboolean (*is_a_buffer)(const void *data, size_t size); + + /* Is a stream in this format. + * + * This function should return %TRUE if the stream contains an image of + * this type. + */ + gboolean (*is_a_source)(VipsSource *source); + + /* Get the flags from a filename. + * + * This function should examine the file and return a set + * of flags. If you don't define it, vips will default to 0 (no flags + * set). + * + * This method is necessary for vips7 compatibility. Don't define + * it if you don't need vips7. + */ + VipsForeignFlags (*get_flags_filename)(const char *filename); + + /* Get the flags for this load operation. Images can be loaded from + * (for example) memory areas rather than files, so you can't just use + * @get_flags_filename(). + */ + VipsForeignFlags (*get_flags)(VipsForeignLoad *load); + + /* Do the minimum read we can. + * + * Set the header fields in @out from @filename. If you can read the + * whole image as well with no performance cost (as with vipsload), + * or if your loader does not support reading only the header, read + * the entire image in this method and leave @load() NULL. + * + * @header() needs to set the dhint on the image .. otherwise you get + * the default SMALLTILE. + * + * Return 0 for success, -1 for error, setting vips_error(). + */ + int (*header)(VipsForeignLoad *load); + + /* Read the whole image into @real. The pixels will get copied to @out + * later. + * + * You can omit this method if you define a @header() method which + * loads the whole file. + * + * Return 0 for success, -1 for error, setting + * vips_error(). + */ + int (*load)(VipsForeignLoad *load); +} VipsForeignLoadClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_foreign_load_get_type(void); + +VIPS_API +const char *vips_foreign_find_load(const char *filename); +VIPS_API +const char *vips_foreign_find_load_buffer(const void *data, size_t size); +VIPS_API +const char *vips_foreign_find_load_source(VipsSource *source); + +VIPS_API +VipsForeignFlags vips_foreign_flags(const char *loader, const char *filename); +VIPS_API +gboolean vips_foreign_is_a(const char *loader, const char *filename); +VIPS_API +gboolean vips_foreign_is_a_buffer(const char *loader, + const void *data, size_t size); +VIPS_API +gboolean vips_foreign_is_a_source(const char *loader, + VipsSource *source); + +VIPS_API +void vips_foreign_load_invalidate(VipsImage *image); + +#define VIPS_TYPE_FOREIGN_SAVE (vips_foreign_save_get_type()) +#define VIPS_FOREIGN_SAVE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSave)) +#define VIPS_FOREIGN_SAVE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSaveClass)) +#define VIPS_IS_FOREIGN_SAVE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_FOREIGN_SAVE)) +#define VIPS_IS_FOREIGN_SAVE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_FOREIGN_SAVE)) +#define VIPS_FOREIGN_SAVE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSaveClass)) + +/** + * VipsSaveable: + * @VIPS_SAVEABLE_MONO: 1 band (eg. CSV) + * @VIPS_SAVEABLE_RGB: 1 or 3 bands (eg. PPM) + * @VIPS_SAVEABLE_RGBA: 1, 2, 3 or 4 bands (eg. PNG) + * @VIPS_SAVEABLE_RGBA_ONLY: 3 or 4 bands (eg. WEBP) + * @VIPS_SAVEABLE_RGB_CMYK: 1, 3 or 4 bands (eg. JPEG) + * @VIPS_SAVEABLE_ANY: any number of bands (eg. TIFF) + * + * See also: #VipsForeignSave. + */ +typedef enum { + VIPS_SAVEABLE_MONO, + VIPS_SAVEABLE_RGB, + VIPS_SAVEABLE_RGBA, + VIPS_SAVEABLE_RGBA_ONLY, + VIPS_SAVEABLE_RGB_CMYK, + VIPS_SAVEABLE_ANY, + VIPS_SAVEABLE_LAST +} VipsSaveable; + +/** + * VipsForeignKeep: + * @VIPS_FOREIGN_KEEP_NONE: don't attach metadata + * @VIPS_FOREIGN_KEEP_EXIF: keep Exif metadata + * @VIPS_FOREIGN_KEEP_XMP: keep XMP metadata + * @VIPS_FOREIGN_KEEP_IPTC: keep IPTC metadata + * @VIPS_FOREIGN_KEEP_ICC: keep ICC metadata + * @VIPS_FOREIGN_KEEP_OTHER: keep other metadata (e.g. PNG comments and some TIFF tags) + * @VIPS_FOREIGN_KEEP_ALL: keep all metadata + * + * Which metadata to retain. + */ +typedef enum /*< flags >*/ { + VIPS_FOREIGN_KEEP_NONE = 0, + VIPS_FOREIGN_KEEP_EXIF = 1 << 0, + VIPS_FOREIGN_KEEP_XMP = 1 << 1, + VIPS_FOREIGN_KEEP_IPTC = 1 << 2, + VIPS_FOREIGN_KEEP_ICC = 1 << 3, + VIPS_FOREIGN_KEEP_OTHER = 1 << 4, + + VIPS_FOREIGN_KEEP_ALL = (VIPS_FOREIGN_KEEP_EXIF | + VIPS_FOREIGN_KEEP_XMP | + VIPS_FOREIGN_KEEP_IPTC | + VIPS_FOREIGN_KEEP_ICC | + VIPS_FOREIGN_KEEP_OTHER), +} VipsForeignKeep; + +typedef struct _VipsForeignSave { + VipsForeign parent_object; + + /* Deprecated in favor of [keep=none] + */ + gboolean strip; + + /* Which metadata to retain. + */ + VipsForeignKeep keep; + + /* Filename of profile to embed. + */ + char *profile; + + /* If flattening out alpha, the background colour to use. Default to + * 0 (black). + */ + VipsArrayDouble *background; + + /* Set to non-zero to set the page size for multi-page save. + */ + int page_height; + + /*< public >*/ + + /* The image we are to save, as supplied by our caller. + */ + VipsImage *in; + + /* @in converted to a saveable format (eg. 8-bit RGB) according to the + * instructions you give in the class fields below. + * + * This is the image you should actually write to the output. + */ + VipsImage *ready; + +} VipsForeignSave; + +typedef struct _VipsForeignSaveClass { + VipsForeignClass parent_class; + + /*< public >*/ + + /* How this format treats bands. + * + * @saveable describes the bands that your saver can handle. For + * example, PPM images can have 1 or 3 bands (mono or RGB), so it + * uses #VIPS_SAVEABLE_RGB. + */ + VipsSaveable saveable; + + /* How this format treats band formats. + * + * @format_table describes the band formats that your saver can + * handle. For each of the 10 #VipsBandFormat values, the array + * should give the format your saver will accept. + */ + VipsBandFormat *format_table; + + /* The set of coding types this format can save. For example, jpeg can + * only save NONE, so has NONE TRUE and RAD and LABQ FALSE. + * + * Default NONE TRUE, RAD and LABQ FALSE. + */ + gboolean coding[VIPS_CODING_LAST]; +} VipsForeignSaveClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_foreign_save_get_type(void); + +VIPS_API +const char *vips_foreign_find_save(const char *filename); +VIPS_API +gchar **vips_foreign_get_suffixes(void); +VIPS_API +const char *vips_foreign_find_save_buffer(const char *suffix); +VIPS_API +const char *vips_foreign_find_save_target(const char *suffix); + +VIPS_API +int vips_vipsload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_vipsload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_vipssave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_vipssave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_openslideload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_openslideload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignSubsample: + * @VIPS_FOREIGN_SUBSAMPLE_AUTO: prevent subsampling when quality >= 90 + * @VIPS_FOREIGN_SUBSAMPLE_ON: always perform subsampling + * @VIPS_FOREIGN_SUBSAMPLE_OFF: never perform subsampling + * + * Set subsampling mode. + */ +typedef enum { + VIPS_FOREIGN_SUBSAMPLE_AUTO, + VIPS_FOREIGN_SUBSAMPLE_ON, + VIPS_FOREIGN_SUBSAMPLE_OFF, + VIPS_FOREIGN_SUBSAMPLE_LAST +} VipsForeignSubsample; + +VIPS_API +int vips_jpegload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jpegload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jpegload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_jpegsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jpegsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jpegsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jpegsave_mime(VipsImage *in, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignWebpPreset: + * @VIPS_FOREIGN_WEBP_PRESET_DEFAULT: default preset + * @VIPS_FOREIGN_WEBP_PRESET_PICTURE: digital picture, like portrait, inner shot + * @VIPS_FOREIGN_WEBP_PRESET_PHOTO: outdoor photograph, with natural lighting + * @VIPS_FOREIGN_WEBP_PRESET_DRAWING: hand or line drawing, with high-contrast details + * @VIPS_FOREIGN_WEBP_PRESET_ICON: small-sized colorful images + * @VIPS_FOREIGN_WEBP_PRESET_TEXT: text-like + * + * Tune lossy encoder settings for different image types. + */ +typedef enum { + VIPS_FOREIGN_WEBP_PRESET_DEFAULT, + VIPS_FOREIGN_WEBP_PRESET_PICTURE, + VIPS_FOREIGN_WEBP_PRESET_PHOTO, + VIPS_FOREIGN_WEBP_PRESET_DRAWING, + VIPS_FOREIGN_WEBP_PRESET_ICON, + VIPS_FOREIGN_WEBP_PRESET_TEXT, + VIPS_FOREIGN_WEBP_PRESET_LAST +} VipsForeignWebpPreset; + +VIPS_API +int vips_webpload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_webpload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_webpload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_webpsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_webpsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_webpsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_webpsave_mime(VipsImage *in, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignTiffCompression: + * @VIPS_FOREIGN_TIFF_COMPRESSION_NONE: no compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_JPEG: jpeg compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE: deflate (zip) compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS: packbits compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4: fax4 compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_LZW: LZW compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_WEBP: WEBP compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD: ZSTD compression + * @VIPS_FOREIGN_TIFF_COMPRESSION_JP2K: JP2K compression + * + * The compression types supported by the tiff writer. + * + * Use @Q to set the jpeg compression level, default 75. + * + * Use @predictor to set the lzw or deflate prediction, default horizontal. + * + * Use @lossless to set WEBP lossless compression. + * + * Use @level to set webp and zstd compression level. + */ +typedef enum { + VIPS_FOREIGN_TIFF_COMPRESSION_NONE, + VIPS_FOREIGN_TIFF_COMPRESSION_JPEG, + VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE, + VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS, + VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4, + VIPS_FOREIGN_TIFF_COMPRESSION_LZW, + VIPS_FOREIGN_TIFF_COMPRESSION_WEBP, + VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD, + VIPS_FOREIGN_TIFF_COMPRESSION_JP2K, + VIPS_FOREIGN_TIFF_COMPRESSION_LAST +} VipsForeignTiffCompression; + +/** + * VipsForeignTiffPredictor: + * @VIPS_FOREIGN_TIFF_PREDICTOR_NONE: no prediction + * @VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL: horizontal differencing + * @VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT: float predictor + * + * The predictor can help deflate and lzw compression. The values are fixed by + * the tiff library. + */ +typedef enum { + VIPS_FOREIGN_TIFF_PREDICTOR_NONE = 1, + VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL = 2, + VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT = 3, + VIPS_FOREIGN_TIFF_PREDICTOR_LAST +} VipsForeignTiffPredictor; + +/** + * VipsForeignTiffResunit: + * @VIPS_FOREIGN_TIFF_RESUNIT_CM: use centimeters + * @VIPS_FOREIGN_TIFF_RESUNIT_INCH: use inches + * + * Use inches or centimeters as the resolution unit for a tiff file. + */ +typedef enum { + VIPS_FOREIGN_TIFF_RESUNIT_CM, + VIPS_FOREIGN_TIFF_RESUNIT_INCH, + VIPS_FOREIGN_TIFF_RESUNIT_LAST +} VipsForeignTiffResunit; + +VIPS_API +int vips_tiffload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tiffload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tiffload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tiffsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tiffsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_tiffsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_openexrload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_fitsload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_fitssave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_analyzeload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_rawload(const char *filename, VipsImage **out, + int width, int height, int bands, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rawsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rawsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rawsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_csvload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_csvload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_csvsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_csvsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_matrixload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_matrixload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_matrixsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_matrixsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_matrixprint(VipsImage *in, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_magickload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_magickload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_magicksave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_magicksave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignPngFilter: + * @VIPS_FOREIGN_PNG_FILTER_NONE: no filtering + * @VIPS_FOREIGN_PNG_FILTER_SUB: difference to the left + * @VIPS_FOREIGN_PNG_FILTER_UP: difference up + * @VIPS_FOREIGN_PNG_FILTER_AVG: average of left and up + * @VIPS_FOREIGN_PNG_FILTER_PAETH: pick best neighbor predictor automatically + * @VIPS_FOREIGN_PNG_FILTER_ALL: adaptive + * + * http://www.w3.org/TR/PNG-Filters.html + * The values mirror those of png.h in libpng. + */ +typedef enum /*< flags >*/ { + VIPS_FOREIGN_PNG_FILTER_NONE = 0x08, + VIPS_FOREIGN_PNG_FILTER_SUB = 0x10, + VIPS_FOREIGN_PNG_FILTER_UP = 0x20, + VIPS_FOREIGN_PNG_FILTER_AVG = 0x40, + VIPS_FOREIGN_PNG_FILTER_PAETH = 0x80, + VIPS_FOREIGN_PNG_FILTER_ALL = 0xF8 +} VipsForeignPngFilter; + +VIPS_API +int vips_pngload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pngload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pngload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pngsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pngsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pngsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignPpmFormat: + * @VIPS_FOREIGN_PPM_FORMAT_PBM: portable bitmap + * @VIPS_FOREIGN_PPM_FORMAT_PGM: portable greymap + * @VIPS_FOREIGN_PPM_FORMAT_PPM: portable pixmap + * @VIPS_FOREIGN_PPM_FORMAT_PFM: portable float map + * @VIPS_FOREIGN_PPM_FORMAT_PNM: portable anymap + * + * The netpbm file format to save as. + * + * #VIPS_FOREIGN_PPM_FORMAT_PBM images are single bit. + * + * #VIPS_FOREIGN_PPM_FORMAT_PGM images are 8, 16, or 32-bits, one band. + * + * #VIPS_FOREIGN_PPM_FORMAT_PPM images are 8, 16, or 32-bits, three bands. + * + * #VIPS_FOREIGN_PPM_FORMAT_PFM images are 32-bit float pixels. + * + * #VIPS_FOREIGN_PPM_FORMAT_PNM images are anymap images -- the image format + * is used to pick the saver. + * + */ +typedef enum { + VIPS_FOREIGN_PPM_FORMAT_PBM, + VIPS_FOREIGN_PPM_FORMAT_PGM, + VIPS_FOREIGN_PPM_FORMAT_PPM, + VIPS_FOREIGN_PPM_FORMAT_PFM, + VIPS_FOREIGN_PPM_FORMAT_PNM, + VIPS_FOREIGN_PPM_FORMAT_LAST +} VipsForeignPpmFormat; + +VIPS_API +int vips_ppmload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_ppmload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_ppmsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_ppmsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_matload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_radload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_radload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_radload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_radsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_radsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_radsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_pdfload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pdfload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_pdfload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_svgload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_svgload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_svgload_string(const char *str, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_svgload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_gifload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gifload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gifload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_gifsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gifsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_gifsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_heifload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_heifload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_heifload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_heifsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_heifsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_heifsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_niftiload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_niftiload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_niftisave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_jp2kload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jp2kload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jp2kload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jp2ksave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jp2ksave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jp2ksave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_jxlload_source(VipsSource *source, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jxlload_buffer(void *buf, size_t len, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jxlload(const char *filename, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jxlsave(VipsImage *in, const char *filename, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jxlsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_jxlsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignDzLayout: + * @VIPS_FOREIGN_DZ_LAYOUT_DZ: use DeepZoom directory layout + * @VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY: use Zoomify directory layout + * @VIPS_FOREIGN_DZ_LAYOUT_GOOGLE: use Google maps directory layout + * @VIPS_FOREIGN_DZ_LAYOUT_IIIF: use IIIF v2 directory layout + * @VIPS_FOREIGN_DZ_LAYOUT_IIIF3: use IIIF v3 directory layout + * + * What directory layout and metadata standard to use. + */ +typedef enum { + VIPS_FOREIGN_DZ_LAYOUT_DZ, + VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY, + VIPS_FOREIGN_DZ_LAYOUT_GOOGLE, + VIPS_FOREIGN_DZ_LAYOUT_IIIF, + VIPS_FOREIGN_DZ_LAYOUT_IIIF3, + VIPS_FOREIGN_DZ_LAYOUT_LAST +} VipsForeignDzLayout; + +/** + * VipsForeignDzDepth: + * @VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL: create layers down to 1x1 pixel + * @VIPS_FOREIGN_DZ_DEPTH_ONETILE: create layers down to 1x1 tile + * @VIPS_FOREIGN_DZ_DEPTH_ONE: only create a single layer + * + * How many pyramid layers to create. + */ +typedef enum { + VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL, + VIPS_FOREIGN_DZ_DEPTH_ONETILE, + VIPS_FOREIGN_DZ_DEPTH_ONE, + VIPS_FOREIGN_DZ_DEPTH_LAST +} VipsForeignDzDepth; + +/** + * VipsForeignDzContainer: + * @VIPS_FOREIGN_DZ_CONTAINER_FS: write tiles to the filesystem + * @VIPS_FOREIGN_DZ_CONTAINER_ZIP: write tiles to a zip file + * @VIPS_FOREIGN_DZ_CONTAINER_SZI: write to a szi file + * + * How many pyramid layers to create. + */ +typedef enum { + VIPS_FOREIGN_DZ_CONTAINER_FS, + VIPS_FOREIGN_DZ_CONTAINER_ZIP, + VIPS_FOREIGN_DZ_CONTAINER_SZI, + VIPS_FOREIGN_DZ_CONTAINER_LAST +} VipsForeignDzContainer; + +VIPS_API +int vips_dzsave(VipsImage *in, const char *name, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_dzsave_buffer(VipsImage *in, void **buf, size_t *len, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_dzsave_target(VipsImage *in, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; + +/** + * VipsForeignHeifCompression: + * @VIPS_FOREIGN_HEIF_COMPRESSION_HEVC: x265 + * @VIPS_FOREIGN_HEIF_COMPRESSION_AVC: x264 + * @VIPS_FOREIGN_HEIF_COMPRESSION_JPEG: jpeg + * @VIPS_FOREIGN_HEIF_COMPRESSION_AV1: aom + * + * The compression format to use inside a HEIF container. + * + * This is assumed to use the same numbering as %heif_compression_format. + */ +typedef enum { + VIPS_FOREIGN_HEIF_COMPRESSION_HEVC = 1, + VIPS_FOREIGN_HEIF_COMPRESSION_AVC = 2, + VIPS_FOREIGN_HEIF_COMPRESSION_JPEG = 3, + VIPS_FOREIGN_HEIF_COMPRESSION_AV1 = 4, + VIPS_FOREIGN_HEIF_COMPRESSION_LAST +} VipsForeignHeifCompression; + +/** + * VipsForeignHeifEncoder: + * @VIPS_FOREIGN_HEIF_ENCODER_AUTO: auto + * @VIPS_FOREIGN_HEIF_ENCODER_AOM: aom + * @VIPS_FOREIGN_HEIF_ENCODER_RAV1E: RAV1E + * @VIPS_FOREIGN_HEIF_ENCODER_SVT: SVT-AV1 + * @VIPS_FOREIGN_HEIF_ENCODER_X265: x265 + * + * The selected encoder to use. + * If libheif hasn't been compiled with the selected encoder, + * we will fallback to the default encoder for the compression format. + * + */ +typedef enum { + VIPS_FOREIGN_HEIF_ENCODER_AUTO, + VIPS_FOREIGN_HEIF_ENCODER_AOM, + VIPS_FOREIGN_HEIF_ENCODER_RAV1E, + VIPS_FOREIGN_HEIF_ENCODER_SVT, + VIPS_FOREIGN_HEIF_ENCODER_X265, + VIPS_FOREIGN_HEIF_ENCODER_LAST +} VipsForeignHeifEncoder; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_FOREIGN_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/format.h b/jtlsrv-cpp/.static-build/include/vips/format.h new file mode 100644 index 0000000..b96c4eb --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/format.h @@ -0,0 +1,135 @@ +/* Base type for supported image formats. Subclass this to add a new + * format. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_FORMAT_H +#define VIPS_FORMAT_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_FORMAT (vips_format_get_type()) +#define VIPS_FORMAT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_FORMAT, VipsFormat)) +#define VIPS_FORMAT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_FORMAT, VipsFormatClass)) +#define VIPS_IS_FORMAT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_FORMAT)) +#define VIPS_IS_FORMAT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_FORMAT)) +#define VIPS_FORMAT_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_FORMAT, VipsFormatClass)) + +/* Image file properties. + */ +typedef enum { + VIPS_FORMAT_NONE = 0, /* No flags set */ + VIPS_FORMAT_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ + VIPS_FORMAT_BIGENDIAN = 2 /* Most-significant byte first */ +} VipsFormatFlags; + +/* Don't instantiate these things, just use the class stuff. + */ + +typedef struct _VipsFormat { + VipsObject parent_object; + /*< public >*/ + +} VipsFormat; + +typedef struct _VipsFormatClass { + VipsObjectClass parent_class; + + /*< public >*/ + /* Is a file in this format. + */ + gboolean (*is_a)(const char *); + + /* Read just the header into the VipsImage. + */ + int (*header)(const char *, VipsImage *); + + /* Load the whole image. + */ + int (*load)(const char *, VipsImage *); + + /* Write the VipsImage to the file in this format. + */ + int (*save)(VipsImage *, const char *); + + /* Get the flags for this file in this format. + */ + VipsFormatFlags (*get_flags)(const char *); + + /* Loop over formats in this order, default 0. We need this because + * some formats can be read by several loaders (eg. tiff can be read + * by the libMagick loader as well as by the tiff loader), and we want + * to make sure the better loader comes first. + */ + int priority; + + /* Null-terminated list of allowed suffixes, eg. ".tif", ".tiff". + */ + const char **suffs; +} VipsFormatClass; + +VIPS_API +GType vips_format_get_type(void); + +/* Map over and find formats. This uses type introspection to loop over + * subclasses of VipsFormat. + */ +VIPS_API +void *vips_format_map(VipsSListMap2Fn fn, void *a, void *b); +VIPS_API +VipsFormatClass *vips_format_for_file(const char *filename); +VIPS_API +VipsFormatClass *vips_format_for_name(const char *filename); + +VIPS_API +VipsFormatFlags vips_format_get_flags(VipsFormatClass *format, + const char *filename); + +/* Read/write an image convenience functions. + */ +VIPS_API +int vips_format_read(const char *filename, VipsImage *out); +VIPS_API +int vips_format_write(VipsImage *in, const char *filename); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_FORMAT_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/freqfilt.h b/jtlsrv-cpp/.static-build/include/vips/freqfilt.h new file mode 100644 index 0000000..85a6d0a --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/freqfilt.h @@ -0,0 +1,64 @@ +/* freq_filt.h + * + * 2/11/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_FREQFILT_H +#define VIPS_FREQFILT_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +VIPS_API +int vips_fwfft(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_invfft(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_freqmult(VipsImage *in, VipsImage *mask, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_spectrum(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_phasecor(VipsImage *in1, VipsImage *in2, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_FREQFILT_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/gate.h b/jtlsrv-cpp/.static-build/include/vips/gate.h new file mode 100644 index 0000000..2b53e22 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/gate.h @@ -0,0 +1,90 @@ +/* Thread profiling. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_GATE_H +#define VIPS_GATE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#include + +#define VIPS_GATE_START(NAME) \ + G_STMT_START \ + { \ + if (vips__thread_profile) \ + vips__thread_gate_start(NAME); \ + } \ + G_STMT_END + +#define VIPS_GATE_STOP(NAME) \ + G_STMT_START \ + { \ + if (vips__thread_profile) \ + vips__thread_gate_stop(NAME); \ + } \ + G_STMT_END + +#define VIPS_GATE_MALLOC(SIZE) \ + G_STMT_START \ + { \ + if (vips__thread_profile) \ + vips__thread_malloc_free((gint64) (SIZE)); \ + } \ + G_STMT_END + +#define VIPS_GATE_FREE(SIZE) \ + G_STMT_START \ + { \ + if (vips__thread_profile) \ + vips__thread_malloc_free(-((gint64) (SIZE))); \ + } \ + G_STMT_END + +extern gboolean vips__thread_profile; + +VIPS_API +void vips_profile_set(gboolean profile); + +void vips__thread_profile_attach(const char *thread_name); +void vips__thread_profile_detach(void); +void vips__thread_profile_stop(void); + +void vips__thread_gate_start(const char *gate_name); +void vips__thread_gate_stop(const char *gate_name); + +void vips__thread_malloc_free(gint64 size); + +#endif /*VIPS_GATE_H*/ + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/generate.h b/jtlsrv-cpp/.static-build/include/vips/generate.h new file mode 100644 index 0000000..c39395c --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/generate.h @@ -0,0 +1,92 @@ +/* Generate pixels. + * + * J.Cupitt, 8/4/93 + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_GENERATE_H +#define VIPS_GENERATE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef int (*VipsRegionWrite)(VipsRegion *region, VipsRect *area, void *a); +VIPS_API +int vips_sink_disc(VipsImage *im, VipsRegionWrite write_fn, void *a); + +VIPS_API +int vips_sink(VipsImage *im, + VipsStartFn start_fn, VipsGenerateFn generate_fn, VipsStopFn stop_fn, + void *a, void *b); +VIPS_API +int vips_sink_tile(VipsImage *im, + int tile_width, int tile_height, + VipsStartFn start_fn, VipsGenerateFn generate_fn, VipsStopFn stop_fn, + void *a, void *b); + +typedef void (*VipsSinkNotify)(VipsImage *im, VipsRect *rect, void *a); +VIPS_API +int vips_sink_screen(VipsImage *in, VipsImage *out, VipsImage *mask, + int tile_width, int tile_height, int max_tiles, + int priority, + VipsSinkNotify notify_fn, void *a); + +VIPS_API +int vips_sink_memory(VipsImage *im); + +VIPS_API +void *vips_start_one(VipsImage *out, void *a, void *b); +VIPS_API +int vips_stop_one(void *seq, void *a, void *b); +VIPS_API +void *vips_start_many(VipsImage *out, void *a, void *b); +VIPS_API +int vips_stop_many(void *seq, void *a, void *b); +VIPS_API +VipsImage **vips_allocate_input_array(VipsImage *out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_image_generate(VipsImage *image, + VipsStartFn start_fn, VipsGenerateFn generate_fn, VipsStopFn stop_fn, + void *a, void *b); + +VIPS_API +int vips_image_pipeline_array(VipsImage *image, + VipsDemandStyle hint, VipsImage **in); +VIPS_API +int vips_image_pipelinev(VipsImage *image, VipsDemandStyle hint, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_GENERATE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/header.h b/jtlsrv-cpp/.static-build/include/vips/header.h new file mode 100644 index 0000000..16c3df2 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/header.h @@ -0,0 +1,329 @@ +/* image header funcs + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_HEADER_H +#define VIPS_HEADER_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/** + * VIPS_META_EXIF_NAME: + * + * The name that read and write operations use for the image's EXIF data. + */ +#define VIPS_META_EXIF_NAME "exif-data" + +/** + * VIPS_META_XMP_NAME: + * + * The name that read and write operations use for the image's XMP data. + */ +#define VIPS_META_XMP_NAME "xmp-data" + +/** + * VIPS_META_IPTC_NAME: + * + * The name that read and write operations use for the image's IPTC data. + */ +#define VIPS_META_IPTC_NAME "iptc-data" + +/** + * VIPS_META_PHOTOSHOP_NAME: + * + * The name that TIFF read and write operations use for the image's + * TIFFTAG_PHOTOSHOP data. + */ +#define VIPS_META_PHOTOSHOP_NAME "photoshop-data" + +/** + * VIPS_META_ICC_NAME: + * + * The name we use to attach an ICC profile. The file read and write + * operations for TIFF, JPEG, PNG and others use this item of metadata to + * attach and save ICC profiles. The profile is updated by the + * vips_icc_transform() operations. + */ +#define VIPS_META_ICC_NAME "icc-profile-data" + +/** + * VIPS_META_IMAGEDESCRIPTION: + * + * The IMAGEDESCRIPTION tag. Often has useful metadata. + */ +#define VIPS_META_IMAGEDESCRIPTION "image-description" + +/** + * VIPS_META_RESOLUTION_UNIT: + * + * The JPEG and TIFF read and write operations use this to record the + * file's preferred unit for resolution. + */ +#define VIPS_META_RESOLUTION_UNIT "resolution-unit" + +/** + * VIPS_META_BITS_PER_SAMPLE: + * + * The bits per sample for each channel. + */ +#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample" + +/** + * VIPS_META_PALETTE: + * + * Does this image have a palette? + */ +#define VIPS_META_PALETTE "palette" + +/** + * VIPS_META_LOADER: + * + * Record the name of the original loader here. Handy for hinting file formats + * and for debugging. + */ +#define VIPS_META_LOADER "vips-loader" + +/** + * VIPS_META_SEQUENTIAL: + * + * Images loaded via vips_sequential() have this int field defined. Some + * operations (eg. vips_shrinkv()) add extra caches if they see it on their + * input. + */ +#define VIPS_META_SEQUENTIAL "vips-sequential" + +/** + * VIPS_META_ORIENTATION: + * + * The orientation tag for this image. An int from 1 - 8 using the standard + * exif/tiff meanings. + * + * * 1 - The 0th row represents the visual top of the image, and the 0th column + * represents the visual left-hand side. + * * 2 - The 0th row represents the visual top of the image, and the 0th column + * represents the visual right-hand side. + * * 3 - The 0th row represents the visual bottom of the image, and the 0th + * column represents the visual right-hand side. + * * 4 - The 0th row represents the visual bottom of the image, and the 0th + * column represents the visual left-hand side. + * * 5 - The 0th row represents the visual left-hand side of the image, and the + * 0th column represents the visual top. + * * 6 - The 0th row represents the visual right-hand side of the image, and the + * 0th column represents the visual top. + * * 7 - The 0th row represents the visual right-hand side of the image, and the + * 0th column represents the visual bottom. + * * 8 - The 0th row represents the visual left-hand side of the image, and the + * 0th column represents the visual bottom. + */ +#define VIPS_META_ORIENTATION "orientation" + +/** + * VIPS_META_PAGE_HEIGHT: + * + * If set, the height of each page when this image was loaded. If you save an + * image with "page-height" set to a format that supports multiple pages, such + * as tiff, the image will be saved as a series of pages. + */ +#define VIPS_META_PAGE_HEIGHT "page-height" + +/** + * VIPS_META_N_PAGES: + * + * If set, the number of pages in the original file. + */ +#define VIPS_META_N_PAGES "n-pages" + +/** + * VIPS_META_N_SUBIFDS: + * + * If set, the number of subifds in the first page of the file. + */ +#define VIPS_META_N_SUBIFDS "n-subifds" + +/** + * VIPS_META_CONCURRENCY: + * + * If set, the suggested concurrency for this image. + */ +#define VIPS_META_CONCURRENCY "concurrency" + +VIPS_API +guint64 vips_format_sizeof(VipsBandFormat format); +VIPS_API +guint64 vips_format_sizeof_unsafe(VipsBandFormat format); + +VIPS_API +double vips_interpretation_max_alpha(VipsInterpretation interpretation); + +VIPS_API +int vips_image_get_width(const VipsImage *image); +VIPS_API +int vips_image_get_height(const VipsImage *image); +VIPS_API +int vips_image_get_bands(const VipsImage *image); +VIPS_API +VipsBandFormat vips_image_get_format(const VipsImage *image); +VIPS_API +double vips_image_get_format_max(VipsBandFormat format); +VIPS_API +VipsBandFormat vips_image_guess_format(const VipsImage *image); +VIPS_API +VipsCoding vips_image_get_coding(const VipsImage *image); +VIPS_API +VipsInterpretation vips_image_get_interpretation(const VipsImage *image); +VIPS_API +VipsInterpretation vips_image_guess_interpretation(const VipsImage *image); +VIPS_API +double vips_image_get_xres(const VipsImage *image); +VIPS_API +double vips_image_get_yres(const VipsImage *image); +VIPS_API +int vips_image_get_xoffset(const VipsImage *image); +VIPS_API +int vips_image_get_yoffset(const VipsImage *image); +VIPS_API +const char *vips_image_get_filename(const VipsImage *image); +VIPS_API +const char *vips_image_get_mode(const VipsImage *image); +VIPS_API +double vips_image_get_scale(const VipsImage *image); +VIPS_API +double vips_image_get_offset(const VipsImage *image); +VIPS_API +int vips_image_get_page_height(VipsImage *image); +VIPS_API +int vips_image_get_n_pages(VipsImage *image); +VIPS_API +int vips_image_get_n_subifds(VipsImage *image); +VIPS_API +int vips_image_get_orientation(VipsImage *image); +VIPS_API +gboolean vips_image_get_orientation_swap(VipsImage *image); +VIPS_API +int vips_image_get_concurrency(VipsImage *image, int default_concurrency); +VIPS_API +const void *vips_image_get_data(VipsImage *image); + +VIPS_API +void vips_image_init_fields(VipsImage *image, + int xsize, int ysize, int bands, + VipsBandFormat format, VipsCoding coding, + VipsInterpretation interpretation, + double xres, double yres); + +VIPS_API +void vips_image_set(VipsImage *image, const char *name, GValue *value); +VIPS_API +int vips_image_get(const VipsImage *image, + const char *name, GValue *value_copy); +VIPS_API +int vips_image_get_as_string(const VipsImage *image, + const char *name, char **out); +VIPS_API +GType vips_image_get_typeof(const VipsImage *image, const char *name); +VIPS_API +gboolean vips_image_remove(VipsImage *image, const char *name); +typedef void *(*VipsImageMapFn)(VipsImage *image, + const char *name, GValue *value, void *a); +VIPS_API +void *vips_image_map(VipsImage *image, VipsImageMapFn fn, void *a); +VIPS_API +gchar **vips_image_get_fields(VipsImage *image); + +VIPS_API +void vips_image_set_area(VipsImage *image, + const char *name, VipsCallbackFn free_fn, void *data); +VIPS_API +int vips_image_get_area(const VipsImage *image, + const char *name, const void **data); +VIPS_API +void vips_image_set_blob(VipsImage *image, + const char *name, + VipsCallbackFn free_fn, const void *data, size_t length); +VIPS_API +void vips_image_set_blob_copy(VipsImage *image, + const char *name, const void *data, size_t length); +VIPS_API +int vips_image_get_blob(const VipsImage *image, + const char *name, const void **data, size_t *length); + +VIPS_API +int vips_image_get_int(const VipsImage *image, const char *name, int *out); +VIPS_API +void vips_image_set_int(VipsImage *image, const char *name, int i); +VIPS_API +int vips_image_get_double(const VipsImage *image, + const char *name, double *out); +VIPS_API +void vips_image_set_double(VipsImage *image, const char *name, double d); +VIPS_API +int vips_image_get_string(const VipsImage *image, + const char *name, const char **out); +VIPS_API +void vips_image_set_string(VipsImage *image, + const char *name, const char *str); +VIPS_API +void vips_image_print_field(const VipsImage *image, const char *name); +VIPS_API +int vips_image_get_image(const VipsImage *image, + const char *name, VipsImage **out); +VIPS_API +void vips_image_set_image(VipsImage *image, const char *name, VipsImage *im); +VIPS_API +void vips_image_set_array_int(VipsImage *image, const char *name, + const int *array, int n); +VIPS_API +int vips_image_get_array_int(VipsImage *image, const char *name, + int **out, int *n); +VIPS_API +int vips_image_get_array_double(VipsImage *image, const char *name, + double **out, int *n); +VIPS_API +void vips_image_set_array_double(VipsImage *image, const char *name, + const double *array, int n); + +VIPS_API +int vips_image_history_printf(VipsImage *image, const char *format, ...) + G_GNUC_PRINTF(2, 3); +VIPS_API +int vips_image_history_args(VipsImage *image, + const char *name, int argc, char *argv[]); +VIPS_API +const char *vips_image_get_history(VipsImage *image); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_HEADER_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/histogram.h b/jtlsrv-cpp/.static-build/include/vips/histogram.h new file mode 100644 index 0000000..51122aa --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/histogram.h @@ -0,0 +1,85 @@ +/* histograms_lut.h + * + * 3/11/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_HISTOGRAM_H +#define VIPS_HISTOGRAM_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +VIPS_API +int vips_maplut(VipsImage *in, VipsImage **out, VipsImage *lut, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_percent(VipsImage *in, double percent, int *threshold, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_stdif(VipsImage *in, VipsImage **out, int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_cum(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_norm(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_equal(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_plot(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_match(VipsImage *in, VipsImage *ref, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_local(VipsImage *in, VipsImage **out, + int width, int height, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_ismonotonic(VipsImage *in, gboolean *out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_hist_entropy(VipsImage *in, double *out, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_case(VipsImage *index, VipsImage **cases, VipsImage **out, int n, + ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_HISTOGRAM_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/image.h b/jtlsrv-cpp/.static-build/include/vips/image.h new file mode 100644 index 0000000..b5d6752 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/image.h @@ -0,0 +1,610 @@ +/* VIPS image class. + * + * 7/7/09 + * - from vips.h + * 2/3/11 + * - move to GObject + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_IMAGE_H +#define VIPS_IMAGE_H + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* If you read MSB first, you get these two values. + * intel order: byte 0 = b6 + * SPARC order: byte 0 = 08 + */ +#define VIPS_MAGIC_INTEL (0xb6a6f208U) +#define VIPS_MAGIC_SPARC (0x08f2a6b6U) + +/* We have a maximum value for a coordinate at various points for sanity + * checking. For example, vips_black() has a max with and height. We use int + * for width/height so we could go up to 2bn, but it's good to have a lower + * value set so we can see crazy numbers early. + * + * This can be overridden with the `VIPS_MAX_COORD` env var, or the + * `--vips-max-coord` CLI arg. + */ +#define VIPS_DEFAULT_MAX_COORD (100000000) + +/* Fetch the overridden value. + */ +#define VIPS_MAX_COORD (vips_max_coord_get()) + +typedef enum { + VIPS_DEMAND_STYLE_ERROR = -1, + VIPS_DEMAND_STYLE_SMALLTILE, + VIPS_DEMAND_STYLE_FATSTRIP, + VIPS_DEMAND_STYLE_THINSTRIP, + VIPS_DEMAND_STYLE_ANY +} VipsDemandStyle; + +/* Types of image descriptor we may have. The type field is advisory only: it + * does not imply that any fields in IMAGE have valid data. + */ +typedef enum { + VIPS_IMAGE_ERROR = -1, + VIPS_IMAGE_NONE, /* no type set */ + VIPS_IMAGE_SETBUF, /* malloced memory array */ + VIPS_IMAGE_SETBUF_FOREIGN, /* memory array, don't free on close */ + VIPS_IMAGE_OPENIN, /* input from fd with a window */ + VIPS_IMAGE_MMAPIN, /* memory mapped input file */ + VIPS_IMAGE_MMAPINRW, /* memory mapped read/write file */ + VIPS_IMAGE_OPENOUT, /* output to fd */ + VIPS_IMAGE_PARTIAL /* partial image */ +} VipsImageType; + +typedef enum { + VIPS_INTERPRETATION_ERROR = -1, + VIPS_INTERPRETATION_MULTIBAND = 0, + VIPS_INTERPRETATION_B_W = 1, + VIPS_INTERPRETATION_HISTOGRAM = 10, + VIPS_INTERPRETATION_XYZ = 12, + VIPS_INTERPRETATION_LAB = 13, + VIPS_INTERPRETATION_CMYK = 15, + VIPS_INTERPRETATION_LABQ = 16, + VIPS_INTERPRETATION_RGB = 17, + VIPS_INTERPRETATION_CMC = 18, + VIPS_INTERPRETATION_LCH = 19, + VIPS_INTERPRETATION_LABS = 21, + VIPS_INTERPRETATION_sRGB = 22, + VIPS_INTERPRETATION_YXY = 23, + VIPS_INTERPRETATION_FOURIER = 24, + VIPS_INTERPRETATION_RGB16 = 25, + VIPS_INTERPRETATION_GREY16 = 26, + VIPS_INTERPRETATION_MATRIX = 27, + VIPS_INTERPRETATION_scRGB = 28, + VIPS_INTERPRETATION_HSV = 29, + VIPS_INTERPRETATION_LAST = 30 +} VipsInterpretation; + +typedef enum { + VIPS_FORMAT_NOTSET = -1, + VIPS_FORMAT_UCHAR = 0, + VIPS_FORMAT_CHAR = 1, + VIPS_FORMAT_USHORT = 2, + VIPS_FORMAT_SHORT = 3, + VIPS_FORMAT_UINT = 4, + VIPS_FORMAT_INT = 5, + VIPS_FORMAT_FLOAT = 6, + VIPS_FORMAT_COMPLEX = 7, + VIPS_FORMAT_DOUBLE = 8, + VIPS_FORMAT_DPCOMPLEX = 9, + VIPS_FORMAT_LAST = 10 +} VipsBandFormat; + +typedef enum { + VIPS_CODING_ERROR = -1, + VIPS_CODING_NONE = 0, + VIPS_CODING_LABQ = 2, + VIPS_CODING_RAD = 6, + VIPS_CODING_LAST = 7 +} VipsCoding; + +typedef enum { + VIPS_ACCESS_RANDOM, + VIPS_ACCESS_SEQUENTIAL, + VIPS_ACCESS_SEQUENTIAL_UNBUFFERED, + VIPS_ACCESS_LAST +} VipsAccess; + +typedef void *(*VipsStartFn)(VipsImage *out, void *a, void *b); +typedef int (*VipsGenerateFn)(VipsRegion *out, + void *seq, void *a, void *b, gboolean *stop); +typedef int (*VipsStopFn)(void *seq, void *a, void *b); + +/* Struct we keep a record of execution time in. Passed to eval signal so + * it can assess progress. + */ +typedef struct _VipsProgress { + /*< private >*/ + VipsImage *im; /* Image we are part of */ + + /*< public >*/ + int run; /* Time we have been running */ + int eta; /* Estimated seconds of computation left */ + gint64 tpels; /* Number of pels we expect to calculate */ + gint64 npels; /* Number of pels calculated so far */ + int percent; /* Percent complete */ + GTimer *start; /* Start time */ +} VipsProgress; + +#define VIPS_TYPE_IMAGE (vips_image_get_type()) +#define VIPS_IMAGE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_IMAGE, VipsImage)) +#define VIPS_IMAGE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_IMAGE, VipsImageClass)) +#define VIPS_IS_IMAGE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_IMAGE)) +#define VIPS_IS_IMAGE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_IMAGE)) +#define VIPS_IMAGE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_IMAGE, VipsImageClass)) + +/* Matching typedef in basic.h. + */ +struct _VipsImage { + VipsObject parent_instance; + + /*< private >*/ + + /* We have to keep these names for compatibility with the old API. + * Don't use them though, use vips_image_get_width() and friends. + */ + + int Xsize; /* image width, in pixels */ + int Ysize; /* image height, in pixels */ + int Bands; /* number of image bands */ + + VipsBandFormat BandFmt; /* pixel format */ + VipsCoding Coding; /* pixel coding */ + VipsInterpretation Type; /* pixel interpretation */ + double Xres; /* horizontal pixels per millimetre */ + double Yres; /* vertical pixels per millimetre */ + + int Xoffset; /* image origin hint */ + int Yoffset; /* image origin hint */ + + /* No longer used, the names are here for compat with very, very old + * code. + */ + int Length; + short Compression; + short Level; + int Bbits; /* was number of bits in this format */ + + /* Old code expects to see this member, newer code has a param on + * eval(). + */ + VipsProgress *time; + + /* Derived fields that some code can fiddle with. New code should use + * vips_image_get_history() and friends. + */ + char *Hist; /* don't use, see vips_image_get_history() */ + char *filename; /* pointer to copy of filename */ + VipsPel *data; /* start of image data for WIO */ + int kill; /* set to non-zero to block eval */ + + /* Everything below this private and only used internally by + * VipsImage. + */ + + /* During vips image read and write we need temporary float-sized + * fields in the struct for staging xres/yres. Don't use these any + * other time. + */ + float Xres_float; + float Yres_float; + + char *mode; /* mode string passed to _new() */ + VipsImageType dtype; /* descriptor type */ + int fd; /* file descriptor */ + void *baseaddr; /* pointer to the start of an mmap file */ + size_t length; /* size of mmap area */ + guint32 magic; /* magic from header, endian-ness of image */ + + /* Partial image stuff. All these fields are initialised + * to NULL and ignored unless set by vips_image_generate() etc. + */ + VipsStartFn start_fn; + VipsGenerateFn generate_fn; + VipsStopFn stop_fn; + void *client1; /* user arguments */ + void *client2; + GMutex *sslock; /* start-stop lock */ + GSList *regions; /* list of regions current for this image */ + VipsDemandStyle dhint; /* demand style hint */ + + /* Extra user-defined fields ... see vips_image_get() etc. + */ + GHashTable *meta; /* GhashTable of GValue */ + GSList *meta_traverse; /* traverse order for Meta */ + + /* Part of mmap() read ... the sizeof() the header we skip from the + * file start. Usually VIPS_SIZEOF_HEADER, but can be something else + * for binary file read. + * + * guint64 so that we can guarantee to work even on systems with + * strange ideas about large files. + */ + gint64 sizeof_header; + + /* If this is a large disc image, don't map the whole thing, instead + * have a set of windows shared between the regions active on the + * image. List of VipsWindow. + */ + GSList *windows; + + /* Upstream/downstream relationships, built from args to + * vips_demand_hint(). + * + * We use these to invalidate downstream pixel buffers. + * Use 'serial' to spot circular dependencies. + * + * See also hint_set below. + */ + GSList *upstream; + GSList *downstream; + int serial; + + /* Keep a list of recounted GValue strings so we can share hist + * efficiently. + */ + GSList *history_list; + + /* The VipsImage (if any) we should signal eval progress on. + */ + VipsImage *progress_signal; + + /* Record the file length here. We use this to stop ourselves mapping + * things beyond the end of the file in the case that the file has + * been truncated. + * + * gint64 so that we can guarantee to work even on systems with + * strange ideas about large files. + */ + gint64 file_length; + + /* Set this when vips_demand_hint_array() is called, and check in any + * operation that will demand pixels from the image. + * + * We use vips_demand_hint_array() to build the tree of + * upstream/downstream relationships, so it's a mandatory thing. + */ + gboolean hint_set; + + /* Delete-on-close is hard to do with signals and callbacks since we + * really need to do this in finalize after the fd has been closed, + * but you can't emit signals then. + * + * Also keep a private copy of the filename string to be deleted, + * since image->filename will be freed in _dispose(). + */ + gboolean delete_on_close; + char *delete_on_close_filename; +}; + +typedef struct _VipsImageClass { + VipsObjectClass parent_class; + + /* Signals we emit. + */ + + /* Evaluation is starting. + */ + void (*preeval)(VipsImage *image, VipsProgress *progress, void *data); + + /* Evaluation progress. + */ + void (*eval)(VipsImage *image, VipsProgress *progress, void *data); + + /* Evaluation is ending. + */ + void (*posteval)(VipsImage *image, VipsProgress *progress, void *data); + + /* An image has been written to. + * Used by eg. vips_image_new_mode("x.jpg", "w") to do the + * final write to jpeg. + * Set *result to non-zero to indicate an error on write. + */ + void (*written)(VipsImage *image, int *result, void *data); + + /* An image has been modified in some way and all caches + * need dropping. + */ + void (*invalidate)(VipsImage *image, void *data); + + /* Minimise this pipeline. + * + * This is triggered (sometimes) at the end of eval to signal that + * we're probably done and that operations involved should try to + * minimise memory use by, for example, dropping caches. + * + * See vips_tilecache(). + */ + void (*minimise)(VipsImage *image, void *data); + +} VipsImageClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_image_get_type(void); + +/* Has to be guint64 and not size_t/off_t since we have to be able to address + * huge images on platforms with 32-bit files. + */ + +/* Pixel address calculation macros. + */ +#define VIPS_IMAGE_SIZEOF_ELEMENT(I) \ + (vips_format_sizeof_unsafe((I)->BandFmt)) +#define VIPS_IMAGE_SIZEOF_PEL(I) \ + (VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands) +#define VIPS_IMAGE_SIZEOF_LINE(I) \ + (VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize) +#define VIPS_IMAGE_SIZEOF_IMAGE(I) \ + (VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize) +#define VIPS_IMAGE_N_ELEMENTS(I) \ + ((I)->Bands * (I)->Xsize) +#define VIPS_IMAGE_N_PELS(I) \ + ((guint64) (I)->Xsize * (I)->Ysize) + +/* If VIPS_DEBUG is defined, add bounds checking. + */ +#ifdef VIPS_DEBUG +#define VIPS_IMAGE_ADDR(I, X, Y) \ + (((X) >= 0 && (X) < VIPS_IMAGE(I)->Xsize && \ + (Y) >= 0 && (Y) < VIPS_IMAGE(I)->Ysize && \ + VIPS_IMAGE(I)->data) \ + ? (VIPS_IMAGE(I)->data + \ + (Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \ + (X) *VIPS_IMAGE_SIZEOF_PEL(I)) \ + : (fprintf(stderr, \ + "VIPS_IMAGE_ADDR: point out of bounds, " \ + "file \"%s\", line %d\n" \ + "(point x=%d, y=%d\n" \ + " should have been within VipsRect left=%d, top=%d, " \ + "width=%d, height=%d)\n", \ + __FILE__, __LINE__, \ + (X), (Y), \ + 0, 0, \ + VIPS_IMAGE(I)->Xsize, \ + VIPS_IMAGE(I)->Ysize), \ + (VipsPel *) NULL)) +#else /*!VIPS_DEBUG*/ +#define VIPS_IMAGE_ADDR(I, X, Y) \ + ((I)->data + \ + (Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \ + (X) *VIPS_IMAGE_SIZEOF_PEL(I)) +#endif /*VIPS_DEBUG*/ + +#ifdef VIPS_DEBUG +#define VIPS_MATRIX(I, X, Y) \ + ((VIPS_IMAGE(I)->BandFmt == VIPS_FORMAT_DOUBLE && \ + VIPS_IMAGE(I)->Bands == 1) \ + ? ((double *) VIPS_IMAGE_ADDR(I, X, Y)) \ + : (fprintf(stderr, "VIPS_MATRIX: not a matrix image\n"), \ + (double *) NULL)) +#else /*!VIPS_DEBUG*/ +#define VIPS_MATRIX(I, X, Y) \ + ((double *) VIPS_IMAGE_ADDR(I, X, Y)) +#endif /*VIPS_DEBUG*/ + +VIPS_API +void vips_progress_set(gboolean progress); + +VIPS_API +void vips_image_invalidate_all(VipsImage *image); + +VIPS_API +void vips_image_minimise_all(VipsImage *image); + +VIPS_API +gboolean vips_image_is_sequential(VipsImage *image); + +VIPS_API +void vips_image_set_progress(VipsImage *image, gboolean progress); +VIPS_API +gboolean vips_image_iskilled(VipsImage *image); +VIPS_API +void vips_image_set_kill(VipsImage *image, gboolean kill); + +VIPS_API +char *vips_filename_get_filename(const char *vips_filename); +VIPS_API +char *vips_filename_get_options(const char *vips_filename); + +VIPS_API +VipsImage *vips_image_new(void); +VIPS_API +VipsImage *vips_image_new_memory(void); +VIPS_API +VipsImage *vips_image_memory(void); +VIPS_API +VipsImage *vips_image_new_from_file(const char *name, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +VipsImage *vips_image_new_from_file_RW(const char *filename); +VIPS_API +VipsImage *vips_image_new_from_file_raw(const char *filename, + int xsize, int ysize, int bands, guint64 offset); +VIPS_API +VipsImage *vips_image_new_from_memory(const void *data, size_t size, + int width, int height, int bands, VipsBandFormat format); +VIPS_API +VipsImage *vips_image_new_from_memory_copy(const void *data, size_t size, + int width, int height, int bands, VipsBandFormat format); +VIPS_API +VipsImage *vips_image_new_from_buffer(const void *buf, size_t len, + const char *option_string, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +VipsImage *vips_image_new_from_source(VipsSource *source, + const char *option_string, ...) G_GNUC_NULL_TERMINATED; +VIPS_API +VipsImage *vips_image_new_matrix(int width, int height); +VIPS_API +VipsImage *vips_image_new_matrixv(int width, int height, ...); +VIPS_API +VipsImage *vips_image_new_matrix_from_array(int width, int height, + const double *array, int size); +VIPS_API +VipsImage *vips_image_matrix_from_array(int width, int height, + const double *array, int size); +VIPS_API +VipsImage *vips_image_new_from_image(VipsImage *image, + const double *c, int n); +VIPS_API +VipsImage *vips_image_new_from_image1(VipsImage *image, double c); + +VIPS_API +void vips_image_set_delete_on_close(VipsImage *image, + gboolean delete_on_close); +VIPS_API +guint64 vips_get_disc_threshold(void); +VIPS_API +VipsImage *vips_image_new_temp_file(const char *format); + +VIPS_API +int vips_image_write(VipsImage *image, VipsImage *out); +VIPS_API +int vips_image_write_to_file(VipsImage *image, const char *name, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_image_write_to_buffer(VipsImage *in, + const char *suffix, void **buf, size_t *size, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_image_write_to_target(VipsImage *in, + const char *suffix, VipsTarget *target, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +void *vips_image_write_to_memory(VipsImage *in, size_t *size); + +VIPS_API +int vips_image_decode_predict(VipsImage *in, + int *bands, VipsBandFormat *format); +VIPS_API +int vips_image_decode(VipsImage *in, VipsImage **out); +VIPS_API +int vips_image_encode(VipsImage *in, VipsImage **out, VipsCoding coding); + +VIPS_API +gboolean vips_image_isMSBfirst(VipsImage *image); +VIPS_API +gboolean vips_image_isfile(VipsImage *image); +VIPS_API +gboolean vips_image_ispartial(VipsImage *image); +VIPS_API +gboolean vips_image_hasalpha(VipsImage *image); + +VIPS_API +VipsImage *vips_image_copy_memory(VipsImage *image); +VIPS_API +int vips_image_wio_input(VipsImage *image); +VIPS_API +int vips_image_pio_input(VipsImage *image); +VIPS_API +int vips_image_pio_output(VipsImage *image); +VIPS_API +int vips_image_inplace(VipsImage *image); +VIPS_API +int vips_image_write_prepare(VipsImage *image); + +VIPS_API +int vips_image_write_line(VipsImage *image, int ypos, VipsPel *linebuffer); + +VIPS_API +gboolean vips_band_format_isint(VipsBandFormat format); +VIPS_API +gboolean vips_band_format_isuint(VipsBandFormat format); +VIPS_API +gboolean vips_band_format_is8bit(VipsBandFormat format); +VIPS_API +gboolean vips_band_format_isfloat(VipsBandFormat format); +VIPS_API +gboolean vips_band_format_iscomplex(VipsBandFormat format); + +VIPS_API +int vips_system(const char *cmd_format, ...) + G_GNUC_NULL_TERMINATED; + +/* Defined in type.c but declared here, since they use VipsImage. + */ +VIPS_API +VipsArrayImage *vips_array_image_new(VipsImage **array, int n); +VIPS_API +VipsArrayImage *vips_array_image_newv(int n, ...); +VIPS_API +VipsArrayImage *vips_array_image_new_from_string(const char *string, + VipsAccess flags); +VIPS_API +VipsArrayImage *vips_array_image_empty(void); +VIPS_API +VipsArrayImage *vips_array_image_append(VipsArrayImage *array, + VipsImage *image); +VIPS_API +VipsImage **vips_array_image_get(VipsArrayImage *array, int *n); +VIPS_API +VipsImage **vips_value_get_array_image(const GValue *value, int *n); +VIPS_API +void vips_value_set_array_image(GValue *value, int n); + +/* Defined in reorder.c, but really a function on image. + */ +VIPS_API +int vips_reorder_prepare_many(VipsImage *image, + VipsRegion **regions, VipsRect *r); +VIPS_API +void vips_reorder_margin_hint(VipsImage *image, int margin); + +VIPS_API +void vips_image_free_buffer(VipsImage *image, void *buffer); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_IMAGE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/interpolate.h b/jtlsrv-cpp/.static-build/include/vips/interpolate.h new file mode 100644 index 0000000..18ffa7a --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/interpolate.h @@ -0,0 +1,139 @@ +/* Various interpolators. + * + * J.Cupitt, 15/10/08 + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_INTERPOLATE_H +#define VIPS_INTERPOLATE_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_INTERPOLATE (vips_interpolate_get_type()) +#define VIPS_INTERPOLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_INTERPOLATE, VipsInterpolate)) +#define VIPS_INTERPOLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_INTERPOLATE, VipsInterpolateClass)) +#define VIPS_IS_INTERPOLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_INTERPOLATE)) +#define VIPS_IS_INTERPOLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_INTERPOLATE)) +#define VIPS_INTERPOLATE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_INTERPOLATE, VipsInterpolateClass)) + +struct _VipsInterpolate { + VipsObject parent_object; +}; + +/* An interpolation function. This is a class method, but we have a lookup + * function for it to speed up dispatch. Write to the memory at "out", + * interpolate the value at position (x, y) in "in". + */ +typedef void (*VipsInterpolateMethod)(VipsInterpolate *interpolate, + void *out, VipsRegion *in, double x, double y); + +typedef struct _VipsInterpolateClass { + VipsObjectClass parent_class; + + /* Write to pixel out(x,y), interpolating from in(x,y). The caller has + * to set the regions up. + */ + VipsInterpolateMethod interpolate; + + /* This interpolator needs a window this many pixels across and down. + */ + int (*get_window_size)(VipsInterpolate *interpolate); + + /* Or just set this if you want a constant. + */ + int window_size; + + /* Stencils are offset by this much. Default to window_size / 2 - 1 + * (centering) if get_window_offset is NULL and window_offset is -1. + */ + int (*get_window_offset)(VipsInterpolate *interpolate); + int window_offset; +} VipsInterpolateClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_interpolate_get_type(void); +VIPS_API +void vips_interpolate(VipsInterpolate *interpolate, + void *out, VipsRegion *in, double x, double y); +VIPS_API +VipsInterpolateMethod vips_interpolate_get_method(VipsInterpolate *interpolate); +VIPS_API +int vips_interpolate_get_window_size(VipsInterpolate *interpolate); +VIPS_API +int vips_interpolate_get_window_offset(VipsInterpolate *interpolate); + +/* How many bits of precision we keep for transformations, ie. how many + * pre-computed matrices we have. + */ +#define VIPS_TRANSFORM_SHIFT (6) +#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT) + +/* How many bits of precision we keep for interpolation, ie. where the decimal + * is in the fixed-point tables. For 16-bit pixels, we need 16 bits for the + * data and 4 bits to add 16 values together. That leaves 12 bits for the + * fractional part. + */ +#define VIPS_INTERPOLATE_SHIFT (12) +#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT) + +/* Convenience: return static interpolators, no need to unref. + */ +VIPS_API +VipsInterpolate *vips_interpolate_nearest_static(void); +VIPS_API +VipsInterpolate *vips_interpolate_bilinear_static(void); + +/* Convenience: make an interpolator from a nickname. g_object_unref() when + * you're done with it. + */ +VIPS_API +VipsInterpolate *vips_interpolate_new(const char *nickname); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_INTERPOLATE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/intl.h b/jtlsrv-cpp/.static-build/include/vips/intl.h new file mode 100644 index 0000000..61a113a --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/intl.h @@ -0,0 +1,18 @@ +/* i18n stuff for vips. Deprecated in favour of glib/gi18n.h. + */ + +#ifndef VIPS_INTL_H +#define VIPS_INTL_H + +#ifdef ENABLE_NLS + +#include + +#else /*!ENABLE_NLS*/ + +#define _(String) (String) +#define N_(String) (String) + +#endif /* ENABLE_NLS */ + +#endif /* VIPS_INTL_H */ diff --git a/jtlsrv-cpp/.static-build/include/vips/mask.h b/jtlsrv-cpp/.static-build/include/vips/mask.h new file mode 100644 index 0000000..5d2c073 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/mask.h @@ -0,0 +1,163 @@ +/* mask.h + * + * 20/9/09 + * - from proto.h + */ + +/* All deprecated. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef IM_MASK_H +#define IM_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef struct im__INTMASK { + int xsize; + int ysize; + int scale; + int offset; + int *coeff; + char *filename; +} INTMASK; + +typedef struct im__DOUBLEMASK { + int xsize; + int ysize; + double scale; + double offset; + double *coeff; + char *filename; +} DOUBLEMASK; + +#define IM_MASK(M, X, Y) ((M)->coeff[(X) + (Y) * (M)->xsize]) + +VIPS_DEPRECATED +INTMASK *im_create_imask(const char *filename, int xsize, int ysize); +VIPS_DEPRECATED +INTMASK *im_create_imaskv(const char *filename, int xsize, int ysize, ...); +VIPS_DEPRECATED +DOUBLEMASK *im_create_dmask(const char *filename, int xsize, int ysize); +VIPS_DEPRECATED +DOUBLEMASK *im_create_dmaskv(const char *filename, int xsize, int ysize, ...); + +VIPS_DEPRECATED +INTMASK *im_read_imask(const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_read_dmask(const char *filename); + +VIPS_DEPRECATED +void im_print_imask(INTMASK *in); +VIPS_DEPRECATED +void im_print_dmask(DOUBLEMASK *in); + +VIPS_DEPRECATED +int im_write_imask(INTMASK *in); +VIPS_DEPRECATED +int im_write_dmask(DOUBLEMASK *in); +VIPS_DEPRECATED +int im_write_imask_name(INTMASK *in, const char *filename); +VIPS_DEPRECATED +int im_write_dmask_name(DOUBLEMASK *in, const char *filename); + +VIPS_DEPRECATED +int im_free_imask(INTMASK *in); +VIPS_DEPRECATED +int im_free_dmask(DOUBLEMASK *in); + +VIPS_DEPRECATED +INTMASK *im_log_imask(const char *filename, double sigma, double min_ampl); +VIPS_DEPRECATED +DOUBLEMASK *im_log_dmask(const char *filename, double sigma, double min_ampl); + +VIPS_DEPRECATED +INTMASK *im_gauss_imask(const char *filename, double sigma, double min_ampl); +VIPS_DEPRECATED +INTMASK *im_gauss_imask_sep(const char *filename, + double sigma, double min_ampl); +VIPS_DEPRECATED +DOUBLEMASK *im_gauss_dmask(const char *filename, + double sigma, double min_ampl); +VIPS_DEPRECATED +DOUBLEMASK *im_gauss_dmask_sep(const char *filename, + double sigma, double min_ampl); + +VIPS_DEPRECATED +INTMASK *im_dup_imask(INTMASK *in, const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_dup_dmask(DOUBLEMASK *in, const char *filename); + +VIPS_DEPRECATED +INTMASK *im_scale_dmask(DOUBLEMASK *in, const char *filename); +VIPS_DEPRECATED +void im_norm_dmask(DOUBLEMASK *mask); +VIPS_DEPRECATED +DOUBLEMASK *im_imask2dmask(INTMASK *in, const char *filename); +VIPS_DEPRECATED +INTMASK *im_dmask2imask(DOUBLEMASK *in, const char *filename); + +VIPS_DEPRECATED +INTMASK *im_rotate_imask90(INTMASK *in, const char *filename); +VIPS_DEPRECATED +INTMASK *im_rotate_imask45(INTMASK *in, const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_rotate_dmask90(DOUBLEMASK *in, const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_rotate_dmask45(DOUBLEMASK *in, const char *filename); + +VIPS_DEPRECATED +DOUBLEMASK *im_mattrn(DOUBLEMASK *in, const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_matcat(DOUBLEMASK *top, DOUBLEMASK *bottom, + const char *filename); +VIPS_DEPRECATED +DOUBLEMASK *im_matmul(DOUBLEMASK *in1, DOUBLEMASK *in2, const char *filename); + +VIPS_DEPRECATED +DOUBLEMASK *im_lu_decomp(const DOUBLEMASK *mat, const char *filename); +VIPS_DEPRECATED +int im_lu_solve(const DOUBLEMASK *lu, double *vec); +VIPS_DEPRECATED +DOUBLEMASK *im_matinv(const DOUBLEMASK *mat, const char *filename); +VIPS_DEPRECATED +int im_matinv_inplace(DOUBLEMASK *mat); + +VIPS_DEPRECATED +DOUBLEMASK *im_local_dmask(struct _VipsImage *out, DOUBLEMASK *mask); +VIPS_DEPRECATED +INTMASK *im_local_imask(struct _VipsImage *out, INTMASK *mask); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*IM_MASK_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/memory.h b/jtlsrv-cpp/.static-build/include/vips/memory.h new file mode 100644 index 0000000..4f75cc5 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/memory.h @@ -0,0 +1,123 @@ +/* memory utilities + * + * J.Cupitt, 8/4/93 + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_MEMORY_H +#define VIPS_MEMORY_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_FREEF(F, S) \ + G_STMT_START \ + { \ + if (S) { \ + (void) F((S)); \ + (S) = 0; \ + } \ + } \ + G_STMT_END + +#define VIPS_FREE(S) VIPS_FREEF(g_free, (S)); + +#define VIPS_SETSTR(S, V) \ + G_STMT_START \ + { \ + const char *sst = (V); \ + \ + if ((S) != sst) { \ + if (!(S) || !sst || strcmp((S), sst) != 0) { \ + VIPS_FREE(S); \ + if (sst) \ + (S) = g_strdup(sst); \ + } \ + } \ + } \ + G_STMT_END + +#define VIPS_MALLOC(OBJ, S) \ + (vips_malloc(VIPS_OBJECT(OBJ), S)) +#define VIPS_NEW(OBJ, T) \ + ((T *) VIPS_MALLOC(OBJ, sizeof(T))) +#define VIPS_ARRAY(OBJ, N, T) \ + ((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T))) + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsImage, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsObject, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsRegion, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsConnection, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsSource, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsSourceCustom, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsGInputStream, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsSourceGInputStream, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsTarget, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsTargetCustom, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsSbuf, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsInterpolate, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsOperation, g_object_unref) + +// FIXME ... need more of these +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsArrayDouble, VipsArrayDouble_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(VipsArrayImage, VipsArrayImage_unref) + +VIPS_API +void *vips_malloc(VipsObject *object, size_t size); +VIPS_API +char *vips_strdup(VipsObject *object, const char *str); + +VIPS_API +void vips_tracked_free(void *s); +VIPS_API +void vips_tracked_aligned_free(void *s); +VIPS_API +void *vips_tracked_malloc(size_t size); +VIPS_API +void *vips_tracked_aligned_alloc(size_t size, size_t align); +VIPS_API +size_t vips_tracked_get_mem(void); +VIPS_API +size_t vips_tracked_get_mem_highwater(void); +VIPS_API +int vips_tracked_get_allocs(void); + +VIPS_API +int vips_tracked_open(const char *pathname, int flags, int mode); +VIPS_API +int vips_tracked_close(int fd); +VIPS_API +int vips_tracked_get_files(void); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_MEMORY_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/morphology.h b/jtlsrv-cpp/.static-build/include/vips/morphology.h new file mode 100644 index 0000000..918b0ce --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/morphology.h @@ -0,0 +1,73 @@ +/* morphology.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_MORPHOLOGY_H +#define VIPS_MORPHOLOGY_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_OPERATION_MORPHOLOGY_ERODE, + VIPS_OPERATION_MORPHOLOGY_DILATE, + VIPS_OPERATION_MORPHOLOGY_LAST +} VipsOperationMorphology; + +VIPS_API +int vips_morph(VipsImage *in, VipsImage **out, VipsImage *mask, + VipsOperationMorphology morph, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rank(VipsImage *in, VipsImage **out, + int width, int height, int index, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_median(VipsImage *in, VipsImage **out, int size, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_countlines(VipsImage *in, double *nolines, + VipsDirection direction, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_labelregions(VipsImage *in, VipsImage **mask, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_fill_nearest(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_MORPHOLOGY_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/mosaicing.h b/jtlsrv-cpp/.static-build/include/vips/mosaicing.h new file mode 100644 index 0000000..28388a5 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/mosaicing.h @@ -0,0 +1,79 @@ +/* mosaicing.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_MOSAICING_H +#define VIPS_MOSAICING_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +VIPS_API +int vips_merge(VipsImage *ref, VipsImage *sec, VipsImage **out, + VipsDirection direction, int dx, int dy, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_mosaic(VipsImage *ref, VipsImage *sec, VipsImage **out, + VipsDirection direction, int xref, int yref, int xsec, int ysec, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_mosaic1(VipsImage *ref, VipsImage *sec, VipsImage **out, + VipsDirection direction, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_match(VipsImage *ref, VipsImage *sec, VipsImage **out, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_globalbalance(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_remosaic(VipsImage *in, VipsImage **out, + const char *old_str, const char *new_str, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_matrixinvert(VipsImage *m, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_MOSAICING_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/object.h b/jtlsrv-cpp/.static-build/include/vips/object.h new file mode 100644 index 0000000..0c4cbdd --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/object.h @@ -0,0 +1,720 @@ +/* abstract base class for all vips objects + */ + +/* + + Copyright (C) 1991-2003 The National Gallery + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_OBJECT_H +#define VIPS_OBJECT_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Handy! + */ +#ifdef VIPS_DEBUG +#define VIPS_UNREF(X) \ + G_STMT_START \ + { \ + if (X) { \ + g_assert(G_OBJECT(X)->ref_count > 0); \ + g_object_unref(X); \ + (X) = 0; \ + } \ + } \ + G_STMT_END +#else /*!VIPS_DEBUG*/ +#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X)) +#endif /*VIPS_DEBUG*/ + +typedef struct _VipsObject VipsObject; +typedef struct _VipsObjectClass VipsObjectClass; + +/* Track extra stuff for arguments to objects + */ + +typedef enum /*< flags >*/ { + VIPS_ARGUMENT_NONE = 0, + VIPS_ARGUMENT_REQUIRED = 1, + VIPS_ARGUMENT_CONSTRUCT = 2, + VIPS_ARGUMENT_SET_ONCE = 4, + VIPS_ARGUMENT_SET_ALWAYS = 8, + VIPS_ARGUMENT_INPUT = 16, + VIPS_ARGUMENT_OUTPUT = 32, + VIPS_ARGUMENT_DEPRECATED = 64, + VIPS_ARGUMENT_MODIFY = 128, + VIPS_ARGUMENT_NON_HASHABLE = 256 +} VipsArgumentFlags; + +/* Useful flag combinations. User-visible ones are: + * + * VIPS_ARGUMENT_REQUIRED_INPUT Eg. the "left" argument for an add operation + * + * VIPS_ARGUMENT_OPTIONAL_INPUT Eg. the "caption" for an object + * + * VIPS_ARGUMENT_REQUIRED_OUTPUT Eg. the "result" of an add operation + * + * VIPS_ARGUMENT_OPTIONAL_OUTPUT Eg. the x pos of the image minimum + * + * Other combinations are used internally, eg. supplying the cast-table for an + * arithmetic operation + */ + +#define VIPS_ARGUMENT_REQUIRED_INPUT \ + (VIPS_ARGUMENT_INPUT | \ + VIPS_ARGUMENT_REQUIRED | \ + VIPS_ARGUMENT_CONSTRUCT) + +#define VIPS_ARGUMENT_OPTIONAL_INPUT \ + (VIPS_ARGUMENT_INPUT | \ + VIPS_ARGUMENT_CONSTRUCT) + +#define VIPS_ARGUMENT_REQUIRED_OUTPUT \ + (VIPS_ARGUMENT_OUTPUT | \ + VIPS_ARGUMENT_REQUIRED | \ + VIPS_ARGUMENT_CONSTRUCT) + +#define VIPS_ARGUMENT_OPTIONAL_OUTPUT \ + (VIPS_ARGUMENT_OUTPUT | \ + VIPS_ARGUMENT_CONSTRUCT) + +#define VIPS_ARG_IMAGE(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_object((NAME), (LONG), (DESC), \ + VIPS_TYPE_IMAGE, \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, TYPE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_object((NAME), (LONG), (DESC), \ + TYPE, \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_INTERPOLATE(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET) \ + VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE) + +#define VIPS_ARG_BOOL(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \ + (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_DOUBLE(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, MIN, MAX, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_double((NAME), (LONG), (DESC), \ + (MIN), (MAX), (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_BOXED(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, TYPE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \ + (TYPE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_INT(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, MIN, MAX, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_int((NAME), (LONG), (DESC), \ + (MIN), (MAX), (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_UINT64(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, MIN, MAX, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_uint64((NAME), (LONG), (DESC), \ + (MIN), (MAX), (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_ENUM(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, TYPE, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_enum((NAME), (LONG), (DESC), \ + (TYPE), (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_FLAGS(CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, TYPE, VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_flags((NAME), (LONG), (DESC), \ + (TYPE), (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_STRING(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, \ + VALUE) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_string((NAME), (LONG), (DESC), \ + (VALUE), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +#define VIPS_ARG_POINTER(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET) \ + { \ + GParamSpec *pspec; \ +\ + pspec = g_param_spec_pointer((NAME), (LONG), (DESC), \ + (GParamFlags) (G_PARAM_READWRITE)); \ + g_object_class_install_property(G_OBJECT_CLASS(CLASS), \ + vips_argument_get_id(), pspec); \ + vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \ + pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \ + } + +/* Keep one of these for every argument. + */ +typedef struct _VipsArgument { + GParamSpec *pspec; /* pspec for this argument */ + + /* More stuff, see below */ +} VipsArgument; + +/* Keep one of these in the class struct for every argument. + */ +typedef struct _VipsArgumentClass { + VipsArgument parent; + + /* The class of the object we are an arg for. + */ + VipsObjectClass *object_class; + + VipsArgumentFlags flags; + int priority; /* Order args by this */ + guint offset; /* G_STRUCT_OFFSET of member in object */ +} VipsArgumentClass; + +/* Keep one of these in the object struct for every argument instance. + */ +typedef struct _VipsArgumentInstance { + VipsArgument parent; + + /* The class we are part of. + */ + VipsArgumentClass *argument_class; + + /* The object we are attached to. + */ + VipsObject *object; + + /* Has been set. + */ + gboolean assigned; + + /* If this is an output argument, keep the id of our "close" handler + * here. + */ + gulong close_id; + + /* We need to listen for "invalidate" on input images and send our own + * "invalidate" out. If we go, we need to disconnect. + */ + gulong invalidate_id; +} VipsArgumentInstance; + +/* Need to look up our VipsArgument structs from a pspec. Just hash the + * pointer (ie. we assume pspecs are never shared, is this correct?) + */ +typedef GHashTable VipsArgumentTable; + +VIPS_API +int vips_argument_get_id(void); +void vips__object_set_member(VipsObject *object, GParamSpec *pspec, + GObject **member, GObject *argument); +typedef void *(*VipsArgumentMapFn)(VipsObject *object, GParamSpec *pspec, + VipsArgumentClass *argument_class, + VipsArgumentInstance *argument_instance, void *a, void *b); +VIPS_API +void *vips_argument_map(VipsObject *object, + VipsArgumentMapFn fn, void *a, void *b); +VIPS_API +int vips_object_get_args(VipsObject *object, + const char ***names, int **flags, int *n_args); +typedef void *(*VipsArgumentClassMapFn)(VipsObjectClass *object_class, + GParamSpec *pspec, + VipsArgumentClass *argument_class, void *a, void *b); +VIPS_API +void *vips_argument_class_map(VipsObjectClass *object_class, + VipsArgumentClassMapFn fn, void *a, void *b); +VIPS_API +gboolean vips_argument_class_needsstring(VipsArgumentClass *argument_class); +VIPS_API +int vips_object_get_argument(VipsObject *object, const char *name, + GParamSpec **pspec, + VipsArgumentClass **argument_class, + VipsArgumentInstance **argument_instance); +VIPS_API +gboolean vips_object_argument_isset(VipsObject *object, const char *name); +VIPS_API +VipsArgumentFlags vips_object_get_argument_flags(VipsObject *object, + const char *name); +VIPS_API +int vips_object_get_argument_priority(VipsObject *object, const char *name); + +/* We have to loop over an objects args in several places, and we can't always + * use vips_argument_map(), the preferred looper. Have the loop code as a + * macro as well for these odd cases. + */ +#define VIPS_ARGUMENT_FOR_ALL(OBJECT, PSPEC, ARG_CLASS, ARG_INSTANCE) \ + { \ + VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \ + GSList *p; \ +\ + for (p = object_class->argument_table_traverse; p; p = p->next) { \ + VipsArgumentClass *ARG_CLASS = \ + (VipsArgumentClass *) p->data; \ + VipsArgument *argument = (VipsArgument *) argument_class; \ + GParamSpec *PSPEC = argument->pspec; \ + VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \ + vips__argument_get_instance(argument_class, \ + VIPS_OBJECT(OBJECT)); + +#define VIPS_ARGUMENT_FOR_ALL_END \ + } \ + } + +/* And some macros to collect args from a va list. + * + * Use something like this: + * + * GParamSpec *pspec; + * VipsArgumentClass *argument_class; + * VipsArgumentInstance *argument_instance; + * + * if (vips_object_get_argument(VIPS_OBJECT(operation), name, + * &pspec, &argument_class, &argument_instance)) + * return -1; + * + * VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap); + * + * GValue value holds the value of an input argument, do + * something with it + * + * VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap); + * + * void **arg points to where to write an output argument + * + * VIPS_ARGUMENT_COLLECT_END + */ +#define VIPS_ARGUMENT_COLLECT_SET(PSPEC, ARG_CLASS, AP) \ + if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \ + GValue value = G_VALUE_INIT; \ + gchar *error = NULL; \ +\ + /* Input args are given inline, eg. ("factor", 12.0) \ + * and must be collected. \ + */ \ + G_VALUE_COLLECT_INIT(&value, \ + G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \ +\ + /* Don't bother with the error message. \ + */ \ + if (error) { \ + VIPS_DEBUG_MSG("VIPS_OBJECT_COLLECT_SET: err\n"); \ + g_free(error); \ + } + +#define VIPS_ARGUMENT_COLLECT_GET(PSPEC, ARG_CLASS, AP) \ + g_value_unset(&value); \ + } \ + else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \ + { \ + void **arg G_GNUC_UNUSED; \ +\ + /* Output args are a pointer to where to send the \ + * result. \ + */ \ + arg = va_arg(AP, void **); + +#define VIPS_ARGUMENT_COLLECT_END \ + } + +#define VIPS_TYPE_OBJECT (vips_object_get_type()) +#define VIPS_OBJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject)) +#define VIPS_OBJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass)) +#define VIPS_IS_OBJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_OBJECT)) +#define VIPS_IS_OBJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_OBJECT)) +#define VIPS_OBJECT_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass)) + +struct _VipsObject { + GObject parent_instance; + + /* Set after ->build() has run successfully: construct is fully done + * and checked. + */ + gboolean constructed; + + /* Set for static objects which are allocated at startup and never + * freed. These objects are omitted from leak reports. + */ + gboolean static_object; + + /* Table of argument instances for this class and any derived classes. + */ + VipsArgumentTable *argument_table; + + /* Class properties (see below), duplicated in the instance so we can + * get at them easily via the property system. + */ + char *nickname; + char *description; + + /* The pre/post/close callbacks are all fire-once. + */ + gboolean preclose; + gboolean close; + gboolean postclose; + + /* Total memory allocated relative to this object, handy for + * profiling. + */ + size_t local_memory; +}; + +struct _VipsObjectClass { + GObjectClass parent_class; + + /* Build the object ... all argument properties have been set, + * now build the thing. + */ + int (*build)(VipsObject *object); + + /* Just after build ... the object is fully ready for work. + */ + int (*postbuild)(VipsObject *object, void *data); + + /* Try to print something about the class, handy for help displays. + * Keep to one line. + */ + void (*summary_class)(struct _VipsObjectClass *cls, VipsBuf *buf); + + /* Try to print a one-line summary for the object, the user can see + * this output via things like "header fred.tif", --vips-cache-trace, + * etc. + */ + void (*summary)(VipsObject *object, VipsBuf *buf); + + /* Try to print everything about the object, handy for debugging. + */ + void (*dump)(VipsObject *object, VipsBuf *buf); + + /* Sanity-check the object. Print messages and stuff. + * Handy for debugging. + */ + void (*sanity)(VipsObject *object, VipsBuf *buf); + + /* Rewind. Save and restore any stuff that needs to survive a + * dispose(). + */ + void (*rewind)(VipsObject *object); + + /* Just before close, everything is still alive. + */ + void (*preclose)(VipsObject *object); + + /* Close, time to free stuff. + */ + void (*close)(VipsObject *object); + + /* Post-close, everything is dead, except the VipsObject pointer. + * Useful for eg. deleting the file associated with a temp image. + */ + void (*postclose)(VipsObject *object); + + /* The CLI interface. Implement these four to get CLI input and output + * for your object. + */ + + /* Given a command-line arg (eg. a filename), make an instance of the + * object. Just do the g_object_new(), don't call _build(). + * + * Don't call this directly, see vips_object_new_from_string(). + */ + VipsObject *(*new_from_string)(const char *string); + + /* The inverse of ^^. Given an object, output what ->new_from_string() + * would have been given to make that object. + */ + void (*to_string)(VipsObject *object, VipsBuf *buf); + + /* Does this output arg need an arg from the command line? Image + * output, for example, needs a filename to write to. + */ + gboolean output_needs_arg; + + /* Write the object to the string. Return 0 for success, or -1 on + * error, setting vips_error(). string is NULL if output_needs_arg() + * was FALSE. + */ + int (*output_to_arg)(VipsObject *object, const char *string); + + /* Class nickname, eg. "VipsInterpolateBicubic" has "bicubic" as a + * nickname. Not internationalised. + */ + const char *nickname; + + /* Class description. Used for help messages, so internationalised. + */ + const char *description; + + /* Hash from pspec to VipsArgumentClass. + * + * This records the VipsArgumentClass for every pspec used in + * VipsObject and any subclass (ie. everywhere), so it's huge. Don't + * loop over this hash! Fine for lookups though. + */ + VipsArgumentTable *argument_table; + + /* A sorted (by priority) list of the VipsArgumentClass for this class + * and any superclasses. This is small and specific to this class. + * + * Use the stored GType to work out when to restart the list for a + * subclass. + */ + GSList *argument_table_traverse; + GType argument_table_traverse_gtype; + + /* This class is deprecated and therefore hidden from various UI bits. + * + * VipsOperation has a deprecated flag, use that in preference to this + * if you can. + */ + gboolean deprecated; + + /* Reserved for future expansion. + */ + void (*_vips_reserved1)(void); + void (*_vips_reserved2)(void); + void (*_vips_reserved3)(void); + void (*_vips_reserved4)(void); +}; + +VIPS_API +gboolean vips_value_is_null(GParamSpec *psoec, const GValue *value); +VIPS_API +void vips_object_set_property(GObject *gobject, + guint property_id, const GValue *value, GParamSpec *pspec); +VIPS_API +void vips_object_get_property(GObject *gobject, + guint property_id, GValue *value, GParamSpec *pspec); + +VIPS_API +void vips_object_preclose(VipsObject *object); +VIPS_API +int vips_object_build(VipsObject *object); + +VIPS_API +void vips_object_summary_class(VipsObjectClass *klass, VipsBuf *buf); +VIPS_API +void vips_object_summary(VipsObject *object, VipsBuf *buf); +VIPS_API +void vips_object_dump(VipsObject *object, VipsBuf *buf); + +VIPS_API +void vips_object_print_summary_class(VipsObjectClass *klass); +VIPS_API +void vips_object_print_summary(VipsObject *object); +VIPS_API +void vips_object_print_dump(VipsObject *object); +VIPS_API +void vips_object_print_name(VipsObject *object); + +VIPS_API +gboolean vips_object_sanity(VipsObject *object); + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_object_get_type(void); + +VIPS_API +void vips_object_class_install_argument(VipsObjectClass *cls, + GParamSpec *pspec, VipsArgumentFlags flags, + int priority, guint offset); +VIPS_API +int vips_object_set_argument_from_string(VipsObject *object, + const char *name, const char *value); +VIPS_API +gboolean vips_object_argument_needsstring(VipsObject *object, + const char *name); +VIPS_API +int vips_object_get_argument_to_string(VipsObject *object, + const char *name, const char *arg); +VIPS_API +int vips_object_set_required(VipsObject *object, const char *value); + +typedef void *(*VipsObjectSetArguments)(VipsObject *object, void *a, void *b); +VIPS_API +VipsObject *vips_object_new(GType type, + VipsObjectSetArguments set, void *a, void *b); + +VIPS_API +int vips_object_set_valist(VipsObject *object, va_list ap); +VIPS_API +int vips_object_set(VipsObject *object, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_object_set_from_string(VipsObject *object, const char *string); + +VIPS_API +VipsObject *vips_object_new_from_string(VipsObjectClass *object_class, + const char *p); +VIPS_API +void vips_object_to_string(VipsObject *object, VipsBuf *buf); + +VIPS_API +void *vips_object_map(VipsSListMap2Fn fn, void *a, void *b); + +typedef void *(*VipsTypeMapFn)(GType type, void *a); +typedef void *(*VipsTypeMap2Fn)(GType type, void *a, void *b); +typedef void *(*VipsClassMapFn)(VipsObjectClass *cls, void *a); +VIPS_API +void *vips_type_map(GType base, VipsTypeMap2Fn fn, void *a, void *b); +VIPS_API +void *vips_type_map_all(GType base, VipsTypeMapFn fn, void *a); +VIPS_API +int vips_type_depth(GType type); +VIPS_API +GType vips_type_find(const char *basename, const char *nickname); +VIPS_API +const char *vips_nickname_find(GType type); + +VIPS_API +void *vips_class_map_all(GType type, VipsClassMapFn fn, void *a); +VIPS_API +const VipsObjectClass *vips_class_find(const char *basename, + const char *nickname); + +VIPS_API +VipsObject **vips_object_local_array(VipsObject *parent, int n); + +VIPS_API +void vips_object_local_cb(VipsObject *vobject, GObject *gobject); +#define vips_object_local(V, G) \ + (g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G)) + +VIPS_API +void vips_object_set_static(VipsObject *object, gboolean static_object); +VIPS_API +void vips_object_print_all(void); +VIPS_API +void vips_object_sanity_all(void); + +VIPS_API +void vips_object_rewind(VipsObject *object); + +VIPS_API +void vips_object_unref_outputs(VipsObject *object); + +VIPS_API +const char *vips_object_get_description(VipsObject *object); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_OBJECT_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/operation.h b/jtlsrv-cpp/.static-build/include/vips/operation.h new file mode 100644 index 0000000..7384a4e --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/operation.h @@ -0,0 +1,178 @@ +/* base class for all vips operations + */ + +/* + + Copyright (C) 1991-2005 The National Gallery + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_OPERATION_H +#define VIPS_OPERATION_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum /*< flags >*/ { + VIPS_OPERATION_NONE = 0, + VIPS_OPERATION_SEQUENTIAL = 1, + VIPS_OPERATION_SEQUENTIAL_UNBUFFERED = 2, + VIPS_OPERATION_NOCACHE = 4, + VIPS_OPERATION_DEPRECATED = 8, + VIPS_OPERATION_UNTRUSTED = 16, + VIPS_OPERATION_BLOCKED = 32, + VIPS_OPERATION_REVALIDATE = 64 +} VipsOperationFlags; + +#define VIPS_TYPE_OPERATION (vips_operation_get_type()) +#define VIPS_OPERATION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_OPERATION, VipsOperation)) +#define VIPS_OPERATION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_OPERATION, VipsOperationClass)) +#define VIPS_IS_OPERATION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_OPERATION)) +#define VIPS_IS_OPERATION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_OPERATION)) +#define VIPS_OPERATION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_OPERATION, VipsOperationClass)) + +typedef gboolean (*VipsOperationBuildFn)(VipsObject *object); + +struct _VipsOperation { + VipsObject parent_instance; + + /* Keep the hash here. + */ + guint hash; + gboolean found_hash; + + /* Pixels calculated ... handy for measuring over-calculation. + */ + int pixels; +}; + +typedef struct _VipsOperationClass { + VipsObjectClass parent_class; + + /* Print the usage message. + */ + void (*usage)(struct _VipsOperationClass *cls, VipsBuf *buf); + + /* Return a set of operation flags. + */ + VipsOperationFlags (*get_flags)(VipsOperation *operation); + VipsOperationFlags flags; + + /* One of our input images has signalled "invalidate". The cache uses + * VipsOperation::invalidate to drop dirty ops. + */ + void (*invalidate)(VipsOperation *operation); +} VipsOperationClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_operation_get_type(void); + +VIPS_API +VipsOperationFlags vips_operation_get_flags(VipsOperation *operation); +VIPS_API +void vips_operation_class_print_usage(VipsOperationClass *operation_class); +VIPS_API +void vips_operation_invalidate(VipsOperation *operation); + +VIPS_API +int vips_operation_call_valist(VipsOperation *operation, va_list ap); +VIPS_API +VipsOperation *vips_operation_new(const char *name); +VIPS_API +int vips_call_required_optional(VipsOperation **operation, + va_list required, va_list optional); +VIPS_API +int vips_call(const char *operation_name, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_call_split(const char *operation_name, va_list optional, ...); +VIPS_API +int vips_call_split_option_string(const char *operation_name, + const char *option_string, va_list optional, ...); + +VIPS_API +void vips_call_options(GOptionGroup *group, VipsOperation *operation); +VIPS_API +int vips_call_argv(VipsOperation *operation, int argc, char **argv); + +VIPS_API +void vips_cache_drop_all(void); +VIPS_API +int vips_cache_operation_buildp(VipsOperation **operation); +VIPS_API +VipsOperation *vips_cache_operation_build(VipsOperation *operation); +VIPS_API +void vips_cache_print(void); +VIPS_API +void vips_cache_set_max(int max); +VIPS_API +void vips_cache_set_max_mem(size_t max_mem); +VIPS_API +int vips_cache_get_max(void); +VIPS_API +int vips_cache_get_size(void); +VIPS_API +size_t vips_cache_get_max_mem(void); +VIPS_API +int vips_cache_get_max_files(void); +VIPS_API +void vips_cache_set_max_files(int max_files); +VIPS_API +void vips_cache_set_dump(gboolean dump); +VIPS_API +void vips_cache_set_trace(gboolean trace); + +/* Part of threadpool, really, but we want these in a header that gets scanned + * for our typelib. + */ +VIPS_API +void vips_concurrency_set(int concurrency); +VIPS_API +int vips_concurrency_get(void); + +VIPS_API +void vips_operation_block_set(const char *name, gboolean state); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_OPERATION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/private.h b/jtlsrv-cpp/.static-build/include/vips/private.h new file mode 100644 index 0000000..766c455 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/private.h @@ -0,0 +1,234 @@ +/* Declarations which are public-facing, but private. See internal.h for + * declarations which are only used internally by vips and which are not + * externally visible. + * + * 6/7/09 + * - from vips.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_PRIVATE_H +#define VIPS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_SPARE (8) + +/* Private to iofuncs: the minimum number of scanlines we add above and below + * the window as a margin for slop. + */ +#define VIPS__WINDOW_MARGIN_PIXELS (128) + +/* Private to iofuncs: add at least this many bytes above and below the window. + * There's no point mapping just a few KB of a small image. + */ +#define VIPS__WINDOW_MARGIN_BYTES (1024 * 1024 * 10) + +/* sizeof() a VIPS header on disc. + */ +#define VIPS_SIZEOF_HEADER (64) + +/* What we track for each mmap window. Have a list of these on an openin + * VipsImage. + */ +typedef struct { + int ref_count; /* # of regions referencing us */ + struct _VipsImage *im; /* VipsImage we are attached to */ + + int top; /* Area of image we have mapped, in pixels */ + int height; + VipsPel *data; /* First pixel of line 'top' */ + + void *baseaddr; /* Base of window */ + size_t length; /* Size of window */ +} VipsWindow; + +VIPS_API +int vips_window_unref(VipsWindow *window); +VIPS_API +void vips_window_print(VipsWindow *window); + +/* Per-thread buffer state. Held in a GPrivate. + */ +typedef struct { + GHashTable *hash; /* VipsImage -> VipsBufferCache* */ + GThread *thread; /* Just for sanity checking */ +} VipsBufferThread; + +/* Per-image buffer cache. This keeps a list of "done" VipsBuffer that this + * worker has generated. We use this to reuse results within a thread. + * + * Hash to this from VipsBufferThread::hash. + * We can't store the GSList directly in the hash table as GHashTable lacks an + * update operation and we'd need to _remove() and _insert() on every list + * operation. + */ +typedef struct _VipsBufferCache { + GSList *buffers; /* GSList of "done" VipsBuffer* */ + GThread *thread; /* Just for sanity checking */ + struct _VipsImage *im; + VipsBufferThread *buffer_thread; + GSList *reserve; /* VipsBuffer kept in reserve */ + int n_reserve; /* Number in reserve */ +} VipsBufferCache; + +/* What we track for each pixel buffer. These can move between caches and + * between threads, but not between images. + * + * Moving between threads is difficult, use region ownership stuff. + */ +typedef struct _VipsBuffer { + int ref_count; /* # of regions referencing us */ + struct _VipsImage *im; /* VipsImage we are attached to */ + + VipsRect area; /* Area this pixel buffer covers */ + gboolean done; /* Calculated and in a cache */ + VipsBufferCache *cache; /* The cache this buffer is published on */ + VipsPel *buf; /* Private malloc() area */ + size_t bsize; /* Size of private malloc() */ +} VipsBuffer; + +VIPS_API +void vips_buffer_dump_all(void); +VIPS_API +void vips_buffer_done(VipsBuffer *buffer); +VIPS_API +void vips_buffer_undone(VipsBuffer *buffer); +VIPS_API +void vips_buffer_unref(VipsBuffer *buffer); +VIPS_API +VipsBuffer *vips_buffer_new(struct _VipsImage *im, VipsRect *area); +VIPS_API +VipsBuffer *vips_buffer_ref(struct _VipsImage *im, VipsRect *area); +VIPS_API +VipsBuffer *vips_buffer_unref_ref(VipsBuffer *buffer, + struct _VipsImage *im, VipsRect *area); +VIPS_API +void vips_buffer_print(VipsBuffer *buffer); + +void vips__render_shutdown(void); + +/* Sections of region.h that are private to VIPS. + */ + +/* Region types. + */ +typedef enum _RegionType { + VIPS_REGION_NONE, + VIPS_REGION_BUFFER, /* A VipsBuffer */ + VIPS_REGION_OTHER_REGION, /* Memory on another region */ + VIPS_REGION_OTHER_IMAGE, /* Memory on another image */ + VIPS_REGION_WINDOW /* A VipsWindow on fd */ +} RegionType; + +/* Private to iofuncs: the size of the `tiles' requested by + * vips_image_generate() when acting as a data sink. + */ +#define VIPS__TILE_WIDTH (128) +#define VIPS__TILE_HEIGHT (128) + +/* The height of the strips for the other two request styles. + */ +#define VIPS__THINSTRIP_HEIGHT (1) +#define VIPS__FATSTRIP_HEIGHT (16) + +/* Functions on regions. + */ +struct _VipsRegion; +void vips__region_take_ownership(struct _VipsRegion *reg); +void vips__region_check_ownership(struct _VipsRegion *reg); +/* TODO(kleisauke): VIPS_API is required by vipsdisp. + */ +VIPS_API +void vips__region_no_ownership(struct _VipsRegion *reg); + +typedef int (*VipsRegionFillFn)(struct _VipsRegion *, void *); +VIPS_API +int vips_region_fill(struct _VipsRegion *reg, + const VipsRect *r, VipsRegionFillFn fn, void *a); + +int vips__image_wio_output(struct _VipsImage *image); +int vips__image_pio_output(struct _VipsImage *image); + +/* VIPS_ARGUMENT_FOR_ALL() needs to have this visible. + */ +VIPS_API +VipsArgumentInstance *vips__argument_get_instance( + VipsArgumentClass *argument_class, + VipsObject *object); +VipsArgument *vips__argument_table_lookup(VipsArgumentTable *table, + GParamSpec *pspec); + +/* im_demand_hint_array() needs to have this visible. + */ +#if VIPS_ENABLE_DEPRECATED +VIPS_API +#endif +void vips__demand_hint_array(struct _VipsImage *image, + int hint, struct _VipsImage **in); +/* im_cp_desc_array() needs to have this visible. + */ +#if VIPS_ENABLE_DEPRECATED +VIPS_API +#endif +int vips__image_copy_fields_array(struct _VipsImage *out, + struct _VipsImage *in[]); + +void vips__region_count_pixels(struct _VipsRegion *region, const char *nickname); +VIPS_API +void vips_region_dump_all(void); + +VIPS_API +int vips_region_prepare_many(struct _VipsRegion **reg, const VipsRect *r); + +/* Handy for debugging. + */ +int vips__view_image(struct _VipsImage *image); + +/* Pre 8.7 libvipses used this for allocating argument ids. + */ +VIPS_API +int _vips__argument_id; + +void vips__meta_init(void); + +// autoptr needs typed functions for autofree ... this needs to be in the +// public API since downstream projects can use our auto defs +VIPS_API +void VipsArrayDouble_unref(VipsArrayDouble *array); +VIPS_API +void VipsArrayImage_unref(VipsArrayImage *array); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_PRIVATE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/rect.h b/jtlsrv-cpp/.static-build/include/vips/rect.h new file mode 100644 index 0000000..52479e1 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/rect.h @@ -0,0 +1,80 @@ +/* Simple rectangle algebra. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_RECT_H +#define VIPS_RECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef struct _VipsRect { + /*< public >*/ + int left; + int top; + int width; + int height; +} VipsRect; + +#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width) +#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height) +#define VIPS_RECT_HCENTRE(R) ((R)->left + (R)->width / 2) +#define VIPS_RECT_VCENTRE(R) ((R)->top + (R)->height / 2) + +VIPS_API +gboolean vips_rect_isempty(const VipsRect *r); +VIPS_API +gboolean vips_rect_includespoint(const VipsRect *r, int x, int y); +VIPS_API +gboolean vips_rect_includesrect(const VipsRect *r1, const VipsRect *r2); +VIPS_API +gboolean vips_rect_equalsrect(const VipsRect *r1, const VipsRect *r2); +VIPS_API +gboolean vips_rect_overlapsrect(const VipsRect *r1, const VipsRect *r2); +VIPS_API +void vips_rect_marginadjust(VipsRect *r, int n); +VIPS_API +void vips_rect_intersectrect(const VipsRect *r1, const VipsRect *r2, + VipsRect *out); +VIPS_API +void vips_rect_unionrect(const VipsRect *r1, const VipsRect *r2, + VipsRect *out); +VIPS_API +VipsRect *vips_rect_dup(const VipsRect *r); +VIPS_API +void vips_rect_normalise(VipsRect *r); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_RECT_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/region.h b/jtlsrv-cpp/.static-build/include/vips/region.h new file mode 100644 index 0000000..b066289 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/region.h @@ -0,0 +1,238 @@ +/* Definitions for partial image regions. + * + * J.Cupitt, 8/4/93 + * + * 2/3/11 + * - move to GObject + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_REGION_H +#define VIPS_REGION_H + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_REGION (vips_region_get_type()) +#define VIPS_REGION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_REGION, VipsRegion)) +#define VIPS_REGION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_REGION, VipsRegionClass)) +#define VIPS_IS_REGION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_REGION)) +#define VIPS_IS_REGION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_REGION)) +#define VIPS_REGION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_REGION, VipsRegionClass)) + +/** + * VipsRegionShrink: + * @VIPS_REGION_SHRINK_MEAN: use the average + * @VIPS_REGION_SHRINK_MEDIAN: use the median + * @VIPS_REGION_SHRINK_MODE: use the mode + * @VIPS_REGION_SHRINK_MAX: use the maximum + * @VIPS_REGION_SHRINK_MIN: use the minimum + * @VIPS_REGION_SHRINK_NEAREST: use the top-left pixel + * + * How to calculate the output pixels when shrinking a 2x2 region. + */ +typedef enum { + VIPS_REGION_SHRINK_MEAN, + VIPS_REGION_SHRINK_MEDIAN, + VIPS_REGION_SHRINK_MODE, + VIPS_REGION_SHRINK_MAX, + VIPS_REGION_SHRINK_MIN, + VIPS_REGION_SHRINK_NEAREST, + VIPS_REGION_SHRINK_LAST +} VipsRegionShrink; + +/* Sub-area of image. + * + * Matching typedef in basic.h. + */ +struct _VipsRegion { + VipsObject parent_object; + + /*< public >*/ + /* Users may read these two fields. + */ + VipsImage *im; /* Link back to parent image */ + VipsRect valid; /* Area of parent we can see */ + + /* The rest of VipsRegion is private. + */ + /*< private >*/ + RegionType type; /* What kind of attachment */ + VipsPel *data; /* Off here to get data */ + int bpl; /* Bytes-per-line for data */ + void *seq; /* Sequence we are using to fill region */ + + /* The thread that made this region. Used to assert() test that + * regions are not being shared between threads. + */ + GThread *thread; + + /* Ref to the window we use for this region, if any. + */ + VipsWindow *window; + + /* Ref to the buffer we use for this region, if any. + */ + VipsBuffer *buffer; + + /* The image this region is on has changed and caches need to be + * dropped. + */ + gboolean invalid; +}; + +typedef struct _VipsRegionClass { + VipsObjectClass parent_class; + +} VipsRegionClass; + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_region_get_type(void); + +VIPS_API +VipsRegion *vips_region_new(VipsImage *image); + +VIPS_API +int vips_region_buffer(VipsRegion *reg, const VipsRect *r); +VIPS_API +int vips_region_image(VipsRegion *reg, const VipsRect *r); +VIPS_API +int vips_region_region(VipsRegion *reg, VipsRegion *dest, + const VipsRect *r, int x, int y); +VIPS_API +int vips_region_equalsregion(VipsRegion *reg1, VipsRegion *reg2); +VIPS_API +int vips_region_position(VipsRegion *reg, int x, int y); + +VIPS_API +void vips_region_paint(VipsRegion *reg, const VipsRect *r, int value); +VIPS_API +void vips_region_paint_pel(VipsRegion *reg, + const VipsRect *r, const VipsPel *ink); +VIPS_API +void vips_region_black(VipsRegion *reg); +VIPS_API +void vips_region_copy(VipsRegion *reg, VipsRegion *dest, + const VipsRect *r, int x, int y); +VIPS_API +int vips_region_shrink_method(VipsRegion *from, VipsRegion *to, + const VipsRect *target, VipsRegionShrink method); +VIPS_API +int vips_region_shrink(VipsRegion *from, VipsRegion *to, + const VipsRect *target); + +VIPS_API +int vips_region_prepare(VipsRegion *reg, const VipsRect *r); +VIPS_API +int vips_region_prepare_to(VipsRegion *reg, + VipsRegion *dest, const VipsRect *r, int x, int y); + +VIPS_API +VipsPel *vips_region_fetch(VipsRegion *region, + int left, int top, int width, int height, size_t *len); +VIPS_API +int vips_region_width(VipsRegion *region); +VIPS_API +int vips_region_height(VipsRegion *region); + +VIPS_API +void vips_region_invalidate(VipsRegion *reg); + +/* Use this to count pixels passing through key points. Handy for spotting bad + * overcomputation. + */ +#ifdef DEBUG_LEAK +#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N) +#else /*!DEBUG_LEAK*/ +#define VIPS_COUNT_PIXELS(R, N) +#endif /*DEBUG_LEAK*/ + +#define VIPS_REGION_LSKIP(R) \ + ((size_t) ((R)->bpl)) +#define VIPS_REGION_N_ELEMENTS(R) \ + ((size_t) ((R)->valid.width * (R)->im->Bands)) +#define VIPS_REGION_SIZEOF_ELEMENT(R) \ + (VIPS_IMAGE_SIZEOF_ELEMENT((R)->im)) +#define VIPS_REGION_SIZEOF_PEL(R) \ + (VIPS_IMAGE_SIZEOF_PEL((R)->im)) +#define VIPS_REGION_SIZEOF_LINE(R) \ + ((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R))) + +/* If DEBUG is defined, add bounds checking. + */ +#ifdef DEBUG +#define VIPS_REGION_ADDR(R, X, Y) \ + ((vips_rect_includespoint(&(R)->valid, (X), (Y))) \ + ? ((R)->data + ((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \ + ((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R)) \ + : (fprintf(stderr, \ + "VIPS_REGION_ADDR: point out of bounds, " \ + "file \"%s\", line %d\n" \ + "(point x=%d, y=%d\n" \ + " should have been within VipsRect left=%d, top=%d, " \ + "width=%d, height=%d)\n", \ + __FILE__, __LINE__, \ + (X), (Y), \ + (R)->valid.left, \ + (R)->valid.top, \ + (R)->valid.width, \ + (R)->valid.height), \ + abort(), (VipsPel *) NULL)) +#else /*DEBUG*/ +#define VIPS_REGION_ADDR(R, X, Y) \ + ((R)->data + \ + ((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \ + ((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R)) +#endif /*DEBUG*/ + +#define VIPS_REGION_ADDR_TOPLEFT(R) ((R)->data) + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_REGION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/resample.h b/jtlsrv-cpp/.static-build/include/vips/resample.h new file mode 100644 index 0000000..7a87972 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/resample.h @@ -0,0 +1,123 @@ +/* resample.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_RESAMPLE_H +#define VIPS_RESAMPLE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +typedef enum { + VIPS_KERNEL_NEAREST, + VIPS_KERNEL_LINEAR, + VIPS_KERNEL_CUBIC, + VIPS_KERNEL_MITCHELL, + VIPS_KERNEL_LANCZOS2, + VIPS_KERNEL_LANCZOS3, + VIPS_KERNEL_LAST +} VipsKernel; + +typedef enum { + VIPS_SIZE_BOTH, + VIPS_SIZE_UP, + VIPS_SIZE_DOWN, + VIPS_SIZE_FORCE, + VIPS_SIZE_LAST +} VipsSize; + +VIPS_API +int vips_shrink(VipsImage *in, VipsImage **out, + double hshrink, double vshrink, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_shrinkh(VipsImage *in, VipsImage **out, int hshrink, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_shrinkv(VipsImage *in, VipsImage **out, int vshrink, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_reduce(VipsImage *in, VipsImage **out, + double hshrink, double vshrink, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_reduceh(VipsImage *in, VipsImage **out, double hshrink, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_reducev(VipsImage *in, VipsImage **out, double vshrink, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_thumbnail(const char *filename, VipsImage **out, int width, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_thumbnail_buffer(void *buf, size_t len, VipsImage **out, + int width, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_thumbnail_image(VipsImage *in, VipsImage **out, int width, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_thumbnail_source(VipsSource *source, VipsImage **out, + int width, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_similarity(VipsImage *in, VipsImage **out, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_rotate(VipsImage *in, VipsImage **out, double angle, ...) + G_GNUC_NULL_TERMINATED; +VIPS_API +int vips_affine(VipsImage *in, VipsImage **out, + double a, double b, double c, double d, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_resize(VipsImage *in, VipsImage **out, double scale, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_mapim(VipsImage *in, VipsImage **out, VipsImage *index, ...) + G_GNUC_NULL_TERMINATED; + +VIPS_API +int vips_quadratic(VipsImage *in, VipsImage **out, VipsImage *coeff, ...) + G_GNUC_NULL_TERMINATED; + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_RESAMPLE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/sbuf.h b/jtlsrv-cpp/.static-build/include/vips/sbuf.h new file mode 100644 index 0000000..8d8b318 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/sbuf.h @@ -0,0 +1,143 @@ +/* Buffered inputput from a VipsSource + * + * J.Cupitt, 18/11/19 + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_SBUF_H +#define VIPS_SBUF_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#define VIPS_TYPE_SBUF (vips_sbuf_get_type()) +#define VIPS_SBUF(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_SBUF, VipsSbuf)) +#define VIPS_SBUF_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_SBUF, VipsSbufClass)) +#define VIPS_IS_SBUF(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_SBUF)) +#define VIPS_IS_SBUF_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_SBUF)) +#define VIPS_SBUF_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_SBUF, VipsSbufClass)) + +#define VIPS_SBUF_BUFFER_SIZE (4096) + +/* Layer over source: read with an input buffer. + * + * Libraries like libjpeg do their own input buffering and need raw IO, but + * others, like radiance, need to parse the input into lines. A buffered read + * class is very convenient. + */ +typedef struct _VipsSbuf { + VipsObject parent_object; + + /*< private >*/ + + /* The VipsSource we wrap. + */ + VipsSource *source; + + /* The +1 means there's always a \0 byte at the end. + * + * Unsigned char, since we don't want >127 to be -ve. + * + * chars_in_buffer is how many chars we have in input_buffer, + * read_point is the current read position in that buffer. + */ + unsigned char input_buffer[VIPS_SBUF_BUFFER_SIZE + 1]; + int chars_in_buffer; + int read_point; + + /* Build lines of text here. + */ + unsigned char line[VIPS_SBUF_BUFFER_SIZE + 1]; + +} VipsSbuf; + +typedef struct _VipsSbufClass { + VipsObjectClass parent_class; + +} VipsSbufClass; + +VIPS_API +GType vips_sbuf_get_type(void); + +VIPS_API +VipsSbuf *vips_sbuf_new_from_source(VipsSource *source); + +VIPS_API +void vips_sbuf_unbuffer(VipsSbuf *sbuf); + +VIPS_API +int vips_sbuf_getc(VipsSbuf *sbuf); +#define VIPS_SBUF_GETC(S) ( \ + (S)->read_point < (S)->chars_in_buffer \ + ? (S)->input_buffer[(S)->read_point++] \ + : vips_sbuf_getc(S)) +VIPS_API +void vips_sbuf_ungetc(VipsSbuf *sbuf); +#define VIPS_SBUF_UNGETC(S) \ + { \ + if ((S)->read_point > 0) \ + (S)->read_point -= 1; \ + } + +VIPS_API +int vips_sbuf_require(VipsSbuf *sbuf, int require); +#define VIPS_SBUF_REQUIRE(S, R) ( \ + (S)->read_point + (R) <= (S)->chars_in_buffer \ + ? 0 \ + : vips_sbuf_require((S), (R))) +#define VIPS_SBUF_PEEK(S) ((S)->input_buffer + (S)->read_point) +#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++]) + +VIPS_API +const char *vips_sbuf_get_line(VipsSbuf *sbuf); +VIPS_API +char *vips_sbuf_get_line_copy(VipsSbuf *sbuf); +VIPS_API +const char *vips_sbuf_get_non_whitespace(VipsSbuf *sbuf); +VIPS_API +int vips_sbuf_skip_whitespace(VipsSbuf *sbuf); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_SBUF_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/semaphore.h b/jtlsrv-cpp/.static-build/include/vips/semaphore.h new file mode 100644 index 0000000..adab65c --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/semaphore.h @@ -0,0 +1,77 @@ +/* Definitions for thread support. + * + * JC, 9/5/94 + * 30/7/99 RP, JC + * - reworked for posix/solaris threads + * 28/9/99 JC + * - restructured, made part of public API + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_SEMAPHORE_H +#define VIPS_SEMAPHORE_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Implement our own semaphores. + */ +typedef struct { + char *name; + int v; + + GMutex *mutex; + GCond *cond; +} VipsSemaphore; + +VIPS_API +int vips_semaphore_up(VipsSemaphore *s); +VIPS_API +int vips_semaphore_upn(VipsSemaphore *s, int n); +VIPS_API +int vips_semaphore_down(VipsSemaphore *s); +VIPS_API +int vips_semaphore_downn(VipsSemaphore *s, int n); +VIPS_API +int vips_semaphore_down_timeout(VipsSemaphore *s, gint64 timeout); +VIPS_API +void vips_semaphore_destroy(VipsSemaphore *s); +VIPS_API +void vips_semaphore_init(VipsSemaphore *s, int v, char *name); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_SEMAPHORE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/thread.h b/jtlsrv-cpp/.static-build/include/vips/thread.h new file mode 100644 index 0000000..79f41e2 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/thread.h @@ -0,0 +1,75 @@ +/* Private include file ... if we've been configured without gthread, we need + * to point the g_thread_*() and g_mutex_*() functions at our own stubs. + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_THREAD_H +#define VIPS_THREAD_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* We need wrappers over g_mutex_new(), it was replaced by g_mutex_init() in + * glib 2.32+ + */ +VIPS_API +GMutex *vips_g_mutex_new(void); +VIPS_API +void vips_g_mutex_free(GMutex *); + +/* Same for GCond. + */ +VIPS_API +GCond *vips_g_cond_new(void); +VIPS_API +void vips_g_cond_free(GCond *); + +/* ... and for GThread. + */ +VIPS_API +GThread *vips_g_thread_new(const char *, GThreadFunc, gpointer); + +VIPS_API +gboolean vips_thread_isvips(void); + +VIPS_API +int vips_thread_execute(const char *domain, GFunc func, gpointer data); + +typedef struct _VipsThreadset VipsThreadset; +VipsThreadset *vips_threadset_new(int max_threads); +int vips_threadset_run(VipsThreadset *set, + const char *domain, GFunc func, gpointer data); +void vips_threadset_free(VipsThreadset *set); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_THREAD_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/threadpool.h b/jtlsrv-cpp/.static-build/include/vips/threadpool.h new file mode 100644 index 0000000..77230f3 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/threadpool.h @@ -0,0 +1,159 @@ +/* Thread eval for VIPS. + * + * 29/9/99 JC + * - from thread.h + * 17/3/10 + * - from threadgroup + * - rework with a simpler distributed work allocation model + * 02/02/20 kleisauke + * - reuse threads by using GLib's threadpool + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_THREADPOOL_H +#define VIPS_THREADPOOL_H + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Per-thread state. Allocate functions can use these members to + * communicate with work functions. + */ + +#define VIPS_TYPE_THREAD_STATE (vips_thread_state_get_type()) +#define VIPS_THREAD_STATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + VIPS_TYPE_THREAD_STATE, VipsThreadState)) +#define VIPS_THREAD_STATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + VIPS_TYPE_THREAD_STATE, VipsThreadStateClass)) +#define VIPS_IS_THREAD_STATE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIPS_TYPE_THREAD_STATE)) +#define VIPS_IS_THREAD_STATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), VIPS_TYPE_THREAD_STATE)) +#define VIPS_THREAD_STATE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + VIPS_TYPE_THREAD_STATE, VipsThreadStateClass)) + +typedef struct _VipsThreadState { + VipsObject parent_object; + + /*< public >*/ + /* Image we run on. + */ + VipsImage *im; + + /* This region is created and destroyed by the threadpool for the + * use of the worker. + */ + VipsRegion *reg; + + /* Neither used nor set, do what you like with them. + */ + VipsRect pos; + int x, y; + + /* Set in work to get the allocate to signal stop. + */ + gboolean stop; + + /* The client data passed to the enclosing vips_threadpool_run(). + */ + void *a; + + /* Set in allocate to stall this thread for a moment. Handy for + * debugging race conditions. + */ + gboolean stall; + +} VipsThreadState; + +typedef struct _VipsThreadStateClass { + VipsObjectClass parent_class; + /*< public >*/ + +} VipsThreadStateClass; + +VIPS_API +void *vips_thread_state_set(VipsObject *object, void *a, void *b); + +/* Don't put spaces around void here, it breaks gtk-doc. + */ +VIPS_API +GType vips_thread_state_get_type(void); + +VIPS_API +VipsThreadState *vips_thread_state_new(VipsImage *im, void *a); + +/* Constructor for per-thread state. + */ +typedef VipsThreadState *(*VipsThreadStartFn)(VipsImage *im, void *a); + +/* A work allocate function. This is run single-threaded by a worker to + * set up a new work unit. + * Return non-zero for errors. Set *stop for "no more work to do" + */ +typedef int (*VipsThreadpoolAllocateFn)(VipsThreadState *state, + void *a, gboolean *stop); + +/* A work function. This does a unit of work (eg. processing a tile or + * whatever). Return non-zero for errors. + */ +typedef int (*VipsThreadpoolWorkFn)(VipsThreadState *state, void *a); + +/* A progress function. This is run by the main thread once for every + * allocation. Return an error to kill computation early. + */ +typedef int (*VipsThreadpoolProgressFn)(void *a); + +VIPS_API +int vips_threadpool_run(VipsImage *im, + VipsThreadStartFn start, + VipsThreadpoolAllocateFn allocate, + VipsThreadpoolWorkFn work, + VipsThreadpoolProgressFn progress, + void *a); +VIPS_API +void vips_get_tile_size(VipsImage *im, + int *tile_width, int *tile_height, int *n_lines); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_THREADPOOL_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/transform.h b/jtlsrv-cpp/.static-build/include/vips/transform.h new file mode 100644 index 0000000..148ae74 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/transform.h @@ -0,0 +1,89 @@ +/* Affine transforms. + */ + +/* + + Copyright (C) 1991-2003 The National Gallery + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_TRANSFORM_H +#define VIPS_TRANSFORM_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Params for an affine transformation. + */ +typedef struct { + /* Area of input we can use. This can be smaller than the real input + * image: we expand the input to add extra pixels for interpolation. + */ + VipsRect iarea; + + /* The area of the output we've been asked to generate. left/top can + * be negative. + */ + VipsRect oarea; + + /* The transform. + */ + double a, b, c, d; + double idx, idy; + double odx, ody; + + double ia, ib, ic, id; /* Inverse of matrix abcd */ +} VipsTransformation; + +void vips__transform_init(VipsTransformation *trn); +int vips__transform_calc_inverse(VipsTransformation *trn); +int vips__transform_isidentity(const VipsTransformation *trn); +int vips__transform_add(const VipsTransformation *in1, + const VipsTransformation *in2, + VipsTransformation *out); +void vips__transform_print(const VipsTransformation *trn); + +void vips__transform_forward_point(const VipsTransformation *trn, + const double x, const double y, double *ox, double *oy); +void vips__transform_invert_point(const VipsTransformation *trn, + const double x, const double y, double *ox, double *oy); +void vips__transform_forward_rect(const VipsTransformation *trn, + const VipsRect *in, VipsRect *out); +void vips__transform_invert_rect(const VipsTransformation *trn, + const VipsRect *in, VipsRect *out); + +void vips__transform_set_area(VipsTransformation *); + +int vips__affine(VipsImage *in, VipsImage *out, VipsTransformation *trn); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_TRANSFORM_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/type.h b/jtlsrv-cpp/.static-build/include/vips/type.h new file mode 100644 index 0000000..1de36a6 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/type.h @@ -0,0 +1,310 @@ +/* the GTypes we define + * + * 27/10/11 + * - from header.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_TYPE_H +#define VIPS_TYPE_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* A very simple boxed type for testing. Just holds an int. + */ +typedef struct _VipsThing { + int i; +} VipsThing; + +/** + * VIPS_TYPE_THING: + * + * The #GType for a #VipsThing. + */ +#define VIPS_TYPE_THING (vips_thing_get_type()) +VIPS_API +GType vips_thing_get_type(void); +VIPS_API +VipsThing *vips_thing_new(int i); + +/* A ref-counted area of memory. Can hold arrays of things as well. + */ +typedef struct _VipsArea { + void *data; + size_t length; /* 0 if not known */ + + /* If this area represents an array, the number of elements in the + * array. Equal to length / sizeof(element). + */ + int n; + + /*< private >*/ + + /* Reference count and lock. + * + * We could use an atomic int, but this is not a high-traffic data + * structure, so a simple GMutex is OK. + */ + int count; + GMutex *lock; + + /* Things like ICC profiles need their own free functions. + * + * Set client to anything you like -- VipsArea doesn't use this. + */ + VipsCallbackFn free_fn; + void *client; + + /* If we are holding an array (for example, an array of double), the + * GType of the elements and their size. 0 for not known. + * + * n is always length / sizeof_type, we keep it as a member for + * convenience. + */ + GType type; + size_t sizeof_type; +} VipsArea; + +VIPS_API +VipsArea *vips_area_copy(VipsArea *area); +VIPS_API +int vips_area_free_cb(void *mem, VipsArea *area); +VIPS_API +void vips_area_unref(VipsArea *area); + +VIPS_API +VipsArea *vips_area_new(VipsCallbackFn free_fn, void *data); +VIPS_API +VipsArea *vips_area_new_array(GType type, size_t sizeof_type, int n); +VIPS_API +VipsArea *vips_area_new_array_object(int n); +VIPS_API +void *vips_area_get_data(VipsArea *area, + size_t *length, int *n, GType *type, size_t *sizeof_type); + +#ifdef VIPS_DEBUG +#define VIPS_ARRAY_ADDR(X, I) \ + (((I) >= 0 && (I) < VIPS_AREA(X)->n) \ + ? (void *) ((VipsPel *) VIPS_AREA(X)->data + \ + VIPS_AREA(X)->sizeof_type * (I)) \ + : (fprintf(stderr, \ + "VIPS_ARRAY_ADDR: index out of bounds, " \ + "file \"%s\", line %d\n" \ + "(index %d should have been within [0,%d])\n", \ + __FILE__, __LINE__, \ + (I), VIPS_AREA(X)->n), \ + NULL)) +#else /*!VIPS_DEBUG*/ +#define VIPS_ARRAY_ADDR(X, I) \ + ((void *) ((VipsPel *) VIPS_AREA(X)->data + \ + VIPS_AREA(X)->sizeof_type * (I))) +#endif /*VIPS_DEBUG*/ + +/** + * VIPS_TYPE_AREA: + * + * The #GType for a #VipsArea. + */ +#define VIPS_TYPE_AREA (vips_area_get_type()) +#define VIPS_AREA(X) ((VipsArea *) (X)) +VIPS_API +GType vips_area_get_type(void); + +/** + * VIPS_TYPE_SAVE_STRING: + * + * The #GType for a #VipsSaveString. + */ +#define VIPS_TYPE_SAVE_STRING (vips_save_string_get_type()) +VIPS_API +GType vips_save_string_get_type(void); + +typedef struct _VipsSaveString { + char *s; +} VipsSaveString; + +/** + * VIPS_TYPE_REF_STRING: + * + * The #GType for a #VipsRefString. + */ +#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type()) + +typedef struct _VipsRefString { + VipsArea area; +} VipsRefString; + +VIPS_API +VipsRefString *vips_ref_string_new(const char *str); +VIPS_API +const char *vips_ref_string_get(VipsRefString *refstr, size_t *length); +VIPS_API +GType vips_ref_string_get_type(void); + +/** + * VIPS_TYPE_BLOB: + * + * The %GType for a #VipsBlob. + */ +#define VIPS_TYPE_BLOB (vips_blob_get_type()) + +typedef struct _VipsBlob { + VipsArea area; +} VipsBlob; + +VIPS_API +VipsBlob *vips_blob_new(VipsCallbackFn free_fn, + const void *data, size_t length); +VIPS_API +VipsBlob *vips_blob_copy(const void *data, size_t length); +VIPS_API +const void *vips_blob_get(VipsBlob *blob, size_t *length); +VIPS_API +void vips_blob_set(VipsBlob *blob, + VipsCallbackFn free_fn, const void *data, size_t length); +VIPS_API +GType vips_blob_get_type(void); + +/** + * VIPS_TYPE_ARRAY_DOUBLE: + * + * The #GType for a #VipsArrayDouble. + */ +#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type()) + +typedef struct _VipsArrayDouble { + VipsArea area; +} VipsArrayDouble; + +VIPS_API +VipsArrayDouble *vips_array_double_new(const double *array, int n); +VIPS_API +VipsArrayDouble *vips_array_double_newv(int n, ...); +VIPS_API +double *vips_array_double_get(VipsArrayDouble *array, int *n); +VIPS_API +GType vips_array_double_get_type(void); + +/** + * VIPS_TYPE_ARRAY_INT: + * + * The #GType for a #VipsArrayInt. + */ +#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type()) + +typedef struct _VipsArrayInt { + VipsArea area; +} VipsArrayInt; + +VIPS_API +VipsArrayInt *vips_array_int_new(const int *array, int n); +VIPS_API +VipsArrayInt *vips_array_int_newv(int n, ...); +VIPS_API +int *vips_array_int_get(VipsArrayInt *array, int *n); +VIPS_API +GType vips_array_int_get_type(void); + +/** + * VIPS_TYPE_ARRAY_IMAGE: + * + * The #GType for a #VipsArrayImage. + */ +#define VIPS_TYPE_ARRAY_IMAGE (vips_array_image_get_type()) + +typedef struct _VipsArrayImage { + VipsArea area; +} VipsArrayImage; + +/* See image.h for vips_array_image_new() etc., they need to be declared after + * VipsImage. + */ +VIPS_API +GType vips_array_image_get_type(void); + +VIPS_API +void vips_value_set_area(GValue *value, VipsCallbackFn free_fn, void *data); +VIPS_API +void *vips_value_get_area(const GValue *value, size_t *length); + +VIPS_API +const char *vips_value_get_save_string(const GValue *value); +VIPS_API +void vips_value_set_save_string(GValue *value, const char *str); +VIPS_API +void vips_value_set_save_stringf(GValue *value, const char *fmt, ...) + G_GNUC_PRINTF(2, 3); + +VIPS_API +const char *vips_value_get_ref_string(const GValue *value, size_t *length); +VIPS_API +void vips_value_set_ref_string(GValue *value, const char *str); + +VIPS_API +void *vips_value_get_blob(const GValue *value, size_t *length); +VIPS_API +void vips_value_set_blob(GValue *value, + VipsCallbackFn free_fn, const void *data, size_t length); +VIPS_API +void vips_value_set_blob_free(GValue *value, void *data, size_t length); + +VIPS_API +void vips_value_set_array(GValue *value, + int n, GType type, size_t sizeof_type); +VIPS_API +void *vips_value_get_array(const GValue *value, + int *n, GType *type, size_t *sizeof_type); + +VIPS_API +double *vips_value_get_array_double(const GValue *value, int *n); +VIPS_API +void vips_value_set_array_double(GValue *value, const double *array, int n); + +VIPS_API +int *vips_value_get_array_int(const GValue *value, int *n); +VIPS_API +void vips_value_set_array_int(GValue *value, const int *array, int n); + +VIPS_API +GObject **vips_value_get_array_object(const GValue *value, int *n); +VIPS_API +void vips_value_set_array_object(GValue *value, int n); + +/* See also image.h, that has vips_array_image_get(), vips_array_image_new(), + * vips_value_get_array_image() and vips_value_set_array_image(). They need + * to be declared after VipsImage. + */ + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_TYPE_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/util.h b/jtlsrv-cpp/.static-build/include/vips/util.h new file mode 100644 index 0000000..201adf9 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/util.h @@ -0,0 +1,432 @@ +/* Various useful definitions. + * + * J.Cupitt, 8/4/93 + * 15/7/96 JC + * - C++ stuff added + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_UTIL_H +#define VIPS_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#include +#include + +/* Some platforms don't have M_PI :-( + */ +#define VIPS_PI (3.14159265358979323846) + +/* Convert degrees->rads and vice-versa. + */ +#define VIPS_RAD(R) (((R) / 360.0) * 2.0 * VIPS_PI) +#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0) + +#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B)) +#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B)) + +#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V))) +#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V))) + +#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0]))) + +#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X)) + +// is something (eg. a pointer) N aligned +#define VIPS_ALIGNED(P, N) ((((guint64) (P)) & ((N) - 1)) == 0) + +/* The built-in isnan and isinf functions provided by gcc 4+ and clang are + * up to 7x faster than their libc equivalent included from . + */ +#if defined(__clang__) || (__GNUC__ >= 4) +#define VIPS_ISNAN(V) __builtin_isnan(V) +#define VIPS_FLOOR(V) __builtin_floor(V) +#define VIPS_CEIL(V) __builtin_ceil(V) +#define VIPS_RINT(V) __builtin_rint(V) +#define VIPS_ROUND(V) __builtin_round(V) +#define VIPS_FABS(V) __builtin_fabs(V) +#define VIPS_FMAX(A, B) __builtin_fmax(A, B) +#define VIPS_FMIN(A, B) __builtin_fmin(A, B) +#else +#define VIPS_ISNAN(V) isnan(V) +#define VIPS_FLOOR(V) floor(V) +#define VIPS_CEIL(V) ceil(V) +#define VIPS_RINT(V) rint(V) +#define VIPS_ROUND(V) round(V) +#define VIPS_FABS(V) VIPS_ABS(V) +#define VIPS_FMAX(A, B) VIPS_MAX(A, B) +#define VIPS_FMIN(A, B) VIPS_MIN(A, B) +#endif + +/* Testing status before the function call saves a lot of time. + */ +#define VIPS_ONCE(ONCE, FUNC, CLIENT) \ + G_STMT_START \ + { \ + if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \ + (void) g_once(ONCE, FUNC, CLIENT); \ + } \ + G_STMT_END + +/* VIPS_RINT() does "bankers rounding", it rounds to the nearest even integer. + * For things like image geometry, we want strict nearest int. + * + * If you know it's unsigned, _UINT is a little faster. + */ +#define VIPS_ROUND_INT(R) ((int) ((R) > 0 ? ((R) + 0.5) : ((R) -0.5))) +#define VIPS_ROUND_UINT(R) ((int) ((R) + 0.5)) + +/* Round N down and up to the nearest multiple of P. + */ +#define VIPS_ROUND_DOWN(N, P) ((N) - ((N) % (P))) +#define VIPS_ROUND_UP(N, P) (VIPS_ROUND_DOWN((N) + (P) -1, (P))) + +#define VIPS_SWAP(TYPE, A, B) \ + G_STMT_START \ + { \ + TYPE t = (A); \ + (A) = (B); \ + (B) = t; \ + } \ + G_STMT_END + +/* Duff's device. Do OPERation N times in a 16-way unrolled loop. + */ +#define VIPS_UNROLL(N, OPER) \ + G_STMT_START \ + { \ + if ((N)) { \ + int duff_count = ((N) + 15) / 16; \ + \ + switch ((N) % 16) { \ + case 0: \ + do { \ + OPER; \ + case 15: \ + OPER; \ + case 14: \ + OPER; \ + case 13: \ + OPER; \ + case 12: \ + OPER; \ + case 11: \ + OPER; \ + case 10: \ + OPER; \ + case 9: \ + OPER; \ + case 8: \ + OPER; \ + case 7: \ + OPER; \ + case 6: \ + OPER; \ + case 5: \ + OPER; \ + case 4: \ + OPER; \ + case 3: \ + OPER; \ + case 2: \ + OPER; \ + case 1: \ + OPER; \ + } while (--duff_count > 0); \ + } \ + } \ + } \ + G_STMT_END + +/* Various integer range clips. Record over/under flows. + */ +#define VIPS_CLIP_UCHAR(V, SEQ) \ + G_STMT_START \ + { \ + if ((V) < 0) { \ + (SEQ)->underflow++; \ + (V) = 0; \ + } \ + else if ((V) > UCHAR_MAX) { \ + (SEQ)->overflow++; \ + (V) = UCHAR_MAX; \ + } \ + } \ + G_STMT_END + +#define VIPS_CLIP_CHAR(V, SEQ) \ + G_STMT_START \ + { \ + if ((V) < SCHAR_MIN) { \ + (SEQ)->underflow++; \ + (V) = SCHAR_MIN; \ + } \ + else if ((V) > SCHAR_MAX) { \ + (SEQ)->overflow++; \ + (V) = SCHAR_MAX; \ + } \ + } \ + G_STMT_END + +#define VIPS_CLIP_USHORT(V, SEQ) \ + G_STMT_START \ + { \ + if ((V) < 0) { \ + (SEQ)->underflow++; \ + (V) = 0; \ + } \ + else if ((V) > USHRT_MAX) { \ + (SEQ)->overflow++; \ + (V) = USHRT_MAX; \ + } \ + } \ + G_STMT_END + +#define VIPS_CLIP_SHORT(V, SEQ) \ + G_STMT_START \ + { \ + if ((V) < SHRT_MIN) { \ + (SEQ)->underflow++; \ + (V) = SHRT_MIN; \ + } \ + else if ((V) > SHRT_MAX) { \ + (SEQ)->overflow++; \ + (V) = SHRT_MAX; \ + } \ + } \ + G_STMT_END + +#define VIPS_CLIP_UINT(V, SEQ) \ + G_STMT_START \ + { \ + if ((V) < 0) { \ + (SEQ)->underflow++; \ + (V) = 0; \ + } \ + } \ + G_STMT_END + +#define VIPS_CLIP_NONE(V, SEQ) \ + { \ + } + +/* Not all platforms have PATH_MAX (eg. Hurd) and we don't need a platform one + * anyway, just a static buffer big enough for almost any path. + */ +#define VIPS_PATH_MAX (4096) + +/* Create multiple copies of a function targeted at groups of SIMD intrinsics, + * with the most suitable selected at runtime via dynamic dispatch. + */ +#ifdef HAVE_TARGET_CLONES +#define VIPS_TARGET_CLONES(TARGETS) \ + __attribute__((target_clones(TARGETS))) +#else +#define VIPS_TARGET_CLONES(TARGETS) +#endif + +VIPS_API +const char *vips_enum_string(GType enm, int value); +VIPS_API +const char *vips_enum_nick(GType enm, int value); +VIPS_API +int vips_enum_from_nick(const char *domain, GType type, const char *str); +VIPS_API +int vips_flags_from_nick(const char *domain, GType type, const char *nick); + +VIPS_API +gboolean vips_slist_equal(GSList *l1, GSList *l2); +VIPS_API +void *vips_slist_map2(GSList *list, VipsSListMap2Fn fn, void *a, void *b); +VIPS_API +void *vips_slist_map2_rev(GSList *list, VipsSListMap2Fn fn, void *a, void *b); +VIPS_API +void *vips_slist_map4(GSList *list, + VipsSListMap4Fn fn, void *a, void *b, void *c, void *d); +VIPS_API +void *vips_slist_fold2(GSList *list, void *start, + VipsSListFold2Fn fn, void *a, void *b); +VIPS_API +GSList *vips_slist_filter(GSList *list, VipsSListMap2Fn fn, void *a, void *b); +VIPS_API +void vips_slist_free_all(GSList *list); +VIPS_API +void *vips_map_equal(void *a, void *b); + +VIPS_API +void *vips_hash_table_map(GHashTable *hash, + VipsSListMap2Fn fn, void *a, void *b); + +VIPS_API +gboolean vips_iscasepostfix(const char *a, const char *b); +VIPS_API +gboolean vips_isprefix(const char *a, const char *b); +VIPS_API +char *vips_break_token(char *str, const char *brk); + +VIPS_API +int vips_filename_suffix_match(const char *path, const char *suffixes[]); + +VIPS_API +gint64 vips_file_length(int fd); +/* TODO(kleisauke): VIPS_API is required by vipsedit. + */ +VIPS_API +int vips__write(int fd, const void *buf, size_t count); + +/* TODO(kleisauke): VIPS_API is required by test_connections. + */ +VIPS_API +int vips__open(const char *filename, int flags, int mode); +int vips__open_read(const char *filename); +FILE *vips__fopen(const char *filename, const char *mode); + +FILE *vips__file_open_read(const char *filename, + const char *fallback_dir, gboolean text_mode); +FILE *vips__file_open_write(const char *filename, + gboolean text_mode); +/* TODO(kleisauke): VIPS_API is required by vipsedit. + */ +VIPS_API +char *vips__file_read(FILE *fp, const char *name, size_t *length_out); +char *vips__file_read_name(const char *name, const char *fallback_dir, + size_t *length_out); +int vips__file_write(void *data, size_t size, size_t nmemb, FILE *stream); +/* TODO(kleisauke): VIPS_API is required by the magick module. + */ +VIPS_API +gint64 vips__get_bytes(const char *filename, unsigned char buf[], gint64 len); +int vips__fgetc(FILE *fp); + +GValue *vips__gvalue_ref_string_new(const char *text); +void vips__gslist_gvalue_free(GSList *list); +GSList *vips__gslist_gvalue_copy(const GSList *list); +GSList *vips__gslist_gvalue_merge(GSList *a, const GSList *b); +char *vips__gslist_gvalue_get(const GSList *list); + +gint64 vips__seek_no_error(int fd, gint64 pos, int whence); +/* TODO(kleisauke): VIPS_API is required by vipsedit. + */ +VIPS_API +gint64 vips__seek(int fd, gint64 pos, int whence); +int vips__ftruncate(int fd, gint64 pos); +VIPS_API +int vips_existsf(const char *name, ...) + G_GNUC_PRINTF(1, 2); +VIPS_API +int vips_isdirf(const char *name, ...) + G_GNUC_PRINTF(1, 2); +VIPS_API +int vips_mkdirf(const char *name, ...) + G_GNUC_PRINTF(1, 2); +VIPS_API +int vips_rmdirf(const char *name, ...) + G_GNUC_PRINTF(1, 2); +VIPS_API +int vips_rename(const char *old_name, const char *new_name); + +/** + * VipsToken: + * @VIPS_TOKEN_LEFT: left bracket + * @VIPS_TOKEN_RIGHT: right bracket + * @VIPS_TOKEN_STRING: string constant + * @VIPS_TOKEN_EQUALS: equals sign + * @VIPS_TOKEN_COMMA: comma + * + * Tokens returned by the vips lexical analyzer, see vips__token_get(). This + * is used to parse option strings for arguments. + * + * Left and right brackets can be any of (, {, [, <. + * + * Strings may be in double quotes, and may contain escaped quote characters, + * for example string, "string" and "str\"ing". + * + */ +typedef enum { + VIPS_TOKEN_LEFT = 1, + VIPS_TOKEN_RIGHT, + VIPS_TOKEN_STRING, + VIPS_TOKEN_EQUALS, + VIPS_TOKEN_COMMA +} VipsToken; + +// we expose this one in the API for testing +VIPS_API +const char *vips__token_get(const char *buffer, + VipsToken *token, char *string, int size); +const char *vips__token_must(const char *buffer, VipsToken *token, + char *string, int size); +const char *vips__token_need(const char *buffer, VipsToken need_token, + char *string, int size); +const char *vips__token_segment(const char *p, VipsToken *token, + char *string, int size); +const char *vips__token_segment_need(const char *p, VipsToken need_token, + char *string, int size); +const char *vips__find_rightmost_brackets(const char *p); +/* TODO(kleisauke): VIPS_API is required by libvips-cpp and vipsheader. + */ +VIPS_API +void vips__filename_split8(const char *name, + char *filename, char *option_string); + +VIPS_API +int vips_ispoweroftwo(int p); +VIPS_API +int vips_amiMSBfirst(void); + +/* TODO(kleisauke): VIPS_API is required by jpegsave_file_fuzzer. + */ +VIPS_API +char *vips__temp_name(const char *format); + +void vips__change_suffix(const char *name, char *out, int mx, + const char *new_suff, const char **olds, int nolds); + +VIPS_API +char *vips_realpath(const char *path); + +guint32 vips__random(guint32 seed); +guint32 vips__random_add(guint32 seed, int value); + +const char *vips__icc_dir(void); +const char *vips__windows_prefix(void); + +char *vips__get_iso8601(void); + +VIPS_API +int vips_strtod(const char *str, double *out); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_UTIL_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/vector.h b/jtlsrv-cpp/.static-build/include/vips/vector.h new file mode 100644 index 0000000..7dc1ee6 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/vector.h @@ -0,0 +1,63 @@ +/* helper stuff for Highway + * + * 16/03/21 kleisauke + * - from vector.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VECTOR_H +#define VIPS_VECTOR_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Set from the command-line. + */ +extern gboolean vips__vector_enabled; + +VIPS_API +gboolean vips_vector_isenabled(void); +VIPS_API +void vips_vector_set_enabled(gboolean enabled); + +VIPS_API +gint64 vips_vector_get_builtin_targets(void); +VIPS_API +gint64 vips_vector_get_supported_targets(void); +VIPS_API +const char *vips_vector_target_name(gint64 target); +VIPS_API +void vips_vector_disable_targets(gint64 disabled_targets); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_VECTOR_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/version.h b/jtlsrv-cpp/.static-build/include/vips/version.h new file mode 100644 index 0000000..390a5ee --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/version.h @@ -0,0 +1,26 @@ +/* Macros for the header version. + */ + +#ifndef VIPS_VERSION_H +#define VIPS_VERSION_H + +#define VIPS_VERSION "8.16.1" +#define VIPS_VERSION_STRING "8.16.1" +#define VIPS_MAJOR_VERSION (8) +#define VIPS_MINOR_VERSION (16) +#define VIPS_MICRO_VERSION (1) + +/* The ABI version, as used for library versioning. + */ +#define VIPS_LIBRARY_CURRENT (60) +#define VIPS_LIBRARY_REVISION (1) +#define VIPS_LIBRARY_AGE (18) + +#define VIPS_CONFIG "enable debug: false\nenable deprecated: true\nenable modules: false\nenable cplusplus: true\nenable RAD load/save: true\nenable Analyze7 load: true\nenable PPM load/save: true\nenable GIF load: true\nFFTs with fftw3: true\nSIMD support with libhwy or liborc: false\nICC profile support with lcms2: false\ndeflate compression with zlib: true\ntext rendering with pangocairo: false\nfont file support with fontconfig: false\nEXIF metadata support with libexif: false\nJPEG load/save with libjpeg: true\nJXL load/save with libjxl: false (dynamic module: false)\nJPEG2000 load/save with OpenJPEG: false\nPNG load/save with libpng: true\nimage quantisation with imagequant or quantizr: false\nTIFF load/save with libtiff: false\nimage pyramid save with libarchive: false\nHEIC/AVIF load/save with libheif: false (dynamic module: false)\nWebP load/save with libwebp: true\nPDF load with PDFium or Poppler: false (dynamic module: false)\nSVG load with librsvg: false\nEXR load with OpenEXR: false\nWSI load with OpenSlide: false (dynamic module: false)\nMatlab load with Matio: false\nNIfTI load/save with libnifti: false\nFITS load/save with cfitsio: false\nGIF save with cgif: false\nMagick load/save with MagickCore: false (dynamic module: false)" + +/* Not really anything to do with versions, but this is a handy place to put + * it. + */ +#define VIPS_ENABLE_DEPRECATED 1 + +#endif /*VIPS_VERSION_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/video.h b/jtlsrv-cpp/.static-build/include/vips/video.h new file mode 100644 index 0000000..b5c9b0c --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/video.h @@ -0,0 +1,52 @@ +/* video.h + * + * 20/9/09 + * - from proto.h + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef IM_VIDEO_H +#define IM_VIDEO_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +VIPS_DEPRECATED +int im_video_v4l1(VipsImage *im, const char *device, + int channel, int brightness, int colour, int contrast, int hue, + int ngrabs); +VIPS_DEPRECATED +int im_video_test(VipsImage *im, int brightness, int error); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*IM_VIDEO_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/vips.h b/jtlsrv-cpp/.static-build/include/vips/vips.h new file mode 100644 index 0000000..9e74ef5 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/vips.h @@ -0,0 +1,201 @@ +/* @(#) Header file for Birkbeck/VIPS Image Processing Library + * Authors: N. Dessipris, K. Martinez, Birkbeck College, London. + * Sept 94 + * + * 15/7/96 JC + * - now does C++ extern stuff + * - many more protos + * 15/4/97 JC + * - protos split out + * 4/3/98 JC + * - IM_ANY added + * - sRGB colourspace added + * 28/10/98 JC + * - VASARI_MAGIC_INTEL and VASARI_MAGIC_SPARC added + * 29/9/99 JC + * - new locks for threading, no more threadgroup stuff in IMAGE + * 30/11/00 JC + * - override RGB/CMYK macros on cygwin + * 21/9/02 JC + * - new Xoffset/Yoffset fields + * - rationalized macro names + * 6/6/05 Markus Wollgarten + * - added Meta header field + * 31/7/05 + * - added meta.h for new metadata API + * 22/8/05 + * - scrapped stupid VAS_HD + * 30/9/05 + * - added sizeof_header field for mmap window read of RAW files + * 4/10/05 + * - now you have to define IM_ENABLE_DEPRECATED to get broken #defined + * 5/10/05 + * - added GNUC attributes + * 8/5/06 + * - added RGB16, GREY16 + * 30/10/06 + * - added im_window_t + * 7/11/07 + * - added preclose and evalstart callbacks + * - brought time struct in here + * 7/3/08 + * - MAGIC values should be unsigned + * 2/7/08 + * - added invalidate callbacks + * 7/8/08 + * - include , thanks nicola + * 30/6/09 + * - move deprecated stuff to its own header + * 16/5/18 + * - remove old vips7 stuff, you must explicitly include it now + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VIPS_H +#define VIPS_VIPS_H + +#include +#include +#include +#include + +/* Needed for VipsGInputStream. + */ +#include + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* VIPS_DISABLE_COMPAT: + * + * Disable automatically inclusion of `vips7compat.h`. + * + * This has no effect when building with `-Ddeprecated=false`. + */ +#if VIPS_ENABLE_DEPRECATED && !defined(VIPS_DISABLE_COMPAT) +#include +#endif + +/* We can't use _ here since this will be compiled by our clients and they may + * not have _(). + */ +#define VIPS_INIT(ARGV0) \ + (vips_version(3) - vips_version(5) != \ + VIPS_LIBRARY_CURRENT - VIPS_LIBRARY_AGE \ + ? ( \ + g_warning("ABI mismatch"), \ + g_warning("library has ABI version %d", \ + vips_version(3) - vips_version(5)), \ + g_warning("application needs ABI version %d", \ + VIPS_LIBRARY_CURRENT - VIPS_LIBRARY_AGE), \ + vips_error("vips_init", "ABI mismatch"), \ + -1) \ + : vips_init(ARGV0)) + +VIPS_API +int vips_max_coord_get(void); +VIPS_API +int vips_init(const char *argv0); +VIPS_API +const char *vips_get_argv0(void); +VIPS_API +const char *vips_get_prgname(void); +VIPS_API +void vips_shutdown(void); +VIPS_API +void vips_thread_shutdown(void); + +VIPS_API +void vips_add_option_entries(GOptionGroup *option_group); + +VIPS_API +void vips_leak_set(gboolean leak); + +VIPS_API +void vips_block_untrusted_set(gboolean state); + +VIPS_API +const char *vips_version_string(void); +VIPS_API +int vips_version(int flag); + +VIPS_API +const char *vips_guess_prefix(const char *argv0, const char *env_name); +VIPS_API +const char *vips_guess_libdir(const char *argv0, const char *env_name); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_VIPS_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/vips7compat.h b/jtlsrv-cpp/.static-build/include/vips/vips7compat.h new file mode 100644 index 0000000..4bc21a9 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/vips7compat.h @@ -0,0 +1,1771 @@ +/* compat with the vips7 API + * + * 4/3/11 + * - hacked up + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_VIPS7COMPAT_H +#define VIPS_VIPS7COMPAT_H + +#include + +#ifdef HAVE_ORC +#include +#endif /* HAVE_ORC */ + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Renamed types. + */ + +/* We have this misspelt in earlier versions :( + */ +#define VIPS_META_IPCT_NAME VIPS_META_IPTC_NAME + +#define IM_D93_X0 VIPS_D93_X0 +#define IM_D93_Y0 VIPS_D93_Y0 +#define IM_D93_Z0 VIPS_D93_Z0 + +#define IM_D75_X0 VIPS_D75_X0 +#define IM_D75_Y0 VIPS_D75_Y0 +#define IM_D75_Z0 VIPS_D75_Z0 + +#define IM_D65_X0 VIPS_D65_X0 +#define IM_D65_Y0 VIPS_D65_Y0 +#define IM_D65_Z0 VIPS_D65_Z0 + +#define IM_D55_X0 VIPS_D55_X0 +#define IM_D55_Y0 VIPS_D55_Y0 +#define IM_D55_Z0 VIPS_D55_Z0 + +#define IM_D50_X0 VIPS_D50_X0 +#define IM_D50_Y0 VIPS_D50_Y0 +#define IM_D50_Z0 VIPS_D50_Z0 + +#define IM_A_X0 VIPS_A_X0 +#define IM_A_Y0 VIPS_A_Y0 +#define IM_A_Z0 VIPS_A_Z0 + +#define IM_B_X0 VIPS_B_X0 +#define IM_B_Y0 VIPS_B_Y0 +#define IM_B_Z0 VIPS_B_Z0 + +#define IM_C_X0 VIPS_C_X0 +#define IM_C_Y0 VIPS_C_Y0 +#define IM_C_Z0 VIPS_C_Z0 + +#define IM_E_X0 VIPS_E_X0 +#define IM_E_Y0 VIPS_E_Y0 +#define IM_E_Z0 VIPS_E_Z0 + +#define IM_D3250_X0 VIPS_D3250_X0 +#define IM_D3250_Y0 VIPS_D3250_Y0 +#define IM_D3250_Z0 VIPS_D3250_Z0 + +#define im_col_Lab2XYZ vips_col_Lab2XYZ +#define im_col_XYZ2Lab vips_col_XYZ2Lab +#define im_col_ab2h vips_col_ab2h +#define im_col_ab2Ch vips_col_ab2Ch +#define im_col_Ch2ab vips_col_Ch2ab + +#define im_col_L2Lucs vips_col_L2Lcmc +#define im_col_C2Cucs vips_col_C2Ccmc +#define im_col_Ch2hucs vips_col_Ch2hcmc +#define im_col_pythagoras vips_pythagoras + +#define im_col_make_tables_UCS vips_col_make_tables_CMC +#define im_col_Lucs2L vips_col_Lcmc2L +#define im_col_Cucs2C vips_col_Ccmc2C +#define im_col_Chucs2h vips_col_Chcmc2h + +#define PEL VipsPel + +#define IM_BANDFMT_NOTSET VIPS_FORMAT_NOTSET +#define IM_BANDFMT_UCHAR VIPS_FORMAT_UCHAR +#define IM_BANDFMT_CHAR VIPS_FORMAT_CHAR +#define IM_BANDFMT_USHORT VIPS_FORMAT_USHORT +#define IM_BANDFMT_SHORT VIPS_FORMAT_SHORT +#define IM_BANDFMT_UINT VIPS_FORMAT_UINT +#define IM_BANDFMT_INT VIPS_FORMAT_INT +#define IM_BANDFMT_FLOAT VIPS_FORMAT_FLOAT +#define IM_BANDFMT_COMPLEX VIPS_FORMAT_COMPLEX +#define IM_BANDFMT_DOUBLE VIPS_FORMAT_DOUBLE +#define IM_BANDFMT_DPCOMPLEX VIPS_FORMAT_DPCOMPLEX +#define IM_BANDFMT_LAST VIPS_FORMAT_LAST +#define VipsBandFmt VipsBandFormat + +#define IM_SMALLTILE VIPS_DEMAND_STYLE_SMALLTILE +#define IM_FATSTRIP VIPS_DEMAND_STYLE_FATSTRIP +#define IM_THINSTRIP VIPS_DEMAND_STYLE_THINSTRIP +#define IM_ANY VIPS_DEMAND_STYLE_ANY + +#define IM_CODING_NONE VIPS_CODING_NONE +#define IM_CODING_LABQ VIPS_CODING_LABQ +#define IM_CODING_RAD VIPS_CODING_RAD + +#define IM_TYPE_MULTIBAND VIPS_INTERPRETATION_MULTIBAND +#define IM_TYPE_B_W VIPS_INTERPRETATION_B_W +#define IM_TYPE_HISTOGRAM VIPS_INTERPRETATION_HISTOGRAM +#define IM_TYPE_FOURIER VIPS_INTERPRETATION_FOURIER +#define IM_TYPE_XYZ VIPS_INTERPRETATION_XYZ +#define IM_TYPE_LAB VIPS_INTERPRETATION_LAB +#define IM_TYPE_CMYK VIPS_INTERPRETATION_CMYK +#define IM_TYPE_LABQ VIPS_INTERPRETATION_LABQ +#define IM_TYPE_RGB VIPS_INTERPRETATION_RGB +#define IM_TYPE_UCS VIPS_INTERPRETATION_CMC +#define IM_TYPE_LCH VIPS_INTERPRETATION_LCH +#define IM_TYPE_LABS VIPS_INTERPRETATION_LABS +#define IM_TYPE_sRGB VIPS_INTERPRETATION_sRGB +#define IM_TYPE_YXY VIPS_INTERPRETATION_YXY +#define IM_TYPE_RGB16 VIPS_INTERPRETATION_RGB16 +#define IM_TYPE_GREY16 VIPS_INTERPRETATION_GREY16 +#define VipsType VipsInterpretation + +#define IMAGE VipsImage +#define REGION VipsRegion + +#define IM_INTENT_PERCEPTUAL VIPS_INTENT_PERCEPTUAL +#define IM_INTENT_RELATIVE_COLORIMETRIC VIPS_INTENT_RELATIVE +#define IM_INTENT_SATURATION VIPS_INTENT_SATURATION +#define IM_INTENT_ABSOLUTE_COLORIMETRIC VIPS_INTENT_ABSOLUTE + +/* Renamed macros. + */ + +#define IM_MAX VIPS_MAX +#define IM_MIN VIPS_MIN +#define IM_RAD VIPS_RAD +#define IM_DEG VIPS_DEG +#define IM_PI VIPS_PI +#define IM_RINT VIPS_RINT +#define IM_ABS VIPS_ABS +#define IM_NUMBER VIPS_NUMBER +#define IM_CLIP VIPS_CLIP +#define IM_CLIP_UCHAR VIPS_CLIP_UCHAR +#define IM_CLIP_CHAR VIPS_CLIP_CHAR +#define IM_CLIP_USHORT VIPS_CLIP_USHORT +#define IM_CLIP_SHORT VIPS_CLIP_SHORT +#define IM_CLIP_NONE VIPS_CLIP_NONE +#define IM_SWAP VIPS_SWAP + +#define IM_IMAGE_ADDR VIPS_IMAGE_ADDR +#define IM_IMAGE_N_ELEMENTS VIPS_IMAGE_N_ELEMENTS +#define IM_IMAGE_SIZEOF_ELEMENT VIPS_IMAGE_SIZEOF_ELEMENT +#define IM_IMAGE_SIZEOF_PEL VIPS_IMAGE_SIZEOF_PEL +#define IM_IMAGE_SIZEOF_LINE VIPS_IMAGE_SIZEOF_LINE + +#define IM_REGION_LSKIP VIPS_REGION_LSKIP +#define IM_REGION_ADDR VIPS_REGION_ADDR +#define IM_REGION_ADDR_TOPLEFT VIPS_REGION_ADDR_TOPLEFT +#define IM_REGION_N_ELEMENTS VIPS_REGION_N_ELEMENTS +#define IM_REGION_SIZEOF_LINE VIPS_REGION_SIZEOF_LINE + +/* Renamed externs. + */ +VIPS_DEPRECATED_FOR(vips_format_sizeof_unsafe) +const guint64 vips__image_sizeof_bandformat[]; +#define im__sizeof_bandfmt vips__image_sizeof_bandformat + +/* Renamed functions. + */ + +#define im_error vips_error +#define im_verror vips_verror +#define im_verror_system vips_verror_system +#define im_error_system vips_error_system +#define im_error_buffer vips_error_buffer +#define im_error_clear vips_error_clear +#define im_warn vips_warn +#define im_vwarn vips_vwarn +#define im_diag vips_info +#define im_vdiag vips_vinfo +#define error_exit vips_error_exit + +#define im_get_argv0 vips_get_argv0 +#define im_version_string vips_version_string +#define im_version vips_version +#define im_get_option_group vips_get_option_group +#define im_guess_prefix vips_guess_prefix +#define im_guess_libdir vips_guess_libdir +#define im__global_lock vips__global_lock + +VIPS_DEPRECATED +int im_cp_desc(IMAGE *out, IMAGE *in); +VIPS_DEPRECATED +int im_cp_descv(IMAGE *im, ...); +#define im_cp_desc_array(I, A) vips__image_copy_fields_array(I, A) +VIPS_DEPRECATED +int im_demand_hint(IMAGE *im, VipsDemandStyle hint, ...); +#define im_demand_hint_array(A, B, C) (vips__demand_hint_array(A, B, C), 0) + +#define im_image(P, W, H, B, F) \ + vips_image_new_from_memory((P), 0, (W), (H), (B), (F)) + +#define im_binfile vips_image_new_from_file_raw +#define im__open_temp vips_image_new_temp_file +#define im__test_kill(I) (vips_image_iskilled(I)) +#define im__start_eval(I) (vips_image_preeval(I), vips_image_iskilled(I)) +#define im__handle_eval(I, W, H) \ + (vips_image_eval(I, W, H), vips_image_iskilled(I)) +#define im__end_eval vips_image_posteval +#define im_invalidate vips_image_invalidate_all +#define im_isfile vips_image_isfile +#define im_printdesc(I) vips_object_print_dump(VIPS_OBJECT(I)) + +/* im_openout() needs to have this visible. + */ +VIPS_DEPRECATED +VipsImage *vips_image_new_mode(const char *filename, const char *mode); + +/* im_image_open_input() needs to have this visible. + */ +VIPS_DEPRECATED +int vips_image_open_input(VipsImage *image); + +/* im_image_open_output() needs to have this visible. + */ +VIPS_DEPRECATED +int vips_image_open_output(VipsImage *image); + +/* im_mapfile() needs to have this visible. + */ +VIPS_DEPRECATED +int vips_mapfile(VipsImage *image); + +/* im_mapfilerw() needs to have this visible. + */ +VIPS_DEPRECATED +int vips_mapfilerw(VipsImage *image); + +/* im_remapfilerw() needs to have this visible. + */ +VIPS_DEPRECATED +int vips_remapfilerw(VipsImage *image); + +#define im_openout(F) vips_image_new_mode(F, "w") +#define im_setbuf(F) vips_image_new("t") + +#define im_initdesc(image, \ + xsize, ysize, bands, bandbits, bandfmt, coding, \ + type, xres, yres, xo, yo) \ + vips_image_init_fields(image, \ + xsize, ysize, bands, bandfmt, coding, \ + type, xres, yres) + +#define im__open_image_file vips__open_image_read +#define im_setupout vips_image_write_prepare +#define im_writeline(Y, IM, P) vips_image_write_line(IM, Y, P) + +#define im_prepare vips_region_prepare +#define im_prepare_to vips_region_prepare_to +#define im_region_create vips_region_new +#define im_region_free g_object_unref +#define im_region_region vips_region_region +#define im_region_buffer vips_region_buffer +#define im_region_black vips_region_black +#define im_region_paint vips_region_paint +#define im_prepare_many vips_region_prepare_many + +#define im__region_no_ownership vips__region_no_ownership + +#define im_image_sanity(I) (!vips_object_sanity(VIPS_OBJECT(I))) +#define im_image_sanity_all vips_object_sanity_all +#define im__print_all vips_object_print_all + +/* Compat functions. + */ + +VIPS_DEPRECATED_FOR(vips_init) +int im_init_world(const char *argv0); + +VIPS_DEPRECATED_FOR(vips_image_new_mode) +VipsImage *im_open(const char *filename, const char *mode); + +VIPS_DEPRECATED +VipsImage *im_open_local(VipsImage *parent, + const char *filename, const char *mode); +VIPS_DEPRECATED +int im_open_local_array(VipsImage *parent, + VipsImage **images, int n, const char *filename, const char *mode); + +#define im_callback_fn VipsCallbackFn + +VIPS_DEPRECATED_FOR(g_signal_connect) +int im_add_callback(VipsImage *im, + const char *callback, im_callback_fn fn, void *a, void *b); +VIPS_DEPRECATED_FOR(g_signal_connect) +int im_add_callback1(VipsImage *im, + const char *callback, im_callback_fn fn, void *a, void *b); +#define im_add_close_callback(IM, FN, A, B) \ + im_add_callback(IM, "close", FN, A, B) +#define im_add_postclose_callback(IM, FN, A, B) \ + im_add_callback(IM, "postclose", FN, A, B) +#define im_add_preclose_callback(IM, FN, A, B) \ + im_add_callback(IM, "preclose", FN, A, B) +#define im_add_evalstart_callback(IM, FN, A, B) \ + im_add_callback1(IM, "preeval", FN, A, B) +#define im_add_evalend_callback(IM, FN, A, B) \ + im_add_callback1(IM, "posteval", FN, A, B) +#define im_add_eval_callback(IM, FN, A, B) \ + (vips_image_set_progress(IM, TRUE), \ + im_add_callback1(IM, "eval", FN, A, B)) +#define im_add_invalidate_callback(IM, FN, A, B) \ + im_add_callback(IM, "invalidate", FN, A, B) + +#define im_bits_of_fmt(fmt) (vips_format_sizeof(fmt) << 3) + +typedef void *(*im_construct_fn)(void *, void *, void *); +VIPS_DEPRECATED_FOR(vips_object_local) +void *im_local(VipsImage *im, + im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c); +VIPS_DEPRECATED_FOR(vips_object_local_array) +int im_local_array(VipsImage *im, void **out, int n, + im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c); + +VIPS_DEPRECATED_FOR(g_object_unref) +int im_close(VipsImage *im); +VIPS_DEPRECATED_FOR(vips_image_new_from_file) +VipsImage *im_init(const char *filename); + +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_Type2char(VipsInterpretation type); +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_BandFmt2char(VipsBandFormat fmt); +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_Coding2char(VipsCoding coding); +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_Compression2char(int n); +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_dtype2char(VipsImageType n); +VIPS_DEPRECATED_FOR(vips_enum_string) +const char *im_dhint2char(VipsDemandStyle style); + +VIPS_DEPRECATED_FOR(vips_enum_from_nick) +VipsInterpretation im_char2Type(const char *str); +VIPS_DEPRECATED_FOR(vips_enum_from_nick) +VipsBandFormat im_char2BandFmt(const char *str); +VIPS_DEPRECATED_FOR(vips_enum_from_nick) +VipsCoding im_char2Coding(const char *str); +VIPS_DEPRECATED_FOR(vips_enum_from_nick) +VipsImageType im_char2dtype(const char *str); +VIPS_DEPRECATED_FOR(vips_enum_from_nick) +VipsDemandStyle im_char2dhint(const char *str); + +#define Rect VipsRect +#define IM_RECT_RIGHT VIPS_RECT_RIGHT +#define IM_RECT_BOTTOM VIPS_RECT_BOTTOM +#define IM_RECT_HCENTRE VIPS_RECT_HCENTRE +#define IM_RECT_VCENTRE VIPS_RECT_VCENTRE + +#define im_rect_marginadjust vips_rect_marginadjust +#define im_rect_includespoint vips_rect_includespoint +#define im_rect_includesrect vips_rect_includesrect +#define im_rect_intersectrect vips_rect_intersectrect +#define im_rect_isempty vips_rect_isempty +#define im_rect_unionrect vips_rect_unionrect +#define im_rect_equalsrect vips_rect_equalsrect +#define im_rect_dup vips_rect_dup +#define im_rect_normalise vips_rect_normalise + +#define im_start_one vips_start_one +#define im_stop_one vips_stop_one +#define im_start_many vips_start_many +#define im_stop_many vips_stop_many +#define im_allocate_input_array vips_allocate_input_array +#define im_start_fn VipsStartFn +typedef int (*im_generate_fn)(VipsRegion *out, void *seq, void *a, void *b); +#define im_stop_fn VipsStopFn +VIPS_DEPRECATED_FOR(vips_image_generate) +int im_generate(VipsImage *im, + im_start_fn start, im_generate_fn generate, im_stop_fn stop, + void *a, void *b); + +#define im__mmap vips__mmap +#define im__munmap vips__munmap +#define im_mapfile vips_mapfile +#define im_mapfilerw vips_mapfilerw +#define im_remapfilerw vips_remapfilerw + +#define im__print_renders vips__print_renders + +VIPS_DEPRECATED_FOR(vips_sink_screen) +int im_cache(IMAGE *in, IMAGE *out, int width, int height, int max); + +#define IM_FREEF(F, S) \ + G_STMT_START \ + { \ + if (S) { \ + (void) F((S)); \ + (S) = 0; \ + } \ + } \ + G_STMT_END + +/* Can't just use VIPS_FREEF(), we want the extra cast to void on the argument + * to vips_free() to make sure we can work for "const char *" variables. + */ +#define IM_FREE(S) \ + G_STMT_START \ + { \ + if (S) { \ + (void) im_free((void *) (S)); \ + (S) = 0; \ + } \ + } \ + G_STMT_END + +#define IM_SETSTR(S, V) \ + G_STMT_START \ + { \ + const char *sst = (V); \ +\ + if ((S) != sst) { \ + if (!(S) || !sst || strcmp((S), sst) != 0) { \ + IM_FREE(S); \ + if (sst) \ + (S) = im_strdup(NULL, sst); \ + } \ + } \ + } \ + G_STMT_END + +#define im_malloc(IM, SZ) \ + (vips_malloc(VIPS_OBJECT(IM), (SZ))) +#define im_free vips_free +#define im_strdup(IM, STR) \ + (vips_strdup(VIPS_OBJECT(IM), (STR))) +#define IM_NEW(IM, T) ((T *) im_malloc((IM), sizeof(T))) +#define IM_ARRAY(IM, N, T) ((T *) im_malloc((IM), (N) * sizeof(T))) + +#define im_incheck vips_image_wio_input +#define im_outcheck(I) (0) +#define im_rwcheck vips_image_inplace +#define im_pincheck vips_image_pio_input +#define im_poutcheck(I) (0) + +#define im_iocheck(I, O) im_incheck(I) +#define im_piocheck(I, O) im_pincheck(I) + +#define im_check_uncoded vips_check_uncoded +#define im_check_coding_known vips_check_coding_known +#define im_check_coding_labq vips_check_coding_labq +#define im_check_coding_rad vips_check_coding_rad +#define im_check_coding_noneorlabq vips_check_coding_noneorlabq +#define im_check_coding_same vips_check_coding_same +#define im_check_mono vips_check_mono +#define im_check_bands_1or3 vips_check_bands_1or3 +#define im_check_bands vips_check_bands +#define im_check_bands_1orn vips_check_bands_1orn +#define im_check_bands_1orn_unary vips_check_bands_1orn_unary +#define im_check_bands_same vips_check_bands_same +#define im_check_bandno vips_check_bandno +#define im_check_int vips_check_int +#define im_check_uint vips_check_uint +#define im_check_uintorf vips_check_uintorf +#define im_check_noncomplex vips_check_noncomplex +#define im_check_complex vips_check_complex +#define im_check_format vips_check_format +#define im_check_u8or16 vips_check_u8or16 +#define im_check_8or16 vips_check_8or16 +#define im_check_u8or16orf vips_check_u8or16orf +#define im_check_format_same vips_check_format_same +#define im_check_size_same vips_check_size_same +#define im_check_vector vips_check_vector +#define im_check_hist vips_check_hist +#define im_check_imask vips_check_imask +#define im_check_dmask vips_check_dmask + +#define vips_bandfmt_isint vips_band_format_isint +#define vips_bandfmt_isuint vips_band_format_isuint +#define vips_bandfmt_isfloat vips_band_format_isfloat +#define vips_bandfmt_iscomplex vips_band_format_iscomplex + +#define im__change_suffix vips__change_suffix + +/* Buffer processing. + */ +typedef void (*im_wrapone_fn)(void *in, void *out, int width, + void *a, void *b); +VIPS_DEPRECATED +int im_wrapone(VipsImage *in, VipsImage *out, + im_wrapone_fn fn, void *a, void *b); + +typedef void (*im_wraptwo_fn)(void *in1, void *in2, void *out, + int width, void *a, void *b); +VIPS_DEPRECATED +int im_wraptwo(VipsImage *in1, VipsImage *in2, VipsImage *out, + im_wraptwo_fn fn, void *a, void *b); + +typedef void (*im_wrapmany_fn)(void **in, void *out, int width, + void *a, void *b); +VIPS_DEPRECATED +int im_wrapmany(VipsImage **in, VipsImage *out, + im_wrapmany_fn fn, void *a, void *b); + +#define IM_META_EXIF_NAME VIPS_META_EXIF_NAME +#define IM_META_ICC_NAME VIPS_META_ICC_NAME +#define IM_META_RESOLUTION_UNIT VIPS_META_RESOLUTION_UNIT +#define IM_TYPE_SAVE_STRING VIPS_TYPE_SAVE_STRING +#define IM_TYPE_BLOB VIPS_TYPE_BLOB +#define IM_TYPE_AREA VIPS_TYPE_AREA +#define IM_TYPE_REF_STRING VIPS_TYPE_REF_STRING + +#define im_header_map_fn VipsImageMapFn +#define im_header_map vips_image_map + +#define im_header_int vips_image_get_int +#define im_header_double vips_image_get_double +#define im_header_string(IMAGE, FIELD, STRING) \ + vips_image_get_string(IMAGE, FIELD, (const char **) STRING) +#define im_header_as_string vips_image_get_as_string +#define im_header_get_typeof vips_image_get_typeof +#define im_header_get vips_image_get + +#define im_histlin vips_image_history_printf +#define im_updatehist vips_image_history_args +#define im_history_get vips_image_get_history + +#define im_save_string_get vips_value_get_save_string +#define im_save_string_set vips_value_set_save_string +#define im_save_string_setf vips_value_set_save_stringf + +#define im_ref_string_set vips_value_set_ref_string +#define im_ref_string_get(V) vips_value_get_ref_string(V, NULL) +VIPS_DEPRECATED_FOR(vips_value_get_ref_string) +size_t im_ref_string_get_length(const GValue *value); + +#define im_blob_get vips_value_get_blob +#define im_blob_set vips_value_set_blob + +#define im_meta_set(A, B, C) (vips_image_set(A, B, C), 0) +#define im_meta_remove vips_image_remove +#define im_meta_get vips_image_get +#define im_meta_get_typeof vips_image_get_typeof + +#define im_meta_set_int(A, B, C) (vips_image_set_int(A, B, C), 0) +#define im_meta_get_int vips_image_get_int +#define im_meta_set_double(A, B, C) (vips_image_set_double(A, B, C), 0) +#define im_meta_get_double vips_image_get_double +#define im_meta_set_area(A, B, C, D) (vips_image_set_area(A, B, C, D), 0) +#define im_meta_get_area vips_image_get_area +#define im_meta_set_string(A, B, C) (vips_image_set_string(A, B, C), 0) +#define im_meta_get_string vips_image_get_string +#define im_meta_set_blob(A, B, C, D, E) \ + (vips_image_set_blob(A, B, C, D, E), 0) +#define im_meta_get_blob vips_image_get_blob + +#define im_semaphore_t VipsSemaphore + +#define im_semaphore_up vips_semaphore_up +#define im_semaphore_down vips_semaphore_down +#define im_semaphore_upn vips_semaphore_upn +#define im_semaphore_downn vips_semaphore_downn +#define im_semaphore_destroy vips_semaphore_destroy +#define im_semaphore_init vips_semaphore_init + +#define im__open_image_read vips__open_image_read +#define im_image_open_input vips_image_open_input +#define im_image_open_output vips_image_open_output +#define im__has_extension_block vips__has_extension_block +#define im__read_extension_block vips__read_extension_block +#define im__write_extension_block vips__write_extension_block +#define im__writehist vips__writehist +#define im__read_header_bytes vips__read_header_bytes +#define im__write_header_bytes vips__write_header_bytes + +#define VSListMap2Fn VipsSListMap2Fn +#define VSListMap4Fn VipsSListMap4Fn +#define VSListFold2Fn VipsSListFold2Fn + +#define im_slist_equal vips_slist_equal +#define im_slist_map2 vips_slist_map2 +#define im_slist_map2_rev vips_slist_map2_rev +#define im_slist_map4 vips_slist_map4 +#define im_slist_fold2 vips_slist_fold2 +#define im_slist_filter vips_slist_filter +#define im_slist_free_all vips_slist_free_all +#define im_map_equal vips_map_equal +#define im_hash_table_map vips_hash_table_map +#define im_strncpy vips_strncpy +#define im_strrstr vips_strrstr +#define im_ispostfix vips_ispostfix +#define im_isprefix vips_isprefix +#define im_break_token vips_break_token +#define im_vsnprintf vips_vsnprintf +#define im_snprintf vips_snprintf +#define im_file_length vips_file_length +#define im__write vips__write +#define im__file_open_read vips__file_open_read +#define im__file_open_write vips__file_open_write +#define im__file_read vips__file_read +#define im__file_read_name vips__file_read_name +#define im__file_write vips__file_write +#define im__get_bytes vips__get_bytes +#define im__gvalue_ref_string_new vips__gvalue_ref_string_new +#define im__gslist_gvalue_free vips__gslist_gvalue_free +#define im__gslist_gvalue_copy vips__gslist_gvalue_copy +#define im__gslist_gvalue_merge vips__gslist_gvalue_merge +#define im__gslist_gvalue_get vips__gslist_gvalue_get +#define im__seek vips__seek +#define im__ftruncate vips__ftruncate +#define im_existsf vips_existsf +#define im_popenf vips_popenf +#define im_ispoweroftwo vips_ispoweroftwo +#define im_amiMSBfirst vips_amiMSBfirst +#define im__temp_name vips__temp_name + +#define IM_VERSION_STRING VIPS_VERSION_STRING +#define IM_MAJOR_VERSION VIPS_MAJOR_VERSION +#define IM_MINOR_VERSION VIPS_MINOR_VERSION +#define IM_MICRO_VERSION VIPS_MICRO_VERSION + +#if defined(G_PLATFORM_WIN32) || defined(G_WITH_CYGWIN) +#define VIPS_EXEEXT ".exe" +#else /* !defined(G_PLATFORM_WIN32) && !defined(G_WITH_CYGWIN) */ +#define VIPS_EXEEXT "" +#endif /* defined(G_PLATFORM_WIN32) || defined(G_WITH_CYGWIN) */ +#define IM_EXEEXT VIPS_EXEEXT + +#define IM_SIZEOF_HEADER VIPS_SIZEOF_HEADER + +#define im_concurrency_set vips_concurrency_set +#define im_concurrency_get vips_concurrency_get + +VIPS_DEPRECATED_FOR(vips_add) +int im_add(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_subtract) +int im_subtract(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_multiply) +int im_multiply(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_divide) +int im_divide(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_min) +int im_min(VipsImage *in, double *out); +VIPS_DEPRECATED_FOR(vips_min) +int im_minpos(VipsImage *in, int *xpos, int *ypos, double *out); +VIPS_DEPRECATED_FOR(vips_max) +int im_max(VipsImage *in, double *out); +VIPS_DEPRECATED_FOR(vips_max) +int im_maxpos(VipsImage *in, int *xpos, int *ypos, double *out); +VIPS_DEPRECATED_FOR(vips_avg) +int im_avg(VipsImage *in, double *out); +VIPS_DEPRECATED_FOR(vips_deviate) +int im_deviate(VipsImage *in, double *out); +VIPS_DEPRECATED_FOR(vips_invert) +int im_invert(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_linear1) +int im_lintra(double a, VipsImage *in, double b, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_linear) +int im_lintra_vec(int n, double *a, VipsImage *in, double *b, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_abs) +int im_abs(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_sign) +int im_sign(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_stats) +DOUBLEMASK *im_stats(VipsImage *in); +VIPS_DEPRECATED_FOR(vips_measure) +DOUBLEMASK *im_measure_area(VipsImage *im, + int left, int top, int width, int height, + int h, int v, + int *sel, int nsel, const char *name); + +VIPS_DEPRECATED_FOR(vips_sin) +int im_sintra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_cos) +int im_costra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_tan) +int im_tantra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_asin) +int im_asintra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_acos) +int im_acostra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_atan) +int im_atantra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_log) +int im_logtra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_log10) +int im_log10tra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_exp) +int im_exptra(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_exp10) +int im_exp10tra(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_floor) +int im_floor(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_rint) +int im_rint(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_ceil) +int im_ceil(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_equal) +int im_equal(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_notequal) +int im_notequal(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_less) +int im_less(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_lesseq) +int im_lesseq(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_more) +int im_more(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_moreeq) +int im_moreeq(VipsImage *in1, VipsImage *in2, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_andimage) +int im_andimage(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_orimage) +int im_orimage(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_eorimage) +int im_eorimage(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_andimage_const) +int im_andimage_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_orimage_const) +int im_orimage_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_eorimage_const) +int im_eorimage_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_andimage_const1) +int im_andimageconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_orimage_const1) +int im_orimageconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_eorimage_const1) +int im_eorimageconst(VipsImage *in, VipsImage *out, double c); + +VIPS_DEPRECATED_FOR(vips_lshift_const) +int im_shiftleft_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_lshift) +int im_shiftleft(VipsImage *in, VipsImage *out, int n); +VIPS_DEPRECATED_FOR(vips_rshift_const) +int im_shiftright_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_rshift) +int im_shiftright(VipsImage *in, VipsImage *out, int n); + +VIPS_DEPRECATED_FOR(vips_remainder) +int im_remainder(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_remainder_const) +int im_remainder_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_remainder_const1) +int im_remainderconst(VipsImage *in, VipsImage *out, double c); + +VIPS_DEPRECATED_FOR(vips_pow) +int im_powtra(VipsImage *in, VipsImage *out, double e); +VIPS_DEPRECATED_FOR(vips_pow_const) +int im_powtra_vec(VipsImage *in, VipsImage *out, int n, double *e); +VIPS_DEPRECATED_FOR(vips_exp) +int im_expntra(VipsImage *in, VipsImage *out, double e); +VIPS_DEPRECATED_FOR(vips_exp_const) +int im_expntra_vec(VipsImage *in, VipsImage *out, int n, double *e); + +VIPS_DEPRECATED_FOR(vips_equal_const) +int im_equal_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_notequal_const) +int im_notequal_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_less_const) +int im_less_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_lesseq_const) +int im_lesseq_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_more_const) +int im_more_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_moreeq_const) +int im_moreeq_vec(VipsImage *in, VipsImage *out, int n, double *c); +VIPS_DEPRECATED_FOR(vips_equal_const1) +int im_equalconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_notequal_const1) +int im_notequalconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_less_const1) +int im_lessconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_lesseq_const1) +int im_lesseqconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_more_const1) +int im_moreconst(VipsImage *in, VipsImage *out, double c); +VIPS_DEPRECATED_FOR(vips_moreeq_const1) +int im_moreeqconst(VipsImage *in, VipsImage *out, double c); + +VIPS_DEPRECATED_FOR(vips_max) +int im_maxpos_vec(VipsImage *im, int *xpos, int *ypos, double *maxima, int n); +VIPS_DEPRECATED_FOR(vips_min) +int im_minpos_vec(VipsImage *im, int *xpos, int *ypos, double *minima, int n); + +VIPS_DEPRECATED +int im_maxpos_avg(VipsImage *im, double *xpos, double *ypos, double *out); + +VIPS_DEPRECATED +int im_linreg(VipsImage **ins, VipsImage *out, double *xs); + +VIPS_DEPRECATED_FOR(vips_cross_phase) +int im_cross_phase(VipsImage *a, VipsImage *b, VipsImage *out); + +VIPS_DEPRECATED +int im_point(VipsImage *im, VipsInterpolate *interpolate, + double x, double y, int band, double *out); +VIPS_DEPRECATED +int im_point_bilinear(VipsImage *im, + double x, double y, int band, double *out); + +VIPS_DEPRECATED_FOR(vips_image_write) +int im_copy(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_copy) +int im_copy_set(VipsImage *in, VipsImage *out, + VipsInterpretation interpretation, + float xres, float yres, int xoffset, int yoffset); +VIPS_DEPRECATED +int im_copy_set_meta(VipsImage *in, VipsImage *out, + const char *field, GValue *value); +VIPS_DEPRECATED_FOR(vips_copy) +int im_copy_morph(VipsImage *in, VipsImage *out, + int bands, VipsBandFormat format, VipsCoding coding); +VIPS_DEPRECATED_FOR(vips_byteswap) +int im_copy_swap(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_copy_file) +int im_copy_file(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_copy_native(VipsImage *in, VipsImage *out, gboolean is_msb_first); +VIPS_DEPRECATED_FOR(vips_embed) +int im_embed(VipsImage *in, VipsImage *out, + int type, int x, int y, int width, int height); +VIPS_DEPRECATED_FOR(vips_flip) +int im_fliphor(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_flip) +int im_flipver(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_insert) +int im_insert(VipsImage *main, VipsImage *sub, VipsImage *out, int x, int y); +VIPS_DEPRECATED_FOR(vips_insert) +int im_insert_noexpand(VipsImage *main, VipsImage *sub, VipsImage *out, int x, int y); +VIPS_DEPRECATED_FOR(vips_join) +int im_lrjoin(VipsImage *left, VipsImage *right, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_join) +int im_tbjoin(VipsImage *top, VipsImage *bottom, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_extract_area) +int im_extract_area(VipsImage *in, VipsImage *out, + int left, int top, int width, int height); +VIPS_DEPRECATED_FOR(vips_extract_band) +int im_extract_band(VipsImage *in, VipsImage *out, int band); +VIPS_DEPRECATED_FOR(vips_extract_band) +int im_extract_bands(VipsImage *in, VipsImage *out, int band, int nbands); +VIPS_DEPRECATED +int im_extract_areabands(VipsImage *in, VipsImage *out, + int left, int top, int width, int height, int band, int nbands); +VIPS_DEPRECATED_FOR(vips_replicate) +int im_replicate(VipsImage *in, VipsImage *out, int across, int down); +VIPS_DEPRECATED_FOR(vips_wrap) +int im_wrap(VipsImage *in, VipsImage *out, int x, int y); +VIPS_DEPRECATED_FOR(vips_wrap) +int im_rotquad(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_cast) +int im_clip2fmt(VipsImage *in, VipsImage *out, VipsBandFormat fmt); +VIPS_DEPRECATED_FOR(vips_bandjoin2) +int im_bandjoin(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_bandjoin) +int im_gbandjoin(VipsImage **in, VipsImage *out, int n); +VIPS_DEPRECATED_FOR(vips_bandrank) +int im_rank_image(VipsImage **in, VipsImage *out, int n, int index); +VIPS_DEPRECATED_FOR(vips_bandrank) +int im_maxvalue(VipsImage **in, VipsImage *out, int n); +VIPS_DEPRECATED_FOR(vips_grid) +int im_grid(VipsImage *in, VipsImage *out, int tile_height, int across, int down); +VIPS_DEPRECATED_FOR(vips_scale) +int im_scale(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_scale) +int im_scaleps(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_msb) +int im_msb(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_msb) +int im_msb_band(VipsImage *in, VipsImage *out, int band); +VIPS_DEPRECATED_FOR(vips_zoom) +int im_zoom(VipsImage *in, VipsImage *out, int xfac, int yfac); +VIPS_DEPRECATED_FOR(vips_subsample) +int im_subsample(VipsImage *in, VipsImage *out, int xshrink, int yshrink); + +VIPS_DEPRECATED_FOR(vips_gaussnoise) +int im_gaussnoise(VipsImage *out, int x, int y, double mean, double sigma); +VIPS_DEPRECATED_FOR(vips_text) +int im_text(VipsImage *out, const char *text, const char *font, + int width, int alignment, int dpi); +VIPS_DEPRECATED_FOR(vips_black) +int im_black(VipsImage *out, int x, int y, int bands); +VIPS_DEPRECATED_FOR(vips_xyz) +int im_make_xy(VipsImage *out, const int xsize, const int ysize); +VIPS_DEPRECATED_FOR(vips_zone) +int im_zone(VipsImage *out, int size); +VIPS_DEPRECATED_FOR(vips_zone) +int im_fzone(VipsImage *out, int size); +VIPS_DEPRECATED_FOR(vips_eye) +int im_feye(VipsImage *out, + const int xsize, const int ysize, const double factor); +VIPS_DEPRECATED_FOR(vips_eye) +int im_eye(VipsImage *out, + const int xsize, const int ysize, const double factor); +VIPS_DEPRECATED_FOR(vips_grey) +int im_grey(VipsImage *out, const int xsize, const int ysize); +VIPS_DEPRECATED_FOR(vips_grey) +int im_fgrey(VipsImage *out, const int xsize, const int ysize); +VIPS_DEPRECATED_FOR(vips_sines) +int im_sines(VipsImage *out, + int xsize, int ysize, double horfreq, double verfreq); +VIPS_DEPRECATED_FOR(vips_buildlut) +int im_buildlut(DOUBLEMASK *input, VipsImage *output); +VIPS_DEPRECATED_FOR(vips_invertlut) +int im_invertlut(DOUBLEMASK *input, VipsImage *output, int lut_size); +VIPS_DEPRECATED_FOR(vips_identity) +int im_identity(VipsImage *lut, int bands); +VIPS_DEPRECATED_FOR(vips_identity) +int im_identity_ushort(VipsImage *lut, int bands, int sz); + +VIPS_DEPRECATED_FOR(vips_tonelut) +int im_tone_build_range(VipsImage *out, + int in_max, int out_max, + double Lb, double Lw, double Ps, double Pm, double Ph, + double S, double M, double H); +VIPS_DEPRECATED_FOR(vips_tonelut) +int im_tone_build(VipsImage *out, + double Lb, double Lw, double Ps, double Pm, double Ph, + double S, double M, double H); + +VIPS_DEPRECATED_FOR(vips_system) +int im_system(VipsImage *im, const char *cmd, char **out); +VIPS_DEPRECATED_FOR(vips_system) +VipsImage *im_system_image(VipsImage *im, + const char *in_format, const char *out_format, const char *cmd_format, + char **log); + +VIPS_DEPRECATED_FOR(vips_complex) +int im_c2amph(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_complex) +int im_c2rect(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_imag) +int im_c2imag(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_real) +int im_c2real(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_complexform) +int im_ri2c(VipsImage *in1, VipsImage *in2, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_rot90) +int im_rot90(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_rot180) +int im_rot180(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_rot270) +int im_rot270(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_ifthenelse) +int im_ifthenelse(VipsImage *c, VipsImage *a, VipsImage *b, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_ifthenelse) +int im_blend(VipsImage *c, VipsImage *a, VipsImage *b, VipsImage *out); + +VIPS_DEPRECATED +DOUBLEMASK *im_vips2mask(VipsImage *in, const char *filename); +VIPS_DEPRECATED +INTMASK *im_vips2imask(IMAGE *in, const char *filename); +VIPS_DEPRECATED +int im_mask2vips(DOUBLEMASK *in, VipsImage *out); +VIPS_DEPRECATED +int im_imask2vips(INTMASK *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_bandmean) +int im_bandmean(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_recomb) +int im_recomb(VipsImage *in, VipsImage *out, DOUBLEMASK *recomb); + +VIPS_DEPRECATED +int im_argb2rgba(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_falsecolour) +int im_falsecolour(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_gamma) +int im_gammacorrect(VipsImage *in, VipsImage *out, double exponent); + +VIPS_DEPRECATED_FOR(vips_tilecache) +int im_tile_cache_random(IMAGE *in, IMAGE *out, + int tile_width, int tile_height, int max_tiles); + +VIPS_DEPRECATED_FOR(vips_shrink) +int im_shrink(VipsImage *in, VipsImage *out, double xshrink, double yshrink); +VIPS_DEPRECATED_FOR(vips_affine) +int im_affinei(VipsImage *in, VipsImage *out, + VipsInterpolate *interpolate, + double a, double b, double c, double d, double dx, double dy, + int ox, int oy, int ow, int oh); +VIPS_DEPRECATED_FOR(vips_affine) +int im_affinei_all(VipsImage *in, VipsImage *out, VipsInterpolate *interpolate, + double a, double b, double c, double d, double dx, double dy); +VIPS_DEPRECATED_FOR(vips_shrink) +int im_rightshift_size(VipsImage *in, VipsImage *out, + int xshift, int yshift, int band_fmt); + +VIPS_DEPRECATED_FOR(vips_Lab2XYZ) +int im_Lab2XYZ_temp(IMAGE *in, IMAGE *out, double X0, double Y0, double Z0); +VIPS_DEPRECATED_FOR(vips_Lab2XYZ) +int im_Lab2XYZ(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED_FOR(vips_XYZ2Lab) +int im_XYZ2Lab(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_XYZ2Lab) +int im_XYZ2Lab_temp(VipsImage *in, VipsImage *out, + double X0, double Y0, double Z0); +VIPS_DEPRECATED_FOR(vips_Lab2LCh) +int im_Lab2LCh(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LCh2Lab) +int im_LCh2Lab(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LCh2CMC) +int im_LCh2UCS(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_CMC2LCh) +int im_UCS2LCh(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_XYZ2Yxy) +int im_XYZ2Yxy(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_Yxy2XYZ) +int im_Yxy2XYZ(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_float2rad) +int im_float2rad(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_rad2float) +int im_rad2float(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_Lab2LabQ) +int im_Lab2LabQ(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LabQ2Lab) +int im_LabQ2Lab(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_Lab2LabS) +int im_Lab2LabS(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LabS2Lab) +int im_LabS2Lab(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LabQ2LabS) +int im_LabQ2LabS(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LabS2LabQ) +int im_LabS2LabQ(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_LabQ2sRGB) +int im_LabQ2sRGB(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED +int im_XYZ2sRGB(IMAGE *in, IMAGE *out); +VIPS_DEPRECATED +int im_sRGB2XYZ(IMAGE *in, IMAGE *out); + +struct im_col_display; +#define im_col_displays(S) (NULL) +#define im_LabQ2disp_build_table(A, B) (NULL) +#define im_LabQ2disp_table(A, B, C) (im_LabQ2disp(A, B, C)) + +VIPS_DEPRECATED +int im_Lab2disp(IMAGE *in, IMAGE *out, struct im_col_display *disp); +VIPS_DEPRECATED +int im_disp2Lab(IMAGE *in, IMAGE *out, struct im_col_display *disp); + +VIPS_DEPRECATED +int im_dE_fromdisp(IMAGE *, IMAGE *, IMAGE *, struct im_col_display *); +VIPS_DEPRECATED +int im_dECMC_fromdisp(IMAGE *, IMAGE *, IMAGE *, struct im_col_display *); + +#define im_disp2XYZ(A, B, C) (im_sRGB2XYZ(A, B)) +#define im_XYZ2disp(A, B, C) (im_XYZ2sRGB(A, B)) +#define im_LabQ2disp(A, B, C) (im_LabQ2sRGB(A, B)) + +VIPS_DEPRECATED_FOR(vips_icc_transform) +int im_icc_transform(VipsImage *in, VipsImage *out, + const char *input_profile_filename, + const char *output_profile_filename, + VipsIntent intent); + +#define im_icc_present vips_icc_present + +VIPS_DEPRECATED_FOR(vips_icc_import) +int im_icc_import(VipsImage *in, VipsImage *out, + const char *input_profile_filename, VipsIntent intent); +VIPS_DEPRECATED_FOR(vips_icc_import) +int im_icc_import_embedded(VipsImage *in, VipsImage *out, VipsIntent intent); +VIPS_DEPRECATED_FOR(vips_icc_export) +int im_icc_export_depth(VipsImage *in, VipsImage *out, int depth, + const char *output_profile_filename, VipsIntent intent); +VIPS_DEPRECATED_FOR(vips_icc_ac2rc) +int im_icc_ac2rc(VipsImage *in, VipsImage *out, const char *profile_filename); + +VIPS_DEPRECATED +int im_LabQ2XYZ(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_UCS2XYZ(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_UCS2Lab(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_Lab2UCS(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_XYZ2UCS(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_dE76) +int im_dE_fromLab(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_dECMC) +int im_dECMC_fromLab(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED +int im_dE_fromXYZ(VipsImage *in1, VipsImage *in2, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_dE00) +int im_dE00_fromLab(VipsImage *in1, VipsImage *in2, VipsImage *out); + +VIPS_DEPRECATED +int im_lab_morph(VipsImage *in, VipsImage *out, + DOUBLEMASK *mask, + double L_offset, double L_scale, + double a_scale, double b_scale); + +#define im_col_dE00 vips_col_dE00 + +VIPS_DEPRECATED_FOR(vips_quadratic) +int im_quadratic(IMAGE *in, IMAGE *out, IMAGE *coeff); + +VIPS_DEPRECATED_FOR(vips_maplut) +int im_maplut(VipsImage *in, VipsImage *out, VipsImage *lut); +VIPS_DEPRECATED +int im_hist(VipsImage *in, VipsImage *out, int bandno); +VIPS_DEPRECATED_FOR(vips_hist_find) +int im_histgr(VipsImage *in, VipsImage *out, int bandno); +VIPS_DEPRECATED_FOR(vips_hist_cum) +int im_histcum(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_hist_norm) +int im_histnorm(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_histeq(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_hist_equal) +int im_heq(VipsImage *in, VipsImage *out, int bandno); +VIPS_DEPRECATED_FOR(vips_hist_find_ndim) +int im_histnD(VipsImage *in, VipsImage *out, int bins); +VIPS_DEPRECATED_FOR(vips_hist_find_indexed) +int im_hist_indexed(VipsImage *index, VipsImage *value, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_hist_plot) +int im_histplot(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_project) +int im_project(VipsImage *in, VipsImage *hout, VipsImage *vout); +VIPS_DEPRECATED_FOR(vips_profile) +int im_profile(IMAGE *in, IMAGE *out, int dir); +VIPS_DEPRECATED +int im_hsp(VipsImage *in, VipsImage *ref, VipsImage *out); +VIPS_DEPRECATED +int im_histspec(VipsImage *in, VipsImage *ref, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_hist_local) +int im_lhisteq(VipsImage *in, VipsImage *out, int xwin, int ywin); +VIPS_DEPRECATED_FOR(vips_stdif) +int im_stdif(VipsImage *in, VipsImage *out, + double a, double m0, double b, double s0, int xwin, int ywin); +VIPS_DEPRECATED_FOR(vips_percent) +int im_mpercent(VipsImage *in, double percent, int *out); +VIPS_DEPRECATED +int im_mpercent_hist(VipsImage *hist, double percent, int *out); +VIPS_DEPRECATED_FOR(vips_hist_ismonotonic) +int im_ismonotonic(VipsImage *lut, int *out); + +VIPS_DEPRECATED +int im_tone_analyse(VipsImage *in, VipsImage *out, + double Ps, double Pm, double Ph, double S, double M, double H); +VIPS_DEPRECATED +int im_tone_map(VipsImage *in, VipsImage *out, VipsImage *lut); + +/* Not really correct, but who uses these. + */ +#define im_lhisteq_raw im_lhisteq +#define im_stdif_raw im_stdif + +/* ruby-vips uses this + */ +#define vips_class_map_concrete_all vips_class_map_all + +VIPS_DEPRECATED_FOR(vips_morph) +int im_dilate(VipsImage *in, VipsImage *out, INTMASK *mask); +VIPS_DEPRECATED_FOR(vips_morph) +int im_erode(VipsImage *in, VipsImage *out, INTMASK *mask); + +VIPS_DEPRECATED_FOR(vips_conva) +int im_aconv(VipsImage *in, VipsImage *out, + DOUBLEMASK *mask, int n_layers, int cluster); +VIPS_DEPRECATED_FOR(vips_convi) +int im_conv(VipsImage *in, VipsImage *out, INTMASK *mask); +VIPS_DEPRECATED_FOR(vips_convf) +int im_conv_f(VipsImage *in, VipsImage *out, DOUBLEMASK *mask); + +VIPS_DEPRECATED_FOR(vips_convasep) +int im_aconvsep(VipsImage *in, VipsImage *out, + DOUBLEMASK *mask, int n_layers); + +VIPS_DEPRECATED_FOR(vips_convsep) +int im_convsep(VipsImage *in, VipsImage *out, INTMASK *mask); +VIPS_DEPRECATED_FOR(vips_convsep) +int im_convsep_f(VipsImage *in, VipsImage *out, DOUBLEMASK *mask); + +VIPS_DEPRECATED_FOR(vips_compass) +int im_compass(VipsImage *in, VipsImage *out, INTMASK *mask); +VIPS_DEPRECATED_FOR(vips_compass) +int im_gradient(VipsImage *in, VipsImage *out, INTMASK *mask); +VIPS_DEPRECATED_FOR(vips_compass) +int im_lindetect(VipsImage *in, VipsImage *out, INTMASK *mask); + +VIPS_DEPRECATED +int im_addgnoise(VipsImage *in, VipsImage *out, double sigma); + +VIPS_DEPRECATED +int im_contrast_surface_raw(IMAGE *in, IMAGE *out, + int half_win_size, int spacing); +VIPS_DEPRECATED +int im_contrast_surface(VipsImage *in, VipsImage *out, + int half_win_size, int spacing); + +VIPS_DEPRECATED +int im_grad_x(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_grad_y(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_fastcor) +int im_fastcor(VipsImage *in, VipsImage *ref, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_spcor) +int im_spcor(VipsImage *in, VipsImage *ref, VipsImage *out); +VIPS_DEPRECATED +int im_gradcor(VipsImage *in, VipsImage *ref, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_sharpen) +int im_sharpen(VipsImage *in, VipsImage *out, + int mask_size, + double x1, double y2, double y3, + double m1, double m2); + +typedef enum { + IM_MASK_IDEAL_HIGHPASS = 0, + IM_MASK_IDEAL_LOWPASS = 1, + IM_MASK_BUTTERWORTH_HIGHPASS = 2, + IM_MASK_BUTTERWORTH_LOWPASS = 3, + IM_MASK_GAUSS_HIGHPASS = 4, + IM_MASK_GAUSS_LOWPASS = 5, + + IM_MASK_IDEAL_RINGPASS = 6, + IM_MASK_IDEAL_RINGREJECT = 7, + IM_MASK_BUTTERWORTH_RINGPASS = 8, + IM_MASK_BUTTERWORTH_RINGREJECT = 9, + IM_MASK_GAUSS_RINGPASS = 10, + IM_MASK_GAUSS_RINGREJECT = 11, + + IM_MASK_IDEAL_BANDPASS = 12, + IM_MASK_IDEAL_BANDREJECT = 13, + IM_MASK_BUTTERWORTH_BANDPASS = 14, + IM_MASK_BUTTERWORTH_BANDREJECT = 15, + IM_MASK_GAUSS_BANDPASS = 16, + IM_MASK_GAUSS_BANDREJECT = 17, + + IM_MASK_FRACTAL_FLT = 18 +} ImMaskType; + +/* We had them in the VIPS namespace for a while before deprecating them. + */ +#define VIPS_MASK_IDEAL_HIGHPASS IM_MASK_IDEAL_HIGHPASS +#define VIPS_MASK_IDEAL_LOWPASS IM_MASK_IDEAL_LOWPASS +#define VIPS_MASK_BUTTERWORTH_HIGHPASS IM_MASK_BUTTERWORTH_HIGHPASS +#define VIPS_MASK_BUTTERWORTH_LOWPASS IM_MASK_BUTTERWORTH_LOWPASS +#define VIPS_MASK_GAUSS_HIGHPASS IM_MASK_GAUSS_HIGHPASS +#define VIPS_MASK_GAUSS_LOWPASS IM_MASK_GAUSS_LOWPASS +#define VIPS_MASK_IDEAL_RINGPASS IM_MASK_IDEAL_RINGPASS +#define VIPS_MASK_IDEAL_RINGREJECT IM_MASK_IDEAL_RINGREJECT +#define VIPS_MASK_BUTTERWORTH_RINGPASS IM_MASK_BUTTERWORTH_RINGPASS +#define VIPS_MASK_BUTTERWORTH_RINGREJECT IM_MASK_BUTTERWORTH_RINGREJECT +#define VIPS_MASK_GAUSS_RINGPASS IM_MASK_GAUSS_RINGPASS +#define VIPS_MASK_GAUSS_RINGREJECT IM_MASK_GAUSS_RINGREJECT +#define VIPS_MASK_IDEAL_BANDPASS IM_MASK_IDEAL_BANDPASS +#define VIPS_MASK_IDEAL_BANDREJECT IM_MASK_IDEAL_BANDREJECT +#define VIPS_MASK_BUTTERWORTH_BANDPASS IM_MASK_BUTTERWORTH_BANDPASS +#define VIPS_MASK_BUTTERWORTH_BANDREJECT IM_MASK_BUTTERWORTH_BANDREJECT +#define VIPS_MASK_GAUSS_BANDPASS IM_MASK_GAUSS_BANDPASS +#define VIPS_MASK_GAUSS_BANDREJECT IM_MASK_GAUSS_BANDREJECT +#define VIPS_MASK_FRACTAL_FLT IM_MASK_FRACTAL_FLT + +#define VIPS_MASK IM_MASK + +VIPS_DEPRECATED +int im_flt_image_freq(VipsImage *in, VipsImage *out, ImMaskType flag, ...); +VIPS_DEPRECATED +int im_create_fmask(VipsImage *out, + int xsize, int ysize, ImMaskType flag, ...); + +VIPS_DEPRECATED_FOR(vips_fwfft) +int im_fwfft(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_invfft) +int im_invfft(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_invfft) +int im_invfftr(VipsImage *in, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_freqmult) +int im_freqflt(VipsImage *in, VipsImage *mask, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_spectrum) +int im_disp_ps(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED_FOR(vips_fractsurf) +int im_fractsurf(VipsImage *out, int size, double frd); +VIPS_DEPRECATED_FOR(vips_phasecor) +int im_phasecor_fft(VipsImage *in1, VipsImage *in2, VipsImage *out); + +VIPS_DEPRECATED_FOR(vips_countlines) +int im_cntlines(VipsImage *im, double *nolines, int flag); +VIPS_DEPRECATED_FOR(vips_labelregions) +int im_label_regions(VipsImage *test, VipsImage *mask, int *segments); +VIPS_DEPRECATED_FOR(vips_rank) +int im_rank(VipsImage *in, VipsImage *out, int width, int height, int index); +VIPS_DEPRECATED +int im_zerox(VipsImage *in, VipsImage *out, int sign); + +VIPS_DEPRECATED +int im_benchmarkn(VipsImage *in, VipsImage *out, int n); +VIPS_DEPRECATED +int im_benchmark2(VipsImage *in, double *out); + +VIPS_DEPRECATED_FOR(vips_draw_circle) +int im_draw_circle(VipsImage *image, + int x, int y, int radius, gboolean fill, VipsPel *ink); + +VIPS_DEPRECATED_FOR(vips_draw_mask) +int im_draw_mask(VipsImage *image, + VipsImage *mask_im, int x, int y, VipsPel *ink); +VIPS_DEPRECATED_FOR(vips_draw_image) +int im_draw_image(VipsImage *image, VipsImage *sub, int x, int y); +VIPS_DEPRECATED_FOR(vips_draw_rect) +int im_draw_rect(VipsImage *image, + int left, int top, int width, int height, int fill, VipsPel *ink); + +typedef int (*VipsPlotFn)(VipsImage *image, int x, int y, + void *a, void *b, void *c); + +VIPS_DEPRECATED_FOR(vips_draw_line) +int im_draw_line_user(VipsImage *image, + int x1, int y1, int x2, int y2, + VipsPlotFn plot, void *a, void *b, void *c); +VIPS_DEPRECATED_FOR(vips_draw_line) +int im_draw_line(VipsImage *image, + int x1, int y1, int x2, int y2, VipsPel *ink); +VIPS_DEPRECATED +int im_lineset(VipsImage *in, VipsImage *out, VipsImage *mask, VipsImage *ink, + int n, int *x1v, int *y1v, int *x2v, int *y2v); + +VIPS_DEPRECATED +int im_insertset(VipsImage *main, VipsImage *sub, VipsImage *out, int n, int *x, int *y); + +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_draw_flood(VipsImage *image, int x, int y, VipsPel *ink, VipsRect *dout); +VIPS_DEPRECATED_FOR(vips_draw_flood) +int im_draw_flood_blob(VipsImage *image, + int x, int y, VipsPel *ink, VipsRect *dout); +VIPS_DEPRECATED_FOR(vips_draw_flood1) +int im_draw_flood_other(VipsImage *image, VipsImage *test, + int x, int y, int serial, VipsRect *dout); + +VIPS_DEPRECATED_FOR(vips_draw_point) +int im_draw_point(VipsImage *image, int x, int y, VipsPel *ink); +VIPS_DEPRECATED_FOR(vips_getpoint) +int im_read_point(VipsImage *image, int x, int y, VipsPel *ink); + +VIPS_DEPRECATED_FOR(vips_draw_smudge) +int im_draw_smudge(VipsImage *image, + int left, int top, int width, int height); + +VIPS_DEPRECATED +void im_filename_split(const char *path, char *name, char *mode); +VIPS_DEPRECATED_FOR(g_path_get_basename) +const char *im_skip_dir(const char *filename); +VIPS_DEPRECATED +void im_filename_suffix(const char *path, char *suffix); +VIPS_DEPRECATED +int im_filename_suffix_match(const char *path, const char *suffixes[]); +VIPS_DEPRECATED +char *im_getnextoption(char **in); +VIPS_DEPRECATED +char *im_getsuboption(const char *buf); + +VIPS_DEPRECATED_FOR(vips_match) +int im_match_linear(VipsImage *ref, VipsImage *sec, VipsImage *out, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2); +VIPS_DEPRECATED_FOR(vips_match) +int im_match_linear_search(VipsImage *ref, VipsImage *sec, VipsImage *out, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, + int hwindowsize, int hsearchsize); + +VIPS_DEPRECATED_FOR(vips_globalbalance) +int im_global_balance(VipsImage *in, VipsImage *out, double gamma); +VIPS_DEPRECATED_FOR(vips_globalbalance) +int im_global_balancef(VipsImage *in, VipsImage *out, double gamma); + +VIPS_DEPRECATED_FOR(vips_remosaic) +int im_remosaic(VipsImage *in, VipsImage *out, + const char *old_str, const char *new_str); + +VIPS_DEPRECATED_FOR(vips_merge) +int im_lrmerge(VipsImage *ref, VipsImage *sec, VipsImage *out, + int dx, int dy, int mwidth); +VIPS_DEPRECATED_FOR(vips_mosaic1) +int im_lrmerge1(VipsImage *ref, VipsImage *sec, VipsImage *out, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, + int mwidth); +VIPS_DEPRECATED_FOR(vips_merge) +int im_tbmerge(VipsImage *ref, VipsImage *sec, VipsImage *out, + int dx, int dy, int mwidth); +VIPS_DEPRECATED_FOR(vips_mosaic1) +int im_tbmerge1(VipsImage *ref, VipsImage *sec, VipsImage *out, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, + int mwidth); + +VIPS_DEPRECATED_FOR(vips_mosaic) +int im_lrmosaic(VipsImage *ref, VipsImage *sec, VipsImage *out, + int bandno, + int xref, int yref, int xsec, int ysec, + int hwindowsize, int hsearchsize, + int balancetype, + int mwidth); +VIPS_DEPRECATED_FOR(vips_mosaic1) +int im_lrmosaic1(VipsImage *ref, VipsImage *sec, VipsImage *out, + int bandno, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, + int hwindowsize, int hsearchsize, + int balancetype, + int mwidth); +VIPS_DEPRECATED_FOR(vips_mosaic) +int im_tbmosaic(VipsImage *ref, VipsImage *sec, VipsImage *out, + int bandno, + int xref, int yref, int xsec, int ysec, + int hwindowsize, int hsearchsize, + int balancetype, + int mwidth); +VIPS_DEPRECATED_FOR(vips_mosaic1) +int im_tbmosaic1(VipsImage *ref, VipsImage *sec, VipsImage *out, + int bandno, + int xr1, int yr1, int xs1, int ys1, + int xr2, int yr2, int xs2, int ys2, + int hwindowsize, int hsearchsize, + int balancetype, + int mwidth); + +VIPS_DEPRECATED +int im_correl(VipsImage *ref, VipsImage *sec, + int xref, int yref, int xsec, int ysec, + int hwindowsize, int hsearchsize, + double *correlation, int *x, int *y); + +VIPS_DEPRECATED +int im_align_bands(VipsImage *in, VipsImage *out); +VIPS_DEPRECATED +int im_maxpos_subpel(VipsImage *in, double *x, double *y); + +VipsImage *vips__deprecated_open_read(const char *filename, gboolean sequential); +VipsImage *vips__deprecated_open_write(const char *filename); + +void im__format_init(void); + +/* Low-level read/write operations. + */ +VIPS_DEPRECATED +int im_jpeg2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_bufjpeg2vips(void *buf, size_t len, + VipsImage *out, gboolean header_only); +VIPS_DEPRECATED +int im_vips2jpeg(VipsImage *in, const char *filename); +VIPS_DEPRECATED +int im_vips2mimejpeg(VipsImage *in, int qfac); +VIPS_DEPRECATED +int im_vips2bufjpeg(VipsImage *in, VipsImage *out, + int qfac, char **obuf, int *olen); + +VIPS_DEPRECATED +int im_tiff2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2tiff(VipsImage *in, const char *filename); +VIPS_DEPRECATED +int im_tile_cache(VipsImage *in, VipsImage *out, + int tile_width, int tile_height, int max_tiles); + +VIPS_DEPRECATED +int im_magick2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_bufmagick2vips(void *buf, size_t len, + VipsImage *out, gboolean header_only); + +VIPS_DEPRECATED +int im_exr2vips(const char *filename, VipsImage *out); + +VIPS_DEPRECATED +int im_ppm2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2ppm(VipsImage *in, const char *filename); + +VIPS_DEPRECATED +int im_analyze2vips(const char *filename, VipsImage *out); + +VIPS_DEPRECATED +int im_csv2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2csv(VipsImage *in, const char *filename); + +VIPS_DEPRECATED +int im_png2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2png(VipsImage *in, const char *filename); +VIPS_DEPRECATED +int im_vips2bufpng(VipsImage *in, VipsImage *out, + int compression, int interlace, char **obuf, size_t *olen); + +VIPS_DEPRECATED +int im_webp2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2webp(VipsImage *in, const char *filename); + +VIPS_DEPRECATED +int im_raw2vips(const char *filename, VipsImage *out, + int width, int height, int bpp, int offset); +VIPS_DEPRECATED +int im_vips2raw(VipsImage *in, int fd); + +VIPS_DEPRECATED +int im_mat2vips(const char *filename, VipsImage *out); + +VIPS_DEPRECATED +int im_rad2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2rad(VipsImage *in, const char *filename); + +VIPS_DEPRECATED +int im_fits2vips(const char *filename, VipsImage *out); +VIPS_DEPRECATED +int im_vips2fits(VipsImage *in, const char *filename); + +VIPS_DEPRECATED +int im_vips2dz(VipsImage *in, const char *filename); + +int im__bandup(const char *domain, VipsImage *in, VipsImage *out, int n); +int im__bandalike_vec(const char *domain, VipsImage **in, VipsImage **out, int n); +int im__bandalike(const char *domain, + VipsImage *in1, VipsImage *in2, VipsImage *out1, VipsImage *out2); +int im__formatalike_vec(VipsImage **in, VipsImage **out, int n); +int im__formatalike(VipsImage *in1, VipsImage *in2, VipsImage *out1, VipsImage *out2); + +int im__colour_unary(const char *domain, + VipsImage *in, VipsImage *out, VipsInterpretation interpretation, + im_wrapone_fn buffer_fn, void *a, void *b); +VipsImage **im__insert_base(const char *domain, + VipsImage *in1, VipsImage *in2, VipsImage *out); + +/* TODO(kleisauke): These are also defined in pmosaicing.h */ +int vips__find_lroverlap(VipsImage *ref_in, VipsImage *sec_in, VipsImage *out, + int bandno_in, + int xref, int yref, int xsec, int ysec, + int halfcorrelation, int halfarea, + int *dx0, int *dy0, + double *scale1, double *angle1, double *dx1, double *dy1); +int vips__find_tboverlap(VipsImage *ref_in, VipsImage *sec_in, VipsImage *out, + int bandno_in, + int xref, int yref, int xsec, int ysec, + int halfcorrelation, int halfarea, + int *dx0, int *dy0, + double *scale1, double *angle1, double *dx1, double *dy1); + +/* A colour temperature. + */ +typedef struct { + double X0, Y0, Z0; +} im_colour_temperature; + +VIPS_DEPRECATED +void im_copy_dmask_matrix(DOUBLEMASK *mask, double **matrix); +VIPS_DEPRECATED +void im_copy_matrix_dmask(double **matrix, DOUBLEMASK *mask); + +VIPS_DEPRECATED +int *im_ivector(int nl, int nh); +VIPS_DEPRECATED +float *im_fvector(int nl, int nh); +VIPS_DEPRECATED +double *im_dvector(int nl, int nh); +VIPS_DEPRECATED +void im_free_ivector(int *v, int nl, int nh); +VIPS_DEPRECATED +void im_free_fvector(float *v, int nl, int nh); +VIPS_DEPRECATED +void im_free_dvector(double *v, int nl, int nh); + +VIPS_DEPRECATED +int **im_imat_alloc(int nrl, int nrh, int ncl, int nch); +VIPS_DEPRECATED +void im_free_imat(int **m, int nrl, int nrh, int ncl, int nch); +VIPS_DEPRECATED +float **im_fmat_alloc(int nrl, int nrh, int ncl, int nch); +VIPS_DEPRECATED +void im_free_fmat(float **m, int nrl, int nrh, int ncl, int nch); +VIPS_DEPRECATED +double **im_dmat_alloc(int nrl, int nrh, int ncl, int nch); +VIPS_DEPRECATED +void im_free_dmat(double **m, int nrl, int nrh, int ncl, int nch); + +VIPS_DEPRECATED +int im_invmat(double **, int); + +VIPS_DEPRECATED +int im_conv_f_raw(VipsImage *in, VipsImage *out, DOUBLEMASK *mask); +VIPS_DEPRECATED +int im_convsep_f_raw(VipsImage *in, VipsImage *out, DOUBLEMASK *mask); + +VIPS_DEPRECATED +int im_greyc_mask(VipsImage *in, VipsImage *out, VipsImage *mask, + int iterations, float amplitude, float sharpness, float anisotropy, + float alpha, float sigma, float dl, float da, float gauss_prec, + int interpolation, int fast_approx); + +VIPS_DEPRECATED +int vips_check_imask(const char *domain, INTMASK *mask); +VIPS_DEPRECATED +int vips_check_dmask(const char *domain, DOUBLEMASK *mask); +VIPS_DEPRECATED +int vips_check_dmask_1d(const char *domain, DOUBLEMASK *mask); + +VIPS_DEPRECATED +GOptionGroup *vips_get_option_group(void); + +/* old window manager API + */ +VIPS_DEPRECATED +VipsWindow *vips_window_ref(VipsImage *im, int top, int height); + +VIPS_DEPRECATED +FILE *vips_popenf(const char *fmt, const char *mode, ...) + G_GNUC_PRINTF(1, 3); + +double *vips__ink_to_vector(const char *domain, + VipsImage *im, VipsPel *ink, int *n); + +VipsPel *im__vector_to_ink(const char *domain, + VipsImage *im, int n, double *vec); + +int vips__init(const char *argv0); + +size_t vips__get_sizeof_vipsobject(void); + +/* This is deprecated to make room for highway. + */ +#define VIPS_VECTOR_SOURCE_MAX (10) + +typedef struct { + const char *name; + char *unique_name; + + int n_temp; + int n_scanline; + int n_source; + int n_destination; + int n_constant; + int n_parameter; + int n_instruction; + + int sl[VIPS_VECTOR_SOURCE_MAX]; + int line[VIPS_VECTOR_SOURCE_MAX]; + + int s[VIPS_VECTOR_SOURCE_MAX]; + + int d1; + +#ifdef HAVE_ORC + OrcProgram *program; +#endif /*HAVE_ORC*/ + + gboolean compiled; +} VipsVector; + +typedef struct { +#ifdef HAVE_ORC + OrcExecutor executor; +#endif /*HAVE_ORC*/ + + VipsVector *vector; +} VipsExecutor; + +VIPS_DEPRECATED +void vips_vector_init(void); + +VIPS_DEPRECATED +void vips_vector_free(VipsVector *vector); +VIPS_DEPRECATED +VipsVector *vips_vector_new(const char *name, int dsize); + +VIPS_DEPRECATED +void vips_vector_constant(VipsVector *vector, + char *name, int value, int size); +VIPS_DEPRECATED +void vips_vector_source_scanline(VipsVector *vector, + char *name, int line, int size); +VIPS_DEPRECATED +int vips_vector_source_name(VipsVector *vector, const char *name, int size); +VIPS_DEPRECATED +void vips_vector_temporary(VipsVector *vector, const char *name, int size); +VIPS_DEPRECATED +int vips_vector_parameter(VipsVector *vector, const char *name, int size); +VIPS_DEPRECATED +int vips_vector_destination(VipsVector *vector, const char *name, int size); +VIPS_DEPRECATED +void vips_vector_asm2(VipsVector *vector, + const char *op, const char *a, const char *b); +VIPS_DEPRECATED +void vips_vector_asm3(VipsVector *vector, + const char *op, const char *a, const char *b, const char *c); +VIPS_DEPRECATED +gboolean vips_vector_full(VipsVector *vector); + +VIPS_DEPRECATED +gboolean vips_vector_compile(VipsVector *vector); + +VIPS_DEPRECATED +void vips_vector_print(VipsVector *vector); + +VIPS_DEPRECATED +void vips_executor_set_program(VipsExecutor *executor, + VipsVector *vector, int n); +VIPS_DEPRECATED +void vips_executor_set_scanline(VipsExecutor *executor, + VipsRegion *ir, int x, int y); +VIPS_DEPRECATED +void vips_executor_set_destination(VipsExecutor *executor, void *value); +VIPS_DEPRECATED +void vips_executor_set_parameter(VipsExecutor *executor, int var, int value); +VIPS_DEPRECATED +void vips_executor_set_array(VipsExecutor *executor, int var, void *value); + +VIPS_DEPRECATED +void vips_executor_run(VipsExecutor *executor); + +VIPS_DEPRECATED +void vips_vector_to_fixed_point(double *in, int *out, int n, int scale); + +/* This stuff is very, very old and should not be used by anyone now. + */ +#ifdef VIPS_ENABLE_ANCIENT +#include +#endif /*VIPS_ENABLE_ANCIENT*/ + +#include +#include +#include + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_VIPS7COMPAT_H*/ diff --git a/jtlsrv-cpp/.static-build/include/vips/vips8 b/jtlsrv-cpp/.static-build/include/vips/vips8 new file mode 100644 index 0000000..13eab88 --- /dev/null +++ b/jtlsrv-cpp/.static-build/include/vips/vips8 @@ -0,0 +1,67 @@ +// Include file to get vips C++ binding + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_CPLUSPLUS +#define VIPS_CPLUSPLUS + +/* avoid conflict with Qt definitions, if they exist */ +#if defined(signals) && defined(Q_SIGNALS) +#define _VIPS_QT_SIGNALS_DEFINED +#undef signals +#endif + +#include + +#include + +/* Note: when building without Meson, it may be necessary to define + * _VIPS_PUBLIC as __declspec(dllexport) when building a DLL. + */ +#ifndef _VIPS_PUBLIC +#define _VIPS_PUBLIC +#endif + +#define VIPS_CPLUSPLUS_API _VIPS_PUBLIC + +#define VIPS_NAMESPACE_START namespace vips { +#define VIPS_NAMESPACE_END } + +#include "VError8.h" +#include "VImage8.h" +#include "VInterpolate8.h" +#include "VRegion8.h" +#include "VConnection8.h" + +/* restore Qt keywords if they were disabled for GLib inclusion */ +#ifdef _VIPS_QT_SIGNALS_DEFINED +#define signals Q_SIGNALS +#undef _VIPS_QT_SIGNALS_DEFINED +#endif + +#endif /*VIPS_CPLUSPLUS*/ diff --git a/jtlsrv-cpp/.static-build/lib/pkgconfig/vips-cpp.pc b/jtlsrv-cpp/.static-build/lib/pkgconfig/vips-cpp.pc new file mode 100644 index 0000000..df5f0c5 --- /dev/null +++ b/jtlsrv-cpp/.static-build/lib/pkgconfig/vips-cpp.pc @@ -0,0 +1,10 @@ +prefix=/out +includedir=${prefix}/include +libdir=${prefix}/lib + +Name: vips-cpp +Description: C++ API for vips8 image processing library +Version: 8.16.1 +Requires: vips, glib-2.0 >= 2.52, gio-2.0, gobject-2.0, expat, zlib >= 0.4, fftw3, libjpeg, libpng >= 1.2.9, libwebp >= 0.6, libwebpmux >= 0.6, libwebpdemux >= 0.6 +Libs: -L${libdir} -lvips-cpp -pthread -lm +Cflags: -I${includedir} -DHAVE_CONFIG_H=1 -pthread diff --git a/jtlsrv-cpp/.static-build/lib/pkgconfig/vips.pc b/jtlsrv-cpp/.static-build/lib/pkgconfig/vips.pc new file mode 100644 index 0000000..89fa224 --- /dev/null +++ b/jtlsrv-cpp/.static-build/lib/pkgconfig/vips.pc @@ -0,0 +1,10 @@ +prefix=/out +includedir=${prefix}/include +libdir=${prefix}/lib + +Name: vips +Description: Image processing library +Version: 8.16.1 +Requires: glib-2.0 >= 2.52, gio-2.0, gobject-2.0, expat, zlib >= 0.4, fftw3, libjpeg, libpng >= 1.2.9, libwebp >= 0.6, libwebpmux >= 0.6, libwebpdemux >= 0.6 +Libs: -L${libdir} -lvips -pthread -lm +Cflags: -I${includedir} -DHAVE_CONFIG_H=1 -pthread diff --git a/jtlsrv-cpp/.static-build/share/locale/de/LC_MESSAGES/vips8.16.mo b/jtlsrv-cpp/.static-build/share/locale/de/LC_MESSAGES/vips8.16.mo new file mode 100644 index 0000000..0f5978e Binary files /dev/null and b/jtlsrv-cpp/.static-build/share/locale/de/LC_MESSAGES/vips8.16.mo differ diff --git a/jtlsrv-cpp/.static-build/share/locale/en_GB/LC_MESSAGES/vips8.16.mo b/jtlsrv-cpp/.static-build/share/locale/en_GB/LC_MESSAGES/vips8.16.mo new file mode 100644 index 0000000..2c329fa Binary files /dev/null and b/jtlsrv-cpp/.static-build/share/locale/en_GB/LC_MESSAGES/vips8.16.mo differ diff --git a/jtlsrv-cpp/.static-build/share/man/man1/vips.1 b/jtlsrv-cpp/.static-build/share/man/man1/vips.1 new file mode 100644 index 0000000..b8423ae --- /dev/null +++ b/jtlsrv-cpp/.static-build/share/man/man1/vips.1 @@ -0,0 +1,93 @@ +.TH VIPS 1 "30 June 1993" +.SH NAME +vips \- run vips operations from the command line +.SH SYNOPSIS +.B vips [options] [command] [command-options] [command-args] +.SH DESCRIPTION +.B vips(1) +is the VIPS universal main program. You can use it to run any VIPS operation +from the command line, to query the VIPS class hierarchy, and to +maintain parts of the VIPS library. + +To run a VIPS operation, the first argument should be the name of the +operation +and following arguments should be the operation arguments. For example: + + $ vips invert lena.v lena2.v + +.SH OPTIONS +.TP +.B -l BASE-NAME, --list=BASE-NAME +List operations below BASE-NAME. This prints a one-line summary of every +operation in vips below the class BASE-NAME, where BASE-NAME may be a full +vips class name, or a nickname. + +If BASE-NAME is not supplied, this will list all classes below VipsOperation. + +.TP +.B -p PLUGIN, --plugin=PLUGIN +Load PLUGIN. Note that plugins in $VIPSHOME/lib/vips-plugins-MAJOR.MINOR are +loaded automatically. + +.TP +.B -v, --version +Show VIPS version. + +.TP +.B -c NAME, --completion NAME +Print completions for +.B NAME + +.SH COMMANDS + +.TP +.B operation-name operation-arguments +Execute a named operation, for example add. + +.SH EXAMPLES + +Run a vips operation. Operation options must follow the operation name. + + $ vips insert lena.v lena2.v out.v 0 0 --background "128 0 0" + +Get a "usage" message for an operation. + + $ vips insert + insert image @sub into @main at @x, @y + usage: + insert main sub out x y + where: + main - Main input image, input VipsImage + sub - Sub-image to insert into main image, input VipsImage + out - Output image, output VipsImage + x - Left edge of sub in main, input gint + default: 0 + min: -100000000, max: 100000000 + y - Top edge of sub in main, input gint + default: 0 + min: -100000000, max: 100000000 + optional arguments: + expand - Expand output to hold all of both inputs, input gboolean + default: false + background - Colour for new pixels, input VipsArrayDouble + operation flags: sequential + +List all draw operations. + + $ vips -l draw + VipsDraw (draw), draw operations + VipsDrawink (drawink), draw with ink operations + VipsDrawRect (draw_rect), paint a rectangle on an image + VipsDrawMask (draw_mask), draw a mask on an image + VipsDrawLine (draw_line), draw a line on an image + VipsDrawCircle (draw_circle), draw a circle on an image + VipsDrawFlood (draw_flood), flood-fill an area + VipsDrawImage (draw_image), paint an image into another image + VipsDrawSmudge (draw_smudge), blur a rectangle on an image + +.SH RETURN VALUE +returns 0 on success and non-zero on error. +.SH SEE ALSO +vipsheader(1) +.SH COPYRIGHT +The National Gallery and Birkbeck College, 1989-1996. diff --git a/jtlsrv-cpp/.static-build/share/man/man1/vipsedit.1 b/jtlsrv-cpp/.static-build/share/man/man1/vipsedit.1 new file mode 100644 index 0000000..8666fce --- /dev/null +++ b/jtlsrv-cpp/.static-build/share/man/man1/vipsedit.1 @@ -0,0 +1,50 @@ +.TH VIPSEDIT 1 "30 June 1993" +.SH NAME +vipsedit \- edit header of a vips image file +.SH SYNOPSIS +.B vipsedit [OPTION...] vipsfile +.SH DESCRIPTION +.B vipsedit +alters a VIPS image file's header. This is useful for setting the resolution, +for example. + +The options are: + + -x, --xsize=N set Xsize to N + -y, --ysize=N set Ysize to N + -b, --bands=N set Bands to N + -f, --format=F set BandFmt to F (eg. uchar) + -i, --interpretation=I + set Interpretation to I (eg. xyz) + -c, --coding=C set Coding to C (eg. labq) + -X, --xres=R set Xres to R pixels/mm + -Y, --yres=R set Yres to R pixels/mm + -u, --xoffset=N set Xoffset to N + -v, --yoffset=N set Yoffset to N + -e, --setext replace extension block with stdin + +Be very careful when changing Xsize, Ysize, BandFmt or Bands. vipsedit does no +checking! + +.SH EXAMPLES +To set the Xsize to 512 and Bands to 6: + + vipsedit --xsize=512 --bands=6 fred.v + +or + + vipsedit -x 512 -b 6 fred.v + +Extract the XML metadata from an image with +.B vipsheader(1), +edit it, and reattach with +.B vipsedit(1). + + vipsheader -f getext fred.v | sed s/banana/pineapple/ | vipsedit -e fred.v + +.SH RETURN VALUE +returns 0 on success and non-zero on error. +.SH SEE ALSO +vipsheader(1) +.SH COPYRIGHT +K. Martinez 1993 diff --git a/jtlsrv-cpp/.static-build/share/man/man1/vipsheader.1 b/jtlsrv-cpp/.static-build/share/man/man1/vipsheader.1 new file mode 100644 index 0000000..b558154 --- /dev/null +++ b/jtlsrv-cpp/.static-build/share/man/man1/vipsheader.1 @@ -0,0 +1,47 @@ +.TH VIPSHEADER 1 "12 July 1990" +.SH NAME +vipsheader \- prints information about an image file +.SH SYNOPSIS +vipsheader [OPTIONS ...] files ... +.SH DESCRIPTION +.B vipsheader(1) +prints image header fields to stdout. + +.SH OPTIONS + +.TP +.B -a, --all +Show all fields. Fields are displayed to be convenient for humans to +read, so binary data, for example, is summarized rather than simply printed. + +.TP +.B -f FIELD, --field=FIELD +Print the value of +.B FIELD +from the image header. Fields are printed in a way suitable for programs to +understand, so, for example, binary data is base64-encoded and printed as a +stream of characters. + +The special field name +.B getext +prints the VIPS extension block: the XML defining the image metadata. You can +alter this, then reattach with +.B vipsedit(1). + +You can use multiple "-f" arguments to print the values +of many fields. + +.SH EXAMPLES + $ vipsheader -f width ~/pics/*.v + 1024 + 1279 + 22865 + 1 + 256 + +.SH SEE ALSO +vipsedit(1) +.SH COPYRIGHT +N. Dessipris +.SH AUTHOR +N. Dessipris \- 12/07/1990 diff --git a/jtlsrv-cpp/.static-build/share/man/man1/vipsprofile.1 b/jtlsrv-cpp/.static-build/share/man/man1/vipsprofile.1 new file mode 100644 index 0000000..eaea9f8 --- /dev/null +++ b/jtlsrv-cpp/.static-build/share/man/man1/vipsprofile.1 @@ -0,0 +1,43 @@ +.TH VIPSPROFILE 1 "13 December 2013" +.SH NAME +vipsprofile \- analyze vips profiles +.SH SYNOPSIS +.B vipsprofile +.SH DESCRIPTION +.B vipsprofile(1) +analyzes the file written by the --vips-profile option, calculates some +statistics, and draws a graph of evaluation. + +Run any vips program with the --vips-profile option to generate a file called +"vips-profile.txt". This contains timing information about CPU use, memory use +and thread synchronisation. + +Run +.B vipsprofile(1) +to load this file, calculate some +statistics, and draw a graph of evaluation saved to vips-profile.svg. This +analysis can help track down performance problems. + +For example: + + $ vips sharpen shark.jpg x.jpg --vips-profile + recording profile in vips-profile.txt + $ vipsprofile + reading from vips-profile.txt + loaded 3622 events + total time = 0.138322 + name alive wait% work% unkn% memory peakm + worker 20 0.069 34.5 58.9 6.65 3.14 5.56 + worker 21 0.07 1.36 60.2 38.4 2.65 5.07 + worker 22 0.07 33 55.8 11.1 2.62 5.04 + worker 23 0.072 34.2 59.7 6.15 2.72 5.14 + wbuffer 24 0.075 99 1.03 0.00401 0 0 + wbuffer 25 0.075 95.6 4.39 0.00667 0 0 + main 26 0.14 52.8 0 47.2 -11.1 0.787 + peak memory = 21.6 MB + writing to vips-profile.svg + +.SH RETURN VALUE +returns 0 on success and non-zero on error. +.SH SEE ALSO +vips(1) diff --git a/jtlsrv-cpp/.static-build/share/man/man1/vipsthumbnail.1 b/jtlsrv-cpp/.static-build/share/man/man1/vipsthumbnail.1 new file mode 100644 index 0000000..b14ac4f --- /dev/null +++ b/jtlsrv-cpp/.static-build/share/man/man1/vipsthumbnail.1 @@ -0,0 +1,117 @@ +.TH VIPSTHUMBNAIL 1 "13 May 2010" +.SH NAME +vipsthumbnail \- make thumbnails of image files +.SH SYNOPSIS +.B vipsthumbnail [flags] imagefile1 imagefile2 ... +.SH DESCRIPTION +.B vipsthumbnail(1) +processes each +.B imagefile +in turn, shrinking each image to fit within a 128 by 128 pixel square. +The shrunk image is written to a new file named +.B tn_imagefile.jpg. +This program is typically faster and uses less memory than +other image thumbnail programs. + +For example: + + $ vipsthumbnail fred.png jim.tif + +will read image files +.B fred.png +and +.B jim.tif +and write thumbnails to the files +.B tn_fred.jpg +and +.B tn_jim.jpg. + + $ vipsthumbnail --size=64 -o thumbnails/%s.png fred.jpg + +will read image file +.B fred.jpg +and write a 64 x 64 pixel thumbnail to the file +.B thumbnails/fred.png. + +.SH OPTIONS +.TP +.B -s N, --size=N +Set the output thumbnail size to +.B N +x +.B N +pixels. + +You can use "MxN" to specify a rectangular bounding box. +The image is shrunk so that it just fits within this area, images +which are smaller than this are expanded. + +Use "xN" or "Mx" to just resize on +one axis. + +Append "<" to only resize if the input image is smaller than the +target, append ">" to only resize if the input image is larger than the target. + +.TP +.B -o FORMAT, --output=FORMAT +Set the output format string. The input filename has any file type suffix +removed, then that value is substituted into +.B FORMAT +replacing +.B %s. +If +.B FORMAT +is a relative path, the name of the input directory is prepended. In other +words, any path in +.B FORMAT +is relative to the directory of the current input file. + +The default value is +.B tn_%s.jpg +meaning JPEG output, with +.B tn_ +prepended. You can add format options too, for example +.B tn_%s.jpg[Q=20] +will write JPEG images with Q set to 20. + +.TP +.B -e PROFILE, --eprofile=PROFILE +Export thumbnails with this ICC profile. Images are only colour-transformed if +there is both an output and an input profile available. The input profile can +either be embedded in the input image or supplied with the +.B --iprofile +option. + +.TP +.B -i PROFILE, --iprofile=PROFILE +Import images with this ICC profile, if no profile is embedded in the image. +Images are only colour-transformed if +there is both an output and an input profile available. The output profile +should be supplied with the +.B --oprofile +option. + +.TP +.B -c, --crop +Crop the output image down. The image is shrunk so as to completely fill the +bounding box in both axes, then any excess is cropped off. + +.TP +.B -d, --delete +Delete the output profile from the image. This can save a small amount of +space. + +.TP +.B -t, --rotate +Auto-rotate images using EXIF orientation tags. + +.TP +.B -a, --linear +Shrink images in linear light colour space. This can be much slower. + +.SH RETURN VALUE +returns 0 on success and non-zero on error. Error can mean one or more +conversions failed. + +.SH SEE ALSO +vipsheader(1) diff --git a/jtlsrv-cpp/CMakeLists.txt b/jtlsrv-cpp/CMakeLists.txt deleted file mode 100644 index 9b8254e..0000000 --- a/jtlsrv-cpp/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(jtlsrv-cpp LANGUAGES C CXX) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# --- Dependencies ----------------------------------------------------------- - -find_package(PkgConfig REQUIRED) -pkg_check_modules(LIBUV REQUIRED libuv) -pkg_check_modules(OPENSSL REQUIRED openssl) -pkg_check_modules(VIPS REQUIRED vips) -find_library(ODBC_LIBRARY odbc) -find_path(ODBC_INCLUDE_DIR sql.h) - -# llhttp (vendored) -add_library(llhttp STATIC - vendor/llhttp.c - vendor/api.c - vendor/http.c -) -target_include_directories(llhttp PUBLIC vendor) - -# nlohmann/json (vendored, header-only) -add_library(json INTERFACE) -target_include_directories(json INTERFACE vendor) - -# --- jtlsrv ----------------------------------------------------------------- - -add_executable(jtlsrv - src/main.cpp - src/log.cpp - src/http.cpp - src/tls_server.cpp - src/pairing.cpp - src/router.cpp - src/endpoints/client.cpp - src/endpoints/init.cpp - src/endpoints/category.cpp - src/endpoints/product.cpp - src/endpoints/productcomposite.cpp - src/endpoints/deleted_entity.cpp - src/endpoints/customergroup.cpp - src/endpoints/order.cpp - src/endpoints/pimage.cpp - src/endpoints/cimage.cpp - src/db/pool.cpp - src/request_log.cpp - src/order_log.cpp -) - -target_include_directories(jtlsrv PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${LIBUV_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIRS} - ${ODBC_INCLUDE_DIR} - ${VIPS_INCLUDE_DIRS} -) - -target_link_libraries(jtlsrv PRIVATE - llhttp - json - ${LIBUV_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${ODBC_LIBRARY} - ${VIPS_LIBRARIES} - pthread -) - -target_link_directories(jtlsrv PRIVATE - ${LIBUV_LIBRARY_DIRS} - ${OPENSSL_LIBRARY_DIRS} - ${VIPS_LIBRARY_DIRS} -) diff --git a/jtlsrv-cpp/Dockerfile b/jtlsrv-cpp/Dockerfile deleted file mode 100644 index d944717..0000000 --- a/jtlsrv-cpp/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM ubuntu:24.04 - -# Install build deps -RUN apt-get update && apt-get install -y \ - build-essential cmake pkg-config \ - libuv1-dev libssl-dev \ - libodbc2 unixodbc-dev \ - libvips-dev \ - curl gnupg2 gdbserver \ - && rm -rf /var/lib/apt/lists/* - -# Install Microsoft ODBC Driver 18 -RUN curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \ - && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/24.04/prod noble main" > /etc/apt/sources.list.d/mssql-release.list \ - && apt-get update \ - && ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 \ - && rm -rf /var/lib/apt/lists/* - -# Copy source -WORKDIR /build -COPY CMakeLists.txt . -COPY vendor/ vendor/ -COPY src/ src/ - -# Build (default Debug for gdb, override with --build-arg CMAKE_BUILD_TYPE=Release) -ARG CMAKE_BUILD_TYPE=Debug -RUN mkdir -p build && cd build \ - && cmake .. -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ - && cmake --build . -j$(nproc) \ - && cp jtlsrv /usr/local/bin/ - -# Copy certs and env -WORKDIR /app -COPY certs/ certs/ -COPY .env.docker .env - -EXPOSE 4443 - -CMD ["jtlsrv"] diff --git a/jtlsrv-cpp/Makefile b/jtlsrv-cpp/Makefile new file mode 100644 index 0000000..7de6f82 --- /dev/null +++ b/jtlsrv-cpp/Makefile @@ -0,0 +1,89 @@ +CXX := g++ +CC := gcc +PKGFLAGS := $(shell pkg-config --cflags libuv openssl vips) +PKGLIBS := $(shell pkg-config --libs libuv openssl vips) + +BUILD_DIR := build +BINARY := jtlsrv + +CXXFLAGS := -std=c++17 -Wall -Wextra -Isrc -Ivendor $(PKGFLAGS) +CFLAGS := -Wall -Ivendor +LDFLAGS := $(PKGLIBS) -lodbc -pthread + +ifeq ($(DEBUG),1) + CXXFLAGS := -std=c++17 -Wall -Wextra -g -O0 -Isrc -Ivendor $(PKGFLAGS) + CFLAGS := -Wall -g -O0 -Ivendor +else + CXXFLAGS += -O2 + CFLAGS += -O2 +endif + +CPP_SRCS := \ + src/main.cpp \ + src/log.cpp \ + src/http.cpp \ + src/tls_server.cpp \ + src/pairing.cpp \ + src/router.cpp \ + src/endpoints/client.cpp \ + src/endpoints/init.cpp \ + src/endpoints/category.cpp \ + src/endpoints/product.cpp \ + src/endpoints/productcomposite.cpp \ + src/endpoints/deleted_entity.cpp \ + src/endpoints/customergroup.cpp \ + src/endpoints/order.cpp \ + src/endpoints/pimage.cpp \ + src/endpoints/cimage.cpp \ + src/db/pool.cpp \ + src/queries/shop.cpp \ + src/request_log.cpp \ + src/order_log.cpp + +C_SRCS := \ + vendor/llhttp.c \ + vendor/api.c \ + vendor/http.c + +CPP_OBJS := $(patsubst src/%.cpp,$(BUILD_DIR)/src/%.o,$(CPP_SRCS)) +C_OBJS := $(patsubst vendor/%.c,$(BUILD_DIR)/vendor/%.o,$(C_SRCS)) +OBJS := $(CPP_OBJS) $(C_OBJS) + +.PHONY: all debug clean rebuild run help + +all: $(BINARY) + +debug: + $(MAKE) DEBUG=1 all + +$(BINARY): $(OBJS) + @mkdir -p $(BUILD_DIR) + $(CXX) $(OBJS) -o $@ $(LDFLAGS) + +$(BUILD_DIR)/src/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) -c $< -o $@ + +$(BUILD_DIR)/vendor/%.o: vendor/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -rf $(BUILD_DIR) $(BINARY) + +rebuild: clean all + +run: all + @mkdir -p logs + ./$(BINARY) + +help: + @echo "Usage: make [target]" + @echo "" + @echo " all Build $(BINARY) (default)" + @echo " debug Build with -g -O0" + @echo " clean Remove $(BUILD_DIR)/" + @echo " rebuild clean + all" + @echo " run Build and start the server" + @echo "" + @echo "Variables: DEBUG=1" diff --git a/jtlsrv-cpp/README.md b/jtlsrv-cpp/README.md new file mode 100644 index 0000000..096c39d --- /dev/null +++ b/jtlsrv-cpp/README.md @@ -0,0 +1,124 @@ +# jtlsrv + +Built on **libuv** (event loop), **OpenSSL** (TLS), **llhttp** (HTTP parsing), **unixODBC** + [**ODBC Driver 18 for SQL Server**](https://learn.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server) (database), and **libvips** (image thumbnails). Blocking work (ODBC queries, image processing) runs on libuv worker threads. + +## Requirements + +| Dependency | Purpose | +|---|---| +| C++17 compiler | gcc or clang | +| GNU Make | Build | +| pkg-config | Dependency flags | +| libuv | Async I/O and thread pool | +| OpenSSL | TLS | +| libvips | Product/category image resizing | +| unixODBC + dev headers | ODBC runtime | +| [ODBC Driver 18 for SQL Server](https://learn.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server) | Connect to JTL-Wawi (MSSQL) | + +Vendored in `vendor/`: **llhttp**, **nlohmann/json** (no install needed). + +### Install on Ubuntu / Debian + +```bash +sudo apt install \ + build-essential make pkg-config \ + libuv1-dev libssl-dev libvips-dev unixodbc-dev +``` + +Install [Microsoft's ODBC driver](https://learn.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server) (required for MSSQL): + +```bash +curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \ + sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg + +echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] \ + https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" | \ + sudo tee /etc/apt/sources.list.d/mssql-release.list + +sudo apt update +sudo ACCEPT_EULA=Y apt install msodbcsql18 +``` + +## Build + +```bash +make +``` + +The binary is written to `./jtlsrv`. After code changes always run `make` before starting the server. + +Debug build: + +```bash +make debug +``` + +## Configuration + +Copy the example env file from the repo root and edit as needed: + +```bash +cp ../.env.example .env +``` + +Key settings: + +| Variable | Default | Description | +|---|---|---| +| `PORT` | `4443` | HTTPS listen port | +| `PAIRING_CODE` | `307018` | Code shown to the POS during pairing | +| `AUTH_TOKEN` | (built-in default) | Device auth token after pairing | +| `MSSQL_*` | — | JTL-Wawi database connection | +| `MANDANT_*` | — | Mandant metadata returned to the client | +| `ROOT_CATEGORY_ID` | `1` | Root category for sync | +| `TAX_ZONE_NAME` | `Zone-EU` | Tax zone for product prices | +| `LOG_FILE` | `logs/requests.log` | Request log path | +| `ORDER_LOG_FILE` | `logs/orders.log` | Order log path | + +The server starts without MSSQL if `MSSQL_USER` is unset or the connection fails — pairing and handshake still work, but catalog sync from the database is unavailable. + +## TLS certificates + +Place a certificate and key at `certs/cert.pem` and `certs/key.pem` (relative to the working directory when you run the binary). + +```bash +mkdir -p certs +openssl req -x509 -newkey rsa:2048 -nodes \ + -keyout certs/key.pem -out certs/cert.pem -days 3650 \ + -subj '/CN=localhost/O=JTL POS Sync/C=DE' \ + -addext 'subjectAltName=DNS:localhost,IP:127.0.0.1,IP:0.0.0.0' +``` + +On startup the server prints the pairing code and whether MSSQL connected. + +## API endpoints + +| Method | Path | Description | +|---|---|---| +| GET | `/v1/client` | Client discovery / pairing | +| GET | `/v1/init` | Init handshake | +| GET | `/v1/category` | Category sync | +| GET | `/v1/product` | Product sync | +| GET | `/v1/productcomposite` | Composite product sync | +| GET | `/v1/deletedentity` | Deleted entity sync | +| GET | `/v1/customergroup` | Customer group sync | +| POST | `/v1/order` | Submit orders | +| GET | `/v1/pimage` | Product image (resized) | +| GET | `/v1/cimage` | Category image (resized) | + +## Project layout + +``` +Makefile +src/ + main.cpp Entry point, route registration, startup + config.hpp .env loader + tls_server.{hpp,cpp} HTTPS over libuv + OpenSSL + http.{hpp,cpp} llhttp request/response handling + router.{hpp,cpp} Route dispatch + pairing.{hpp,cpp} In-memory pairing store + endpoints/ HTTP handlers + queries/ SQL query builders (header-only) + db/pool.{hpp,cpp} ODBC connection pool +vendor/ llhttp, nlohmann/json +``` diff --git a/jtlsrv-cpp/jtlsrv-static b/jtlsrv-cpp/jtlsrv-static new file mode 100755 index 0000000..531f424 Binary files /dev/null and b/jtlsrv-cpp/jtlsrv-static differ diff --git a/jtlsrv-cpp/src/db/pool.cpp b/jtlsrv-cpp/src/db/pool.cpp index 5ff862f..edc4e36 100644 --- a/jtlsrv-cpp/src/db/pool.cpp +++ b/jtlsrv-cpp/src/db/pool.cpp @@ -3,7 +3,10 @@ #include "../log.hpp" #include +#include #include +#include +#include static OdbcPool g_pool; @@ -11,6 +14,28 @@ OdbcPool& get_pool() { return g_pool; } OdbcPool::~OdbcPool() { disconnect(); } +static void odbc_log_diag(SQLSMALLINT handle_type, SQLHANDLE handle, const char* ctx) { + if (!handle) { + logc::warn("ODBC %s failed (no handle)", ctx); + return; + } + SQLSMALLINT rec = 0; + bool any = false; + while (true) { + SQLCHAR state[6], msg[SQL_MAX_MESSAGE_LENGTH]; + SQLINTEGER native; + SQLSMALLINT msg_len; + SQLRETURN diag_rc = SQLGetDiagRec(handle_type, handle, ++rec, + state, &native, msg, sizeof(msg), &msg_len); + if (diag_rc != SQL_SUCCESS && diag_rc != SQL_SUCCESS_WITH_INFO) break; + any = true; + logc::warn("ODBC %s: %s - %s (%d)", ctx, state, msg, (int)native); + } + if (!any) { + logc::warn("ODBC %s failed (no diag)", ctx); + } +} + int OdbcPool::connect() { SQLRETURN rc; @@ -31,7 +56,6 @@ int OdbcPool::connect() { return -1; } - // Connection string std::string conn_str = "DRIVER={ODBC Driver 18 for SQL Server};" "SERVER=" + server + "," + std::to_string(port) + ";" @@ -43,8 +67,7 @@ int OdbcPool::connect() { logc::info("ODBC connecting to %s:%d/%s as %s", server.c_str(), port, database.c_str(), user.c_str()); - // Create pool of 4 connections - const int POOL_SIZE = 4; + const int POOL_SIZE = config::get_int("MSSQL_POOL_SIZE", 1); conns_.resize(POOL_SIZE); int connected = 0; @@ -58,14 +81,14 @@ int OdbcPool::connect() { if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { SQLAllocHandle(SQL_HANDLE_STMT, conns_[i].hdbc, &conns_[i].hstmt); + SQLSetConnectAttr(conns_[i].hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); connected++; } else { - SQLCHAR state[6], msg[SQL_MAX_MESSAGE_LENGTH]; - SQLINTEGER native; - SQLSMALLINT msg_len; - SQLGetDiagRec(SQL_HANDLE_DBC, conns_[i].hdbc, 1, - state, &native, msg, sizeof(msg), &msg_len); - logc::warn("ODBC connect[%d] failed: %s - %s", i, state, msg); + char ctx[32]; + std::snprintf(ctx, sizeof(ctx), "connect[%d]", i); + odbc_log_diag(SQL_HANDLE_DBC, conns_[i].hdbc, ctx); + SQLFreeHandle(SQL_HANDLE_DBC, conns_[i].hdbc); + conns_[i].hdbc = SQL_NULL_HDBC; } } @@ -87,44 +110,52 @@ void OdbcPool::disconnect() { if (henv_ != SQL_NULL_HENV) { SQLFreeHandle(SQL_HANDLE_ENV, henv_); henv_ = SQL_NULL_HENV; } } -OdbcPool::Connection* OdbcPool::checkout() { - std::lock_guard lock(mutex_); - for (auto& c : conns_) { - if (!c.in_use) { c.in_use = true; return &c; } +OdbcPool::Connection* OdbcPool::checkout_raw() { + for (int attempt = 0; attempt < 300; attempt++) { + { + std::lock_guard lock(mutex_); + for (auto& c : conns_) { + if (!c.in_use && c.hdbc != SQL_NULL_HDBC) { + c.in_use = true; + return &c; + } + } + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } return nullptr; } +OdbcPool::ConnGuard OdbcPool::checkout() { + return ConnGuard(checkout_raw(), this); +} + void OdbcPool::release(Connection* c) { + if (!c) return; + if (c->in_transaction) { + SQLEndTran(SQL_HANDLE_DBC, c->hdbc, SQL_ROLLBACK); + SQLSetConnectAttr(c->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); + c->in_transaction = false; + logc::warn("ODBC: rolled back uncommitted transaction on connection release"); + } std::lock_guard lock(mutex_); c->in_use = false; } -bool OdbcPool::execute(const std::string& sql, const std::vector& params, ResultSet& out) { - Connection* c = checkout(); - if (!c) return false; +static bool bind_params(SQLHSTMT hstmt, const std::vector& params, std::vector& indicators) { + indicators.assign(params.size(), 0); - SQLRETURN rc; + // Stable placeholder for null numeric parameters. + static const int64_t null_placeholder = 0; - // Prepare statement - rc = SQLPrepare(c->hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); - if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { - release(c); - return false; - } - - // Wide buffer storage for NVarChar parameters (must outlive SQLExecute) - std::vector> wbufs; - - // Bind parameters for (size_t i = 0; i < params.size(); i++) { const auto& p = params[i]; SQLUSMALLINT param_num = static_cast(i + 1); - SQLPOINTER val_ptr = nullptr; + SQLPOINTER val_ptr = (SQLPOINTER)&null_placeholder; SQLLEN buf_len = 0; - SQLLEN indicator = 0; SQLSMALLINT c_type = SQL_C_CHAR; SQLSMALLINT sql_type = SQL_VARCHAR; + SQLULEN column_size = 1; switch (p.type) { case ParamType::Int: @@ -132,12 +163,16 @@ bool OdbcPool::execute(const std::string& sql, const std::vector& params, sql_type = SQL_INTEGER; val_ptr = (SQLPOINTER)&p.int_val; buf_len = sizeof(SQLINTEGER); + column_size = sizeof(SQLINTEGER); + indicators[i] = buf_len; break; case ParamType::BigInt: c_type = SQL_C_SBIGINT; sql_type = SQL_BIGINT; val_ptr = (SQLPOINTER)&p.int_val; buf_len = sizeof(SQLBIGINT); + column_size = sizeof(SQLBIGINT); + indicators[i] = buf_len; break; case ParamType::Float: case ParamType::Double: @@ -145,128 +180,167 @@ bool OdbcPool::execute(const std::string& sql, const std::vector& params, sql_type = SQL_DOUBLE; val_ptr = (SQLPOINTER)&p.dbl_val; buf_len = sizeof(SQLDOUBLE); + column_size = sizeof(SQLDOUBLE); + indicators[i] = buf_len; break; - case ParamType::NVarChar: { - // Convert narrow string to SQLWCHAR (unsigned short = UTF-16) - // SQLWCHAR is unsigned short (2 bytes) on this platform - std::vector wbuf(p.str_val.size()); - for (size_t k = 0; k < p.str_val.size(); k++) - wbuf[k] = static_cast((unsigned char)p.str_val[k]); - wbufs.push_back(std::move(wbuf)); - auto& wb = wbufs.back(); - c_type = SQL_C_WCHAR; + case ParamType::NVarChar: + case ParamType::DateTime: + // UTF-8 SQL_C_CHAR + SQL_WVARCHAR works with msodbcsql18 for nvarchar columns. + c_type = SQL_C_CHAR; sql_type = SQL_WVARCHAR; - val_ptr = (SQLPOINTER)wb.data(); - buf_len = (SQLLEN)(wb.size() * sizeof(SQLWCHAR)); - indicator = wb.empty() ? SQL_NULL_DATA : (SQLLEN)(wb.size() * sizeof(SQLWCHAR)); + column_size = p.str_val.empty() ? 1 : p.str_val.size(); + if (!p.is_null) { + val_ptr = (SQLPOINTER)p.str_val.c_str(); + buf_len = static_cast(p.str_val.size()); + indicators[i] = SQL_NTS; + } break; - } case ParamType::Bit: c_type = SQL_C_BIT; sql_type = SQL_BIT; val_ptr = (SQLPOINTER)&p.int_val; buf_len = 1; + column_size = 1; + indicators[i] = 1; break; } - rc = SQLBindParameter(c->hstmt, param_num, SQL_PARAM_INPUT, - c_type, sql_type, p.str_val.size() + 1, 0, val_ptr, buf_len, &indicator); + if (p.is_null) { + indicators[i] = SQL_NULL_DATA; + } + + SQLRETURN rc = SQLBindParameter(hstmt, param_num, SQL_PARAM_INPUT, + c_type, sql_type, column_size, 0, val_ptr, buf_len, &indicators[i]); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { - release(c); return false; } } + return true; +} - // Execute - rc = SQLExecute(c->hstmt); - if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA) { - release(c); +static bool fetch_results(SQLHSTMT hstmt, ResultSet& out) { + out.clear(); + + while (true) { + SQLSMALLINT col_count = 0; + SQLNumResultCols(hstmt, &col_count); + + if (col_count > 0) { + std::vector col_types(col_count); + for (SQLSMALLINT col = 0; col < col_count; col++) { + SQLSMALLINT data_type; + SQLDescribeCol(hstmt, col + 1, nullptr, 0, nullptr, &data_type, nullptr, nullptr, nullptr); + col_types[col] = data_type; + } + + while (true) { + SQLRETURN rc = SQLFetch(hstmt); + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) break; + + Row row; + for (SQLSMALLINT col = 0; col < col_count; col++) { + Cell cell; + SQLLEN ind; + SQLSMALLINT sql_type = col_types[col]; + + if (sql_type == SQL_BINARY || sql_type == SQL_VARBINARY || + sql_type == SQL_LONGVARBINARY) { + std::vector blob_data; + unsigned char chunk[8192]; + while (true) { + rc = SQLGetData(hstmt, col + 1, SQL_C_BINARY, chunk, sizeof(chunk), &ind); + if (ind == SQL_NULL_DATA) { break; } + if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { + SQLLEN copy_len = std::min(ind, (SQLLEN)sizeof(chunk)); + blob_data.insert(blob_data.end(), chunk, chunk + copy_len); + } + if (rc == SQL_SUCCESS) break; + if (rc != SQL_SUCCESS_WITH_INFO) break; + } + if (!blob_data.empty()) { + cell.type = CellType::Blob; + cell.blob = std::move(blob_data); + } + } else { + char buf[4096]; + rc = SQLGetData(hstmt, col + 1, SQL_C_CHAR, buf, sizeof(buf) - 1, &ind); + if (ind == SQL_NULL_DATA) { + cell.type = CellType::Null; + } else if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { + cell.type = CellType::String; + cell.str = std::string(buf, std::min((SQLLEN)(sizeof(buf)-1), ind)); + } + } + row.push_back(std::move(cell)); + } + out.push_back(std::move(row)); + } + if (!out.empty()) return true; + } + + SQLRETURN rc = SQLMoreResults(hstmt); + if (rc == SQL_NO_DATA) break; + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) break; + } + return true; +} + +bool OdbcPool::execute(Connection* c, const std::string& sql, const std::vector& params, ResultSet& out) { + if (!c) { + logc::warn("ODBC execute: no connection"); return false; } - // Fetch results if it's a SELECT - out.clear(); - SQLSMALLINT col_count = 0; - SQLNumResultCols(c->hstmt, &col_count); - - if (col_count > 0) { - // Discover column types - std::vector col_types(col_count); - bool has_blobs = false; - for (SQLSMALLINT col = 0; col < col_count; col++) { - SQLSMALLINT data_type; - SQLDescribeCol(c->hstmt, col + 1, nullptr, 0, nullptr, &data_type, nullptr, nullptr, nullptr); - col_types[col] = data_type; - if (data_type == SQL_BINARY || data_type == SQL_VARBINARY || data_type == SQL_LONGVARBINARY) - has_blobs = true; - } - - while (true) { - rc = SQLFetch(c->hstmt); - if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) break; - - Row row; - for (SQLSMALLINT col = 0; col < col_count; col++) { - Cell cell; - SQLLEN ind; - SQLSMALLINT sql_type = col_types[col]; - - // Binary columns: read as binary - if (sql_type == SQL_BINARY || sql_type == SQL_VARBINARY || - sql_type == SQL_LONGVARBINARY) { - std::vector blob_data; - unsigned char chunk[8192]; - int chunk_count = 0; - while (true) { - rc = SQLGetData(c->hstmt, col + 1, SQL_C_BINARY, chunk, sizeof(chunk), &ind); - if (ind == SQL_NULL_DATA) { break; } - if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { - SQLLEN copy_len = std::min(ind, (SQLLEN)sizeof(chunk)); - if (has_blobs && chunk_count == 0) - logc::info(" blob col=%d rc=%d ind=%d copy=%d", col, rc, (int)ind, (int)copy_len); - blob_data.insert(blob_data.end(), chunk, chunk + copy_len); - chunk_count++; - } - if (rc == SQL_SUCCESS) break; - if (rc != SQL_SUCCESS_WITH_INFO) break; - } - if (chunk_count > 0) { - cell.type = CellType::Blob; - cell.blob = std::move(blob_data); - if (has_blobs) - logc::info(" blob col=%d total=%zu chunks=%d", col, cell.blob.size(), chunk_count); - } - } else { - // String/numeric columns: read as char - char buf[4096]; - rc = SQLGetData(c->hstmt, col + 1, SQL_C_CHAR, buf, sizeof(buf) - 1, &ind); - if (ind == SQL_NULL_DATA) { - cell.type = CellType::Null; - } else if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { - cell.type = CellType::String; - cell.str = std::string(buf, std::min((SQLLEN)(sizeof(buf)-1), ind)); - } - } - row.push_back(std::move(cell)); - } - out.push_back(std::move(row)); - } + SQLRETURN rc = SQLPrepare(c->hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { + odbc_log_diag(SQL_HANDLE_STMT, c->hstmt, "prepare"); + return false; } - // Reset statement for reuse + std::vector indicators; + if (!params.empty() && !bind_params(c->hstmt, params, indicators)) { + odbc_log_diag(SQL_HANDLE_STMT, c->hstmt, "bind"); + return false; + } + + rc = SQLExecute(c->hstmt); + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA) { + odbc_log_diag(SQL_HANDLE_STMT, c->hstmt, "execute"); + return false; + } + + fetch_results(c->hstmt, out); + SQLFreeStmt(c->hstmt, SQL_UNBIND); SQLFreeStmt(c->hstmt, SQL_CLOSE); - release(c); return true; } +bool OdbcPool::execute(Connection* c, const std::string& sql, ResultSet& out) { + return execute(c, sql, {}, out); +} + +bool OdbcPool::execute(const std::string& sql, const std::vector& params, ResultSet& out) { + ConnGuard g = checkout(); + if (!g) { + logc::warn("ODBC execute: pool exhausted"); + return false; + } + bool ok = execute(g.get(), sql, params, out); + return ok; +} + bool OdbcPool::execute(const std::string& sql, ResultSet& out) { return execute(sql, {}, out); } int64_t OdbcPool::execute_scalar(const std::string& sql, const std::vector& params, int64_t fallback) { ResultSet rs; - if (!execute(sql, params, rs) || rs.empty() || rs[0].empty()) return fallback; + if (!execute(sql, params, rs)) { + logc::warn("ODBC scalar query failed"); + return fallback; + } + if (rs.empty() || rs[0].empty()) return fallback; const auto& cell = rs[0][0]; if (cell.type == CellType::Int64) return cell.i64; if (cell.type == CellType::String) { @@ -274,3 +348,42 @@ int64_t OdbcPool::execute_scalar(const std::string& sql, const std::vectorin_transaction) { + logc::warn("ODBC begin: connection already in transaction"); + return false; + } + SQLRETURN rc = SQLSetConnectAttr(c->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0); + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { + odbc_log_diag(SQL_HANDLE_DBC, c->hdbc, "begin"); + return false; + } + c->in_transaction = true; + return true; +} + +bool OdbcPool::commit(Connection* c) { + if (!c || !c->in_transaction) return false; + SQLRETURN rc = SQLEndTran(SQL_HANDLE_DBC, c->hdbc, SQL_COMMIT); + SQLSetConnectAttr(c->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); + c->in_transaction = false; + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { + odbc_log_diag(SQL_HANDLE_DBC, c->hdbc, "commit"); + return false; + } + return true; +} + +bool OdbcPool::rollback(Connection* c) { + if (!c || !c->in_transaction) return true; + SQLRETURN rc = SQLEndTran(SQL_HANDLE_DBC, c->hdbc, SQL_ROLLBACK); + SQLSetConnectAttr(c->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); + c->in_transaction = false; + if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { + odbc_log_diag(SQL_HANDLE_DBC, c->hdbc, "rollback"); + return false; + } + return true; +} diff --git a/jtlsrv-cpp/src/db/pool.hpp b/jtlsrv-cpp/src/db/pool.hpp index 4456491..9c7b7bf 100644 --- a/jtlsrv-cpp/src/db/pool.hpp +++ b/jtlsrv-cpp/src/db/pool.hpp @@ -21,35 +21,75 @@ struct Cell { using Row = std::vector; using ResultSet = std::vector; -enum class ParamType { Int, BigInt, Float, Double, NVarChar, Bit }; +enum class ParamType { Int, BigInt, Float, Double, NVarChar, Bit, DateTime }; struct Param { ParamType type; std::string str_val; int64_t int_val = 0; double dbl_val = 0.0; + bool is_null = false; + + static Param null_int() { Param p; p.type = ParamType::Int; p.is_null = true; return p; } + static Param null_bigint() { Param p; p.type = ParamType::BigInt; p.is_null = true; return p; } + static Param null_nvarchar() { Param p; p.type = ParamType::NVarChar; p.is_null = true; return p; } }; class OdbcPool { public: - ~OdbcPool(); - int connect(); - void disconnect(); - bool execute(const std::string& sql, const std::vector& params, ResultSet& out); - bool execute(const std::string& sql, ResultSet& out); - int64_t execute_scalar(const std::string& sql, const std::vector& params = {}, int64_t fallback = 0); - -private: struct Connection { SQLHDBC hdbc = SQL_NULL_HDBC; SQLHSTMT hstmt = SQL_NULL_HSTMT; bool in_use = false; + bool in_transaction = false; }; + + // RAII checkout guard. Returned by checkout(). + struct ConnGuard { + Connection* conn = nullptr; + OdbcPool* pool = nullptr; + ConnGuard() = default; + ConnGuard(Connection* c, OdbcPool* p) : conn(c), pool(p) {} + ~ConnGuard() { if (conn && pool) pool->release(conn); } + ConnGuard(const ConnGuard&) = delete; + ConnGuard(ConnGuard&& other) noexcept : conn(other.conn), pool(other.pool) { other.conn = nullptr; } + ConnGuard& operator=(ConnGuard&& other) noexcept { + if (this != &other) { + if (conn && pool) pool->release(conn); + conn = other.conn; + pool = other.pool; + other.conn = nullptr; + } + return *this; + } + Connection* operator->() const { return conn; } + Connection* get() const { return conn; } + explicit operator bool() const { return conn != nullptr; } + }; + + ~OdbcPool(); + int connect(); + void disconnect(); + + bool execute(const std::string& sql, const std::vector& params, ResultSet& out); + bool execute(const std::string& sql, ResultSet& out); + int64_t execute_scalar(const std::string& sql, const std::vector& params = {}, int64_t fallback = 0); + + // Transactional execution on an explicitly checked-out connection. + ConnGuard checkout(); + bool execute(Connection* conn, const std::string& sql, const std::vector& params, ResultSet& out); + bool execute(Connection* conn, const std::string& sql, ResultSet& out); + bool begin(Connection* conn); + bool commit(Connection* conn); + bool rollback(Connection* conn); + + void release(Connection* c); + +private: SQLHENV henv_ = SQL_NULL_HENV; std::vector conns_; std::mutex mutex_; - Connection* checkout(); - void release(Connection* c); + Connection* checkout_raw(); }; OdbcPool& get_pool(); diff --git a/jtlsrv-cpp/src/endpoints/category.cpp b/jtlsrv-cpp/src/endpoints/category.cpp index d0ae7ae..7fc1201 100644 --- a/jtlsrv-cpp/src/endpoints/category.cpp +++ b/jtlsrv-cpp/src/endpoints/category.cpp @@ -3,7 +3,7 @@ #include "../router.hpp" #include "../queries/category_list.hpp" -void handle_category(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_category(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t cursor = std::stoll(req.get_query_param("lastChangedCategory", "0")); int limit = std::stoi(req.get_query_param("limit", "20")); auto categories = get_category_list(cursor, limit); diff --git a/jtlsrv-cpp/src/endpoints/cimage.cpp b/jtlsrv-cpp/src/endpoints/cimage.cpp index b652913..8a7766c 100644 --- a/jtlsrv-cpp/src/endpoints/cimage.cpp +++ b/jtlsrv-cpp/src/endpoints/cimage.cpp @@ -4,7 +4,7 @@ #include "../log.hpp" #include "../queries/image.hpp" -void handle_cimage(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_cimage(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { std::string path = req.get_query_param("path"); if (path.empty()) { resp.send_json(400, {{"Message", "Missing required query parameter 'path'."}}); diff --git a/jtlsrv-cpp/src/endpoints/customergroup.cpp b/jtlsrv-cpp/src/endpoints/customergroup.cpp index f294096..92d010f 100644 --- a/jtlsrv-cpp/src/endpoints/customergroup.cpp +++ b/jtlsrv-cpp/src/endpoints/customergroup.cpp @@ -3,7 +3,7 @@ #include "../router.hpp" #include "../queries/customer_groups.hpp" -void handle_customergroup(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_customergroup(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t cursor = std::stoll(req.get_query_param("lastChangedCustomerGroup", "0")); auto groups = get_customer_group_list(cursor); resp.send_json(200, groups); diff --git a/jtlsrv-cpp/src/endpoints/deleted_entity.cpp b/jtlsrv-cpp/src/endpoints/deleted_entity.cpp index f4df3b0..ae8de30 100644 --- a/jtlsrv-cpp/src/endpoints/deleted_entity.cpp +++ b/jtlsrv-cpp/src/endpoints/deleted_entity.cpp @@ -3,7 +3,7 @@ #include "../router.hpp" #include "../queries/deleted_entity_list.hpp" -void handle_deleted_entity(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_deleted_entity(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t cursor = std::stoll(req.get_query_param("lastChangedDeletedEntity", "0")); int limit = std::stoi(req.get_query_param("limit", "600")); auto deleted = get_deleted_entity_list(cursor, limit); diff --git a/jtlsrv-cpp/src/endpoints/init.cpp b/jtlsrv-cpp/src/endpoints/init.cpp index 04f477e..2ab66ae 100644 --- a/jtlsrv-cpp/src/endpoints/init.cpp +++ b/jtlsrv-cpp/src/endpoints/init.cpp @@ -1,12 +1,13 @@ #include "../http.hpp" #include "../tls_server.hpp" #include "../router.hpp" +#include "../log.hpp" #include "../queries/counts.hpp" #include "../queries/customer_groups.hpp" #include "../queries/shop.hpp" #include "../config.hpp" -void handle_init(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_init(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t product_cursor = std::stoll(req.get_query_param("lastChangedProduct", "0")); int64_t category_cursor = std::stoll(req.get_query_param("lastChangedCategory", "0")); int64_t cg_cursor = std::stoll(req.get_query_param("lastChangedCustomerGroup", "0")); @@ -17,6 +18,7 @@ void handle_init(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { int shop = get_active_shop_id(); int64_t product_count = 0, category_count = 0, cg_count = 0, composite_count = 0, deleted_count = 0; + int64_t max_order_id_count = 0; if (get_pool().execute_scalar("SELECT 1") != 0) { product_count = get_product_count(root, shop, product_cursor); @@ -24,6 +26,16 @@ void handle_init(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { cg_count = get_customer_group_count(cg_cursor); composite_count = get_composite_count(shop, composite_cursor); deleted_count = get_deleted_count(deleted_cursor); + max_order_id_count = get_max_order_id_count(get_active_shop_subshop_id()); + logc::info("init counts: products=%lld categories=%lld cg=%lld composite=%lld deleted=%lld max_order=%lld root=%d shop=%d subshop=%d", + product_count, category_count, cg_count, composite_count, deleted_count, max_order_id_count, + root, shop, get_active_shop_subshop_id()); + if (product_cursor == 0 && category_cursor == 0 && + product_count == 0 && category_count == 0 && deleted_count == 0) { + logc::warn("init: all counts zero with cursors at 0 — check DB connectivity and shop/category config"); + } + } else { + logc::warn("init: DB connection check failed, returning zero counts"); } resp.send_json(200, { @@ -36,6 +48,6 @@ void handle_init(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { {"configurationGroup_count", "0"}, {"configurationItem_count", "0"}, {"deletedEntity_count", std::to_string(deleted_count)}, - {"max_orderId_count", "0"} + {"max_orderId_count", std::to_string(max_order_id_count)} }); } diff --git a/jtlsrv-cpp/src/endpoints/order.cpp b/jtlsrv-cpp/src/endpoints/order.cpp index 409cf04..733c877 100644 --- a/jtlsrv-cpp/src/endpoints/order.cpp +++ b/jtlsrv-cpp/src/endpoints/order.cpp @@ -1,11 +1,22 @@ +// POST /v1/order — creates one or more POS orders. +// Port of src/endpoints/order.js and src/queries/create-order.js. + #include "../http.hpp" -#include "../tls_server.hpp" #include "../router.hpp" #include "../log.hpp" +#include "../order_log.hpp" +#include "../queries/create_order.hpp" -void handle_order(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { - // TODO: full order creation (Milestone 5/6) - // For now, parse the JSON body and acknowledge +#include + +static nlohmann::json get_orders(const nlohmann::json& body) { + if (!body.is_object()) return nlohmann::json::array(); + auto it = body.find("orders"); + if (it == body.end() || !it->is_array()) return nlohmann::json::array(); + return *it; +} + +void handle_order(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { nlohmann::json body; try { body = nlohmann::json::parse(req.body); @@ -14,15 +25,44 @@ void handle_order(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { } nlohmann::json results = nlohmann::json::array(); - if (body.contains("orders") && body["orders"].is_array()) { - for (auto& order : body["orders"]) { - std::string ext_id = order.value("externalId", ""); + nlohmann::json orders = get_orders(body); + + int successful = 0; + int failed = 0; + + for (const auto& order : orders) { + std::string externalOrderId = order.value("externalId", ""); + g_order_log.log_order(order.dump(), externalOrderId); + + try { + nlohmann::json created = order::create_order(order); + logc::success("order %s (kAuftrag=%s) created for externalId=%s", + created.value("orderNumber", "").c_str(), + created.value("orderId", "").c_str(), + externalOrderId.c_str()); results.push_back({ {"status", "OK"}, - {"externalOrderId", ext_id}, + {"externalOrderId", externalOrderId}, {"message", ""} }); + ++successful; + } catch (const std::exception& ex) { + logc::error("order externalId=%s failed: %s", externalOrderId.c_str(), ex.what()); + results.push_back({ + {"status", "ERROR"}, + {"externalOrderId", externalOrderId}, + {"message", ex.what()} + }); + ++failed; } } + resp.send_json(200, results); + + if (orders.empty()) { + logc::info("POST /v1/order: no orders in body"); + } else { + logc::info("POST /v1/order: %d order(s), %d OK, %d ERROR", + static_cast(orders.size()), successful, failed); + } } diff --git a/jtlsrv-cpp/src/endpoints/pimage.cpp b/jtlsrv-cpp/src/endpoints/pimage.cpp index 8d5963f..acedfbf 100644 --- a/jtlsrv-cpp/src/endpoints/pimage.cpp +++ b/jtlsrv-cpp/src/endpoints/pimage.cpp @@ -4,7 +4,7 @@ #include "../log.hpp" #include "../queries/image.hpp" -void handle_pimage(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_pimage(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { std::string path = req.get_query_param("path"); if (path.empty()) { resp.send_json(400, {{"Message", "Missing required query parameter 'path'."}}); diff --git a/jtlsrv-cpp/src/endpoints/product.cpp b/jtlsrv-cpp/src/endpoints/product.cpp index 147603c..9c9d07b 100644 --- a/jtlsrv-cpp/src/endpoints/product.cpp +++ b/jtlsrv-cpp/src/endpoints/product.cpp @@ -3,7 +3,7 @@ #include "../router.hpp" #include "../queries/product_list.hpp" -void handle_product(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_product(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t cursor = std::stoll(req.get_query_param("lastChangedProduct", "0")); int limit = std::stoi(req.get_query_param("limit", "20")); auto products = get_product_list(cursor, limit); diff --git a/jtlsrv-cpp/src/endpoints/productcomposite.cpp b/jtlsrv-cpp/src/endpoints/productcomposite.cpp index f9bbf04..e59c8a6 100644 --- a/jtlsrv-cpp/src/endpoints/productcomposite.cpp +++ b/jtlsrv-cpp/src/endpoints/productcomposite.cpp @@ -3,7 +3,7 @@ #include "../router.hpp" #include "../queries/composite_product_list.hpp" -void handle_productcomposite(HttpRequest& req, HttpResponse& resp, RouteContext& ctx) { +void handle_productcomposite(HttpRequest& req, HttpResponse& resp, RouteContext& /*ctx*/) { int64_t cursor = std::stoll(req.get_query_param("lastChangedCompositeProduct", "0")); int limit = std::stoi(req.get_query_param("limit", "100")); auto composites = get_composite_product_list(cursor, limit); diff --git a/jtlsrv-cpp/src/main.cpp b/jtlsrv-cpp/src/main.cpp index 0a539d1..80ee204 100644 --- a/jtlsrv-cpp/src/main.cpp +++ b/jtlsrv-cpp/src/main.cpp @@ -16,6 +16,7 @@ #include #include "queries/shop.hpp" +#include "queries/customer_groups.hpp" #include "request_log.hpp" #include "order_log.hpp" @@ -27,7 +28,6 @@ static uv_loop_t* loop = nullptr; static Router router; static PairingStore pairing_store; static RequestLog request_log; -static OrderLog order_log; static json build_config() { return { @@ -85,7 +85,7 @@ static void handle_request(tls_session* sess) { // Console log with response size and truncated body const char* ip = sess->peer_ip.c_str(); if (resp_size > 0) { - std::string preview = resp_body.substr(0, std::min(resp_size, (size_t)200)); + std::string preview = resp_body.substr(0, std::min(resp_size, (size_t)220)); logc::info("%s %s %s %d %dms [%zu bytes] %s", ip, req.method.c_str(), url.c_str(), resp.status_code, (int)elapsed, resp_size, preview.c_str()); @@ -102,7 +102,7 @@ static void handle_request(tls_session* sess) { // Entry point // --------------------------------------------------------------------------- -int main(int argc, char* argv[]) { +int main(int /*argc*/, char* argv[]) { config::load(".env"); if (VIPS_INIT(argv[0])) { @@ -110,6 +110,7 @@ int main(int argc, char* argv[]) { } int port = config::get_int("PORT", 4443); + std::string bind_address = config::get("BIND_ADDRESS", "0.0.0.0"); std::string cert_path = "certs/cert.pem"; std::string key_path = "certs/key.pem"; @@ -140,7 +141,10 @@ int main(int argc, char* argv[]) { config::get("MSSQL_DATABASE").c_str()); if (fetch_active_shop()) { logc::info("Active shop ID: %d", get_active_shop_id()); + } else { + logc::warn("Active shop not loaded — sync filters and order mapping may be wrong"); } + (void)get_customer_group_ids(); } else { logc::warn("MSSQL connection skipped"); logc::warn("POS handshake will still work; sync from database is not available yet."); @@ -150,9 +154,9 @@ int main(int argc, char* argv[]) { // Open log files request_log.open(config::get("LOG_FILE", "logs/requests.log")); - order_log.open(config::get("ORDER_LOG_FILE", "logs/orders.log")); + g_order_log.open(config::get("ORDER_LOG_FILE", "logs/orders.log")); - int r = tls_server_init(loop, "0.0.0.0", port, + int r = tls_server_init(loop, bind_address.c_str(), port, cert_path.c_str(), key_path.c_str()); if (r != 0) { logc::error("failed to start TLS server"); @@ -166,7 +170,7 @@ int main(int argc, char* argv[]) { uv_run(loop, UV_RUN_DEFAULT); request_log.close(); - order_log.close(); + g_order_log.close(); get_pool().disconnect(); vips_shutdown(); logc::info("shutdown complete."); diff --git a/jtlsrv-cpp/src/order_log.cpp b/jtlsrv-cpp/src/order_log.cpp index 91e86f0..59725ff 100644 --- a/jtlsrv-cpp/src/order_log.cpp +++ b/jtlsrv-cpp/src/order_log.cpp @@ -3,6 +3,8 @@ #include #include +OrderLog g_order_log; + static void ensure_parent_dir(const std::string& path) { size_t pos = path.rfind('/'); if (pos != std::string::npos) { @@ -19,10 +21,9 @@ void OrderLog::close() { if (fp_) { std::fclose(fp_); fp_ = nullptr; } } -int OrderLog::log_order(const std::string& order_json) { +void OrderLog::log_order(const std::string& order_json, const std::string& external_id) { std::lock_guard lock(mutex_); sequence_++; - max_external_id_++; if (fp_) { auto now = std::chrono::system_clock::now(); @@ -32,13 +33,8 @@ int OrderLog::log_order(const std::string& order_json) { char ts[32]; std::strftime(ts, sizeof(ts), "%Y-%m-%dT%H:%M:%S", &tm_buf); - std::fprintf(fp_, "%s #%d externalId=%d %s\n", - ts, sequence_, max_external_id_, order_json.c_str()); + std::fprintf(fp_, "%s #%d externalId=%s %s\n", + ts, sequence_, external_id.c_str(), order_json.c_str()); std::fflush(fp_); } - return max_external_id_; -} - -std::string OrderLog::get_max_external_id() const { - return std::to_string(max_external_id_); } diff --git a/jtlsrv-cpp/src/order_log.hpp b/jtlsrv-cpp/src/order_log.hpp index dc64c38..ae840b5 100644 --- a/jtlsrv-cpp/src/order_log.hpp +++ b/jtlsrv-cpp/src/order_log.hpp @@ -7,11 +7,11 @@ class OrderLog { public: void open(const std::string& path); void close(); - int log_order(const std::string& order_json); - std::string get_max_external_id() const; + void log_order(const std::string& order_json, const std::string& external_id = ""); private: FILE* fp_ = nullptr; std::mutex mutex_; int sequence_ = 0; - int max_external_id_ = 0; }; + +extern OrderLog g_order_log; diff --git a/jtlsrv-cpp/src/queries/commit.hpp b/jtlsrv-cpp/src/queries/commit.hpp new file mode 100644 index 0000000..29f0ae4 --- /dev/null +++ b/jtlsrv-cpp/src/queries/commit.hpp @@ -0,0 +1,32 @@ +#pragma once +#include +#include "xml.hpp" +#include "../db/pool.hpp" + +namespace delivery { + +inline void commit_picklists(OdbcPool::Connection* c, int kBenutzer, int kSessionId, int kAuftrag) { + std::string bestellungen = xml::element("Bestellung", xml::tag("kBestellung", int64_t(kAuftrag))); + + const char* sql = + "DECLARE @xBestellungen XML = CONVERT(XML, ?);" + "DECLARE @xResult XML;" + "EXEC Auslieferung.spPicklistenUebernehmen" + " @Bestellungen = @xBestellungen," + " @kBenutzer = ?," + " @nTeillieferung = 0," + " @kSessionId = ?," + " @xResult = @xResult OUTPUT"; + + std::vector ps = { + {ParamType::NVarChar, bestellungen, 0}, + {ParamType::Int, "", kBenutzer}, + {ParamType::Int, "", kSessionId} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs)) { + throw std::runtime_error("commit_picklists failed"); + } +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/counts.hpp b/jtlsrv-cpp/src/queries/counts.hpp index b582b3d..b28a85d 100644 --- a/jtlsrv-cpp/src/queries/counts.hpp +++ b/jtlsrv-cpp/src/queries/counts.hpp @@ -43,23 +43,32 @@ static const char* DELETED_ENTITY_COUNT_SQL = "SELECT COUNT(*) AS cnt FROM Pos.vDeletedEntity " "WHERE CONVERT(BIGINT, vDeletedEntity.bLastChanged) > ?"; +static const char* MAX_ORDER_ID_SQL = + "SELECT ISNULL(MAX(kPosAuftrag), 0) AS cnt FROM Pos.tAuftragMapping " + "WHERE kShopSubShop = ?"; + inline int64_t get_category_count(int64_t root_cat, int k_shop, int64_t cursor) { return get_pool().execute_scalar(CATEGORY_COUNT_SQL, - {{ParamType::BigInt,"",root_cat},{ParamType::BigInt,"",k_shop}, - {ParamType::BigInt,"",k_shop},{ParamType::BigInt,"",cursor}}); + {{ParamType::BigInt,"",root_cat},{ParamType::Int,"",k_shop}, + {ParamType::Int,"",k_shop},{ParamType::BigInt,"",cursor}}); } inline int64_t get_product_count(int64_t root_cat, int k_shop, int64_t cursor) { return get_pool().execute_scalar(PRODUCT_COUNT_SQL, - {{ParamType::BigInt,"",root_cat},{ParamType::BigInt,"",k_shop}, - {ParamType::BigInt,"",k_shop},{ParamType::BigInt,"",cursor}, - {ParamType::BigInt,"",k_shop},{ParamType::BigInt,"",cursor}}); + {{ParamType::BigInt,"",root_cat},{ParamType::Int,"",k_shop}, + {ParamType::Int,"",k_shop},{ParamType::BigInt,"",cursor}, + {ParamType::Int,"",k_shop},{ParamType::BigInt,"",cursor}}); } inline int64_t get_composite_count(int k_shop, int64_t cursor) { return get_pool().execute_scalar(COMPOSITE_PRODUCT_COUNT_SQL, - {{ParamType::BigInt,"",k_shop},{ParamType::BigInt,"",k_shop}, + {{ParamType::Int,"",k_shop},{ParamType::Int,"",k_shop}, {ParamType::BigInt,"",cursor}}); } inline int64_t get_deleted_count(int64_t cursor) { return get_pool().execute_scalar(DELETED_ENTITY_COUNT_SQL, {{ParamType::BigInt,"",cursor}}); } +inline int64_t get_max_order_id_count(int k_shop_subshop) { + if (k_shop_subshop <= 0) return 0; + return get_pool().execute_scalar(MAX_ORDER_ID_SQL, + {{ParamType::Int,"",k_shop_subshop}}); +} diff --git a/jtlsrv-cpp/src/queries/create_order.hpp b/jtlsrv-cpp/src/queries/create_order.hpp new file mode 100644 index 0000000..d1c6626 --- /dev/null +++ b/jtlsrv-cpp/src/queries/create_order.hpp @@ -0,0 +1,729 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "delivery.hpp" +#include "shop.hpp" +#include "../db/pool.hpp" +#include "../config.hpp" +#include "nlohmann/json.hpp" + +namespace order { + +struct Defaults; + +namespace { + +struct Config { + int kBenutzer = 1; + int kFirmaHistory = 0; + int kSprache = 1; + int kPlattform = 7; + int kVersandArt = 0; + int kKundengruppe = 0; + int orderNumberSequence = 3; + int customerNumberSequence = 6; +}; + +Config g_config; +std::unique_ptr g_resolved_defaults; +std::map g_zahlungsart_cache; + +} // namespace + +struct Defaults { + int kFirmaHistory = 1; + int kVersandArt = 1; + int kKundengruppe = 1; + int kPlattform = 1; +}; + +inline void load_config() { + g_config.kBenutzer = config::get_int("JTL_KBENUTZER", 1); + g_config.kFirmaHistory = config::get_int("JTL_KFIRMAHISTORY", 0); + g_config.kSprache = config::get_int("JTL_KSPRACHE", 1); + g_config.kPlattform = config::get_int("JTL_KPLATTFORM", 7); + g_config.kVersandArt = config::get_int("JTL_KVERSANDART", 0); + g_config.kKundengruppe = config::get_int("JTL_KKUNDENGRUPPE", 0); + g_config.orderNumberSequence = config::get_int("JTL_ORDER_NUMBER_SEQUENCE", 3); + g_config.customerNumberSequence = config::get_int("JTL_CUSTOMER_NUMBER_SEQUENCE", 6); +} + +inline const Defaults& get_defaults(OdbcPool::Connection* c) { + if (g_resolved_defaults) return *g_resolved_defaults; + + Defaults d; + d.kFirmaHistory = g_config.kFirmaHistory; + d.kVersandArt = g_config.kVersandArt; + d.kKundengruppe = g_config.kKundengruppe; + d.kPlattform = g_config.kPlattform; + + const char* sql = + "SELECT" + " (SELECT MAX(kFirmaHistory) FROM dbo.tFirmaHistory) AS kFirmaHistory," + " (SELECT MIN(kVersandArt) FROM dbo.tVersandArt) AS kVersandArt," + " (SELECT TOP 1 kKundenGruppe FROM dbo.tKundenGruppe ORDER BY nStandard DESC, kKundenGruppe) AS kKundengruppe," + " (SELECT CASE WHEN EXISTS (SELECT 1 FROM dbo.tPlattform WHERE nPlattform = ?) THEN ? ELSE 1 END) AS kPlattform"; + + std::vector ps = { + {ParamType::Int, "", g_config.kPlattform}, + {ParamType::Int, "", g_config.kPlattform} + }; + ResultSet rs; + if (get_pool().execute(c, sql, ps, rs) && !rs.empty() && !rs[0].empty()) { + if (!rs[0][0].str.empty()) d.kFirmaHistory = std::stoi(rs[0][0].str); + if (!rs[0][1].str.empty()) d.kVersandArt = std::stoi(rs[0][1].str); + if (!rs[0][2].str.empty()) d.kKundengruppe = std::stoi(rs[0][2].str); + if (!rs[0][3].str.empty()) d.kPlattform = std::stoi(rs[0][3].str); + } + + // Apply environment overrides + if (g_config.kFirmaHistory > 0) d.kFirmaHistory = g_config.kFirmaHistory; + if (g_config.kVersandArt > 0) d.kVersandArt = g_config.kVersandArt; + if (g_config.kKundengruppe > 0) d.kKundengruppe = g_config.kKundengruppe; + + g_resolved_defaults = std::make_unique(d); + return *g_resolved_defaults; +} + +inline double to_number(const nlohmann::json& value, double fallback = 0) { + if (value.is_null()) return fallback; + if (value.is_number()) return value.get(); + if (value.is_string()) { + std::string s = value.get(); + if (s.empty()) return fallback; + std::replace(s.begin(), s.end(), ',', '.'); + try { return std::stod(s); } catch (...) {} + } + return fallback; +} + +inline int to_int(const nlohmann::json& value, int fallback = 0) { + if (value.is_null()) return fallback; + if (value.is_number_integer()) return value.get(); + if (value.is_number_unsigned()) return static_cast(value.get()); + if (value.is_number_float()) return static_cast(value.get()); + if (value.is_boolean()) return value.get() ? 1 : 0; + if (value.is_string()) { + std::string s = value.get(); + if (s.empty()) return fallback; + try { return std::stoi(s); } catch (...) {} + } + return fallback; +} + +inline int json_int(const nlohmann::json& obj, const char* key, int fallback = 0) { + auto it = obj.find(key); + if (it == obj.end()) return fallback; + return to_int(*it, fallback); +} + +inline int steuerklasse_for_vat(double vat) { + if (vat >= 15) return 1; + if (vat > 0) return 2; + return 1; +} + +inline int iso_week(const std::tm& tm) { + // JTL placeholders: J = Jahr, M = Monat, T = Tag, K = Kalenderwoche. + // ISO week date + std::tm t0 = tm; + int yday = t0.tm_yday; + int wday = t0.tm_wday; + if (wday == 0) wday = 7; + int week = (yday - wday + 10) / 7; + if (week < 1) week = 1; + if (week > 53) week = 53; + return week; +} + +inline std::string format_number_placeholders(const std::string& tpl, const std::tm& tm) { + if (tpl.empty()) return ""; + std::string r = tpl; + auto replace = [&r](const std::string& from, const std::string& to) { + size_t start = 0; + while ((start = r.find(from, start)) != std::string::npos) { + r.replace(start, from.size(), to); + start += to.size(); + } + }; + std::ostringstream mm, dd, kk; + mm << std::setw(2) << std::setfill('0') << (tm.tm_mon + 1); + dd << std::setw(2) << std::setfill('0') << tm.tm_mday; + kk << std::setw(2) << std::setfill('0') << iso_week(tm); + replace("", std::to_string(tm.tm_year + 1900)); + replace("", mm.str()); + replace("", dd.str()); + replace("", kk.str()); + return r; +} + +inline std::tm parse_order_date(const std::string& s) { + std::tm tm{}; + std::string iso = s; + std::replace(iso.begin(), iso.end(), ' ', 'T'); + std::istringstream ss(iso); + ss >> std::get_time(&tm, "%Y-%m-%dT%H:%M:%S"); + if (ss.fail()) { + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + localtime_r(&t, &tm); + } + return tm; +} + +inline std::string order_date_sql(const std::tm& tm) { + char buf[32]; + std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); + return buf; +} + +inline std::string country_name(const std::string& iso) { + static const std::map names = { + {"DE", "Deutschland"}, + {"AT", "Oesterreich"}, + {"CH", "Schweiz"} + }; + auto it = names.find(iso); + return it != names.end() ? it->second : iso; +} + +inline std::string next_number_from_sequence(OdbcPool::Connection* c, int kLaufendeNummer, + const std::tm& date) { + const char* sql = + "DECLARE @n INT, @cPrefix NVARCHAR(50), @cSuffix NVARCHAR(50);" + "UPDATE dbo.tLaufendeNummern" + " SET @n = nNummer = nNummer + 1, @cPrefix = cPrefix, @cSuffix = cSuffix" + " WHERE kLaufendeNummer = ?;" + "SELECT @n AS nNummer, @cPrefix AS cPrefix, @cSuffix AS cSuffix"; + + std::vector ps = {{ParamType::Int, "", kLaufendeNummer}}; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs) || rs.empty() || rs[0].size() < 3) { + throw std::runtime_error("dbo.tLaufendeNummern has no row " + std::to_string(kLaufendeNummer)); + } + int n = std::stoi(rs[0][0].str); + std::string prefix = format_number_placeholders(rs[0][1].str, date); + std::string suffix = format_number_placeholders(rs[0][2].str, date); + return prefix + std::to_string(n) + suffix; +} + +inline int allocate_pk(OdbcPool::Connection* c, const std::string& tableName) { + const char* sql = + "DECLARE @pk INT;" + "UPDATE dbo.tpk SET @pk = nummer, nummer = nummer + 1, dChanged = GETDATE() WHERE cName = ?;" + "SELECT @pk AS pk"; + + std::vector ps = {{ParamType::NVarChar, tableName, 0}}; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs) || rs.empty() || rs[0].empty()) { + throw std::runtime_error("dbo.tpk has no row for table '" + tableName + "'"); + } + return std::stoi(rs[0][0].str); +} + +inline nlohmann::json resolve_zahlungsart(OdbcPool::Connection* c, const std::string& name) { + std::string key = name.empty() ? "bar" : name; + std::transform(key.begin(), key.end(), key.begin(), [](unsigned char ch) { return std::tolower(ch); }); + auto it = g_zahlungsart_cache.find(key); + if (it != g_zahlungsart_cache.end()) return it->second; + + std::vector ps = {{ParamType::NVarChar, key, 0}}; + ResultSet rs; + get_pool().execute(c, "SELECT TOP 1 kZahlungsart, cName FROM dbo.tZahlungsart WHERE cName = ?", ps, rs); + + if (!rs.empty() && !rs[0].empty()) { + nlohmann::json z = {{"kZahlungsart", std::stoi(rs[0][0].str)}, {"cName", rs[0][1].str}}; + g_zahlungsart_cache[key] = z; + return z; + } + + int kZahlungsart = allocate_pk(c, "tZahlungsart"); + const char* insert = + "INSERT INTO dbo.tZahlungsart" + " (kZahlungsart, cName, cPrtString, nLastschrift, cPrtStringVor, cPaymentOption, cKonto," + " nAusliefernVorZahlung, nPrioritaet, nMahnwesenAktiv, fSkontoWert, nSkontoZeitraum," + " nMatchingOptionen, nIstStandard, nAktiv)" + " VALUES (?, ?, '', 0, '', '', '', 0, 0, 0, 0, 0, 0, 0, 1)"; + std::vector ps2 = { + {ParamType::Int, "", kZahlungsart}, + {ParamType::NVarChar, key, 0} + }; + get_pool().execute(c, insert, ps2, rs); + + nlohmann::json z = {{"kZahlungsart", kZahlungsart}, {"cName", key}}; + g_zahlungsart_cache[key] = z; + return z; +} + +inline std::string next_customer_number(OdbcPool::Connection* c) { + std::tm date; + { + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + localtime_r(&t, &date); + } + return next_number_from_sequence(c, g_config.customerNumberSequence, date); +} + +inline std::pair lookup_kassenkunde(OdbcPool::Connection* c, const Defaults& defaults) { + ResultSet rs; + get_pool().execute(c, + "SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKassenKunde = 'Y' ORDER BY kKunde", rs); + if (!rs.empty() && !rs[0].empty()) { + int kKunde = std::stoi(rs[0][0].str); + int grp = defaults.kKundengruppe; + if (rs[0].size() > 1 && !rs[0][1].str.empty()) grp = std::stoi(rs[0][1].str); + return {kKunde, grp}; + } + return {0, defaults.kKundengruppe}; +} + +inline bool is_walk_in_order(const nlohmann::json& order) { + std::string customer_number = order.value("customerNumber", ""); + if (customer_number.empty() || customer_number == "0") return true; + + const auto billing = order.value("billingAddress", nlohmann::json::object()); + return billing.value("lastName", "") == "Laufkunde" + && billing.value("firstName", "").empty(); +} + +inline std::pair create_customer(OdbcPool::Connection* c, const std::string& customer_number, + const nlohmann::json& address, const Defaults& defaults) { + const nlohmann::json a = address.is_null() ? nlohmann::json::object() : address; + std::string iso = a.value("countryIso", "DE"); + std::transform(iso.begin(), iso.end(), iso.begin(), [](unsigned char ch) { return std::toupper(ch); }); + int kKundengruppe = json_int(a, "customerGroupId", 0); + if (kKundengruppe <= 0) kKundengruppe = defaults.kKundengruppe; + + const char* sql = + "DECLARE @returnValue INT;" + "DECLARE @p1 dbo.TYPE_spkundeInsert;" + "INSERT INTO @p1" + " (kInetKunde, kKundenKategorie, cKundenNr, cFirma, cAnrede, cTitel, cVorname, cName," + " cStrasse, cPLZ, cOrt, cLand, cTel, cFax, cEMail, dErstellt, cMobil, fRabatt, cUSTID, cNewsletter," + " cZusatz, cEbayName, kBuyer, cAdressZusatz, cGeburtstag, cWWW, cSperre, cPostID, kKundenGruppe," + " nZahlungsziel, kSprache, cISO, cBundesland, cHerkunft, cKassenKunde, cHRNr, kZahlungsart," + " nDebitorennr, cSteuerNr, nKreditlimit, kKundenDrucktext, nMahnstopp, nMahnrhythmus, kFirma," + " fProvision, nVertreter, fSkonto, nSkontoInTagen)" + " VALUES" + " (0, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, GETDATE(), ?, ?, NULL, 'N'," + " N'', N'', 0, ?, ?, N'', 'N', NULL, ?," + " 0, ?, ?, ?, ?, ?, N'', 0," + " ?, N'', 0, 0, 0, 0, 0," + " NULL, 0, 0, 0);" + "EXEC @returnValue = Kunde.spKundeInsert @daten = @p1;" + "SELECT @returnValue AS kKunde"; + + std::vector ps = { + {ParamType::NVarChar, customer_number, 0}, + {ParamType::NVarChar, a.value("company", ""), 0}, + {ParamType::NVarChar, a.value("salutation", ""), 0}, + {ParamType::NVarChar, a.value("title", ""), 0}, + {ParamType::NVarChar, a.value("firstName", ""), 0}, + {ParamType::NVarChar, a.value("lastName", "Laufkunde"), 0}, + {ParamType::NVarChar, a.value("street", "-"), 0}, + {ParamType::NVarChar, a.value("zipCode", ""), 0}, + {ParamType::NVarChar, a.value("city", "-"), 0}, + {ParamType::NVarChar, country_name(iso), 0}, + {ParamType::NVarChar, a.value("phone", ""), 0}, + {ParamType::NVarChar, a.value("fax", ""), 0}, + {ParamType::NVarChar, a.value("email", ""), 0}, + {ParamType::NVarChar, a.value("mobile", ""), 0}, + {ParamType::Double, "", 0, to_number(a["discount"], 0)}, + {ParamType::NVarChar, a.value("addressAddition", ""), 0}, + {ParamType::NVarChar, a.value("birthday", ""), 0}, + {ParamType::Int, "", kKundengruppe}, + {ParamType::Int, "", g_config.kSprache}, + {ParamType::NVarChar, iso, 0}, + {ParamType::NVarChar, a.value("state", ""), 0}, + {ParamType::NVarChar, std::string("Kasse"), 0}, + {ParamType::NVarChar, std::string("Y"), 0}, + {ParamType::Int, "", json_int(a, "debtorNumber", 0)} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs) || rs.empty() || rs[0].empty()) { + throw std::runtime_error("Kunde.spKundeInsert failed for '" + customer_number + "'"); + } + int kKunde = std::stoi(rs[0][0].str); + if (kKunde <= 0) throw std::runtime_error("Kunde.spKundeInsert returned invalid kKunde"); + return {kKunde, kKundengruppe}; +} + +inline std::pair resolve_customer(OdbcPool::Connection* c, const nlohmann::json& order, + const Defaults& defaults) { + if (is_walk_in_order(order)) { + auto [kKunde, grp] = lookup_kassenkunde(c, defaults); + if (kKunde > 0) return {kKunde, grp}; + return create_customer(c, next_customer_number(c), + order.value("billingAddress", nlohmann::json::object()), defaults); + } + + std::string customer_number = order.value("customerNumber", ""); + std::vector ps = {{ParamType::NVarChar, customer_number, 0}}; + ResultSet rs; + get_pool().execute(c, "SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKundenNr = ?", ps, rs); + if (!rs.empty() && !rs[0].empty()) { + int kKunde = std::stoi(rs[0][0].str); + int grp = defaults.kKundengruppe; + if (rs[0].size() > 1 && !rs[0][1].str.empty()) grp = std::stoi(rs[0][1].str); + return {kKunde, grp}; + } + return create_customer(c, customer_number, order.value("billingAddress", nlohmann::json::object()), defaults); +} + +inline std::string next_order_number(OdbcPool::Connection* c, const std::tm& date) { + return next_number_from_sequence(c, g_config.orderNumberSequence, date); +} + +inline void insert_order_address(OdbcPool::Connection* c, int kAuftrag, int kKunde, + const nlohmann::json& address, int nTyp) { + const nlohmann::json a = address.is_null() ? nlohmann::json::object() : address; + std::string iso = a.value("countryIso", "DE"); + std::transform(iso.begin(), iso.end(), iso.begin(), [](unsigned char ch) { return std::toupper(ch); }); + + const char* sql = + "INSERT INTO Verkauf.tAuftragAdresse" + " (kAuftrag, kKunde, cFirma, cAnrede, cTitel, cVorname, cName, cStrasse, cPLZ, cOrt, cLand," + " cTel, cZusatz, cAdressZusatz, cMobil, cMail, cFax, cBundesland, cISO, nTyp, nZolldokumenteErforderlich)" + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)"; + + std::vector ps = { + {ParamType::Int, "", kAuftrag}, + {ParamType::Int, "", kKunde}, + {ParamType::NVarChar, a.value("company", ""), 0}, + {ParamType::NVarChar, a.value("salutation", ""), 0}, + {ParamType::NVarChar, a.value("title", ""), 0}, + {ParamType::NVarChar, a.value("firstName", ""), 0}, + {ParamType::NVarChar, a.value("lastName", "-"), 0}, + {ParamType::NVarChar, a.value("street", "-"), 0}, + {ParamType::NVarChar, a.value("zipCode", ""), 0}, + {ParamType::NVarChar, a.value("city", "-"), 0}, + {ParamType::NVarChar, country_name(iso), 0}, + {ParamType::NVarChar, a.value("phone", ""), 0}, + {ParamType::NVarChar, a.value("extraAddressLine", ""), 0}, + {ParamType::NVarChar, a.value("addressAddition", ""), 0}, + {ParamType::NVarChar, a.value("mobile", ""), 0}, + {ParamType::NVarChar, a.value("email", ""), 0}, + {ParamType::NVarChar, a.value("fax", ""), 0}, + {ParamType::NVarChar, a.value("state", ""), 0}, + {ParamType::NVarChar, iso, 0}, + {ParamType::Int, "", nTyp} + }; + ResultSet rs; + get_pool().execute(c, sql, ps, rs); +} + +inline int insert_order_item(OdbcPool::Connection* c, int kAuftrag, const nlohmann::json& item) { + double vat = to_number(item["vat"], 19); + double quantity = to_number(item["quantity"], 1); + double price_gross = to_number(item["priceGross"], 0); + double price_net = to_number(item["priceNet"], price_gross / (1 + vat / 100)); + double discount = to_number(item["discountPercent"], 0); + int kSteuerklasse = steuerklasse_for_vat(vat); + std::string sku = item.value("sku", ""); + + int kArtikel = 0; + bool has_artikel = false; + if (!sku.empty()) { + std::vector ps = {{ParamType::NVarChar, sku, 0}}; + ResultSet rs; + get_pool().execute(c, "SELECT TOP 1 kArtikel FROM dbo.tArtikel WHERE cArtNr = ?", ps, rs); + if (!rs.empty() && !rs[0].empty()) { + kArtikel = std::stoi(rs[0][0].str); + has_artikel = true; + } + } + + const char* sql = + "DECLARE @t TABLE ([kAuftragPosition] INT);" + "INSERT INTO Verkauf.tAuftragPosition" + " (kArtikel, kAuftrag, cArtNr, nReserviert, cName, cHinweis, fAnzahl, fVkNetto, fMwSt," + " cNameStandard, kSteuerklasse, nType, cEinheit, fFaktor, kSteuerschluessel, fRabatt)" + " OUTPUT inserted.kAuftragPosition INTO @t" + " VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?," + " ?, ?, ?, ?, 1.0, 3, ?);" + "SELECT kAuftragPosition FROM @t"; + + Param cartnr{ParamType::NVarChar, has_artikel ? sku : std::string(), 0, 0.0, !has_artikel}; + + Param pk_art{ParamType::Int, "", kArtikel, 0.0, !has_artikel}; + + std::string name = item.value("name", sku.empty() ? std::string("Position") : sku); + std::vector ps = { + pk_art, + {ParamType::Int, "", kAuftrag}, + cartnr, + {ParamType::NVarChar, name, 0}, + {ParamType::NVarChar, item.value("note", ""), 0}, + {ParamType::Double, "", 0, quantity}, + {ParamType::Double, "", 0, price_net}, + {ParamType::Double, "", 0, vat}, + {ParamType::NVarChar, name, 0}, + {ParamType::Int, "", kSteuerklasse}, + {ParamType::Int, "", has_artikel ? 1 : 0}, + {ParamType::NVarChar, item.value("unit", ""), 0}, + {ParamType::Double, "", 0, discount} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs) || rs.empty() || rs[0].empty()) return 0; + return std::stoi(rs[0][0].str); +} + +inline int parse_pos_auftrag_id(const std::string& external_id) { + if (external_id.empty()) return 0; + try { return std::stoi(external_id); } catch (...) { return 0; } +} + +// PosOrderCreationService.CheckIfOrderExists — already-imported POS order. +inline std::optional> find_existing_pos_order( + OdbcPool::Connection* c, int kPosAuftrag) { + int kShopSubShop = get_active_shop_subshop_id(); + if (kPosAuftrag <= 0 || kShopSubShop <= 0) return std::nullopt; + + const char* sql = + "SELECT TOP 1 m.kAuftrag, a.cAuftragsNr FROM Pos.tAuftragMapping m " + "LEFT JOIN Verkauf.tAuftrag a ON a.kAuftrag = m.kAuftrag " + "WHERE m.kPosAuftrag = ? AND m.kShopSubShop = ? AND m.kAuftrag IS NOT NULL " + "ORDER BY m.kAuftrag DESC"; + + ResultSet rs; + std::vector ps = { + {ParamType::Int, "", kPosAuftrag}, + {ParamType::Int, "", kShopSubShop}, + }; + if (!get_pool().execute(c, sql, ps, rs) + || rs.empty() || rs[0].empty() || rs[0][0].type == CellType::Null) { + return std::nullopt; + } + + int kAuftrag = std::stoi(rs[0][0].str); + if (kAuftrag <= 0) return std::nullopt; + std::string order_number = rs[0].size() > 1 ? rs[0][1].str : ""; + return std::make_pair(kAuftrag, order_number); +} + +inline void upsert_pos_order_mapping(OdbcPool::Connection* c, int kAuftrag, int kPosAuftrag) { + int kShopSubShop = get_active_shop_subshop_id(); + if (kPosAuftrag <= 0 || kShopSubShop <= 0) return; + + const char* sql = + "MERGE INTO Pos.tAuftragMapping WITH (HOLDLOCK) AS Target " + "USING (SELECT ? AS kAuftrag, ? AS kPosAuftrag, ? AS kShopSubShop) AS Source " + "ON Target.kPosAuftrag = Source.kPosAuftrag AND Target.kShopSubShop = Source.kShopSubShop " + "WHEN MATCHED THEN UPDATE SET Target.kAuftrag = Source.kAuftrag " + "WHEN NOT MATCHED BY TARGET THEN " + "INSERT (kAuftrag, kPosAuftrag, kShopSubShop) " + "VALUES (Source.kAuftrag, Source.kPosAuftrag, Source.kShopSubShop)"; + + std::vector ps = { + {ParamType::Int, "", kAuftrag}, + {ParamType::Int, "", kPosAuftrag}, + {ParamType::Int, "", kShopSubShop} + }; + ResultSet rs; + get_pool().execute(c, sql, ps, rs); +} + +inline void insert_pos_order_position_mapping(OdbcPool::Connection* c, int kAuftragPosition, + const std::string& external_id) { + int kPosAuftragPosition = 0; + try { kPosAuftragPosition = std::stoi(external_id); } catch (...) { return; } + int kShopSubShop = get_active_shop_subshop_id(); + if (kAuftragPosition <= 0 || kPosAuftragPosition <= 0 || kShopSubShop <= 0) return; + + const char* sql = "INSERT INTO Pos.tAuftragPositionMapping (kAuftragPosition, kPosAuftragPosition, kShopSubShop) VALUES (?, ?, ?)"; + std::vector ps = { + {ParamType::Int, "", kAuftragPosition}, + {ParamType::Int, "", kPosAuftragPosition}, + {ParamType::Int, "", kShopSubShop} + }; + ResultSet rs; + get_pool().execute(c, sql, ps, rs); +} + +inline bool is_order_delivered(const nlohmann::json& order) { + auto it = order.find("settings"); + if (it != order.end() && !it->is_null()) { + auto del = it->find("deliver"); + if (del != it->end()) { + if (del->is_boolean()) return del->get(); + if (del->is_number()) return del->get() != 0; + if (del->is_string()) { + std::string s = *del; + std::transform(s.begin(), s.end(), s.begin(), [](unsigned char ch) { return std::tolower(ch); }); + return s == "true" || s == "1"; + } + return false; + } + } + return true; +} + +inline void insert_payment(OdbcPool::Connection* c, int kAuftrag, const nlohmann::json& payment, + const nlohmann::json& order, const std::tm& order_date_tm) { + std::string payment_name = payment.value("paymentMethodName", ""); + if (payment_name.empty()) payment_name = order.value("paymentMethodName", "Bar"); + nlohmann::json zahlungsart = resolve_zahlungsart(c, payment_name); + int kZahlung = allocate_pk(c, "tZahlung"); + + const char* sql = + "INSERT INTO dbo.tZahlung" + " (kZahlung, cName, dDatum, fBetrag, kBestellung, kBenutzer, nAnzahlung, cHinweis, kZahlungsart," + " nKeinExport, cExternalTransactionId, nZuweisungstyp, nZahlungstyp, cZuweisungsinfo, nZuweisungswertung)" + " VALUES (?, ?, ?, ?, ?, ?, 0, '', ?," + " 0, ?, 0, 0, '', 0)"; + + std::vector ps = { + {ParamType::Int, "", kZahlung}, + {ParamType::NVarChar, zahlungsart.value("cName", ""), 0}, + {ParamType::NVarChar, order_date_sql(order_date_tm), 0}, + {ParamType::Double, "", 0, to_number(payment["amount"], 0)}, + {ParamType::Int, "", kAuftrag}, + {ParamType::Int, "", g_config.kBenutzer}, + {ParamType::Int, "", json_int(zahlungsart, "kZahlungsart", 0)}, + {ParamType::NVarChar, order.value("externalOrderNumber", ""), 0} + }; + ResultSet rs; + get_pool().execute(c, sql, ps, rs); +} + +inline nlohmann::json create_order(const nlohmann::json& order) { + load_config(); + + auto guard = get_pool().checkout(); + if (!guard) throw std::runtime_error("no ODBC connection available"); + + auto* c = guard.get(); + + int kPosAuftrag = parse_pos_auftrag_id(order.value("externalId", "")); + if (kPosAuftrag > 0) { + if (auto existing = find_existing_pos_order(c, kPosAuftrag)) { + return { + {"orderId", std::to_string(existing->first)}, + {"orderNumber", existing->second} + }; + } + } + + const Defaults& defaults = get_defaults(c); + + if (!get_pool().begin(c)) throw std::runtime_error("failed to begin transaction"); + + try { + g_zahlungsart_cache.clear(); + + std::string creation_date = order.value("creationDate", ""); + std::tm order_date_tm = creation_date.empty() + ? []() { + std::tm tm{}; + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + localtime_r(&t, &tm); + return tm; + }() + : parse_order_date(creation_date); + + auto [kKunde, kKundengruppe] = resolve_customer(c, order, defaults); + nlohmann::json zahlungsart = resolve_zahlungsart(c, order.value("paymentMethodName", "Bar")); + std::string cAuftragsNr = next_order_number(c, order_date_tm); + + int active_shop = get_active_shop_id(); + + const char* insert_auftrag = + "DECLARE @t TABLE ([kAuftrag] INT);" + "INSERT INTO Verkauf.tAuftrag" + " (cAuftragsNr, dErstellt, nKomplettAusgeliefert, kBenutzer, kKunde, kBenutzerErstellt, nType, fFaktor," + " kFirmaHistory, kSprache, cVersandlandWaehrung, fVersandlandWaehrungFaktor, fFinanzierungskosten," + " cWaehrung, kPlattform, kShop, cKundenNr, cVersandlandISO, kVersandArt, kZahlungsart, kKundengruppe," + " cExterneAuftragsnummer)" + " OUTPUT inserted.kAuftrag INTO @t" + " VALUES (?, ?, 0, ?, ?, ?, 1, 1.0," + " ?, ?, ?, 1.0, 0.0," + " ?, ?, ?, ?, ?, ?, ?, ?," + " ?);" + "SELECT kAuftrag FROM @t"; + + std::string shipping_iso = order.value("shippingAddress", nlohmann::json::object()).value("countryIso", "DE"); + std::transform(shipping_iso.begin(), shipping_iso.end(), shipping_iso.begin(), + [](unsigned char ch) { return std::toupper(ch); }); + + std::string currency_iso = order.value("currencyIso", "EUR"); + std::vector ps = { + {ParamType::NVarChar, cAuftragsNr, 0}, + {ParamType::NVarChar, order_date_sql(order_date_tm), 0}, + {ParamType::Int, "", g_config.kBenutzer}, + {ParamType::Int, "", kKunde}, + {ParamType::Int, "", g_config.kBenutzer}, + {ParamType::Int, "", defaults.kFirmaHistory}, + {ParamType::Int, "", g_config.kSprache}, + {ParamType::NVarChar, currency_iso, 0}, + {ParamType::NVarChar, currency_iso, 0}, + {ParamType::Int, "", defaults.kPlattform}, + {ParamType::Int, "", active_shop == 0 ? -1 : active_shop}, + {ParamType::NVarChar, order.value("customerNumber", ""), 0}, + {ParamType::NVarChar, shipping_iso, 0}, + {ParamType::Int, "", defaults.kVersandArt}, + {ParamType::Int, "", json_int(zahlungsart, "kZahlungsart", 0)}, + {ParamType::Int, "", kKundengruppe}, + {ParamType::NVarChar, order.value("externalOrderNumber", ""), 0} + }; + if (active_shop == 0) { + ps[11] = Param::null_int(); + } + + ResultSet rs; + if (!get_pool().execute(c, insert_auftrag, ps, rs) || rs.empty() || rs[0].empty()) { + throw std::runtime_error("failed to insert Verkauf.tAuftrag"); + } + int kAuftrag = std::stoi(rs[0][0].str); + + upsert_pos_order_mapping(c, kAuftrag, kPosAuftrag); + insert_order_address(c, kAuftrag, kKunde, order.value("shippingAddress", nlohmann::json::object()), 0); + insert_order_address(c, kAuftrag, kKunde, order.value("billingAddress", nlohmann::json::object()), 1); + + std::vector delivered_items; + const nlohmann::json& items = order.contains("orderItems") ? order["orderItems"] : nlohmann::json::array(); + for (const auto& item : items) { + int kAuftragPosition = insert_order_item(c, kAuftrag, item); + insert_pos_order_position_mapping(c, kAuftragPosition, item.value("externalId", "")); + if (kAuftragPosition > 0) { + delivered_items.push_back({kAuftragPosition, to_number(item["quantity"], 1)}); + } + } + + const nlohmann::json& payments = order.contains("payments") ? order["payments"] : nlohmann::json::array(); + for (const auto& payment : payments) { + insert_payment(c, kAuftrag, payment, order, order_date_tm); + } + + if (is_order_delivered(order)) { + delivery::deliver_order(c, g_config.kBenutzer, kAuftrag, defaults.kVersandArt, delivered_items); + } + + const char* calc = + "DECLARE @auftrag_calc Verkauf.TYPE_spAuftragEckdatenBerechnen;" + "INSERT INTO @auftrag_calc VALUES (?);" + "EXEC Verkauf.spAuftragEckdatenBerechnen @auftrag = @auftrag_calc"; + std::vector ps_calc = {{ParamType::Int, "", kAuftrag}}; + get_pool().execute(c, calc, ps_calc, rs); + + if (!get_pool().commit(c)) throw std::runtime_error("failed to commit transaction"); + + return { {"orderId", std::to_string(kAuftrag)}, {"orderNumber", cAuftragsNr} }; + } catch (const std::exception&) { + try { get_pool().rollback(c); } catch (...) {} + throw; + } +} + +} // namespace order diff --git a/jtlsrv-cpp/src/queries/customer_groups.hpp b/jtlsrv-cpp/src/queries/customer_groups.hpp index bdbbd58..e8aa9eb 100644 --- a/jtlsrv-cpp/src/queries/customer_groups.hpp +++ b/jtlsrv-cpp/src/queries/customer_groups.hpp @@ -1,5 +1,6 @@ #pragma once #include "../db/pool.hpp" +#include "../log.hpp" #include "nlohmann/json.hpp" static const char* CUSTOMER_GROUP_IDS_SQL = @@ -16,13 +17,20 @@ static const char* CUSTOMER_GROUP_COUNT_SQL = "WHERE CONVERT(BIGINT, bRowversion) > ?"; inline std::vector get_customer_group_ids() { + static std::vector cached; + static bool loaded = false; + if (loaded) return cached; + ResultSet rs; - get_pool().execute(CUSTOMER_GROUP_IDS_SQL, rs); - std::vector ids; - for (auto& row : rs) { - ids.push_back(std::stoll(row[0].str)); + if (!get_pool().execute(CUSTOMER_GROUP_IDS_SQL, rs)) { + logc::warn("failed to load customer group ids"); + return {}; } - return ids; + for (auto& row : rs) { + cached.push_back(std::stoll(row[0].str)); + } + loaded = true; + return cached; } inline nlohmann::json get_customer_group_list(int64_t cursor = 0) { diff --git a/jtlsrv-cpp/src/queries/deliver.hpp b/jtlsrv-cpp/src/queries/deliver.hpp new file mode 100644 index 0000000..a57b86f --- /dev/null +++ b/jtlsrv-cpp/src/queries/deliver.hpp @@ -0,0 +1,42 @@ +#pragma once +#include +#include "xml.hpp" +#include "../db/pool.hpp" + +namespace delivery { + +inline void deliver_picklists(OdbcPool::Connection* c, int kBenutzer, int kSessionId, + int kAuftrag, int kVersandArt) { + std::string pakete = xml::element("Paket", + xml::tag("kBestellung", int64_t(kAuftrag)) + + xml::tag("kVersandart", int64_t(kVersandArt)) + + xml::tag("fGewicht", 0.0)); + + const int AUSLIEFERN_OPTIONS = 0x002; + + const char* sql = + "DECLARE @xHinweise XML = NULL;" + "DECLARE @xPakete XML = CONVERT(XML, ?);" + "DECLARE @xResult XML;" + "EXEC Auslieferung.spPicklistenAusliefern" + " @xHinweise = @xHinweise," + " @Pakete = @xPakete," + " @nOptions = ?," + " @kBenutzer = ?," + " @kSessionId = ?," + " @xResult = @xResult OUTPUT;" + "SELECT @xResult AS xResult"; + + std::vector ps = { + {ParamType::NVarChar, pakete, 0}, + {ParamType::Int, "", AUSLIEFERN_OPTIONS}, + {ParamType::Int, "", kBenutzer}, + {ParamType::Int, "", kSessionId} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs)) { + throw std::runtime_error("deliver_picklists failed"); + } +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/delivery.hpp b/jtlsrv-cpp/src/queries/delivery.hpp new file mode 100644 index 0000000..346c4fc --- /dev/null +++ b/jtlsrv-cpp/src/queries/delivery.hpp @@ -0,0 +1,33 @@ +#pragma once +#include "xml.hpp" +#include "session.hpp" +#include "warehouse.hpp" +#include "reserve.hpp" +#include "commit.hpp" +#include "deliver.hpp" +#include "../db/pool.hpp" + +namespace delivery { + +inline void deliver_order(OdbcPool::Connection* c, int kBenutzer, int kAuftrag, + int kVersandArt, const std::vector& items) { + if (items.empty()) return; + + int kWarenLager = resolve_outgoing_warehouse(c); + int kSessionId = open_session(c, kBenutzer); + + try { + reserve_positions(c, kBenutzer, kSessionId, kWarenLager, items); + commit_picklists(c, kBenutzer, kSessionId, kAuftrag); + deliver_picklists(c, kBenutzer, kSessionId, kAuftrag, kVersandArt); + } catch (...) { + try { discard_session(c, kBenutzer, kSessionId); } catch (...) {} + try { close_session(c, kSessionId); } catch (...) {} + throw; + } + + try { discard_session(c, kBenutzer, kSessionId); } catch (...) {} + try { close_session(c, kSessionId); } catch (...) {} +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/product_list.hpp b/jtlsrv-cpp/src/queries/product_list.hpp index d34feb8..57ad174 100644 --- a/jtlsrv-cpp/src/queries/product_list.hpp +++ b/jtlsrv-cpp/src/queries/product_list.hpp @@ -1,4 +1,5 @@ #pragma once +#include "../log.hpp" #include "../db/pool.hpp" #include "nlohmann/json.hpp" #include "shop.hpp" @@ -41,13 +42,6 @@ static const char* PRODUCT_LIST_SQL = "OR (ir.maxImageRV IS NOT NULL AND ir.maxImageRV > ?)) " "ORDER BY lastChanged ASC"; -static const char* PRICE_OVERRIDES_SQL = - "SELECT p.kArtikel AS articleId, p.kKundenGruppe AS customerGroupId, " - "MIN(pd.fNettoPreis) AS netPrice FROM dbo.tPreis p " - "INNER JOIN dbo.tPreisDetail pd ON pd.kPreis = p.kPreis " - "WHERE p.kArtikel IN (%s) AND p.kShop = 0 AND pd.nAnzahlAb = 0 " - "GROUP BY p.kArtikel, p.kKundenGruppe"; - static std::string gross_price(const std::string& net, const std::string& tax) { double n = std::stod(net.empty() ? "0" : net); double t = std::stod(tax.empty() ? "0" : tax); @@ -72,7 +66,11 @@ inline nlohmann::json get_product_list(int64_t cursor, int limit) { {ParamType::BigInt,"",cursor} }; ResultSet rs; - get_pool().execute(PRODUCT_LIST_SQL, ps, rs); + if (!get_pool().execute(PRODUCT_LIST_SQL, ps, rs)) { + logc::warn("product list query failed (cursor=%lld limit=%d shop=%d)", + (long long)cursor, limit, shop); + return nlohmann::json::array(); + } auto cg_ids = get_customer_group_ids(); nlohmann::json result = nlohmann::json::array(); diff --git a/jtlsrv-cpp/src/queries/reserve.hpp b/jtlsrv-cpp/src/queries/reserve.hpp new file mode 100644 index 0000000..ac2ac11 --- /dev/null +++ b/jtlsrv-cpp/src/queries/reserve.hpp @@ -0,0 +1,57 @@ +#pragma once +#include +#include +#include "xml.hpp" +#include "../db/pool.hpp" + +namespace delivery { + +struct DeliveredItem { + int kAuftragPosition; + double quantity; +}; + +inline void reserve_positions(OdbcPool::Connection* c, int kBenutzer, int kSessionId, + int kWarenLager, const std::vector& items) { + if (items.empty()) return; + + std::string bestellpositionen; + for (const auto& it : items) { + bestellpositionen += xml::element("Bestellposition", + xml::tag("kBestellPos", int64_t(it.kAuftragPosition)) + + xml::tag("fAnzahl", it.quantity)); + } + + std::string laeger = xml::element("Lager", + xml::tag("kWarenlager", int64_t(kWarenLager)) + + xml::tag("nPrio", int64_t(0)) + + xml::tag("kLieferant", int64_t(0)) + + xml::tag("kAnsprechpartner", int64_t(0))); + + const int RESERVIERE_OPTIONS = 0x102; + + const char* sql = + "DECLARE @xBestellpositionen XML = CONVERT(XML, ?);" + "DECLARE @xLaeger XML = CONVERT(XML, ?);" + "EXEC Auslieferung.spReserviereBestellpositionen" + " @Bestellpositionen = @xBestellpositionen," + " @Laeger = @xLaeger," + " @Warenlagereingaenge = NULL," + " @nOptions = ?," + " @kBenutzer = ?," + " @kSessionId = ?"; + + std::vector ps = { + {ParamType::NVarChar, bestellpositionen, 0}, + {ParamType::NVarChar, laeger, 0}, + {ParamType::Int, "", RESERVIERE_OPTIONS}, + {ParamType::Int, "", kBenutzer}, + {ParamType::Int, "", kSessionId} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs)) { + throw std::runtime_error("reserve_positions failed"); + } +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/session.hpp b/jtlsrv-cpp/src/queries/session.hpp new file mode 100644 index 0000000..764d64b --- /dev/null +++ b/jtlsrv-cpp/src/queries/session.hpp @@ -0,0 +1,42 @@ +#pragma once +#include +#include "../db/pool.hpp" + +namespace delivery { + +inline int open_session(OdbcPool::Connection* c, int kBenutzer, + const std::string& hostname = "jtlsrv") { + const char* sql = + "DECLARE @t TABLE ([kSessionId] INT);" + "INSERT INTO dbo.tSessionId (cRechnername, kBenutzer, dLastAction)" + " OUTPUT inserted.kSessionId INTO @t" + " VALUES (?, ?, DATEADD(day, 10, GETDATE()));" + "SELECT kSessionId FROM @t;"; + + std::vector ps = { + {ParamType::NVarChar, hostname, 0}, + {ParamType::Int, "", kBenutzer} + }; + ResultSet rs; + if (!get_pool().execute(c, sql, ps, rs) || rs.empty() || rs[0].empty()) { + throw std::runtime_error("failed to open delivery session"); + } + return std::stoi(rs[0][0].str); +} + +inline void discard_session(OdbcPool::Connection* c, int kBenutzer, int kSessionId) { + std::vector ps = { + {ParamType::Int, "", kBenutzer}, + {ParamType::Int, "", kSessionId} + }; + ResultSet rs; + get_pool().execute(c, "{CALL Auslieferung.spPicklistenVerwerfen(?, ?)}", ps, rs); +} + +inline void close_session(OdbcPool::Connection* c, int kSessionId) { + std::vector ps = {{ParamType::Int, "", kSessionId}}; + ResultSet rs; + get_pool().execute(c, "DELETE FROM dbo.tSessionId WHERE kSessionId = ?", ps, rs); +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/shop.cpp b/jtlsrv-cpp/src/queries/shop.cpp new file mode 100644 index 0000000..15668fb --- /dev/null +++ b/jtlsrv-cpp/src/queries/shop.cpp @@ -0,0 +1,28 @@ +#include "shop.hpp" +#include "../log.hpp" +#include + +int g_active_shop_id = 0; +int g_active_shop_subshop_id = 0; + +static int cell_to_int(const Cell& cell) { + if (cell.type == CellType::Int64) return static_cast(cell.i64); + if (cell.type == CellType::String && !cell.str.empty()) return std::stoi(cell.str); + return 0; +} + +bool fetch_active_shop() { + ResultSet rs; + if (!get_pool().execute( + "SELECT TOP 1 kShop, kShopSubshop FROM dbo.tShopSubshop " + "WHERE nGesperrt = 0 ORDER BY kShop", + rs) || rs.empty()) { + logc::warn("failed to load active shop from dbo.tShopSubshop"); + return false; + } + + g_active_shop_id = cell_to_int(rs[0][0]); + g_active_shop_subshop_id = rs[0].size() > 1 ? cell_to_int(rs[0][1]) : 0; + logc::info("Active shop: kShop=%d kShopSubshop=%d", g_active_shop_id, g_active_shop_subshop_id); + return g_active_shop_id > 0; +} diff --git a/jtlsrv-cpp/src/queries/shop.hpp b/jtlsrv-cpp/src/queries/shop.hpp index b5d8b10..b2cfa6d 100644 --- a/jtlsrv-cpp/src/queries/shop.hpp +++ b/jtlsrv-cpp/src/queries/shop.hpp @@ -1,21 +1,10 @@ #pragma once #include "../db/pool.hpp" -#include "../config.hpp" -static int g_active_shop_id = 0; -static int g_active_shop_subshop_id = 0; +extern int g_active_shop_id; +extern int g_active_shop_subshop_id; inline int get_active_shop_id() { return g_active_shop_id; } inline int get_active_shop_subshop_id() { return g_active_shop_subshop_id; } -inline bool fetch_active_shop() { - ResultSet rs; - if (!get_pool().execute( - "SELECT TOP 1 kShop, kShopSubshop FROM dbo.tShopSubshop " - "WHERE nGesperrt = 0 ORDER BY kShop", rs) || rs.empty()) { - return false; - } - g_active_shop_id = std::stoi(rs[0][0].str); - g_active_shop_subshop_id = rs[0].size() > 1 ? std::stoi(rs[0][1].str) : 0; - return true; -} +bool fetch_active_shop(); diff --git a/jtlsrv-cpp/src/queries/warehouse.hpp b/jtlsrv-cpp/src/queries/warehouse.hpp new file mode 100644 index 0000000..12fca9f --- /dev/null +++ b/jtlsrv-cpp/src/queries/warehouse.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "../db/pool.hpp" +#include "../config.hpp" + +namespace delivery { + +inline int resolve_outgoing_warehouse(OdbcPool::Connection* c) { + int configured = config::get_int("JTL_KWARENLAGER", 0); + if (configured > 0) return configured; + + ResultSet rs; + if (!get_pool().execute(c, + "SELECT TOP 1 kWarenLager FROM dbo.tWarenLager " + "WHERE nFulfillment = 0 AND ISNULL(nAktiv, 1) = 1 " + "ORDER BY nAuslieferungsPrio, kWarenLager", rs) || rs.empty() || rs[0].empty()) { + throw std::runtime_error("No local warehouse (dbo.tWarenLager.nFulfillment = 0) found; set JTL_KWARENLAGER explicitly."); + } + return std::stoi(rs[0][0].str); +} + +} // namespace delivery diff --git a/jtlsrv-cpp/src/queries/xml.hpp b/jtlsrv-cpp/src/queries/xml.hpp new file mode 100644 index 0000000..e644e59 --- /dev/null +++ b/jtlsrv-cpp/src/queries/xml.hpp @@ -0,0 +1,40 @@ +#pragma once +#include + +namespace xml { + +inline std::string escape(const std::string& s) { + std::string r; + r.reserve(s.size()); + for (char c : s) { + switch (c) { + case '<': r += "<"; break; + case '>': r += ">"; break; + case '&': r += "&"; break; + case '\'': r += "'"; break; + case '"': r += """; break; + default: r += c; break; + } + } + return r; +} + +inline std::string tag(const std::string& name, const std::string& value) { + return "<" + name + ">" + escape(value) + ""; +} + +inline std::string tag(const std::string& name, int64_t value) { + return "<" + name + ">" + std::to_string(value) + ""; +} + +inline std::string tag(const std::string& name, double value) { + char buf[32]; + std::snprintf(buf, sizeof(buf), "%.6f", value); + return "<" + name + ">" + buf + ""; +} + +inline std::string element(const std::string& name, const std::string& children) { + return "<" + name + ">" + children + ""; +} + +} // namespace xml diff --git a/jtlsrv-cpp/src/tls_server.cpp b/jtlsrv-cpp/src/tls_server.cpp index c6be699..9ac1a16 100644 --- a/jtlsrv-cpp/src/tls_server.cpp +++ b/jtlsrv-cpp/src/tls_server.cpp @@ -340,6 +340,7 @@ static void tls_server_shutdown() { uv_close(reinterpret_cast(&g_sigint), nullptr); uv_close(reinterpret_cast(&g_sigterm), nullptr); uv_close(reinterpret_cast(&g_server), nullptr); + uv_stop(g_loop); } void tls_server_install_signals(uv_loop_t* loop) { diff --git a/jtlsrv-cpp/static-libs/intl_stub.c b/jtlsrv-cpp/static-libs/intl_stub.c new file mode 100644 index 0000000..3098aee --- /dev/null +++ b/jtlsrv-cpp/static-libs/intl_stub.c @@ -0,0 +1,10 @@ +// No-op stubs when libintl.a is unavailable (gettext NLS not needed for image resize). +const char* libintl_bindtextdomain(const char* domain, const char* dir) { + (void)dir; + return domain; +} + +const char* libintl_bind_textdomain_codeset(const char* domain, const char* codeset) { + (void)codeset; + return domain; +} diff --git a/src/endpoints/init.js b/src/endpoints/init.js index f75da26..ae00f34 100644 --- a/src/endpoints/init.js +++ b/src/endpoints/init.js @@ -1,6 +1,6 @@ import { sendJson } from '../http.js'; -import { getMaxExternalId } from '../order-log.js'; import { getCategoryCount } from '../queries/category-count.js'; +import { getMaxOrderIdCount } from '../queries/max-order-id.js'; import { getCompositeProductCount } from '../queries/composite-product-count.js'; import { getCustomerGroupCount } from '../queries/customer-groups.js'; import { getDeletedEntityCount } from '../queries/deleted-entity-count.js'; @@ -16,12 +16,13 @@ export async function handle(_req, res, { url }) { const compositeProductCursor = Number(url.searchParams.get('lastChangedCompositeProduct')) || 0; const deletedEntityCursor = Number(url.searchParams.get('lastChangedDeletedEntity')) || 0; - const [productCount, categoryCount, customerGroupCount, compositeProductCount, deletedEntityCount] = await Promise.all([ + const [productCount, categoryCount, customerGroupCount, compositeProductCount, deletedEntityCount, maxOrderIdCount] = await Promise.all([ getProductCount({ cursor: productCursor }), getCategoryCount({ cursor: categoryCursor }), getCustomerGroupCount({ cursor: customerGroupCursor }), getCompositeProductCount({ cursor: compositeProductCursor }), getDeletedEntityCount({ cursor: deletedEntityCursor }), + getMaxOrderIdCount(), ]); return sendJson(res, 200, { @@ -34,6 +35,6 @@ export async function handle(_req, res, { url }) { configurationGroup_count: '0', configurationItem_count: '0', deletedEntity_count: String(deletedEntityCount), - max_orderId_count: getMaxExternalId(), + max_orderId_count: String(maxOrderIdCount), }); } diff --git a/src/order-log.js b/src/order-log.js index aaafc12..d48d8cb 100644 --- a/src/order-log.js +++ b/src/order-log.js @@ -7,20 +7,13 @@ fs.mkdirSync(path.dirname(ORDER_LOG_FILE), { recursive: true }); const stream = fs.createWriteStream(ORDER_LOG_FILE, { flags: 'a' }); let orderSequence = 0; -let maxExternalId = 0; export function logOrder(order) { orderSequence += 1; - maxExternalId += 1; + const externalId = order?.externalId ?? ''; - const line = `${new Date().toISOString()} #${orderSequence} externalId=${maxExternalId} ${JSON.stringify(order)}\n`; + const line = `${new Date().toISOString()} #${orderSequence} externalId=${externalId} ${JSON.stringify(order)}\n`; stream.write(line); - - return maxExternalId; -} - -export function getMaxExternalId() { - return String(maxExternalId); } export function closeOrderLog() { diff --git a/src/queries/create-order.js b/src/queries/create-order.js index 93987a2..32aa008 100644 --- a/src/queries/create-order.js +++ b/src/queries/create-order.js @@ -182,7 +182,7 @@ async function nextCustomerNumber(transaction) { * the search tables). Columns of the table type are named explicitly because * their order differs between JTL versions. */ -async function createCustomer(transaction, { customerNumber, address, isPosCustomer, defaults }) { +async function createCustomer(transaction, { customerNumber, address, defaults }) { const a = address || {}; const iso = (a.countryIso || 'DE').toUpperCase(); const kKundengruppe = Number(a.customerGroupId) || defaults.kKundengruppe; @@ -209,8 +209,8 @@ async function createCustomer(transaction, { customerNumber, address, isPosCusto .input('kSprache', sql.Int, config.kSprache) .input('cISO', sql.NVarChar, iso) .input('cBundesland', sql.NVarChar, a.state || '') - .input('cHerkunft', sql.NVarChar, isPosCustomer ? 'Kasse' : 'POS-API') - .input('cKassenKunde', sql.Char(1), isPosCustomer ? 'Y' : 'N') + .input('cHerkunft', sql.NVarChar, 'Kasse') + .input('cKassenKunde', sql.Char(1), 'Y') .input('nDebitorennr', sql.Int, Number(a.debtorNumber) || 0) .query(` DECLARE @returnValue INT; @@ -240,46 +240,55 @@ async function createCustomer(transaction, { customerNumber, address, isPosCusto return { kKunde, kKundengruppe }; } +function isWalkInOrder(order) { + const customerNumber = String(order.customerNumber || '').trim(); + if (!customerNumber || customerNumber === '0') return true; + + const billing = order.billingAddress || {}; + return (billing.lastName || '') === 'Laufkunde' && !(billing.firstName || '').trim(); +} + +async function lookupKassenkunde(transaction, defaults) { + const result = await new sql.Request(transaction).query( + "SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKassenKunde = 'Y' ORDER BY kKunde" + ); + if (result.recordset[0]) { + return { + kKunde: result.recordset[0].kKunde, + kKundengruppe: result.recordset[0].kKundenGruppe || defaults.kKundengruppe, + }; + } + return null; +} + /** * Resolves the customer by cKundenNr; creates the Kunde on the fly when it - * does not exist. Orders without a customer number use (or create) the - * Kassenkunde (walk-in customer). + * does not exist. Walk-in orders use (or create) the Kassenkunde. */ async function resolveCustomer(transaction, order, defaults) { - const customerNumber = String(order.customerNumber || '').trim(); - - if (customerNumber) { - const result = await new sql.Request(transaction) - .input('cKundenNr', sql.NVarChar, customerNumber) - .query('SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKundenNr = @cKundenNr'); - if (result.recordset[0]) { - return { - kKunde: result.recordset[0].kKunde, - kKundengruppe: result.recordset[0].kKundenGruppe || defaults.kKundengruppe, - }; - } + if (isWalkInOrder(order)) { + const kassenKunde = await lookupKassenkunde(transaction, defaults); + if (kassenKunde) return kassenKunde; return createCustomer(transaction, { - customerNumber, + customerNumber: await nextCustomerNumber(transaction), address: order.billingAddress, - isPosCustomer: false, defaults, }); } - const kassenKunde = await new sql.Request(transaction).query( - "SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKassenKunde = 'Y' ORDER BY kKunde" - ); - if (kassenKunde.recordset[0]) { + const customerNumber = String(order.customerNumber || '').trim(); + const result = await new sql.Request(transaction) + .input('cKundenNr', sql.NVarChar, customerNumber) + .query('SELECT TOP 1 kKunde, kKundenGruppe FROM dbo.tKunde WHERE cKundenNr = @cKundenNr'); + if (result.recordset[0]) { return { - kKunde: kassenKunde.recordset[0].kKunde, - kKundengruppe: kassenKunde.recordset[0].kKundenGruppe || defaults.kKundengruppe, + kKunde: result.recordset[0].kKunde, + kKundengruppe: result.recordset[0].kKundenGruppe || defaults.kKundengruppe, }; } - return createCustomer(transaction, { - customerNumber: await nextCustomerNumber(transaction), + customerNumber, address: order.billingAddress, - isPosCustomer: true, defaults, }); } @@ -364,11 +373,41 @@ async function insertOrderItem(transaction, kAuftrag, item) { } /** - * Links a JTL-Wawi order (and its positions) back to the originating - * POS order/position ids via Pos.tAuftragMapping / Pos.tAuftragPositionMapping, - * so the POS system can recognise orders it already pushed into JTL-Wawi. + * JTL PosOrderCreationService.CheckIfOrderExists — skip re-import when the POS + * order id is already mapped to a Wawi order for this subshop. */ -async function insertPosOrderMapping(transaction, kAuftrag, kPosAuftrag) { +async function findExistingPosOrderMapping(kPosAuftrag) { + const kShopSubShop = getActiveShopSubshopId(); + if (!Number.isInteger(kPosAuftrag) || !kShopSubShop) { + return null; + } + + const result = await getPool() + .request() + .input('kPosAuftrag', sql.Int, kPosAuftrag) + .input('kShopSubShop', sql.Int, kShopSubShop) + .query(` + SELECT TOP 1 m.kAuftrag, a.cAuftragsNr + FROM Pos.tAuftragMapping m + LEFT JOIN Verkauf.tAuftrag a ON a.kAuftrag = m.kAuftrag + WHERE m.kPosAuftrag = @kPosAuftrag + AND m.kShopSubShop = @kShopSubShop + AND m.kAuftrag IS NOT NULL + ORDER BY m.kAuftrag DESC + `); + + const row = result.recordset[0]; + if (!row?.kAuftrag) { + return null; + } + return row; +} + +/** + * Links a JTL-Wawi order back to the originating POS order id. + * MERGE matches JTL CreateOrUpdate outcome for the final committed row. + */ +async function upsertPosOrderMapping(transaction, kAuftrag, kPosAuftrag) { const kShopSubShop = getActiveShopSubshopId(); if (!Number.isInteger(kPosAuftrag) || !kShopSubShop) { return; @@ -378,8 +417,15 @@ async function insertPosOrderMapping(transaction, kAuftrag, kPosAuftrag) { .input('kPosAuftrag', sql.Int, kPosAuftrag) .input('kShopSubShop', sql.Int, kShopSubShop) .query(` - INSERT INTO Pos.tAuftragMapping (kAuftrag, kPosAuftrag, kShopSubShop) - VALUES (@kAuftrag, @kPosAuftrag, @kShopSubShop) + MERGE INTO Pos.tAuftragMapping WITH (HOLDLOCK) AS Target + USING (SELECT @kAuftrag AS kAuftrag, @kPosAuftrag AS kPosAuftrag, @kShopSubShop AS kShopSubShop) AS Source + ON Target.kPosAuftrag = Source.kPosAuftrag + AND Target.kShopSubShop = Source.kShopSubShop + WHEN MATCHED THEN + UPDATE SET Target.kAuftrag = Source.kAuftrag + WHEN NOT MATCHED BY TARGET THEN + INSERT (kAuftrag, kPosAuftrag, kShopSubShop) + VALUES (Source.kAuftrag, Source.kPosAuftrag, Source.kShopSubShop); `); } @@ -441,6 +487,17 @@ async function insertPayment(transaction, kAuftrag, payment, order, orderDate, z } export async function createOrder(order) { + const kPosAuftrag = Number.parseInt(order.externalId, 10); + if (Number.isInteger(kPosAuftrag) && kPosAuftrag > 0) { + const existing = await findExistingPosOrderMapping(kPosAuftrag); + if (existing) { + return { + orderId: String(existing.kAuftrag), + orderNumber: existing.cAuftragsNr || '', + }; + } + } + const defaults = await getDefaults(); const transaction = new sql.Transaction(getPool()); await transaction.begin(sql.ISOLATION_LEVEL.READ_COMMITTED); @@ -490,7 +547,7 @@ export async function createOrder(order) { const kAuftrag = resultAuftrag.recordset[0].kAuftrag; const kPosAuftrag = Number.parseInt(order.externalId, 10); - await insertPosOrderMapping(transaction, kAuftrag, kPosAuftrag); + await upsertPosOrderMapping(transaction, kAuftrag, kPosAuftrag); await insertOrderAddress(transaction, kAuftrag, kKunde, order.shippingAddress, 0); await insertOrderAddress(transaction, kAuftrag, kKunde, order.billingAddress, 1); diff --git a/src/queries/max-order-id.js b/src/queries/max-order-id.js new file mode 100644 index 0000000..e0ce660 --- /dev/null +++ b/src/queries/max-order-id.js @@ -0,0 +1,23 @@ +import sql from 'mssql'; +import { getPool } from '../db.js'; +import { getActiveShopSubshopId } from '../shop.js'; + +const MAX_ORDER_ID_SQL = ` +SELECT ISNULL(MAX(kPosAuftrag), 0) AS MaxOrderId +FROM Pos.tAuftragMapping +WHERE kShopSubShop = @kShopSubShop; +`; + +export async function getMaxOrderIdCount() { + const kShopSubShop = getActiveShopSubshopId(); + if (!kShopSubShop) { + return 0; + } + + const result = await getPool() + .request() + .input('kShopSubShop', sql.Int, kShopSubShop) + .query(MAX_ORDER_ID_SQL); + + return result.recordset[0]?.MaxOrderId ?? 0; +}