mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 04:37:44 +00:00
LibGfx/ICC: Move enums to dedicated Enums.{cpp,h}
We will need to use ColorSpace in TagTypes.h, and it can't include Profile.h. Also makes Profile.cpp a bit smaller. No behavior change, pure code move.
This commit is contained in:
parent
6d743ce9e8
commit
64ffae9c55
7 changed files with 258 additions and 232 deletions
|
@ -28,6 +28,7 @@ set(SOURCES
|
|||
Font/WOFF2/Font.cpp
|
||||
GradientPainting.cpp
|
||||
ICC/BinaryWriter.cpp
|
||||
ICC/Enums.cpp
|
||||
ICC/Profile.cpp
|
||||
ICC/Tags.cpp
|
||||
ICC/TagTypes.cpp
|
||||
|
|
|
@ -13,7 +13,7 @@ namespace Gfx::ICC {
|
|||
|
||||
// The ICC spec uses FourCCs for many different things.
|
||||
// This is used to give FourCCs for different roles distinct types, so that they can only be compared to the correct constants.
|
||||
// (FourCCs that have only a small and fixed set of values should use an enum class instead, see e.g. DeviceClass and ColorSpace in Profile.h.)
|
||||
// (FourCCs that have only a small and fixed set of values should use an enum class instead, see e.g. DeviceClass and ColorSpace in Enums.h.)
|
||||
enum class FourCCType {
|
||||
PreferredCMMType,
|
||||
DeviceManufacturer,
|
||||
|
|
178
Userland/Libraries/LibGfx/ICC/Enums.cpp
Normal file
178
Userland/Libraries/LibGfx/ICC/Enums.cpp
Normal file
|
@ -0,0 +1,178 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Nico Weber <thakis@chromium.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibGfx/ICC/Enums.h>
|
||||
|
||||
namespace Gfx::ICC {
|
||||
|
||||
StringView device_class_name(DeviceClass device_class)
|
||||
{
|
||||
switch (device_class) {
|
||||
case DeviceClass::InputDevice:
|
||||
return "InputDevice"sv;
|
||||
case DeviceClass::DisplayDevice:
|
||||
return "DisplayDevice"sv;
|
||||
case DeviceClass::OutputDevice:
|
||||
return "OutputDevice"sv;
|
||||
case DeviceClass::DeviceLink:
|
||||
return "DeviceLink"sv;
|
||||
case DeviceClass::ColorSpace:
|
||||
return "ColorSpace"sv;
|
||||
case DeviceClass::Abstract:
|
||||
return "Abstract"sv;
|
||||
case DeviceClass::NamedColor:
|
||||
return "NamedColor"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView data_color_space_name(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::nCIEXYZ:
|
||||
return "nCIEXYZ"sv;
|
||||
case ColorSpace::CIELAB:
|
||||
return "CIELAB"sv;
|
||||
case ColorSpace::CIELUV:
|
||||
return "CIELUV"sv;
|
||||
case ColorSpace::YCbCr:
|
||||
return "YCbCr"sv;
|
||||
case ColorSpace::CIEYxy:
|
||||
return "CIEYxy"sv;
|
||||
case ColorSpace::RGB:
|
||||
return "RGB"sv;
|
||||
case ColorSpace::Gray:
|
||||
return "Gray"sv;
|
||||
case ColorSpace::HSV:
|
||||
return "HSV"sv;
|
||||
case ColorSpace::HLS:
|
||||
return "HLS"sv;
|
||||
case ColorSpace::CMYK:
|
||||
return "CMYK"sv;
|
||||
case ColorSpace::CMY:
|
||||
return "CMY"sv;
|
||||
case ColorSpace::TwoColor:
|
||||
return "2 color"sv;
|
||||
case ColorSpace::ThreeColor:
|
||||
return "3 color (other than XYZ, Lab, Luv, YCbCr, CIEYxy, RGB, HSV, HLS, CMY)"sv;
|
||||
case ColorSpace::FourColor:
|
||||
return "4 color (other than CMYK)"sv;
|
||||
case ColorSpace::FiveColor:
|
||||
return "5 color"sv;
|
||||
case ColorSpace::SixColor:
|
||||
return "6 color"sv;
|
||||
case ColorSpace::SevenColor:
|
||||
return "7 color"sv;
|
||||
case ColorSpace::EightColor:
|
||||
return "8 color"sv;
|
||||
case ColorSpace::NineColor:
|
||||
return "9 color"sv;
|
||||
case ColorSpace::TenColor:
|
||||
return "10 color"sv;
|
||||
case ColorSpace::ElevenColor:
|
||||
return "11 color"sv;
|
||||
case ColorSpace::TwelveColor:
|
||||
return "12 color"sv;
|
||||
case ColorSpace::ThirteenColor:
|
||||
return "13 color"sv;
|
||||
case ColorSpace::FourteenColor:
|
||||
return "14 color"sv;
|
||||
case ColorSpace::FifteenColor:
|
||||
return "15 color"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView profile_connection_space_name(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::PCSXYZ:
|
||||
return "PCSXYZ"sv;
|
||||
case ColorSpace::PCSLAB:
|
||||
return "PCSLAB"sv;
|
||||
default:
|
||||
return data_color_space_name(color_space);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned number_of_components_in_color_space(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::Gray:
|
||||
return 1;
|
||||
case ColorSpace::TwoColor:
|
||||
return 2;
|
||||
case ColorSpace::nCIEXYZ:
|
||||
case ColorSpace::CIELAB:
|
||||
case ColorSpace::CIELUV:
|
||||
case ColorSpace::YCbCr:
|
||||
case ColorSpace::CIEYxy:
|
||||
case ColorSpace::RGB:
|
||||
case ColorSpace::HSV:
|
||||
case ColorSpace::HLS:
|
||||
case ColorSpace::CMY:
|
||||
case ColorSpace::ThreeColor:
|
||||
return 3;
|
||||
case ColorSpace::CMYK:
|
||||
case ColorSpace::FourColor:
|
||||
return 4;
|
||||
case ColorSpace::FiveColor:
|
||||
return 5;
|
||||
case ColorSpace::SixColor:
|
||||
return 6;
|
||||
case ColorSpace::SevenColor:
|
||||
return 7;
|
||||
case ColorSpace::EightColor:
|
||||
return 8;
|
||||
case ColorSpace::NineColor:
|
||||
return 9;
|
||||
case ColorSpace::TenColor:
|
||||
return 10;
|
||||
case ColorSpace::ElevenColor:
|
||||
return 11;
|
||||
case ColorSpace::TwelveColor:
|
||||
return 12;
|
||||
case ColorSpace::ThirteenColor:
|
||||
return 13;
|
||||
case ColorSpace::FourteenColor:
|
||||
return 14;
|
||||
case ColorSpace::FifteenColor:
|
||||
return 15;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView primary_platform_name(PrimaryPlatform primary_platform)
|
||||
{
|
||||
switch (primary_platform) {
|
||||
case PrimaryPlatform::Apple:
|
||||
return "Apple"sv;
|
||||
case PrimaryPlatform::Microsoft:
|
||||
return "Microsoft"sv;
|
||||
case PrimaryPlatform::SiliconGraphics:
|
||||
return "Silicon Graphics"sv;
|
||||
case PrimaryPlatform::Sun:
|
||||
return "Sun"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView rendering_intent_name(RenderingIntent rendering_intent)
|
||||
{
|
||||
switch (rendering_intent) {
|
||||
case RenderingIntent::Perceptual:
|
||||
return "Perceptual"sv;
|
||||
case RenderingIntent::MediaRelativeColorimetric:
|
||||
return "Media-relative colorimetric"sv;
|
||||
case RenderingIntent::Saturation:
|
||||
return "Saturation"sv;
|
||||
case RenderingIntent::ICCAbsoluteColorimetric:
|
||||
return "ICC-absolute colorimetric"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
77
Userland/Libraries/LibGfx/ICC/Enums.h
Normal file
77
Userland/Libraries/LibGfx/ICC/Enums.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Nico Weber <thakis@chromium.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/StringView.h>
|
||||
|
||||
namespace Gfx::ICC {
|
||||
|
||||
// ICC v4, 7.2.5 Profile/device class field
|
||||
enum class DeviceClass : u32 {
|
||||
InputDevice = 0x73636E72, // 'scnr'
|
||||
DisplayDevice = 0x6D6E7472, // 'mntr'
|
||||
OutputDevice = 0x70727472, // 'prtr'
|
||||
DeviceLink = 0x6C696E6B, // 'link'
|
||||
ColorSpace = 0x73706163, // 'spac'
|
||||
Abstract = 0x61627374, // 'abst'
|
||||
NamedColor = 0x6E6D636C, // 'nmcl'
|
||||
};
|
||||
StringView device_class_name(DeviceClass);
|
||||
|
||||
// ICC v4, 7.2.6 Data colour space field, Table 19 — Data colour space signatures
|
||||
enum class ColorSpace : u32 {
|
||||
nCIEXYZ = 0x58595A20, // 'XYZ ', used in data color spaces.
|
||||
PCSXYZ = nCIEXYZ, // Used in profile connection space instead.
|
||||
CIELAB = 0x4C616220, // 'Lab ', used in data color spaces.
|
||||
PCSLAB = CIELAB, // Used in profile connection space instead.
|
||||
CIELUV = 0x4C757620, // 'Luv '
|
||||
YCbCr = 0x59436272, // 'YCbr'
|
||||
CIEYxy = 0x59787920, // 'Yxy '
|
||||
RGB = 0x52474220, // 'RGB '
|
||||
Gray = 0x47524159, // 'GRAY'
|
||||
HSV = 0x48535620, // 'HSV '
|
||||
HLS = 0x484C5320, // 'HLS '
|
||||
CMYK = 0x434D594B, // 'CMYK'
|
||||
CMY = 0x434D5920, // 'CMY '
|
||||
TwoColor = 0x32434C52, // '2CLR'
|
||||
ThreeColor = 0x33434C52, // '3CLR'
|
||||
FourColor = 0x34434C52, // '4CLR'
|
||||
FiveColor = 0x35434C52, // '5CLR'
|
||||
SixColor = 0x36434C52, // '6CLR'
|
||||
SevenColor = 0x37434C52, // '7CLR'
|
||||
EightColor = 0x38434C52, // '8CLR'
|
||||
NineColor = 0x39434C52, // '9CLR'
|
||||
TenColor = 0x41434C52, // 'ACLR'
|
||||
ElevenColor = 0x42434C52, // 'BCLR'
|
||||
TwelveColor = 0x43434C52, // 'CCLR'
|
||||
ThirteenColor = 0x44434C52, // 'DCLR'
|
||||
FourteenColor = 0x45434C52, // 'ECLR'
|
||||
FifteenColor = 0x46434C52, // 'FCLR'
|
||||
};
|
||||
StringView data_color_space_name(ColorSpace);
|
||||
StringView profile_connection_space_name(ColorSpace);
|
||||
unsigned number_of_components_in_color_space(ColorSpace);
|
||||
|
||||
// ICC v4, 7.2.10 Primary platform field, Table 20 — Primary platforms
|
||||
enum class PrimaryPlatform : u32 {
|
||||
Apple = 0x4150504C, // 'APPL'
|
||||
Microsoft = 0x4D534654, // 'MSFT'
|
||||
SiliconGraphics = 0x53474920, // 'SGI '
|
||||
Sun = 0x53554E57, // 'SUNW'
|
||||
};
|
||||
StringView primary_platform_name(PrimaryPlatform);
|
||||
|
||||
// ICC v4, 7.2.15 Rendering intent field
|
||||
enum class RenderingIntent {
|
||||
Perceptual,
|
||||
MediaRelativeColorimetric,
|
||||
Saturation,
|
||||
ICCAbsoluteColorimetric,
|
||||
};
|
||||
StringView rendering_intent_name(RenderingIntent);
|
||||
|
||||
}
|
|
@ -345,173 +345,6 @@ URL device_model_url(DeviceModel device_model)
|
|||
device_model.c0(), device_model.c1(), device_model.c2(), device_model.c3(), device_model.value));
|
||||
}
|
||||
|
||||
StringView device_class_name(DeviceClass device_class)
|
||||
{
|
||||
switch (device_class) {
|
||||
case DeviceClass::InputDevice:
|
||||
return "InputDevice"sv;
|
||||
case DeviceClass::DisplayDevice:
|
||||
return "DisplayDevice"sv;
|
||||
case DeviceClass::OutputDevice:
|
||||
return "OutputDevice"sv;
|
||||
case DeviceClass::DeviceLink:
|
||||
return "DeviceLink"sv;
|
||||
case DeviceClass::ColorSpace:
|
||||
return "ColorSpace"sv;
|
||||
case DeviceClass::Abstract:
|
||||
return "Abstract"sv;
|
||||
case DeviceClass::NamedColor:
|
||||
return "NamedColor"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView data_color_space_name(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::nCIEXYZ:
|
||||
return "nCIEXYZ"sv;
|
||||
case ColorSpace::CIELAB:
|
||||
return "CIELAB"sv;
|
||||
case ColorSpace::CIELUV:
|
||||
return "CIELUV"sv;
|
||||
case ColorSpace::YCbCr:
|
||||
return "YCbCr"sv;
|
||||
case ColorSpace::CIEYxy:
|
||||
return "CIEYxy"sv;
|
||||
case ColorSpace::RGB:
|
||||
return "RGB"sv;
|
||||
case ColorSpace::Gray:
|
||||
return "Gray"sv;
|
||||
case ColorSpace::HSV:
|
||||
return "HSV"sv;
|
||||
case ColorSpace::HLS:
|
||||
return "HLS"sv;
|
||||
case ColorSpace::CMYK:
|
||||
return "CMYK"sv;
|
||||
case ColorSpace::CMY:
|
||||
return "CMY"sv;
|
||||
case ColorSpace::TwoColor:
|
||||
return "2 color"sv;
|
||||
case ColorSpace::ThreeColor:
|
||||
return "3 color (other than XYZ, Lab, Luv, YCbCr, CIEYxy, RGB, HSV, HLS, CMY)"sv;
|
||||
case ColorSpace::FourColor:
|
||||
return "4 color (other than CMYK)"sv;
|
||||
case ColorSpace::FiveColor:
|
||||
return "5 color"sv;
|
||||
case ColorSpace::SixColor:
|
||||
return "6 color"sv;
|
||||
case ColorSpace::SevenColor:
|
||||
return "7 color"sv;
|
||||
case ColorSpace::EightColor:
|
||||
return "8 color"sv;
|
||||
case ColorSpace::NineColor:
|
||||
return "9 color"sv;
|
||||
case ColorSpace::TenColor:
|
||||
return "10 color"sv;
|
||||
case ColorSpace::ElevenColor:
|
||||
return "11 color"sv;
|
||||
case ColorSpace::TwelveColor:
|
||||
return "12 color"sv;
|
||||
case ColorSpace::ThirteenColor:
|
||||
return "13 color"sv;
|
||||
case ColorSpace::FourteenColor:
|
||||
return "14 color"sv;
|
||||
case ColorSpace::FifteenColor:
|
||||
return "15 color"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView profile_connection_space_name(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::PCSXYZ:
|
||||
return "PCSXYZ"sv;
|
||||
case ColorSpace::PCSLAB:
|
||||
return "PCSLAB"sv;
|
||||
default:
|
||||
return data_color_space_name(color_space);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned number_of_components_in_color_space(ColorSpace color_space)
|
||||
{
|
||||
switch (color_space) {
|
||||
case ColorSpace::Gray:
|
||||
return 1;
|
||||
case ColorSpace::TwoColor:
|
||||
return 2;
|
||||
case ColorSpace::nCIEXYZ:
|
||||
case ColorSpace::CIELAB:
|
||||
case ColorSpace::CIELUV:
|
||||
case ColorSpace::YCbCr:
|
||||
case ColorSpace::CIEYxy:
|
||||
case ColorSpace::RGB:
|
||||
case ColorSpace::HSV:
|
||||
case ColorSpace::HLS:
|
||||
case ColorSpace::CMY:
|
||||
case ColorSpace::ThreeColor:
|
||||
return 3;
|
||||
case ColorSpace::CMYK:
|
||||
case ColorSpace::FourColor:
|
||||
return 4;
|
||||
case ColorSpace::FiveColor:
|
||||
return 5;
|
||||
case ColorSpace::SixColor:
|
||||
return 6;
|
||||
case ColorSpace::SevenColor:
|
||||
return 7;
|
||||
case ColorSpace::EightColor:
|
||||
return 8;
|
||||
case ColorSpace::NineColor:
|
||||
return 9;
|
||||
case ColorSpace::TenColor:
|
||||
return 10;
|
||||
case ColorSpace::ElevenColor:
|
||||
return 11;
|
||||
case ColorSpace::TwelveColor:
|
||||
return 12;
|
||||
case ColorSpace::ThirteenColor:
|
||||
return 13;
|
||||
case ColorSpace::FourteenColor:
|
||||
return 14;
|
||||
case ColorSpace::FifteenColor:
|
||||
return 15;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView primary_platform_name(PrimaryPlatform primary_platform)
|
||||
{
|
||||
switch (primary_platform) {
|
||||
case PrimaryPlatform::Apple:
|
||||
return "Apple"sv;
|
||||
case PrimaryPlatform::Microsoft:
|
||||
return "Microsoft"sv;
|
||||
case PrimaryPlatform::SiliconGraphics:
|
||||
return "Silicon Graphics"sv;
|
||||
case PrimaryPlatform::Sun:
|
||||
return "Sun"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
StringView rendering_intent_name(RenderingIntent rendering_intent)
|
||||
{
|
||||
switch (rendering_intent) {
|
||||
case RenderingIntent::Perceptual:
|
||||
return "Perceptual"sv;
|
||||
case RenderingIntent::MediaRelativeColorimetric:
|
||||
return "Media-relative colorimetric"sv;
|
||||
case RenderingIntent::Saturation:
|
||||
return "Saturation"sv;
|
||||
case RenderingIntent::ICCAbsoluteColorimetric:
|
||||
return "ICC-absolute colorimetric"sv;
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
Flags::Flags() = default;
|
||||
Flags::Flags(u32 bits)
|
||||
: m_bits(bits)
|
||||
|
|
|
@ -46,70 +46,6 @@ private:
|
|||
u8 m_minor_and_bugfix_version = 0;
|
||||
};
|
||||
|
||||
// ICC v4, 7.2.5 Profile/device class field
|
||||
enum class DeviceClass : u32 {
|
||||
InputDevice = 0x73636E72, // 'scnr'
|
||||
DisplayDevice = 0x6D6E7472, // 'mntr'
|
||||
OutputDevice = 0x70727472, // 'prtr'
|
||||
DeviceLink = 0x6C696E6B, // 'link'
|
||||
ColorSpace = 0x73706163, // 'spac'
|
||||
Abstract = 0x61627374, // 'abst'
|
||||
NamedColor = 0x6E6D636C, // 'nmcl'
|
||||
};
|
||||
StringView device_class_name(DeviceClass);
|
||||
|
||||
// ICC v4, 7.2.6 Data colour space field, Table 19 — Data colour space signatures
|
||||
enum class ColorSpace : u32 {
|
||||
nCIEXYZ = 0x58595A20, // 'XYZ ', used in data color spaces.
|
||||
PCSXYZ = nCIEXYZ, // Used in profile connection space instead.
|
||||
CIELAB = 0x4C616220, // 'Lab ', used in data color spaces.
|
||||
PCSLAB = CIELAB, // Used in profile connection space instead.
|
||||
CIELUV = 0x4C757620, // 'Luv '
|
||||
YCbCr = 0x59436272, // 'YCbr'
|
||||
CIEYxy = 0x59787920, // 'Yxy '
|
||||
RGB = 0x52474220, // 'RGB '
|
||||
Gray = 0x47524159, // 'GRAY'
|
||||
HSV = 0x48535620, // 'HSV '
|
||||
HLS = 0x484C5320, // 'HLS '
|
||||
CMYK = 0x434D594B, // 'CMYK'
|
||||
CMY = 0x434D5920, // 'CMY '
|
||||
TwoColor = 0x32434C52, // '2CLR'
|
||||
ThreeColor = 0x33434C52, // '3CLR'
|
||||
FourColor = 0x34434C52, // '4CLR'
|
||||
FiveColor = 0x35434C52, // '5CLR'
|
||||
SixColor = 0x36434C52, // '6CLR'
|
||||
SevenColor = 0x37434C52, // '7CLR'
|
||||
EightColor = 0x38434C52, // '8CLR'
|
||||
NineColor = 0x39434C52, // '9CLR'
|
||||
TenColor = 0x41434C52, // 'ACLR'
|
||||
ElevenColor = 0x42434C52, // 'BCLR'
|
||||
TwelveColor = 0x43434C52, // 'CCLR'
|
||||
ThirteenColor = 0x44434C52, // 'DCLR'
|
||||
FourteenColor = 0x45434C52, // 'ECLR'
|
||||
FifteenColor = 0x46434C52, // 'FCLR'
|
||||
};
|
||||
StringView data_color_space_name(ColorSpace);
|
||||
StringView profile_connection_space_name(ColorSpace);
|
||||
unsigned number_of_components_in_color_space(ColorSpace);
|
||||
|
||||
// ICC v4, 7.2.10 Primary platform field, Table 20 — Primary platforms
|
||||
enum class PrimaryPlatform : u32 {
|
||||
Apple = 0x4150504C, // 'APPL'
|
||||
Microsoft = 0x4D534654, // 'MSFT'
|
||||
SiliconGraphics = 0x53474920, // 'SGI '
|
||||
Sun = 0x53554E57, // 'SUNW'
|
||||
};
|
||||
StringView primary_platform_name(PrimaryPlatform);
|
||||
|
||||
// ICC v4, 7.2.15 Rendering intent field
|
||||
enum class RenderingIntent : u32 {
|
||||
Perceptual = 0,
|
||||
MediaRelativeColorimetric = 1,
|
||||
Saturation = 2,
|
||||
ICCAbsoluteColorimetric = 3,
|
||||
};
|
||||
StringView rendering_intent_name(RenderingIntent);
|
||||
|
||||
// ICC v4, 7.2.11 Profile flags field
|
||||
class Flags {
|
||||
public:
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <AK/String.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGfx/ICC/DistinctFourCC.h>
|
||||
#include <LibGfx/ICC/Enums.h>
|
||||
#include <LibGfx/Vector3.h>
|
||||
#include <math.h>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue