Browse Source

merge main

pull/173/head
dreamer 4 years ago
parent
commit
a828d71232
10 changed files with 325 additions and 5 deletions
  1. +13
    -1
      .gitmodules
  2. +4
    -0
      README.md
  3. +14
    -0
      docs/LICENSES.md
  4. +1
    -0
      plugins/AaronStatic
  5. +1
    -0
      plugins/Algoritmarte
  6. +1
    -0
      plugins/MSM
  7. +75
    -4
      plugins/Makefile
  8. +1
    -0
      plugins/nonlinearcircuits
  9. +164
    -0
      plugins/plugins.cpp
  10. +51
    -0
      src/custom/dep.cpp

+ 13
- 1
.gitmodules View File

@@ -153,7 +153,7 @@
url = https://github.com/martin-lueders/ML_modules.git
[submodule "plugins/Orbits"]
path = plugins/Orbits
url = git@github.com:RareBreeds/Orbits.git
url = https://github.com/RareBreeds/Orbits.git
[submodule "plugins/stocaudio"]
path = plugins/stocaudio
url = https://github.com/aptrn/stocaudio-modules.git
@@ -172,6 +172,18 @@
[submodule "plugins/Dintree"]
path = plugins/Dintree
url = https://github.com/hires/Dintree-Virtual.git
[submodule "plugins/Algoritmarte"]
path = plugins/Algoritmarte
url = https://github.com/algoritmarte/AlgoritmarteVCVPlugin.git
[submodule "plugins/AaronStatic"]
path = plugins/AaronStatic
url = https://github.com/aaronstatic/AaronStatic_modules.git
[submodule "plugins/MSM"]
path = plugins/MSM
url = https://github.com/netboy3/MSM-vcvrack-plugin.git
[submodule "plugins/nonlinearcircuits"]
path = plugins/nonlinearcircuits
url = https://github.com/mhetrick/nonlinearcircuits.git
[submodule "plugins/StarlingVia"]
path = plugins/StarlingVia
url = https://github.com/starlingcode/Via-for-Rack.git

+ 4
- 0
README.md View File

@@ -104,6 +104,8 @@ At the moment the following 3rd-party modules are provided:

- 21kHz
- 8Mode
- Aaron Static
- AlgoritmArte
- Amalgamated Harmonics
- Animated Circuits
- Aria Salvatrice
@@ -142,6 +144,8 @@ At the moment the following 3rd-party modules are provided:
- Mockba Modular
- Mog
- mscHack
- MSM
- Nonlinear Circuits
- Orbits
- Path Set
- Prism


+ 14
- 0
docs/LICENSES.md View File

@@ -15,6 +15,8 @@ Bellow follows a list of all code licenses used in Cardinal and linked submodule
| Rack | GPL-3.0-or-later | The actual Rack code, internal dependencies are compatible with GPLv3+ |
| 21kHz | MIT | |
| 8Mode | BSD-3-Clause | |
| Aaron Static | MIT | |
| AlgoritmArte | GPL-3.0-or-later | |
| Amalgamated Harmonics | BSD-3-Clause | |
| Animated Circuits | GPL-3.0-or-later | |
| Aria Salvatrice | GPL-3.0-or-later | |
@@ -53,6 +55,8 @@ Bellow follows a list of all code licenses used in Cardinal and linked submodule
| Mockba Modular | MIT | |
| Mog | CC0-1.0 | |
| mscHack | BSD-3-Clause | |
| MSM | MIT | Repo's [LICENSE-dist.md](https://github.com/netboy3/MSM-vcvrack-plugin/issues/10) includes wrong information |
| Nonlinear Circuits | CC0-1.0 | |
| Orbits | GPL-3.0-or-later | |
| Path Set | GPL-3.0-or-later | |
| Prism | BSD-3-Clause | |
@@ -84,6 +88,10 @@ Below is a list of artwork licenses from plugins
|-----------------------------------------|------------------|------------------|
| 21kHz | MIT | No artwork specific license provided |
| 8Mode | BSD-3-Clause | No artwork specific license provided |
| AaronStatic/* | MIT | No artwork specific license provided |
| AaronStatic/fonts/PixelOperator.ttf | CC0-1.0 | |
| Algoritmarte/* | GPL-3.0-or-later | No artwork specific license provided |
| Algoritmarte/LEDSliderGreenHandle.svg | CC-BY-NC-4.0 | |
| AmalgamatedHarmonics/* | BSD-3-Clause | No artwork specific license provided |
| AmalgamatedHarmonics/DSEG*.ttf | OFL-1.1-RFN | |
| AmalgamatedHarmonics/Roboto*.ttf | Apache-2.0 | |
@@ -158,6 +166,12 @@ Below is a list of artwork licenses from plugins
| Mog/components/* | CC-BY-NC-4.0 | |
| Mog/Exo2-BoldItalic.ttf | OFL-1.1-RFN | |
| mscHack/* | BSD-3-Clause | No artwork specific license provided, see [mschack#108](https://github.com/mschack/VCV-Rack-Plugins/issues/108) |
| MSM/* | MIT | No artwork specific license provided |
| MSM/Fonts/DejaVuSansMono.ttf | Bitstream-Vera | |
| MSM/Fonts/Segment7Standard.ttf | OFL-1.1-RFN | |
| MSM/Fonts/Sudo.ttf | OFL-1.1-no-RFN | |
| nonlinearcircuits/* | CC0-1.0 | No artwork specific license provided |
| nonlinearcircuits/Audiowide-Regular.ttf | OFL-1.1-RFN | |
| Orbits/* | CC-BY-NC-ND-4.0 | |
| Orbits/fonts/ShareTechMono-Regular.ttf | OFL-1.1-RFN | |
| PathSet/* | GPL-3.0-or-later | No artwork specific license provided |


+ 1
- 0
plugins/AaronStatic

@@ -0,0 +1 @@
Subproject commit 4ace0a1789c577ee4eb12dc03da5271f80598d62

+ 1
- 0
plugins/Algoritmarte

@@ -0,0 +1 @@
Subproject commit 9d41fe882ab5029100b55c98ba7f10172d452795

+ 1
- 0
plugins/MSM

@@ -0,0 +1 @@
Subproject commit 80b4a5aa06d9c4a58f62d90fe567b28b01f6312d

+ 75
- 4
plugins/Makefile View File

@@ -231,7 +231,20 @@ PLUGIN_FILES += $(filter-out 21kHz/src/21kHz.cpp,$(wildcard 21kHz/src/*.cpp))
# --------------------------------------------------------------
# 8Mode

PLUGIN_FILES += $(wildcard 8Mode/src/*.cpp)
PLUGIN_FILES += $(filter-out 8Mode/src/plugin.cpp,$(wildcard 8Mode/src/*.cpp))

# --------------------------------------------------------------
# AlgoritmArte

PLUGIN_FILES += $(filter-out Algoritmarte/src/plugin.cpp,$(wildcard Algoritmarte/src/*.cpp))

# --------------------------------------------------------------
# Aaron Static

PLUGIN_FILES += $(wildcard AaronStatic/src/*.cpp)

# modules/types which are present in other plugins
AARONSTATIC_CUSTOM = RefreshCounter

# --------------------------------------------------------------
# AmalgamatedHarmonics
@@ -378,7 +391,7 @@ AUTINN_CUSTOM = Chord Vibrato
# --------------------------------------------------------------
# Axioma

PLUGIN_FILES += $(wildcard Axioma/src/*.cpp)
PLUGIN_FILES += $(filter-out Axioma/src/plugin.cpp,$(wildcard Axioma/src/*.cpp))

# --------------------------------------------------------------
# BaconPlugs
@@ -668,6 +681,19 @@ PLUGIN_FILES += $(wildcard mscHack/src/*.cpp)
# modules/types which are present in other plugins
MSCHACK_CUSTOM_PER_FILE = MAIN_SYNC_CLOCK FILTER_STRUCT FILTER_PARAM_STRUCT OSC_PARAM_STRUCT PHRASE_CHANGE_STRUCT

# --------------------------------------------------------------
# MSM

PLUGIN_FILES += $(filter-out MSM/src/MSM.cpp,$(wildcard MSM/src/*.cpp))

# modules/types which are present in other plugins
MSM_CUSTOM = ADSR BlankPanel Delay LFO LowFrequencyOscillator Mult Noise OP VCA VCO sawTable triTable

# --------------------------------------------------------------
# Nonlinear Circuits

PLUGIN_FILES += $(filter-out nonlinearcircuits/src/NLC.cpp,$(wildcard nonlinearcircuits/src/*.cpp))

# --------------------------------------------------------------
# Orbits

@@ -946,7 +972,20 @@ else
PLUGIN_LIST = $(subst /plugin.json,,$(wildcard */plugin.json))
endif

UNWANTED_FILES = HetrickCV/res/illustrator - deprecated/MyModule.svg
UNWANTED_FILES = HetrickCV/res/illustrator - deprecated/MyModule.svg
UNWANTED_FILES += nonlinearcircuits/res/NLC - 1050 MIXER SEQUENCER.svg
UNWANTED_FILES += 1050 MIXER SEQUENCER.svg
UNWANTED_FILES += 32to1.svg
UNWANTED_FILES += 4seq.svg
UNWANTED_FILES += 8 BIT CIPHER.svg
UNWANTED_FILES += DIVIDE & CONQUER.svg
UNWANTED_FILES += DIVINE CMOS.svg
UNWANTED_FILES += GENiE.svg
UNWANTED_FILES += NEURON.svg
UNWANTED_FILES += NUMBERWANG.svg
UNWANTED_FILES += ROUTER.svg
UNWANTED_FILES += SEGUE.svg
UNWANTED_FILES += STATUES.svg

RESOURCE_FILES = \
$(filter-out $(UNWANTED_FILES), \
@@ -969,6 +1008,7 @@ RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityPresets
RESOURCE_FILES += MindMeldModular/res/ShapeMaster/CommunityShapes
RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldPresets
RESOURCE_FILES += MindMeldModular/res/ShapeMaster/MindMeldShapes
RESOURCE_FILES += nonlinearcircuits/res

# MOD builds only have LV2 FX variant for now
ifeq ($(MOD_BUILD),true)
@@ -1156,6 +1196,21 @@ $(BUILD_DIR)/8Mode/%.cpp.o: 8Mode/%.cpp
$(foreach m,$(8MODE_CUSTOM),$(call custom_module_names,$(m),8Mode)) \
-DpluginInstance=pluginInstance__8Mode

$(BUILD_DIR)/AaronStatic/%.cpp.o: AaronStatic/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(AARONSTATIC_CUSTOM),$(call custom_module_names,$(m),AaronStatic)) \
-DpluginInstance=pluginInstance__AaronStatic \
-Dinit=init__AaronStatic

$(BUILD_DIR)/Algoritmarte/%.cpp.o: Algoritmarte/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(ALGORITMARTE_CUSTOM),$(call custom_module_names,$(m),Algoritmarte)) \
-DpluginInstance=pluginInstance__Algoritmarte

$(BUILD_DIR)/AmalgamatedHarmonics/%.cpp.o: AmalgamatedHarmonics/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
@@ -1293,7 +1348,8 @@ $(BUILD_DIR)/Dintree/%.cpp.o: Dintree/%.cpp
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(DINTREE_CUSTOM),$(call custom_module_names,$(m),Dintree)) \
-DpluginInstance=pluginInstance__Dintree
-DpluginInstance=pluginInstance__Dintree \
-DSKIP_MINGW_FORMAT

$(BUILD_DIR)/DrumKit/%.cpp.o: DrumKit/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@@ -1546,6 +1602,21 @@ $(BUILD_DIR)/mscHack/%.cpp.o: mscHack/%.cpp
-Wno-non-c-typedef-for-linkage \
-Wno-unused-but-set-variable

$(BUILD_DIR)/MSM/%.cpp.o: MSM/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(MSM_CUSTOM),$(call custom_module_names,$(m),MSM)) \
-DpluginInstance=pluginInstance__MSM \
-DDARKTHEME

$(BUILD_DIR)/nonlinearcircuits/%.cpp.o: nonlinearcircuits/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \
$(foreach m,$(NONLINEARCIRCUITS_CUSTOM),$(call custom_module_names,$(m),nonlinearcircuits)) \
-DpluginInstance=pluginInstance__nonlinearcircuits

$(BUILD_DIR)/Orbits/%.cpp.o: Orbits/%.cpp
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)"
@echo "Compiling $<"


+ 1
- 0
plugins/nonlinearcircuits

@@ -0,0 +1 @@
Subproject commit d7c3763ba3f801a3cfe98c49dfb7419a1477fd46

+ 164
- 0
plugins/plugins.cpp View File

@@ -30,6 +30,12 @@
// 8Mode
#include "8Mode/src/8mode.hpp"

// Aaron Static
#include "AaronStatic/src/plugin.hpp"

// Algoritmarte
#include "Algoritmarte/src/plugin.hpp"

// AmalgamatedHarmonics
#include "AmalgamatedHarmonics/src/AH.hpp"

@@ -562,6 +568,51 @@ extern Model* modelAlienz;
extern Model* modelOSC_WaveMorph_3;
extern Model* modelMaude_221;

// MSM
/* NOTE too much noise in original include, do this a different way
// #include "MSM/src/MSM.hpp"
*/
#define modelADSR modelMSMADSR
#define modelBlankPanel modelMSMBlankPanel
#define modelDelay modelMSMDelay
#define modelLFO modelMSMLFO
#define modelMult modelMSMMult
#define modelNoise modelMSMNoise
#define modelVCA modelMSMVCA
#define modelVCO modelMSMVCO
extern Model* modelVCO;
extern Model* modelBVCO;
extern Model* modelExperimentalVCO;
extern Model* modelNoise;
extern Model* modelLFO;
extern Model* modelVCA;
extern Model* modelADSR;
extern Model* modelDelay;
extern Model* modelWaveShaper;
extern Model* modelWavefolder;
extern Model* modelBitcrusher;
extern Model* modelPhaserModule;
extern Model* modelMorpher;
extern Model* modelRingMod;
extern Model* modelRandomSource;
extern Model* modelMult;
extern Model* modelCrazyMult;
extern Model* modelFade;
extern Model* modelSimpleSlider;
extern Model* modelxseq;
extern Model* modelBlankPanel;
#undef modelADSR
#undef modelBlankPanel
#undef modelDelay
#undef modelLFO
#undef modelMult
#undef modelNoise
#undef modelVCA
#undef modelVCO

// Nonlinear Circuits
#include "nonlinearcircuits/src/NLC.hpp"

// Orbits
#include "Orbits/src/plugin.hpp"

@@ -649,6 +700,8 @@ Plugin* pluginInstance__Cardinal;
#ifndef NOPLUGINS
Plugin* pluginInstance__21kHz;
Plugin* pluginInstance__8Mode;
extern Plugin* pluginInstance__AaronStatic;
Plugin* pluginInstance__Algoritmarte;
Plugin* pluginInstance__AmalgamatedHarmonics;
Plugin* pluginInstance__AnimatedCircuits;
Plugin* pluginInstance__Aria;
@@ -690,6 +743,8 @@ Plugin* pluginInstance__ML;
Plugin* pluginInstance__MockbaModular;
Plugin* pluginInstance__Mog;
extern Plugin* pluginInstance__mscHack;
Plugin* pluginInstance__MSM;
Plugin* pluginInstance__nonlinearcircuits;
Plugin* pluginInstance__Orbits;
Plugin* pluginInstance__PathSet;
Plugin* pluginInstance__Prism;
@@ -870,6 +925,39 @@ static void initStatic__8Mode()
}
}

static void initStatic__AaronStatic()
{
Plugin* const p = new Plugin;
pluginInstance__AaronStatic = p;

const StaticPluginLoader spl(p, "AaronStatic");
if (spl.ok())
{
p->addModel(modelChordCV);
p->addModel(modelScaleCV);
p->addModel(modelRandomNoteCV);
p->addModel(modelDiatonicCV);
}
}

static void initStatic__Algoritmarte()
{
Plugin* const p = new Plugin;
pluginInstance__Algoritmarte = p;

const StaticPluginLoader spl(p, "Algoritmarte");
if (spl.ok())
{
p->addModel(modelClockkky);
p->addModel(modelPlanetz);
p->addModel(modelMusiFrog);
p->addModel(modelZefiro);
p->addModel(modelHoldMeTight);
p->addModel(modelCyclicCA);
p->addModel(modelMusiMath);
}
}

static void initStatic__AmalgamatedHarmonics()
{
Plugin* const p = new Plugin;
@@ -2090,6 +2178,78 @@ static void initStatic__mscHack()
}
}

static void initStatic__MSM()
{
Plugin* const p = new Plugin;
pluginInstance__MSM = p;

const StaticPluginLoader spl(p, "MSM");
if (spl.ok())
{
#define modelADSR modelMSMADSR
#define modelBlankPanel modelMSMBlankPanel
#define modelDelay modelMSMDelay
#define modelLFO modelMSMLFO
#define modelMult modelMSMMult
#define modelNoise modelMSMNoise
#define modelVCA modelMSMVCA
#define modelVCO modelMSMVCO
p->addModel(modelVCO);
p->addModel(modelBVCO);
p->addModel(modelExperimentalVCO);
p->addModel(modelNoise);
p->addModel(modelLFO);
p->addModel(modelVCA);
p->addModel(modelADSR);
p->addModel(modelDelay);
p->addModel(modelWaveShaper);
p->addModel(modelWavefolder);
p->addModel(modelBitcrusher);
p->addModel(modelPhaserModule);
p->addModel(modelMorpher);
p->addModel(modelRingMod);
p->addModel(modelRandomSource);
p->addModel(modelMult);
p->addModel(modelCrazyMult);
p->addModel(modelFade);
p->addModel(modelSimpleSlider);
p->addModel(modelxseq);
p->addModel(modelBlankPanel);
#undef modelADSR
#undef modelBlankPanel
#undef modelDelay
#undef modelLFO
#undef modelMult
#undef modelNoise
#undef modelVCA
#undef modelVCO
}
}

static void initStatic__nonlinearcircuits()
{
Plugin* const p = new Plugin;
pluginInstance__nonlinearcircuits = p;

const StaticPluginLoader spl(p, "nonlinearcircuits");
if (spl.ok())
{
p->addModel(model4Seq);
p->addModel(modelCipher);
p->addModel(modelBOOLs);
p->addModel(modelDivideConquer);
p->addModel(modelDivineCMOS);
p->addModel(modelDoubleNeuron);
p->addModel(modelGenie);
p->addModel(modelLetsSplosh);
p->addModel(modelNeuron);
p->addModel(modelNumberwang);
p->addModel(modelSegue);
p->addModel(modelSquidAxon);
p->addModel(modelStatues);
}
}

static void initStatic__Orbits()
{
Plugin* const p = new Plugin;
@@ -2348,6 +2508,8 @@ void initStaticPlugins()
#ifndef NOPLUGINS
initStatic__21kHz();
initStatic__8Mode();
initStatic__AaronStatic();
initStatic__Algoritmarte();
initStatic__AmalgamatedHarmonics();
initStatic__AnimatedCircuits();
initStatic__Aria();
@@ -2389,6 +2551,8 @@ void initStaticPlugins()
initStatic__MockbaModular();
initStatic__Mog();
initStatic__mscHack();
initStatic__MSM();
initStatic__nonlinearcircuits();
initStatic__Orbits();
initStatic__PathSet();
initStatic__Prism();


+ 51
- 0
src/custom/dep.cpp View File

@@ -56,6 +56,19 @@ static const struct {
{ "/21kHz/res/Panels/D_Inf.svg", {}, -1 },
{ "/21kHz/res/Panels/PalmLoop.svg", {}, -1 },
{ "/21kHz/res/Panels/TachyonEntangler.svg", {}, -1 },
// MIT
{"/AaronStatic/res/ChordCV.svg", {}, -1 },
{"/AaronStatic/res/DiatonicCV.svg", {}, -1 },
{"/AaronStatic/res/RandomNoteCV.svg", {}, -1 },
{"/AaronStatic/res/ScaleCV.svg", {}, -1 },
// GPL3.0-or-later
{ "/Algoritmarte/res/Clockkky.svg", {}, -1 },
{ "/Algoritmarte/res/CyclicCA.svg", {}, -1 },
{ "/Algoritmarte/res/HoldMeTight.svg", {}, -1 },
{ "/Algoritmarte/res/MusiFrog.svg", {}, -1 },
{ "/Algoritmarte/res/MusiMath.svg", {}, -1 },
{ "/Algoritmarte/res/Planetz.svg", {}, -1 },
{ "/Algoritmarte/res/Zefiro.svg", {}, -1 },
// Custom, runtime dark mode used with permission
{ "/AudibleInstruments/res/Blinds.svg", {}, -1 },
{ "/AudibleInstruments/res/Braids.svg", {}, -1 },
@@ -252,6 +265,20 @@ static const struct {
{ "/kocmoc/res/SKF.svg", {}, -1 },
{ "/kocmoc/res/SVF.svg", {}, -1 },
{ "/kocmoc/res/TRG.svg", {}, -1 },
// CC0-1.0
{ "/nonlinearcircuits/res/NLC - 4seq.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - 8 BIT CIPHER.svg", {}, -1 },
{ "/nonlinearcircuits/res/BOOLs2.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - DIVIDE & CONQUER.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - DIVINE CMOS.svg", {}, -1 },
{ "/nonlinearcircuits/res/DoubleNeuronRef.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - GENiE.svg", {}, -1 },
{ "/nonlinearcircuits/res/LetsSplosh.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - NEURON.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - NUMBERWANG.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - SEGUE.svg", {}, -1 },
{ "/nonlinearcircuits/res/squid-axon-papernoise-panel2.svg", {}, -1 },
{ "/nonlinearcircuits/res/NLC - STATUES.svg", {}, -1 },
// GPL-3.0-or-later
{ "/PathSet/res/AstroVibe.svg", {}, -1 },
{ "/PathSet/res/IceTray.svg", {}, -1 },
@@ -352,6 +379,29 @@ static inline bool invertPaint(NSVGshape* const shape, NSVGpaint& paint, const c
}
}

// Special case for Nonlinear Circuits
if (svgFileToInvert != nullptr && std::strncmp(svgFileToInvert, "/nonlinearcircuits/", 19) == 0)
{
switch (paint.color)
{
case 0xff9a7900:
case 0xff96782c:
case 0xff6a07ae:
case 0xffcf8044:
case 0xff2ac6ba:
case 0xff5ba85c:
case 0xffa97b00:
case 0xff9f7a00:
case 0xffff7300:
case 0xffa47b00:
case 0xffb09423:
return false;
case 0xffffffff:
paint.color = 0x00000000;
return true;
}
}

// Special case for PathSet colors
if (svgFileToInvert != nullptr && std::strncmp(svgFileToInvert, "/PathSet/", 9) == 0)
{
@@ -434,6 +484,7 @@ static inline bool invertPaint(NSVGshape* const shape, NSVGpaint& paint, const c
case 0xff0095fe:
case 0xff4d9a4d:
case 0xff4d4d9a:
case 0xff0187fc:
return false;
// pure black (convert to not quite pure white)
case 0xff000000:


Loading…
Cancel
Save