| // Copyright 2013 The Flutter Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | part of dart.ui; | 
 |  | 
 | /// Algorithms to use when painting on the canvas. | 
 | /// | 
 | /// When drawing a shape or image onto a canvas, different algorithms can be | 
 | /// used to blend the pixels. The different values of [BlendMode] specify | 
 | /// different such algorithms. | 
 | /// | 
 | /// Each algorithm has two inputs, the _source_, which is the image being drawn, | 
 | /// and the _destination_, which is the image into which the source image is | 
 | /// being composited. The destination is often thought of as the _background_. | 
 | /// The source and destination both have four color channels, the red, green, | 
 | /// blue, and alpha channels. These are typically represented as numbers in the | 
 | /// range 0.0 to 1.0. The output of the algorithm also has these same four | 
 | /// channels, with values computed from the source and destination. | 
 | /// | 
 | /// The documentation of each value below describes how the algorithm works. In | 
 | /// each case, an image shows the output of blending a source image with a | 
 | /// destination image. In the images below, the destination is represented by an | 
 | /// image with horizontal lines and an opaque landscape photograph, and the | 
 | /// source is represented by an image with vertical lines (the same lines but | 
 | /// rotated) and a bird clip-art image. The [src] mode shows only the source | 
 | /// image, and the [dst] mode shows only the destination image. In the | 
 | /// documentation below, the transparency is illustrated by a checkerboard | 
 | /// pattern. The [clear] mode drops both the source and destination, resulting | 
 | /// in an output that is entirely transparent (illustrated by a solid | 
 | /// checkerboard pattern). | 
 | /// | 
 | /// The horizontal and vertical bars in these images show the red, green, and | 
 | /// blue channels with varying opacity levels, then all three color channels | 
 | /// together with those same varying opacity levels, then all three color | 
 | /// channels set to zero with those varying opacity levels, then two bars showing | 
 | /// a red/green/blue repeating gradient, the first with full opacity and the | 
 | /// second with partial opacity, and finally a bar with the three color channels | 
 | /// set to zero but the opacity varying in a repeating gradient. | 
 | /// | 
 | /// ## Application to the [Canvas] API | 
 | /// | 
 | /// When using [Canvas.saveLayer] and [Canvas.restore], the blend mode of the | 
 | /// [Paint] given to the [Canvas.saveLayer] will be applied when | 
 | /// [Canvas.restore] is called. Each call to [Canvas.saveLayer] introduces a new | 
 | /// layer onto which shapes and images are painted; when [Canvas.restore] is | 
 | /// called, that layer is then composited onto the parent layer, with the source | 
 | /// being the most-recently-drawn shapes and images, and the destination being | 
 | /// the parent layer. (For the first [Canvas.saveLayer] call, the parent layer | 
 | /// is the canvas itself.) | 
 | /// | 
 | /// See also: | 
 | /// | 
 | ///  * [Paint.blendMode], which uses [BlendMode] to define the compositing | 
 | ///    strategy. | 
 | enum BlendMode { | 
 |   // This list comes from Skia's SkXfermode.h and the values (order) should be | 
 |   // kept in sync. | 
 |   // See: https://skia.org/user/api/skpaint#SkXfermode | 
 |  | 
 |   /// Drop both the source and destination images, leaving nothing. | 
 |   /// | 
 |   /// This corresponds to the "clear" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   clear, | 
 |  | 
 |   /// Drop the destination image, only paint the source image. | 
 |   /// | 
 |   /// Conceptually, the destination is first cleared, then the source image is | 
 |   /// painted. | 
 |   /// | 
 |   /// This corresponds to the "Copy" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   src, | 
 |  | 
 |   /// Drop the source image, only paint the destination image. | 
 |   /// | 
 |   /// Conceptually, the source image is discarded, leaving the destination | 
 |   /// untouched. | 
 |   /// | 
 |   /// This corresponds to the "Destination" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   dst, | 
 |  | 
 |   /// Composite the source image over the destination image. | 
 |   /// | 
 |   /// This is the default value. It represents the most intuitive case, where | 
 |   /// shapes are painted on top of what is below, with transparent areas showing | 
 |   /// the destination layer. | 
 |   /// | 
 |   /// This corresponds to the "Source over Destination" Porter-Duff operator, | 
 |   /// also known as the Painter's Algorithm. | 
 |   /// | 
 |   ///  | 
 |   srcOver, | 
 |  | 
 |   /// Composite the source image under the destination image. | 
 |   /// | 
 |   /// This is the opposite of [srcOver]. | 
 |   /// | 
 |   /// This corresponds to the "Destination over Source" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// This is useful when the source image should have been painted before the | 
 |   /// destination image, but could not be. | 
 |   dstOver, | 
 |  | 
 |   /// Show the source image, but only where the two images overlap. The | 
 |   /// destination image is not rendered, it is treated merely as a mask. The | 
 |   /// color channels of the destination are ignored, only the opacity has an | 
 |   /// effect. | 
 |   /// | 
 |   /// To show the destination image instead, consider [dstIn]. | 
 |   /// | 
 |   /// To reverse the semantic of the mask (only showing the source where the | 
 |   /// destination is absent, rather than where it is present), consider | 
 |   /// [srcOut]. | 
 |   /// | 
 |   /// This corresponds to the "Source in Destination" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   srcIn, | 
 |  | 
 |   /// Show the destination image, but only where the two images overlap. The | 
 |   /// source image is not rendered, it is treated merely as a mask. The color | 
 |   /// channels of the source are ignored, only the opacity has an effect. | 
 |   /// | 
 |   /// To show the source image instead, consider [srcIn]. | 
 |   /// | 
 |   /// To reverse the semantic of the mask (only showing the source where the | 
 |   /// destination is present, rather than where it is absent), consider [dstOut]. | 
 |   /// | 
 |   /// This corresponds to the "Destination in Source" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   dstIn, | 
 |  | 
 |   /// Show the source image, but only where the two images do not overlap. The | 
 |   /// destination image is not rendered, it is treated merely as a mask. The color | 
 |   /// channels of the destination are ignored, only the opacity has an effect. | 
 |   /// | 
 |   /// To show the destination image instead, consider [dstOut]. | 
 |   /// | 
 |   /// To reverse the semantic of the mask (only showing the source where the | 
 |   /// destination is present, rather than where it is absent), consider [srcIn]. | 
 |   /// | 
 |   /// This corresponds to the "Source out Destination" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   srcOut, | 
 |  | 
 |   /// Show the destination image, but only where the two images do not overlap. The | 
 |   /// source image is not rendered, it is treated merely as a mask. The color | 
 |   /// channels of the source are ignored, only the opacity has an effect. | 
 |   /// | 
 |   /// To show the source image instead, consider [srcOut]. | 
 |   /// | 
 |   /// To reverse the semantic of the mask (only showing the destination where the | 
 |   /// source is present, rather than where it is absent), consider [dstIn]. | 
 |   /// | 
 |   /// This corresponds to the "Destination out Source" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   dstOut, | 
 |  | 
 |   /// Composite the source image over the destination image, but only where it | 
 |   /// overlaps the destination. | 
 |   /// | 
 |   /// This corresponds to the "Source atop Destination" Porter-Duff operator. | 
 |   /// | 
 |   /// This is essentially the [srcOver] operator, but with the output's opacity | 
 |   /// channel being set to that of the destination image instead of being a | 
 |   /// combination of both image's opacity channels. | 
 |   /// | 
 |   /// For a variant with the destination on top instead of the source, see | 
 |   /// [dstATop]. | 
 |   /// | 
 |   ///  | 
 |   srcATop, | 
 |  | 
 |   /// Composite the destination image over the source image, but only where it | 
 |   /// overlaps the source. | 
 |   /// | 
 |   /// This corresponds to the "Destination atop Source" Porter-Duff operator. | 
 |   /// | 
 |   /// This is essentially the [dstOver] operator, but with the output's opacity | 
 |   /// channel being set to that of the source image instead of being a | 
 |   /// combination of both image's opacity channels. | 
 |   /// | 
 |   /// For a variant with the source on top instead of the destination, see | 
 |   /// [srcATop]. | 
 |   /// | 
 |   ///  | 
 |   dstATop, | 
 |  | 
 |   /// Apply a bitwise `xor` operator to the source and destination images. This | 
 |   /// leaves transparency where they would overlap. | 
 |   /// | 
 |   /// This corresponds to the "Source xor Destination" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   xor, | 
 |  | 
 |   /// Sum the components of the source and destination images. | 
 |   /// | 
 |   /// Transparency in a pixel of one of the images reduces the contribution of | 
 |   /// that image to the corresponding output pixel, as if the color of that | 
 |   /// pixel in that image was darker. | 
 |   /// | 
 |   /// This corresponds to the "Source plus Destination" Porter-Duff operator. | 
 |   /// | 
 |   ///  | 
 |   plus, | 
 |  | 
 |   /// Multiply the color components of the source and destination images. | 
 |   /// | 
 |   /// This can only result in the same or darker colors (multiplying by white, | 
 |   /// 1.0, results in no change; multiplying by black, 0.0, results in black). | 
 |   /// | 
 |   /// When compositing two opaque images, this has similar effect to overlapping | 
 |   /// two transparencies on a projector. | 
 |   /// | 
 |   /// For a variant that also multiplies the alpha channel, consider [multiply]. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [screen], which does a similar computation but inverted. | 
 |   ///  * [overlay], which combines [modulate] and [screen] to favor the | 
 |   ///    destination image. | 
 |   ///  * [hardLight], which combines [modulate] and [screen] to favor the | 
 |   ///    source image. | 
 |   modulate, | 
 |  | 
 |   // Following blend modes are defined in the CSS Compositing standard. | 
 |  | 
 |   /// Multiply the inverse of the components of the source and destination | 
 |   /// images, and inverse the result. | 
 |   /// | 
 |   /// Inverting the components means that a fully saturated channel (opaque | 
 |   /// white) is treated as the value 0.0, and values normally treated as 0.0 | 
 |   /// (black, transparent) are treated as 1.0. | 
 |   /// | 
 |   /// This is essentially the same as [modulate] blend mode, but with the values | 
 |   /// of the colors inverted before the multiplication and the result being | 
 |   /// inverted back before rendering. | 
 |   /// | 
 |   /// This can only result in the same or lighter colors (multiplying by black, | 
 |   /// 1.0, results in no change; multiplying by white, 0.0, results in white). | 
 |   /// Similarly, in the alpha channel, it can only result in more opaque colors. | 
 |   /// | 
 |   /// This has similar effect to two projectors displaying their images on the | 
 |   /// same screen simultaneously. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [modulate], which does a similar computation but without inverting the | 
 |   ///    values. | 
 |   ///  * [overlay], which combines [modulate] and [screen] to favor the | 
 |   ///    destination image. | 
 |   ///  * [hardLight], which combines [modulate] and [screen] to favor the | 
 |   ///    source image. | 
 |   screen, // The last coeff mode. | 
 |  | 
 |   /// Multiply the components of the source and destination images after | 
 |   /// adjusting them to favor the destination. | 
 |   /// | 
 |   /// Specifically, if the destination value is smaller, this multiplies it with | 
 |   /// the source value, whereas is the source value is smaller, it multiplies | 
 |   /// the inverse of the source value with the inverse of the destination value, | 
 |   /// then inverts the result. | 
 |   /// | 
 |   /// Inverting the components means that a fully saturated channel (opaque | 
 |   /// white) is treated as the value 0.0, and values normally treated as 0.0 | 
 |   /// (black, transparent) are treated as 1.0. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [modulate], which always multiplies the values. | 
 |   ///  * [screen], which always multiplies the inverses of the values. | 
 |   ///  * [hardLight], which is similar to [overlay] but favors the source image | 
 |   ///    instead of the destination image. | 
 |   overlay, | 
 |  | 
 |   /// Composite the source and destination image by choosing the lowest value | 
 |   /// from each color channel. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. | 
 |   /// | 
 |   ///  | 
 |   darken, | 
 |  | 
 |   /// Composite the source and destination image by choosing the highest value | 
 |   /// from each color channel. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. | 
 |   /// | 
 |   ///  | 
 |   lighten, | 
 |  | 
 |   /// Divide the destination by the inverse of the source. | 
 |   /// | 
 |   /// Inverting the components means that a fully saturated channel (opaque | 
 |   /// white) is treated as the value 0.0, and values normally treated as 0.0 | 
 |   /// (black, transparent) are treated as 1.0. | 
 |   /// | 
 |   ///  | 
 |   colorDodge, | 
 |  | 
 |   /// Divide the inverse of the destination by the source, and inverse the result. | 
 |   /// | 
 |   /// Inverting the components means that a fully saturated channel (opaque | 
 |   /// white) is treated as the value 0.0, and values normally treated as 0.0 | 
 |   /// (black, transparent) are treated as 1.0. | 
 |   /// | 
 |   ///  | 
 |   colorBurn, | 
 |  | 
 |   /// Multiply the components of the source and destination images after | 
 |   /// adjusting them to favor the source. | 
 |   /// | 
 |   /// Specifically, if the source value is smaller, this multiplies it with the | 
 |   /// destination value, whereas is the destination value is smaller, it | 
 |   /// multiplies the inverse of the destination value with the inverse of the | 
 |   /// source value, then inverts the result. | 
 |   /// | 
 |   /// Inverting the components means that a fully saturated channel (opaque | 
 |   /// white) is treated as the value 0.0, and values normally treated as 0.0 | 
 |   /// (black, transparent) are treated as 1.0. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [modulate], which always multiplies the values. | 
 |   ///  * [screen], which always multiplies the inverses of the values. | 
 |   ///  * [overlay], which is similar to [hardLight] but favors the destination | 
 |   ///    image instead of the source image. | 
 |   hardLight, | 
 |  | 
 |   /// Use [colorDodge] for source values below 0.5 and [colorBurn] for source | 
 |   /// values above 0.5. | 
 |   /// | 
 |   /// This results in a similar but softer effect than [overlay]. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [color], which is a more subtle tinting effect. | 
 |   softLight, | 
 |  | 
 |   /// Subtract the smaller value from the bigger value for each channel. | 
 |   /// | 
 |   /// Compositing black has no effect; compositing white inverts the colors of | 
 |   /// the other image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. | 
 |   /// | 
 |   /// The effect is similar to [exclusion] but harsher. | 
 |   /// | 
 |   ///  | 
 |   difference, | 
 |  | 
 |   /// Subtract double the product of the two images from the sum of the two | 
 |   /// images. | 
 |   /// | 
 |   /// Compositing black has no effect; compositing white inverts the colors of | 
 |   /// the other image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. | 
 |   /// | 
 |   /// The effect is similar to [difference] but softer. | 
 |   /// | 
 |   ///  | 
 |   exclusion, | 
 |  | 
 |   /// Multiply the components of the source and destination images, including | 
 |   /// the alpha channel. | 
 |   /// | 
 |   /// This can only result in the same or darker colors (multiplying by white, | 
 |   /// 1.0, results in no change; multiplying by black, 0.0, results in black). | 
 |   /// | 
 |   /// Since the alpha channel is also multiplied, a fully-transparent pixel | 
 |   /// (opacity 0.0) in one image results in a fully transparent pixel in the | 
 |   /// output. This is similar to [dstIn], but with the colors combined. | 
 |   /// | 
 |   /// For a variant that multiplies the colors but does not multiply the alpha | 
 |   /// channel, consider [modulate]. | 
 |   /// | 
 |   ///  | 
 |   multiply, // The last separable mode. | 
 |  | 
 |   /// Take the hue of the source image, and the saturation and luminosity of the | 
 |   /// destination image. | 
 |   /// | 
 |   /// The effect is to tint the destination image with the source image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. Regions that are entirely transparent in the source image take | 
 |   /// their hue from the destination. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [color], which is a similar but stronger effect as it also applies the | 
 |   ///    saturation of the source image. | 
 |   ///  * [HSVColor], which allows colors to be expressed using Hue rather than | 
 |   ///    the red/green/blue channels of [Color]. | 
 |   hue, | 
 |  | 
 |   /// Take the saturation of the source image, and the hue and luminosity of the | 
 |   /// destination image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. Regions that are entirely transparent in the source image take | 
 |   /// their saturation from the destination. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [color], which also applies the hue of the source image. | 
 |   ///  * [luminosity], which applies the luminosity of the source image to the | 
 |   ///    destination. | 
 |   saturation, | 
 |  | 
 |   /// Take the hue and saturation of the source image, and the luminosity of the | 
 |   /// destination image. | 
 |   /// | 
 |   /// The effect is to tint the destination image with the source image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. Regions that are entirely transparent in the source image take | 
 |   /// their hue and saturation from the destination. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [hue], which is a similar but weaker effect. | 
 |   ///  * [softLight], which is a similar tinting effect but also tints white. | 
 |   ///  * [saturation], which only applies the saturation of the source image. | 
 |   color, | 
 |  | 
 |   /// Take the luminosity of the source image, and the hue and saturation of the | 
 |   /// destination image. | 
 |   /// | 
 |   /// The opacity of the output image is computed in the same way as for | 
 |   /// [srcOver]. Regions that are entirely transparent in the source image take | 
 |   /// their luminosity from the destination. | 
 |   /// | 
 |   ///  | 
 |   /// | 
 |   /// See also: | 
 |   /// | 
 |   ///  * [saturation], which applies the saturation of the source image to the | 
 |   ///    destination. | 
 |   ///  * [ImageFilter.blur], which can be used with [BackdropFilter] for a | 
 |   ///    related effect. | 
 |   luminosity, | 
 | } | 
 |  | 
 | /// An immutable 32 bit color value in ARGB format. | 
 | /// | 
 | /// Consider the light teal of the Flutter logo. It is fully opaque, with a red | 
 | /// channel value of 0x42 (66), a green channel value of 0xA5 (165), and a blue | 
 | /// channel value of 0xF5 (245). In the common "hash syntax" for color values, | 
 | /// it would be described as `#42A5F5`. | 
 | /// | 
 | /// Here are some ways it could be constructed: | 
 | /// | 
 | /// ```dart | 
 | /// Color c = const Color(0xFF42A5F5); | 
 | /// Color c = const Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5); | 
 | /// Color c = const Color.fromARGB(255, 66, 165, 245); | 
 | /// Color c = const Color.fromRGBO(66, 165, 245, 1.0); | 
 | /// ``` | 
 | /// | 
 | /// If you are having a problem with `Color` wherein it seems your color is just | 
 | /// not painting, check to make sure you are specifying the full 8 hexadecimal | 
 | /// digits. If you only specify six, then the leading two digits are assumed to | 
 | /// be zero, which means fully-transparent: | 
 | /// | 
 | /// ```dart | 
 | /// Color c1 = const Color(0xFFFFFF); // fully transparent white (invisible) | 
 | /// Color c2 = const Color(0xFFFFFFFF); // fully opaque white (visible) | 
 | /// ``` | 
 | /// | 
 | /// See also: | 
 | /// | 
 | ///  * [Colors](https://docs.flutter.io/flutter/material/Colors-class.html), which | 
 | ///    defines the colors found in the Material Design specification. | 
 | class Color { | 
 |   /// A 32 bit value representing this color. | 
 |   /// | 
 |   /// The bits are assigned as follows: | 
 |   /// | 
 |   /// * Bits 24-31 are the alpha value. | 
 |   /// * Bits 16-23 are the red value. | 
 |   /// * Bits 8-15 are the green value. | 
 |   /// * Bits 0-7 are the blue value. | 
 |   final int value; | 
 |  | 
 |   /// Construct a color from the lower 32 bits of an [int]. | 
 |   /// | 
 |   /// The bits are interpreted as follows: | 
 |   /// | 
 |   /// * Bits 24-31 are the alpha value. | 
 |   /// * Bits 16-23 are the red value. | 
 |   /// * Bits 8-15 are the green value. | 
 |   /// * Bits 0-7 are the blue value. | 
 |   /// | 
 |   /// In other words, if AA is the alpha value in hex, RR the red value in hex, | 
 |   /// GG the green value in hex, and BB the blue value in hex, a color can be | 
 |   /// expressed as `const Color(0xAARRGGBB)`. | 
 |   /// | 
 |   /// For example, to get a fully opaque orange, you would use `const | 
 |   /// Color(0xFFFF9000)` (`FF` for the alpha, `FF` for the red, `90` for the | 
 |   /// green, and `00` for the blue). | 
 |   @pragma('vm:entry-point') | 
 |   const Color(int value) : value = value & 0xFFFFFFFF; | 
 |  | 
 |   /// Construct a color from the lower 8 bits of four integers. | 
 |   /// | 
 |   /// * `a` is the alpha value, with 0 being transparent and 255 being fully | 
 |   ///   opaque. | 
 |   /// * `r` is [red], from 0 to 255. | 
 |   /// * `g` is [green], from 0 to 255. | 
 |   /// * `b` is [blue], from 0 to 255. | 
 |   /// | 
 |   /// Out of range values are brought into range using modulo 255. | 
 |   /// | 
 |   /// See also [fromRGBO], which takes the alpha value as a floating point | 
 |   /// value. | 
 |   const Color.fromARGB(int a, int r, int g, int b) | 
 |       : value = (((a & 0xff) << 24) | | 
 |                 ((r & 0xff) << 16) | | 
 |                 ((g & 0xff) << 8) | | 
 |                 ((b & 0xff) << 0)) & | 
 |             0xFFFFFFFF; | 
 |  | 
 |   /// Create a color from red, green, blue, and opacity, similar to `rgba()` in CSS. | 
 |   /// | 
 |   /// * `r` is [red], from 0 to 255. | 
 |   /// * `g` is [green], from 0 to 255. | 
 |   /// * `b` is [blue], from 0 to 255. | 
 |   /// * `opacity` is alpha channel of this color as a double, with 0.0 being | 
 |   ///   transparent and 1.0 being fully opaque. | 
 |   /// | 
 |   /// Out of range values are brought into range using modulo 255. | 
 |   /// | 
 |   /// See also [fromARGB], which takes the opacity as an integer value. | 
 |   const Color.fromRGBO(int r, int g, int b, double opacity) | 
 |       : value = ((((opacity * 0xff ~/ 1) & 0xff) << 24) | | 
 |                 ((r & 0xff) << 16) | | 
 |                 ((g & 0xff) << 8) | | 
 |                 ((b & 0xff) << 0)) & | 
 |             0xFFFFFFFF; | 
 |  | 
 |   /// The alpha channel of this color in an 8 bit value. | 
 |   /// | 
 |   /// A value of 0 means this color is fully transparent. A value of 255 means | 
 |   /// this color is fully opaque. | 
 |   int get alpha => (0xff000000 & value) >> 24; | 
 |  | 
 |   /// The blue channel of this color in an 8 bit value. | 
 |   int get blue => (0x000000ff & value) >> 0; | 
 |  | 
 |   /// The green channel of this color in an 8 bit value. | 
 |   int get green => (0x0000ff00 & value) >> 8; | 
 |  | 
 |   @override | 
 |   int get hashCode => value.hashCode; | 
 |  | 
 |   /// The alpha channel of this color as a double. | 
 |   /// | 
 |   /// A value of 0.0 means this color is fully transparent. A value of 1.0 means | 
 |   /// this color is fully opaque. | 
 |   double get opacity => alpha / 0xFF; | 
 |  | 
 |   /// The red channel of this color in an 8 bit value. | 
 |   int get red => (0x00ff0000 & value) >> 16; | 
 |  | 
 |   @override | 
 |   bool operator ==(dynamic other) { | 
 |     if (identical(this, other)) return true; | 
 |     if (other.runtimeType != runtimeType) return false; | 
 |     final Color typedOther = other; | 
 |     return value == typedOther.value; | 
 |   } | 
 |  | 
 |   @override | 
 |   String toString() => 'Color(0x${value.toRadixString(16).padLeft(8, '0')})'; | 
 |  | 
 |   /// Returns a new color that matches this color with the alpha channel | 
 |   /// replaced with `a` (which ranges from 0 to 255). | 
 |   /// | 
 |   /// Out of range values will have unexpected effects. | 
 |   Color withAlpha(int a) { | 
 |     return Color.fromARGB(a, red, green, blue); | 
 |   } | 
 |  | 
 |   /// Returns a new color that matches this color with the blue channel replaced | 
 |   /// with `b` (which ranges from 0 to 255). | 
 |   /// | 
 |   /// Out of range values will have unexpected effects. | 
 |   Color withBlue(int b) { | 
 |     return Color.fromARGB(alpha, red, green, b); | 
 |   } | 
 |  | 
 |   /// Returns a new color that matches this color with the green channel | 
 |   /// replaced with `g` (which ranges from 0 to 255). | 
 |   /// | 
 |   /// Out of range values will have unexpected effects. | 
 |   Color withGreen(int g) { | 
 |     return Color.fromARGB(alpha, red, g, blue); | 
 |   } | 
 |  | 
 |   /// Returns a new color that matches this color with the alpha channel | 
 |   /// replaced with the given `opacity` (which ranges from 0.0 to 1.0). | 
 |   /// | 
 |   /// Out of range values will have unexpected effects. | 
 |   Color withOpacity(double opacity) { | 
 |     assert(opacity >= 0.0 && opacity <= 1.0); | 
 |     return withAlpha((255.0 * opacity).round()); | 
 |   } | 
 |  | 
 |   /// Returns a new color that matches this color with the red channel replaced | 
 |   /// with `r` (which ranges from 0 to 255). | 
 |   /// | 
 |   /// Out of range values will have unexpected effects. | 
 |   Color withRed(int r) { | 
 |     return Color.fromARGB(alpha, r, green, blue); | 
 |   } | 
 | } |