mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-27 16:38:12 +08:00
* Add AI Artist layer * WIP add a button to download the rendered folder under an AI Artist layer * Successfully download the correct image * Break out image downloading JS into helper function * Change file download from using data URLs to blob URLs * WIP rasterize to blob * Remove dimensions from AI Artist layer * Successfully draw rasterized image on layer after calculation * Working txt2img generation based on user prompt * Add img2img and the main parameters * Fix ability to rasterize multi-depth documents with blob URL images by switching them to base64 * Fix test * Rasterize with artboard background color * Allow aspect ratio stretch of AI Artist images * Add automatic resolution choosing * Add a terminate button, and make the lifecycle more robust * Add negative prompt * Add range bounds for parameter inputs * Add seed * Add tiling and restore faces * Add server status check, server hostname customization, and resizing layer to fit AI Artist resolution * Fix background color of infinite canvas rasterization * Escape prompt text sent in the JSON * Revoke blob URLs when cleared/replaced to reduce memory leak * Fix welcome screen logo color * Add PreferencesMessageHandler * Add persistent storage of preferences * Fix crash introduced in previous commit when moving mouse on page load * Add tooltips to the AI Artist layer properties * Integrate AI Artist tool into the raster section of the tool shelf * Add a refresh button to the connection status * Fix crash when generating and switching to a different document tab * Add persistent image storage to AI Artist layers and fix duplication bugs * Add a generate with random seed button * Simplify and standardize message names * Majorly improve robustness of networking code * Fix race condition causing default server hostname to show disconnected when app loads with AI Artist layer selected (probably, not confirmed fixed) * Clean up messages and function calls by changing arguments into structs * Update API to more recent server commit * Add support for picking the sampling method * Add machinery for filtering selected layers with type * Replace placeholder button icons * Improve the random icon by tilting the dice * Use selected_layers() instead of repeating that code * Fix borrow error * Change message flow in progress towards fixing #797 * Allow loading image on non-active document (fixes #797) * Reduce code duplication with rasterization * Add AI Artist tool and layer icons, and remove ugly node layer icon style * Rename "AI Artist" codename to "Imaginate" feature name Co-authored-by: otdavies <oliver@psyfer.io> Co-authored-by: 0hypercube <0hypercube@gmail.com>
106 lines
3.2 KiB
Rust
106 lines
3.2 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::fmt;
|
|
|
|
/// Describes how overlapping SVG elements should be blended together.
|
|
/// See the [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode#examples) for examples.
|
|
#[derive(PartialEq, Eq, Copy, Clone, Debug, Serialize, Deserialize)]
|
|
pub enum BlendMode {
|
|
// Basic group
|
|
Normal,
|
|
// Not supported by SVG, but we should someday support: Dissolve
|
|
|
|
// Darken group
|
|
Multiply,
|
|
Darken,
|
|
ColorBurn,
|
|
// Not supported by SVG, but we should someday support: Linear Burn, Darker Color
|
|
|
|
// Lighten group
|
|
Screen,
|
|
Lighten,
|
|
ColorDodge,
|
|
// Not supported by SVG, but we should someday support: Linear Dodge (Add), Lighter Color
|
|
|
|
// Contrast group
|
|
Overlay,
|
|
SoftLight,
|
|
HardLight,
|
|
// Not supported by SVG, but we should someday support: Vivid Light, Linear Light, Pin Light, Hard Mix
|
|
|
|
// Inversion group
|
|
Difference,
|
|
Exclusion,
|
|
// Not supported by SVG, but we should someday support: Subtract, Divide
|
|
|
|
// Component group
|
|
Hue,
|
|
Saturation,
|
|
Color,
|
|
Luminosity,
|
|
}
|
|
|
|
impl fmt::Display for BlendMode {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
BlendMode::Normal => write!(f, "Normal"),
|
|
|
|
BlendMode::Multiply => write!(f, "Multiply"),
|
|
BlendMode::Darken => write!(f, "Darken"),
|
|
BlendMode::ColorBurn => write!(f, "Color Burn"),
|
|
|
|
BlendMode::Screen => write!(f, "Screen"),
|
|
BlendMode::Lighten => write!(f, "Lighten"),
|
|
BlendMode::ColorDodge => write!(f, "Color Dodge"),
|
|
|
|
BlendMode::Overlay => write!(f, "Overlay"),
|
|
BlendMode::SoftLight => write!(f, "Soft Light"),
|
|
BlendMode::HardLight => write!(f, "Hard Light"),
|
|
|
|
BlendMode::Difference => write!(f, "Difference"),
|
|
BlendMode::Exclusion => write!(f, "Exclusion"),
|
|
|
|
BlendMode::Hue => write!(f, "Hue"),
|
|
BlendMode::Saturation => write!(f, "Saturation"),
|
|
BlendMode::Color => write!(f, "Color"),
|
|
BlendMode::Luminosity => write!(f, "Luminosity"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl BlendMode {
|
|
/// Convert the enum to the CSS string for the blend mode.
|
|
/// [Read more](https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode#values)
|
|
pub fn to_svg_style_name(&self) -> &str {
|
|
match self {
|
|
BlendMode::Normal => "normal",
|
|
BlendMode::Multiply => "multiply",
|
|
BlendMode::Darken => "darken",
|
|
BlendMode::ColorBurn => "color-burn",
|
|
BlendMode::Screen => "screen",
|
|
BlendMode::Lighten => "lighten",
|
|
BlendMode::ColorDodge => "color-dodge",
|
|
BlendMode::Overlay => "overlay",
|
|
BlendMode::SoftLight => "soft-light",
|
|
BlendMode::HardLight => "hard-light",
|
|
BlendMode::Difference => "difference",
|
|
BlendMode::Exclusion => "exclusion",
|
|
BlendMode::Hue => "hue",
|
|
BlendMode::Saturation => "saturation",
|
|
BlendMode::Color => "color",
|
|
BlendMode::Luminosity => "luminosity",
|
|
}
|
|
}
|
|
|
|
/// List of all the blend modes in their conventional ordering and grouping.
|
|
pub fn list_modes_in_groups() -> [&'static [BlendMode]; 6] {
|
|
[
|
|
&[BlendMode::Normal],
|
|
&[BlendMode::Multiply, BlendMode::Darken, BlendMode::ColorBurn],
|
|
&[BlendMode::Screen, BlendMode::Lighten, BlendMode::ColorDodge],
|
|
&[BlendMode::Overlay, BlendMode::SoftLight, BlendMode::HardLight],
|
|
&[BlendMode::Difference, BlendMode::Exclusion],
|
|
&[BlendMode::Hue, BlendMode::Saturation, BlendMode::Color, BlendMode::Luminosity],
|
|
]
|
|
}
|
|
}
|