| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622 |
- /*
- * OpenSlide, a library for reading whole slide image files
- *
- * Copyright (c) 2007-2014 Carnegie Mellon University
- * Copyright (c) 2021 Benjamin Gilbert
- * All rights reserved.
- *
- * OpenSlide 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, version 2.1.
- *
- * OpenSlide 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 OpenSlide. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
- /**
- * @file openslide.h
- * The API for the OpenSlide library.
- *
- * All functions except openslide_close() are thread-safe.
- * See the openslide_close() documentation for its restrictions.
- */
- #ifndef OPENSLIDE_OPENSLIDE_H_
- #define OPENSLIDE_OPENSLIDE_H_
- #include "openslide-features.h"
- #include <stddef.h>
- #include <stdint.h>
- #include <stdbool.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * The main OpenSlide type.
- *
- * An @ref openslide_t object can be used concurrently from multiple threads
- * without locking. (But you must lock or otherwise use memory barriers
- * when passing the object between threads.)
- */
- typedef struct _openslide openslide_t;
- /**
- * An OpenSlide tile cache.
- *
- * An @ref openslide_cache_t object can be used concurrently from multiple
- * threads without locking. (But you must lock or otherwise use memory
- * barriers when passing the object between threads.)
- */
- typedef struct _openslide_cache openslide_cache_t;
- /**
- * @name Basic Usage
- * Opening, reading, and closing whole slide images.
- */
- //@{
- /**
- * Quickly determine whether a whole slide image is recognized.
- *
- * If OpenSlide recognizes the file referenced by @p filename, return a
- * string identifying the slide format vendor. This is equivalent to the
- * value of the #OPENSLIDE_PROPERTY_NAME_VENDOR property. Calling
- * openslide_open() on this file will return a valid OpenSlide object or
- * an OpenSlide object in error state.
- *
- * Otherwise, return NULL. Calling openslide_open() on this file will also
- * return NULL.
- *
- * @param filename The filename to check. On Windows, this must be in UTF-8.
- * @return An identification of the format vendor for this file, or NULL.
- * @since 3.4.0
- */
- OPENSLIDE_PUBLIC()
- const char *openslide_detect_vendor(const char *filename);
- /**
- * Open a whole slide image.
- *
- * This function can be expensive; avoid calling it unnecessarily. For
- * example, a tile server should not call openslide_open() on every tile
- * request. Instead, it should maintain a cache of OpenSlide objects and
- * reuse them when possible.
- *
- * @param filename The filename to open. On Windows, this must be in UTF-8.
- * @return
- * On success, a new OpenSlide object.
- * If the file is not recognized by OpenSlide, NULL.
- * If the file is recognized but an error occurred, an OpenSlide
- * object in error state.
- */
- OPENSLIDE_PUBLIC()
- openslide_t *openslide_open(const char *filename);
- /**
- * Get the number of levels in the whole slide image.
- *
- * @param osr The OpenSlide object.
- * @return The number of levels, or -1 if an error occurred.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- int32_t openslide_get_level_count(openslide_t *osr);
- /**
- * Get the dimensions of level 0 (the largest level). Exactly
- * equivalent to calling openslide_get_level_dimensions(osr, 0, w, h).
- *
- * @param osr The OpenSlide object.
- * @param[out] w The width of the image, or -1 if an error occurred.
- * @param[out] h The height of the image, or -1 if an error occurred.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- void openslide_get_level0_dimensions(openslide_t *osr, int64_t *w, int64_t *h);
- /**
- * Get the dimensions of a level.
- *
- * @param osr The OpenSlide object.
- * @param level The desired level.
- * @param[out] w The width of the image, or -1 if an error occurred
- * or the level was out of range.
- * @param[out] h The height of the image, or -1 if an error occurred
- * or the level was out of range.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- void openslide_get_level_dimensions(openslide_t *osr, int32_t level,
- int64_t *w, int64_t *h);
- /**
- * Get the downsampling factor of a given level.
- *
- * @param osr The OpenSlide object.
- * @param level The desired level.
- * @return The downsampling factor for this level, or -1.0 if an error occurred
- * or the level was out of range.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- double openslide_get_level_downsample(openslide_t *osr, int32_t level);
- /**
- * Get the best level to use for displaying the given downsample.
- *
- * @param osr The OpenSlide object.
- * @param downsample The downsample factor.
- * @return The level identifier, or -1 if an error occurred.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- int32_t openslide_get_best_level_for_downsample(openslide_t *osr,
- double downsample);
- /**
- * Copy pre-multiplied ARGB data from a whole slide image.
- *
- * This function reads and decompresses a region of a whole slide
- * image into the specified memory location. @p dest must be a valid
- * pointer to enough memory to hold the region, at least (@p w * @p h * 4)
- * bytes in length. If an error occurs or has occurred, then the memory
- * pointed to by @p dest will be cleared.
- *
- * The returned pixel data is in device color space. The slide's ICC color
- * profile, if available, can be read with openslide_read_icc_profile() and
- * used to transform the pixels for display.
- *
- * For more information about processing pre-multiplied pixel data, see
- * the [OpenSlide website](https://openslide.org/docs/premultiplied-argb/).
- *
- * @param osr The OpenSlide object.
- * @param dest The destination buffer for the ARGB data.
- * @param x The top left x-coordinate, in the level 0 reference frame.
- * @param y The top left y-coordinate, in the level 0 reference frame.
- * @param level The desired level.
- * @param w The width of the region. Must be non-negative.
- * @param h The height of the region. Must be non-negative.
- */
- OPENSLIDE_PUBLIC()
- void openslide_read_region(openslide_t *osr,
- uint32_t *dest,
- int64_t x, int64_t y,
- int32_t level,
- int64_t w, int64_t h);
- /**
- * Get the size in bytes of the ICC color profile for the whole slide image.
- *
- * @param osr The OpenSlide object.
- * @return -1 on error, 0 if no profile is available, otherwise the profile
- * size in bytes.
- */
- OPENSLIDE_PUBLIC()
- int64_t openslide_get_icc_profile_size(openslide_t *osr);
- /**
- * Copy the ICC color profile from a whole slide image.
- *
- * This function reads the ICC color profile from the slide into the specified
- * memory location. @p dest must be a valid pointer to enough memory
- * to hold the profile. Get the profile size with
- * openslide_get_icc_profile_size().
- *
- * If an error occurs or has occurred, then the memory pointed to by @p dest
- * will be cleared.
- *
- * @param osr The OpenSlide object.
- * @param dest The destination buffer for the ICC color profile.
- */
- OPENSLIDE_PUBLIC()
- void openslide_read_icc_profile(openslide_t *osr, void *dest);
- /**
- * Close an OpenSlide object.
- * No other threads may be using the object.
- * After this function returns, the object cannot be used anymore.
- *
- * @param osr The OpenSlide object.
- */
- OPENSLIDE_PUBLIC()
- void openslide_close(openslide_t *osr);
- //@}
- /**
- * @name Error Handling
- * A simple mechanism for detecting errors.
- *
- * Sometimes an unrecoverable error can occur that will invalidate the
- * OpenSlide object. (This is typically something like an I/O error or
- * data corruption.) When such an error happens in an OpenSlide
- * object, the object will move terminally into an error state.
- *
- * While an object is in an error state, no OpenSlide functions will
- * have any effect on it except for openslide_close(). Functions
- * that are expected to return values will instead return an error
- * value, typically something like NULL or -1. openslide_read_region()
- * will clear its destination buffer instead of painting into
- * it. openslide_get_error() will return a non-NULL string containing
- * an error message. See the documentation for each function for
- * details on what is returned in case of error.
- *
- * This style of error handling allows programs written in C to check
- * for errors only when convenient, because the error state is
- * terminal and the OpenSlide functions return harmlessly when there
- * has been an error.
- *
- * If writing wrappers for OpenSlide in languages that support
- * exceptions, it is recommended that the error state be checked after
- * each call and converted into an exception for that language.
- */
- //@{
- /**
- * Get the current error string.
- *
- * For a given OpenSlide object, once this function returns a non-NULL
- * value, the only useful operation on the object is to call
- * openslide_close() to free its resources.
- *
- * @param osr The OpenSlide object.
- * @return A string describing the original error that caused
- * the problem, or NULL if no error has occurred.
- * @since 3.2.0
- *
- */
- OPENSLIDE_PUBLIC()
- const char *openslide_get_error(openslide_t *osr);
- //@}
- /**
- * @name Predefined Properties
- * Some predefined properties.
- */
- //@{
- /**
- * The name of the property containing a slide's background color, if any.
- * It is represented as an RGB hex triplet.
- *
- * @since 3.2.3
- */
- #define OPENSLIDE_PROPERTY_NAME_BACKGROUND_COLOR "openslide.background-color"
- /**
- * The name of the property containing the height of the rectangle bounding
- * the non-empty region of the slide, if available.
- *
- * @since 3.4.0
- */
- #define OPENSLIDE_PROPERTY_NAME_BOUNDS_HEIGHT "openslide.bounds-height"
- /**
- * The name of the property containing the width of the rectangle bounding
- * the non-empty region of the slide, if available.
- *
- * @since 3.4.0
- */
- #define OPENSLIDE_PROPERTY_NAME_BOUNDS_WIDTH "openslide.bounds-width"
- /**
- * The name of the property containing the X coordinate of the rectangle
- * bounding the non-empty region of the slide, if available.
- *
- * @since 3.4.0
- */
- #define OPENSLIDE_PROPERTY_NAME_BOUNDS_X "openslide.bounds-x"
- /**
- * The name of the property containing the Y coordinate of the rectangle
- * bounding the non-empty region of the slide, if available.
- *
- * @since 3.4.0
- */
- #define OPENSLIDE_PROPERTY_NAME_BOUNDS_Y "openslide.bounds-y"
- /**
- * The name of the property containing a slide's comment, if any.
- *
- * @since 3.0.0
- */
- #define OPENSLIDE_PROPERTY_NAME_COMMENT "openslide.comment"
- /**
- * The name of the property containing the size of a slide's ICC color profile,
- * if any.
- *
- * @since 4.0.0
- */
- #define OPENSLIDE_PROPERTY_NAME_ICC_SIZE "openslide.icc-size"
- /**
- * The name of the property containing the number of microns per pixel in
- * the X dimension of level 0, if known.
- *
- * @since 3.3.0
- */
- #define OPENSLIDE_PROPERTY_NAME_MPP_X "openslide.mpp-x"
- /**
- * The name of the property containing the number of microns per pixel in
- * the Y dimension of level 0, if known.
- *
- * @since 3.3.0
- */
- #define OPENSLIDE_PROPERTY_NAME_MPP_Y "openslide.mpp-y"
- /**
- * The name of the property containing a slide's objective power, if known.
- *
- * @since 3.3.0
- */
- #define OPENSLIDE_PROPERTY_NAME_OBJECTIVE_POWER "openslide.objective-power"
- /**
- * The name of the property containing the "quickhash-1" sum.
- *
- * @since 3.0.0
- */
- #define OPENSLIDE_PROPERTY_NAME_QUICKHASH1 "openslide.quickhash-1"
- /**
- * The name of the property containing an identification of the vendor.
- *
- * @since 3.0.0
- */
- #define OPENSLIDE_PROPERTY_NAME_VENDOR "openslide.vendor"
- //@}
- /**
- * @name Properties
- * Querying properties.
- *
- * Properties are string key-value pairs containing metadata about a whole
- * slide image. These functions allow listing the available properties and
- * obtaining their values.
- *
- * [Some properties](https://openslide.org/properties/) are officially
- * documented and are expected to be stable; others are undocumented but may
- * still be useful. Many properties are uninterpreted data gathered
- * directly from the slide files. New properties may be added in future
- * releases of OpenSlide.
- */
- //@{
- /**
- * Get the NULL-terminated array of property names.
- *
- * This function returns an array of strings naming properties available
- * in the whole slide image.
- *
- * @param osr The OpenSlide object.
- * @return A NULL-terminated string array of property names, or
- * an empty array if an error occurred.
- */
- OPENSLIDE_PUBLIC()
- const char * const *openslide_get_property_names(openslide_t *osr);
- /**
- * Get the value of a single property.
- *
- * This function returns the value of the property given by @p name.
- *
- * @param osr The OpenSlide object.
- * @param name The name of the desired property. Must be
- a valid name as given by openslide_get_property_names().
- * @return The value of the named property, or NULL if the property
- * doesn't exist or an error occurred.
- */
- OPENSLIDE_PUBLIC()
- const char *openslide_get_property_value(openslide_t *osr, const char *name);
- //@}
- /**
- * @name Associated Images
- * Reading associated images.
- *
- * Certain vendor-specific associated images may exist within a whole slide
- * image, such as label and thumbnail images. Each associated image has a
- * name, dimensions, and pixel data. These functions allow listing the
- * available associated images and reading their contents.
- */
- //@{
- /**
- * Get the NULL-terminated array of associated image names.
- *
- * This function returns an array of strings naming associated images
- * available in the whole slide image.
- *
- * @param osr The OpenSlide object.
- * @return A NULL-terminated string array of associated image names, or
- an empty array if an error occurred.
- */
- OPENSLIDE_PUBLIC()
- const char * const *openslide_get_associated_image_names(openslide_t *osr);
- /**
- * Get the dimensions of an associated image.
- *
- * This function returns the width and height of an associated image
- * associated with a whole slide image. Once the dimensions are known,
- * use openslide_read_associated_image() to read the image.
- *
- * @param osr The OpenSlide object.
- * @param name The name of the desired associated image. Must be
- * a valid name as given by openslide_get_associated_image_names().
- * @param[out] w The width of the associated image, or -1 if an error occurred.
- * @param[out] h The height of the associated image, or -1 if an error occurred.
- */
- OPENSLIDE_PUBLIC()
- void openslide_get_associated_image_dimensions(openslide_t *osr,
- const char *name,
- int64_t *w, int64_t *h);
- /**
- * Copy pre-multiplied ARGB data from an associated image.
- *
- * This function reads and decompresses an associated image associated
- * with a whole slide image. @p dest must be a valid pointer to enough
- * memory to hold the image, at least (width * height * 4) bytes in
- * length. Get the width and height with
- * openslide_get_associated_image_dimensions().
- *
- * If an error occurs or has occurred, then the memory pointed to by @p dest
- * will be cleared. In versions prior to 4.0.0, this function did nothing
- * if an error occurred.
- *
- * The returned pixel data is in device color space. The associated image's
- * ICC color profile, if available, can be read with
- * openslide_read_associated_image_icc_profile() and used to transform the
- * pixels for display.
- *
- * For more information about processing pre-multiplied pixel data, see
- * the [OpenSlide website](https://openslide.org/docs/premultiplied-argb/).
- *
- * @param osr The OpenSlide object.
- * @param name The name of the desired associated image. Must be
- * a valid name as given by openslide_get_associated_image_names().
- * @param dest The destination buffer for the ARGB data.
- */
- OPENSLIDE_PUBLIC()
- void openslide_read_associated_image(openslide_t *osr,
- const char *name,
- uint32_t *dest);
- /**
- * Get the size in bytes of the ICC color profile for an associated image.
- *
- * @param osr The OpenSlide object.
- * @param name The name of the desired associated image. Must be
- * a valid name as given by openslide_get_associated_image_names().
- * @return -1 on error, 0 if no profile is available, otherwise the profile
- * size in bytes.
- */
- OPENSLIDE_PUBLIC()
- int64_t openslide_get_associated_image_icc_profile_size(openslide_t *osr,
- const char *name);
- /**
- * Copy the ICC color profile from an associated image.
- *
- * This function reads the ICC color profile from an associated image into
- * the specified memory location. @p dest must be a valid pointer to enough
- * memory to hold the profile. Get the profile size with
- * openslide_get_associated_image_icc_profile_size().
- *
- * If an error occurs or has occurred, then the memory pointed to by @p dest
- * will be cleared.
- *
- * @param osr The OpenSlide object.
- * @param name The name of the desired associated image. Must be
- * a valid name as given by openslide_get_associated_image_names().
- * @param dest The destination buffer for the ICC color profile.
- */
- OPENSLIDE_PUBLIC()
- void openslide_read_associated_image_icc_profile(openslide_t *osr,
- const char *name,
- void *dest);
- //@}
- /**
- * @name Caching
- * Managing the in-memory tile cache.
- *
- * By default, each OpenSlide object has its own internal cache. These
- * functions can be used to configure a cache with a custom size, which may
- * be shared between multiple OpenSlide objects.
- */
- //@{
- /**
- * Create a new tile cache, unconnected to any OpenSlide object. The cache
- * can be attached to one or more OpenSlide objects with openslide_set_cache().
- * The cache must be released with openslide_cache_release() when done.
- *
- * @param capacity The capacity of the cache, in bytes.
- * @return A new cache.
- * @since 4.0.0
- */
- OPENSLIDE_PUBLIC()
- openslide_cache_t *openslide_cache_create(size_t capacity);
- /**
- * Attach a cache to the specified OpenSlide object, replacing the
- * current cache.
- *
- * @param osr The OpenSlide object.
- * @param cache The cache to attach.
- * @since 4.0.0
- */
- OPENSLIDE_PUBLIC()
- void openslide_set_cache(openslide_t *osr, openslide_cache_t *cache);
- /**
- * Release the cache. The cache may be released while it is still attached
- * to OpenSlide objects. It will be freed once the last attached OpenSlide
- * object is closed.
- *
- * @param cache The cache to release.
- * @since 4.0.0
- */
- OPENSLIDE_PUBLIC()
- void openslide_cache_release(openslide_cache_t *cache);
- //@}
- /**
- * @name Miscellaneous
- * Utility functions.
- */
- //@{
- /**
- * Get the version of the OpenSlide library.
- *
- * @return A string describing the OpenSlide version.
- * @since 3.3.0
- */
- OPENSLIDE_PUBLIC()
- const char *openslide_get_version(void);
- //@}
- /**
- * @mainpage OpenSlide
- *
- * OpenSlide is a C library that provides a simple interface to read
- * whole-slide images (also known as virtual slides). See the
- * [OpenSlide website](https://openslide.org/) for more details.
- */
- #ifdef __cplusplus
- }
- #endif
- #endif
|