mirror of https://github.com/GNOME/gimp.git
135 lines
3.9 KiB
C
135 lines
3.9 KiB
C
/* LIBGIMP - The GIMP Library
|
|
* Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
|
|
*
|
|
* gimppalette.c
|
|
* Copyright (C) 2023 Jehan
|
|
*
|
|
* 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 3 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, see
|
|
* <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "gimp.h"
|
|
|
|
#include "gimppalette.h"
|
|
|
|
struct _GimpPalette
|
|
{
|
|
GimpResource parent_instance;
|
|
};
|
|
|
|
G_DEFINE_TYPE (GimpPalette, gimp_palette, GIMP_TYPE_RESOURCE);
|
|
|
|
|
|
static void gimp_palette_class_init (GimpPaletteClass *klass)
|
|
{
|
|
}
|
|
|
|
static void gimp_palette_init (GimpPalette *palette)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* gimp_palette_get_colormap:
|
|
* @palette: The palette.
|
|
* @format: The desired color format.
|
|
* @num_colors: (out) (nullable): The number of colors in the palette.
|
|
* @num_bytes: (out) (nullable): The byte-size of the returned value.
|
|
*
|
|
* This procedure returns a palette's colormap as an array of bytes with
|
|
* all colors converted to a given Babl @format.
|
|
*
|
|
* The byte-size of the returned colormap depends on the number of
|
|
* colors and on the bytes-per-pixel size of @format. E.g. that the
|
|
* following equality is ensured:
|
|
*
|
|
* ```C
|
|
* num_bytes == num_colors * babl_format_get_bytes_per_pixel (format)
|
|
* ```
|
|
*
|
|
* Therefore @num_colors and @num_bytes are kinda redundant since both
|
|
* indicate the size of the return value in a different way. You may
|
|
* both set them to %NULL but not at the same time.
|
|
*
|
|
* Returns: (transfer full) (array length=num_bytes): The palette's colormap.
|
|
*
|
|
* Since: 3.0
|
|
**/
|
|
guint8 *
|
|
gimp_palette_get_colormap (GimpPalette *palette,
|
|
const Babl *format,
|
|
gint *num_colors,
|
|
gsize *num_bytes)
|
|
{
|
|
GBytes *bytes;
|
|
guint8 *colormap;
|
|
gint n_colors;
|
|
gsize n_bytes;
|
|
|
|
g_return_val_if_fail (GIMP_IS_PALETTE (palette), NULL);
|
|
g_return_val_if_fail (format != NULL, NULL);
|
|
g_return_val_if_fail (num_colors != NULL || num_bytes != NULL, NULL);
|
|
|
|
bytes = _gimp_palette_get_bytes (palette, format, &n_colors);
|
|
colormap = g_bytes_unref_to_data (bytes, &n_bytes);
|
|
|
|
if (num_colors)
|
|
*num_colors = n_colors;
|
|
if (num_bytes)
|
|
*num_bytes = n_bytes;
|
|
|
|
return colormap;
|
|
}
|
|
|
|
/**
|
|
* gimp_palette_set_colormap:
|
|
* @palette: The palette.
|
|
* @format: The desired color format.
|
|
* @colormap (array length=num_bytes): The new colormap values.
|
|
* @num_bytes: The byte-size of @colormap.
|
|
*
|
|
* This procedure sets the entries in the specified palette in one go,
|
|
* though they must all be in the same @format.
|
|
*
|
|
* The number of entries depens on the @num_bytes size of @colormap and
|
|
* the bytes-per-pixel size of @format.
|
|
* The procedure will fail if @num_bytes is not an exact multiple of the
|
|
* number of bytes per pixel of @format.
|
|
*
|
|
* Returns: %TRUE on success.
|
|
*
|
|
* Since: 3.0
|
|
**/
|
|
gboolean
|
|
gimp_palette_set_colormap (GimpPalette *palette,
|
|
const Babl *format,
|
|
guint8 *colormap,
|
|
gsize num_bytes)
|
|
{
|
|
GBytes *bytes;
|
|
gboolean success;
|
|
|
|
g_return_val_if_fail (GIMP_IS_PALETTE (palette), FALSE);
|
|
g_return_val_if_fail (format != NULL, FALSE);
|
|
g_return_val_if_fail (colormap != NULL, FALSE);
|
|
g_return_val_if_fail (num_bytes % babl_format_get_bytes_per_pixel (format) == 0, FALSE);
|
|
|
|
bytes = g_bytes_new_static (colormap, num_bytes);
|
|
success = _gimp_palette_set_bytes (palette, format, bytes);
|
|
g_bytes_unref (bytes);
|
|
|
|
return success;
|
|
}
|