first commit
This commit is contained in:
75
.gitignore
vendored
Normal file
75
.gitignore
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
/target
|
||||
/Cargo.lock
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
.pytest_cache/
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
.venv/
|
||||
env/
|
||||
bin/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
include/
|
||||
man/
|
||||
venv/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
pip-selfcheck.json
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
|
||||
# Mr Developer
|
||||
.mr.developer.cfg
|
||||
.project
|
||||
.pydevproject
|
||||
|
||||
# Rope
|
||||
.ropeproject
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
*.pot
|
||||
|
||||
.DS_Store
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyCharm
|
||||
.idea/
|
||||
|
||||
# VSCode
|
||||
.vscode/
|
||||
|
||||
# Pyenv
|
||||
.python-version
|
||||
|
||||
/tests/files/*
|
||||
17
Cargo.toml
Normal file
17
Cargo.toml
Normal file
@@ -0,0 +1,17 @@
|
||||
[package]
|
||||
name = "colorcet"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
rust-version = "1.85.1"
|
||||
authors = ["Wim Pomp <w.pomp@nki.nl>"]
|
||||
license = "BB-CY"
|
||||
description = "Colorcet colormaps."
|
||||
homepage = "https://github.com/wimpomp/colorcet"
|
||||
repository = "https://github.com/wimpomp/colorcet"
|
||||
readme = "README.md"
|
||||
keywords = ["color", "colormap", "color-scales", "visualization", "gradient"]
|
||||
categories = ["graphics", "visualization"]
|
||||
|
||||
[dependencies]
|
||||
phf = { version = "0.12.1", features = ["macros"] }
|
||||
thiserror = "2.0.16"
|
||||
250
LICENSE
Normal file
250
LICENSE
Normal file
@@ -0,0 +1,250 @@
|
||||
Creative Commons Attribution 4.0 International Public License (CC-BY)
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution 4.0 International Public License ("Public License"). To the
|
||||
extent this Public License may be interpreted as a contract, You are
|
||||
granted the Licensed Rights in consideration of Your acceptance of
|
||||
these terms and conditions, and the Licensor grants You such rights in
|
||||
consideration of benefits the Licensor receives from making the
|
||||
Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 - Definitions.
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material and
|
||||
in which the Licensed Material is translated, altered, arranged,
|
||||
transformed, or otherwise modified in a manner requiring permission
|
||||
under the Copyright and Similar Rights held by the Licensor. For
|
||||
purposes of this Public License, where the Licensed Material is a
|
||||
musical work, performance, or sound recording, Adapted Material is
|
||||
always produced where the Licensed Material is synched in timed
|
||||
relation with a moving image.
|
||||
b. Adapter's License means the license You apply to Your Copyright and
|
||||
Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section [5]2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
d. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
e. Exceptions and Limitations means fair use, fair dealing, and/or any
|
||||
other exception or limitation to Copyright and Similar Rights that
|
||||
applies to Your use of the Licensed Material.
|
||||
f. Licensed Material means the artistic or literary work, database, or
|
||||
other material to which the Licensor applied this Public License.
|
||||
g. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
h. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
i. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such as
|
||||
reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
j. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
k. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 - Scope.
|
||||
a. License grant.
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
A. reproduce and Share the Licensed Material, in whole or in
|
||||
part; and
|
||||
B. produce, reproduce, and Share Adapted Material.
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with its
|
||||
terms and conditions.
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
[6]6(a).
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in all
|
||||
media and formats whether now known or hereafter created, and
|
||||
to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including technical
|
||||
modifications necessary to circumvent Effective Technological
|
||||
Measures. For purposes of this Public License, simply making
|
||||
modifications authorized by this Section [7]2(a)(4) never
|
||||
produces Adapted Material.
|
||||
5. Downstream recipients.
|
||||
A. Offer from the Licensor - Licensed Material. Every
|
||||
recipient of the Licensed Material automatically receives
|
||||
an offer from the Licensor to exercise the Licensed
|
||||
Rights under the terms and conditions of this Public
|
||||
License.
|
||||
B. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section [8]3(a)(1)(A)(i).
|
||||
b. Other rights.
|
||||
1. Moral rights, such as the right of integrity, are not licensed
|
||||
under this Public License, nor are publicity, privacy, and/or
|
||||
other similar personality rights; however, to the extent
|
||||
possible, the Licensor waives and/or agrees not to assert any
|
||||
such rights held by the Licensor to the limited extent
|
||||
necessary to allow You to exercise the Licensed Rights, but
|
||||
not otherwise.
|
||||
2. Patent and trademark rights are not licensed under this Public
|
||||
License.
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society under
|
||||
any voluntary or waivable statutory or compulsory licensing
|
||||
scheme. In all other cases the Licensor expressly reserves any
|
||||
right to collect such royalties.
|
||||
|
||||
Section 3 - License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
a. Attribution.
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
A. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if designated);
|
||||
ii. a copyright notice;
|
||||
iii. a notice that refers to this Public License;
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
B. indicate if You modified the Licensed Material and retain
|
||||
an indication of any previous modifications; and
|
||||
C. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
2. You may satisfy the conditions in Section [9]3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section [10]3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
4. If You Share Adapted Material You produce, the Adapter's
|
||||
License You apply must not prevent recipients of the Adapted
|
||||
Material from complying with this Public License.
|
||||
|
||||
Section 4 - Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
a. for the avoidance of doubt, Section [11]2(a)(1) grants You the
|
||||
right to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database;
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material; and
|
||||
c. You must comply with the conditions in Section [12]3(a) if You
|
||||
Share all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section [13]4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
Section 5 - Disclaimer of Warranties and Limitation of Liability.
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the
|
||||
extent possible, the Licensor offers the Licensed Material as-is
|
||||
and as-available, and makes no representations or warranties of any
|
||||
kind concerning the Licensed Material, whether express, implied,
|
||||
statutory, or other. This includes, without limitation, warranties
|
||||
of title, merchantability, fitness for a particular purpose,
|
||||
non-infringement, absence of latent or other defects, accuracy, or
|
||||
the presence or absence of errors, whether or not known or
|
||||
discoverable. Where disclaimers of warranties are not allowed in
|
||||
full or in part, this disclaimer may not apply to You.
|
||||
b. To the extent possible, in no event will the Licensor be liable to
|
||||
You on any legal theory (including, without limitation, negligence)
|
||||
or otherwise for any direct, special, indirect, incidental,
|
||||
consequential, punitive, exemplary, or other losses, costs,
|
||||
expenses, or damages arising out of this Public License or use of
|
||||
the Licensed Material, even if the Licensor has been advised of the
|
||||
possibility of such losses, costs, expenses, or damages. Where a
|
||||
limitation of liability is not allowed in full or in part, this
|
||||
limitation may not apply to You.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
Section 6 - Term and Termination.
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section [14]6(a), it reinstates:
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the violation;
|
||||
or
|
||||
2. upon express reinstatement by the Licensor.
|
||||
For the avoidance of doubt, this Section [15]6(b) does not affect
|
||||
any right the Licensor may have to seek remedies for Your
|
||||
violations of this Public License.
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
d. Sections [16]1, [17]5, [18]6, [19]7, and [20]8 survive termination
|
||||
of this Public License.
|
||||
|
||||
Section 7 - Other Terms and Conditions.
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 - Interpretation.
|
||||
a. For the avoidance of doubt, this Public License does not, and shall
|
||||
not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
d. Nothing in this Public License constitutes or may be interpreted as
|
||||
a limitation upon, or waiver of, any privileges and immunities that
|
||||
apply to the Licensor or You, including from the legal processes of
|
||||
any jurisdiction or authority.
|
||||
7
README.md
Normal file
7
README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Colorcet
|
||||
Rust copy of Python library [colorcet](https://pypi.org/project/colorcet/).
|
||||
[Colorcet](https://colorcet.com/) is a set of perceptually uniform colormaps.
|
||||
|
||||
|
||||
|
||||
|
||||
27485
__init__.py
Normal file
27485
__init__.py
Normal file
File diff suppressed because it is too large
Load Diff
52
copy_from_colorcet.py
Normal file
52
copy_from_colorcet.py
Normal file
@@ -0,0 +1,52 @@
|
||||
import colorcet
|
||||
import re
|
||||
|
||||
|
||||
def parse_cmaps() -> list[str]:
|
||||
pat = re.compile(r"(\s|\[)(\d)(,\s|])")
|
||||
s = []
|
||||
for name in colorcet.all_original_names():
|
||||
cmap = getattr(colorcet, name)
|
||||
if isinstance(cmap, list) and len(cmap) == 256 and isinstance(cmap[0], list):
|
||||
c = f"{cmap}"
|
||||
c = pat.sub(r"\1\2.0\3", c)
|
||||
c = pat.sub(r"\1\2.0\3", c)
|
||||
c = pat.sub(r"\1\2.0\3", c)
|
||||
s.append(f" \"{name}\" => {c},\n")
|
||||
return sorted(s)
|
||||
|
||||
|
||||
def parse_aliases() -> list[str]:
|
||||
pat = re.compile(r",\s+")
|
||||
s = []
|
||||
for name in colorcet.all_original_names():
|
||||
for alias in pat.split(colorcet.get_aliases(name)):
|
||||
s.append(f" \"{alias}\" => \"{name}\",\n")
|
||||
return sorted(s)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""extract colormaps from the python package colorcet, run cargo fmt after"""
|
||||
cmaps = parse_cmaps()
|
||||
aliases = parse_aliases()
|
||||
|
||||
with open("src/colormaps.rs", "w") as f:
|
||||
f.write("use phf::phf_map;\n")
|
||||
f.write("\n")
|
||||
f.write("/// unique colormaps\n")
|
||||
f.write("#[allow(clippy::approx_constant)]\n")
|
||||
f.write("pub static COLOR_MAPS: phf::Map<&'static str, [[f64; 3]; 256]> = phf_map! {\n")
|
||||
for i in cmaps:
|
||||
f.write(i)
|
||||
f.write("};\n")
|
||||
f.write("\n")
|
||||
f.write("/// aliases to colormaps\n")
|
||||
f.write("#[allow(clippy::approx_constant)]\n")
|
||||
f.write("pub static ALIASES: phf::Map<&'static str, &'static str> = phf_map! {\n")
|
||||
for i in aliases:
|
||||
f.write(i)
|
||||
f.write("};")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
320
src/colormaps.rs
Normal file
320
src/colormaps.rs
Normal file
File diff suppressed because one or more lines are too long
75
src/lib.rs
Normal file
75
src/lib.rs
Normal file
@@ -0,0 +1,75 @@
|
||||
mod colormaps;
|
||||
|
||||
use std::ops::Sub;
|
||||
use thiserror::Error;
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum ColorcetError {
|
||||
#[error("no colormap with name {0} known")]
|
||||
ColormapNotFound(String),
|
||||
}
|
||||
|
||||
pub trait Int: Sub + Sized {
|
||||
const MIN: Self;
|
||||
const MAX: Self;
|
||||
}
|
||||
|
||||
macro_rules! impl_int {
|
||||
($($t:tt),+ $(,)?) => {
|
||||
$(
|
||||
impl Int for $t {
|
||||
const MIN: Self = $t::MIN;
|
||||
const MAX: Self = $t::MAX;
|
||||
}
|
||||
)*
|
||||
};
|
||||
}
|
||||
|
||||
impl_int!(
|
||||
u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, isize, usize
|
||||
);
|
||||
|
||||
pub struct ColorMap([[f64; 3]; 256]);
|
||||
|
||||
impl ColorMap {
|
||||
/// get a vector of rgb values, scaled between 0.0 and 1.0
|
||||
pub fn get_colors_f64(&self) -> Vec<Vec<f64>> {
|
||||
self.0.iter().map(|row| row.to_vec()).collect()
|
||||
}
|
||||
|
||||
/// get a vector of rgb values, scaled between T::MIN and T::MAX
|
||||
pub fn get_colors_int<T>(&self) -> Vec<Vec<T>>
|
||||
where
|
||||
T: Int + From<f64>,
|
||||
f64: From<T>,
|
||||
{
|
||||
let a: f64 = T::MIN.into();
|
||||
let b: f64 = T::MAX.into();
|
||||
let c = b - a;
|
||||
self.0
|
||||
.iter()
|
||||
.map(|row| row.iter().map(|&i| ((i - a) / c).round().into()).collect())
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
/// find a colorcet colormap by name, add _r to reverse the colormap
|
||||
pub fn get_named_colormap(name: &str) -> Result<ColorMap, ColorcetError> {
|
||||
let (name0, reverse) = if let Some(name) = name.strip_suffix("_r") {
|
||||
(name, true)
|
||||
} else {
|
||||
(name, false)
|
||||
};
|
||||
|
||||
if let Some(&alias) = colormaps::ALIASES.get(name0)
|
||||
&& let Some(cmap) = colormaps::COLOR_MAPS.get(alias)
|
||||
{
|
||||
let mut cmap = cmap.to_owned();
|
||||
if reverse {
|
||||
cmap.reverse();
|
||||
}
|
||||
Ok(ColorMap(cmap))
|
||||
} else {
|
||||
Err(ColorcetError::ColormapNotFound(name.into()))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user