/*
* 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
* .
*
*/
/**
* @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
#include
#include
#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