pub struct PinstarState {Show 58 fields
pub path: PathBuf,
pub format: SupportedFormat,
pub data: CanvasData,
pub settings: Settings,
pub viewport_x: f64,
pub viewport_y: f64,
pub zoom: f64,
pub selection: Selection<String>,
pub selected_edge_id: Option<String>,
pub floating_editor: Option<TextArea<'static>>,
pub raw_editor: TextArea<'static>,
pub editor_focus: bool,
pub mouse_pos: Option<(u16, u16)>,
pub last_mouse_pos: Option<(u16, u16)>,
pub last_click: Option<(u16, u16, Instant)>,
pub context_menu: Option<PinstarContextMenu>,
pub context_menu_pos: (f64, f64),
pub connection_source_id: Option<String>,
pub resizing_node_id: Option<String>,
pub is_dragging_resize_handle: bool,
pub deleting_connection_source_id: Option<String>,
pub trigger_ext_editor: bool,
pub trigger_whole_file_editor: bool,
pub trigger_image_picker: bool,
pub show_editor_pane: bool,
pub drag_start_pos: Option<(f64, f64)>,
pub rename_popup: Option<TextArea<'static>>,
pub ext_editor_enabled: bool,
pub last_mouse_canvas_pos: Option<(f64, f64)>,
pub drag_captured_nodes: HashSet<String>,
pub drag_group_children: HashSet<String>,
pub show_grid: bool,
pub mouse_selecting: bool,
pub mouse_dragged: bool,
pub locked: bool,
pub last_modified: SystemTime,
pub orthogonal_connections: bool,
pub show_help: bool,
pub help_tab: PinstarHelpTab,
pub help_scroll: u16,
pub select_rect_start: Option<(f64, f64)>,
pub select_rect_end: Option<(f64, f64)>,
pub has_layout_override: bool,
pub undo_stack: Vec<PinstarSnapshot>,
pub redo_stack: Vec<PinstarSnapshot>,
pub rename_popup_rect: Option<Rect>,
pub edge_overlay_rect: Option<Rect>,
pub help_requested: bool,
pub footer_hint: String,
pub last_area: Rect,
pub is_panning: bool,
pub marquee: MarqueeState,
pub right_down_screen: Option<(u16, u16)>,
pub last_zoom_at: Option<Instant>,
pub has_dragged: bool,
pub image_cache: ImageCache,
pub image_picker: Option<Picker>,
pub image_decode_tx: Option<Sender<ImageJob>>,
/* private fields */
}Fields§
§path: PathBuf§format: SupportedFormat§data: CanvasData§settings: Settings§viewport_x: f64§viewport_y: f64§zoom: f64§selection: Selection<String>§selected_edge_id: Option<String>§floating_editor: Option<TextArea<'static>>§raw_editor: TextArea<'static>§editor_focus: bool§mouse_pos: Option<(u16, u16)>§last_mouse_pos: Option<(u16, u16)>§last_click: Option<(u16, u16, Instant)>§connection_source_id: Option<String>§resizing_node_id: Option<String>§is_dragging_resize_handle: bool§deleting_connection_source_id: Option<String>§trigger_ext_editor: bool§trigger_whole_file_editor: bool§trigger_image_picker: bool§show_editor_pane: bool§drag_start_pos: Option<(f64, f64)>§rename_popup: Option<TextArea<'static>>§ext_editor_enabled: bool§last_mouse_canvas_pos: Option<(f64, f64)>§drag_captured_nodes: HashSet<String>§drag_group_children: HashSet<String>§show_grid: bool§mouse_selecting: bool§mouse_dragged: bool§locked: bool§last_modified: SystemTime§orthogonal_connections: bool§show_help: bool§help_tab: PinstarHelpTab§help_scroll: u16§select_rect_start: Option<(f64, f64)>§select_rect_end: Option<(f64, f64)>§has_layout_override: bool§undo_stack: Vec<PinstarSnapshot>§redo_stack: Vec<PinstarSnapshot>§rename_popup_rect: Option<Rect>§edge_overlay_rect: Option<Rect>§help_requested: bool§last_area: Rect§is_panning: bool§marquee: MarqueeState§right_down_screen: Option<(u16, u16)>§last_zoom_at: Option<Instant>§has_dragged: bool§image_cache: ImageCache§image_picker: Option<Picker>§image_decode_tx: Option<Sender<ImageJob>>Implementations§
Source§impl PinstarState
impl PinstarState
pub fn load(path: &Path) -> Result<Self>
Sourcepub fn set_save_handler(
&mut self,
handler: impl Fn(&Path, &str, &str) -> Result<()> + Send + Sync + 'static,
)
pub fn set_save_handler( &mut self, handler: impl Fn(&Path, &str, &str) -> Result<()> + Send + Sync + 'static, )
Let a host validate the loaded source and persist every eager save.
pub fn save(&mut self) -> Result<()>
pub fn take_save_error(&mut self) -> Option<String>
pub fn last_save_failed(&self) -> bool
Sourcepub fn active_mode_message(&self) -> Option<&'static str>
pub fn active_mode_message(&self) -> Option<&'static str>
Returns the header-bar status message for the active transient mode (connection / delete-connection / resize), or None when idle.
pub fn record_undo_state(&mut self)
pub fn undo(&mut self) -> Result<()>
pub fn redo(&mut self) -> Result<()>
pub fn reload(&mut self) -> Result<()>
pub fn all_selected_node_ids(&self) -> HashSet<String>
pub fn select_nodes_in_rect(&mut self, x1: f64, y1: f64, x2: f64, y2: f64)
pub fn delete_selected_node(&mut self)
pub fn get_edge_segments( &self, edge: &CanvasEdge, ) -> Option<Vec<(f64, f64, f64, f64)>>
pub fn select_edge_at(&mut self, cx: f64, cy: f64) -> Option<String>
pub fn set_edge_color(&mut self, color: Option<String>)
pub fn set_edge_style(&mut self, style: EdgeStyle)
Opens the edge context menu centered in the given view area.
Sourcepub fn selected_node_edges(&self) -> Vec<&CanvasEdge>
pub fn selected_node_edges(&self) -> Vec<&CanvasEdge>
Edges connected to the currently selected node, in stable storage order. Used by the edge-list overlay and number-key selection.
Sourcepub fn select_edge_of_selected_node(&mut self, index: usize) -> Option<String>
pub fn select_edge_of_selected_node(&mut self, index: usize) -> Option<String>
Selects the edge at the given 1-based index among the selected node’s connected edges (deselecting the node). Returns its id, or None if out of range / no node selected.
Sourcepub fn is_view_transforming(&self) -> bool
pub fn is_view_transforming(&self) -> bool
Returns true while the view is undergoing continuous transforms (pan, zoom, node resize, connection drawing). During these states the pixel image render is suppressed to avoid churning the encode worker; cheap placeholder text is shown instead.
pub fn sync_from_raw_editor(&mut self) -> Result<()>
pub fn sync_to_raw_editor(&mut self)
pub fn pan(&mut self, dx: f64, dy: f64)
pub fn zoom_in(&mut self)
pub fn zoom_out(&mut self)
pub fn fit_to_view(&mut self, area: Rect)
pub fn screen_to_canvas(&self, sx: u16, sy: u16, area: Rect) -> (f64, f64)
pub fn node_at(&self, x: f64, y: f64) -> Option<String>
pub fn select_node_at(&mut self, x: f64, y: f64) -> Option<String>
pub fn center_on_selected(&mut self)
pub fn select_node_in_direction(&mut self, dx: f64, dy: f64)
pub fn toggle_editor(&mut self)
Sourcepub fn open_rename_popup(&mut self, mode: RenameMode)
pub fn open_rename_popup(&mut self, mode: RenameMode)
Open the rename popup seeded from the selected node.
Title mode renames the node title (clin); Id mode renames the node
id and rewires edges (standalone bin).
pub fn rename_node_title(&mut self, new_title: String)
pub fn rename_node_id(&mut self, new_id: String)
pub fn start_resize(&mut self)
pub fn start_delete_connection(&mut self)
pub fn delete_node_connections(&mut self)
pub fn set_node_color(&mut self, color: Option<String>)
pub fn set_node_shape(&mut self, shape: NodeShape)
pub fn set_orientation(&mut self, orientation: DiagramOrientation)
pub fn cycle_orientation(&mut self)
pub fn add_text_node(&mut self, x: f64, y: f64)
pub fn add_group(&mut self, x: f64, y: f64)
Sourcepub fn add_image_node_with(&mut self, path: PathBuf, x: f64, y: f64)
pub fn add_image_node_with(&mut self, path: PathBuf, x: f64, y: f64)
Add an image file node at the given position. The host has already resolved the file path via its picker dialog.
pub fn start_connection(&mut self)
pub fn finish_connection(&mut self, target_id: &str)
pub fn finish_delete_connection(&mut self, target_id: &str)
pub fn resize_selected_node(&mut self, dw: f64, dh: f64)
pub fn capture_drag_nodes(&mut self)
pub fn capture_group_children(&mut self)
pub fn move_selected_node(&mut self, dx: f64, dy: f64)
Auto Trait Implementations§
impl !Freeze for PinstarState
impl !RefUnwindSafe for PinstarState
impl !Sync for PinstarState
impl !UnwindSafe for PinstarState
impl Send for PinstarState
impl Unpin for PinstarState
impl UnsafeUnpin for PinstarState
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
Source§type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
Source§fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T, C> ComponentsInto<C> for T
impl<T, C> ComponentsInto<C> for T
Source§fn components_into(self) -> C
fn components_into(self) -> C
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more