#Topic Color
#Alias Color_Reference ##

#Code
#Populate
##

Color constants can be helpful to write code, documenting the meaning of values
the represent transparency and color values. The use of Color constants is not
required.

#Subtopic Functions
#Line # routines to read, write, and manipulate SkColor ##
##

# ------------------------------------------------------------------------------

#Subtopic Alpha
#Line # transparency of Color ##

Alpha represents the transparency of Color. Color with Alpha of zero is fully
transparent. Color with Alpha of 255 is fully opaque. Some, but not all pixel
formats contain Alpha. Pixels with Alpha may store it as unsigned integers or
floating point values. Unsigned integer Alpha ranges from zero, fully
transparent, to all bits set, fully opaque. Floating point Alpha ranges from
zero, fully transparent, to one, fully opaque.

#Alias Alpha 
#Substitute alpha
##

#Typedef uint8_t SkAlpha
#Line # defines Alpha as eight bits ##

#Code
#Populate
##

8-bit type for an alpha value. 255 is 100% opaque, zero is 100% transparent.

#Typedef ##

#Subtopic ##

# ------------------------------------------------------------------------------

#Typedef uint32_t SkColor
#Line # defines Color as 32 bits ##

#Code
#Populate
##

32-bit ARGB Color value, Unpremultiplied. Color components are always in
a known order. This is different from SkPMColor, which has its bytes in a configuration
dependent order, to match the format of kBGRA_8888_SkColorType bitmaps. SkColor
is the type used to specify colors in SkPaint and in gradients.

Color that is Premultiplied has the same component values as Color
that is Unpremultiplied if Alpha is 255, fully opaque, although may have the
component values in a different order.

#SeeAlso SkPMColor

#Typedef ##

# ------------------------------------------------------------------------------

#Method static constexpr inline SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
#In Functions
#Line # returns Color_Alpha and RGB combined ##

Returns Color value from 8-bit component values. Asserts if SK_DEBUG is defined
if a, r, g, or b exceed 255. Since Color is Unpremultiplied, a may be smaller
than the largest of r, g, and b.

#Param a    amount of Alpha, from fully transparent (0) to fully opaque (255) ##
#Param r    amount of red, from no red (0) to full red (255) ##
#Param g    amount of green, from no green (0) to full green (255) ##
#Param b    amount of blue, from no blue (0) to full blue (255) ##

#Return color and alpha, Unpremultiplied ##

#Example
    canvas->drawColor(SK_ColorRED);
    canvas->clipRect(SkRect::MakeWH(150, 150));
    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00));
    canvas->clipRect(SkRect::MakeWH(75, 75));
    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF));
##

#SeeAlso SkColorSetRGB SkPaint::setARGB SkPaint::setColor SkColorSetA

#Method ##

# ------------------------------------------------------------------------------

#Define SkColorSetRGB
#Line # returns opaque Color ##

#Code
#Populate
##

Returns Color value from 8-bit component values, with Alpha set
fully opaque to 255.

#Param r    amount of red, from no red (0) to full red (255) ##
#Param g    amount of green, from no green (0) to full green (255) ##
#Param b    amount of blue, from no blue (0) to full blue (255) ##

#Return     color with opaque alpha ##

#Example
    canvas->drawColor(SK_ColorRED);
    canvas->clipRect(SkRect::MakeWH(150, 150));
    canvas->drawColor(SkColorSetRGB(0x00, 0xFF, 0x00));
    canvas->clipRect(SkRect::MakeWH(75, 75));
    canvas->drawColor(SkColorSetRGB(0x00, 0x00, 0xFF));
##

#SeeAlso SkColorSetARGB 

#Define ##

# ------------------------------------------------------------------------------

#Define SkColorGetA
#Line # returns Alpha component ##

#Code
#Populate
##

Returns Alpha byte from Color value.

#Param color SkColor, a 32-bit unsigned int, in 0xAARRGGBB format ##

#Example
    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setColor(SK_ColorRED);
    for (int alpha = 255; alpha >= 0; alpha -= 17) {
        paint.setAlpha(alpha);
        canvas->drawRect({5, 5, 100, 20}, paint);
        SkAlpha alphaInPaint = SkColorGetA(paint.getColor());
        canvas->drawString(std::to_string(alphaInPaint).c_str(), 110, 18, paint);
        canvas->translate(0, 15);
    }
##

#SeeAlso SkPaint::getAlpha

#Define ##

# ------------------------------------------------------------------------------

#Define SkColorGetR
#Line # returns red component ##

#Code
#Populate
##

Returns red component of Color, from zero to 255.

#Param color SkColor, a 32-bit unsigned int, in 0xAARRGGBB format ##
#Return red byte ##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   SkPaint bgPaint;
   bgPaint.setColor(0xafffffff);
   canvas->drawRect({20, 50, 80, 70}, bgPaint);
   uint8_t red = SkColorGetR(source.getColor(226, 128));
   canvas->drawString(std::to_string(red).c_str(), 40, 65, SkPaint());
   canvas->drawLine(80, 70, 226, 128, SkPaint());
##

#SeeAlso SkColorGetG SkColorGetB

#Define ##

# ------------------------------------------------------------------------------

#Define SkColorGetG
#Line # returns green component ##

#Code
#Populate
##

Returns green component of Color, from zero to 255.

#Param color SkColor, a 32-bit unsigned int, in 0xAARRGGBB format ##
#Return green byte ##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   SkPaint bgPaint;
   bgPaint.setColor(0xafffffff);
   canvas->drawRect({20, 50, 80, 70}, bgPaint);
   uint8_t green = SkColorGetG(source.getColor(57, 192));
   canvas->drawString(std::to_string(green).c_str(), 40, 65, SkPaint());
   canvas->drawLine(80, 70, 57, 192, SkPaint());
##

#SeeAlso SkColorGetR SkColorGetB

#Define ##

# ------------------------------------------------------------------------------

#Define SkColorGetB
#Line # returns blue component ##

#Code
#Populate
##

Returns blue component of Color, from zero to 255.

#Param color SkColor, a 32-bit unsigned int, in 0xAARRGGBB format ##
#Return blue byte ##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   SkPaint bgPaint;
   bgPaint.setColor(0xafffffff);
   canvas->drawRect({20, 50, 80, 70}, bgPaint);
   uint8_t blue = SkColorGetB(source.getColor(168, 170));
   canvas->drawString(std::to_string(blue).c_str(), 40, 65, SkPaint());
   canvas->drawLine(80, 70, 168, 170, SkPaint());
##

#SeeAlso SkColorGetR SkColorGetG

#Define ##

# ------------------------------------------------------------------------------

#Method static constexpr inline SkColor SkColorSetA(SkColor c, U8CPU a)
#In Functions
#Line # returns Color with transparency ##

Returns Unpremultiplied Color with red, blue, and green set from c; and alpha set
from a. Alpha component of c is ignored and is replaced by a in result.

#Param c  packed RGB, eight bits per component ##
#Param a  Alpha: transparent at zero, fully opaque at 255 ##

#Return Color with transparency ##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   for (int y = 0; y < 256; y += 16) {
      for (int x = 0; x < 256; x += 16) {
        SkColor color = source.getColor(x + 8, y + 8);
        SkPaint paint;
        paint.setColor(SkColorSetA(color, x + y));
        canvas->drawRect(SkRect::MakeXYWH(x, y, 16, 16), paint);
     }
   }
##

#SeeAlso SkColorSetARGB

#Method ##

# ------------------------------------------------------------------------------

#Subtopic Alpha_Constants
#In Constant
#Line # constants for Alpha ##
#Filter SK_Alpha

#Code
#Populate
##

Alpha constants are conveniences to represent fully transparent and fully
opaque colors and masks. Their use is not required.

#Const SK_AlphaTRANSPARENT 0x00
#Line # fully transparent SkAlpha ##
Represents fully transparent SkAlpha value. SkAlpha ranges from zero,
fully transparent; to 255, fully opaque.
##
#Const SK_AlphaOPAQUE 0xFF
#Line # fully opaque SkAlpha ##
Represents fully opaque SkAlpha value. SkAlpha ranges from zero,
fully transparent; to 255, fully opaque.
##

#Example
#Image 1
#Height 128
#Description
Color the parts of the bitmap red if they mostly contain transparent pixels.
##
    std::vector<int32_t> srcPixels;
    srcPixels.resize(source.height() * source.rowBytes());
    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),
                    &srcPixels.front(), source.rowBytes());
    source.readPixels(pixmap, 0, 0);
    for (int y = 0; y < 16; ++y) {
        for (int x = 0; x < 16; ++x) {
            int32_t* blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;
            size_t transparentCount = 0;
            for (int fillY = 0; fillY < source.height() / 16; ++fillY) {
                for (int fillX = 0; fillX < source.width() / 16; ++fillX) {
                    const SkColor color = SkUnPreMultiply::PMColorToColor(blockStart[fillX]);
                    transparentCount += SkColorGetA(color) == SK_AlphaTRANSPARENT;
                }
                blockStart += source.width();
            }
            if (transparentCount > 200) {
                blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;
                for (int fillY = 0; fillY < source.height() / 16; ++fillY) {
                    for (int fillX = 0; fillX < source.width() / 16; ++fillX) {
                        blockStart[fillX] = SK_ColorRED;
                    }
                    blockStart += source.width();
                }
            }
        }
    }
    SkBitmap bitmap;
    bitmap.installPixels(pixmap);
    canvas->drawBitmap(bitmap, 0, 0);
##


# ------------------------------------------------------------------------------

#Example
#Image 1
#Height 128
#Description
Color the parts of the bitmap green if they contain fully opaque pixels.
##
    std::vector<int32_t> srcPixels;
    srcPixels.resize(source.height() * source.rowBytes());
    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),
                    &srcPixels.front(), source.rowBytes());
    source.readPixels(pixmap, 0, 0);
    for (int y = 0; y < source.height(); ++y) {
        for (int x = 0; x < source.width(); ++x) {
            SkPMColor pixel = srcPixels[y * source.width() + x];
            const SkColor color = SkUnPreMultiply::PMColorToColor(pixel);
            if (SkColorGetA(color) == SK_AlphaOPAQUE) {
                srcPixels[y * source.width() + x] = SK_ColorGREEN;
            }
        }
    }
    SkBitmap bitmap;
    bitmap.installPixels(pixmap);
    canvas->drawBitmap(bitmap, 0, 0);
##

#SeeAlso SkAlpha SK_ColorTRANSPARENT SK_ColorBLACK

#Subtopic Alpha_Constants ##

#Subtopic Color_Constants
#In Constant
#Line # constants for Color ##
#Filter SK_Color

#Code
#Populate
##

Color names are provided as conveniences, but are not otherwise special.
The values chosen for names may not be the same as values used by
SVG, HTML, CSS, or colors named by a platform.

#Const SK_ColorTRANSPARENT 0x00000000
#Line # transparent Color ##
    Represents fully transparent SkColor. May be used to initialize a destination
    containing a mask or a non-rectangular image.
##
#Const SK_ColorBLACK 0xFF000000
#Line # black Color ##
    Represents fully opaque black.
##
#Const SK_ColorDKGRAY 0xFF444444
#Line # dark gray Color ##
    Represents fully opaque dark gray.
    Note that SVG_darkgray is equivalent to 0xFFA9A9A9.
##
#Const SK_ColorGRAY 0xFF888888
#Line # gray Color ##
    Represents fully opaque gray.
    Note that HTML_Gray is equivalent to 0xFF808080.
##
#Const SK_ColorLTGRAY 0xFFCCCCCC
#Line # light gray Color ##
    Represents fully opaque light gray. HTML_Silver is equivalent to 0xFFC0C0C0.
    Note that SVG_lightgray is equivalent to 0xFFD3D3D3.
##
#Const SK_ColorWHITE 0xFFFFFFFF
#Line # white Color ##
    Represents fully opaque white.
##
#Const SK_ColorRED 0xFFFF0000
#Line # red Color ##
    Represents fully opaque red.
##
#Const SK_ColorGREEN 0xFF00FF00
#Line # green Color ##
    Represents fully opaque green. HTML_Lime is equivalent.
    Note that HTML_Green is equivalent to 0xFF008000.
##
#Const SK_ColorBLUE 0xFF0000FF
#Line # blue Color ##
    Represents fully opaque blue.
##
#Const SK_ColorYELLOW 0xFFFFFF00
#Line # yellow Color ##
    Represents fully opaque yellow.
##
#Const SK_ColorCYAN 0xFF00FFFF
#Line # cyan Color ##
    Represents fully opaque cyan. HTML_Aqua is equivalent.
##
#Const SK_ColorMAGENTA 0xFFFF00FF
#Line # magenta Color ##
    Represents fully opaque magenta. HTML_Fuchsia is equivalent.
##

#Example
###$
$Function
#define SKIA_COLOR_PAIR(name) "SK_Color" #name, SK_Color##name
$$
void draw(SkCanvas* canvas) {
    struct ColorCompare {
        const char* fSVGName;
        SkColor fSVGColor;
        const char* fSkiaName;
        SkColor fSkiaColor;
    } colorCompare[] = {  // see https://www.w3.org/TR/SVG/types.html#ColorKeywords
        {"black",     SkColorSetRGB(  0,   0,   0),    SKIA_COLOR_PAIR(BLACK) },
        {"darkgray",  SkColorSetRGB(169, 169, 169),    SKIA_COLOR_PAIR(DKGRAY) },
        {"gray",      SkColorSetRGB(128, 128, 128),    SKIA_COLOR_PAIR(GRAY) },
        {"lightgray", SkColorSetRGB(211, 211, 211),    SKIA_COLOR_PAIR(LTGRAY) },
        {"white",     SkColorSetRGB(255, 255, 255),    SKIA_COLOR_PAIR(WHITE) },
        {"red",       SkColorSetRGB(255,   0,   0),    SKIA_COLOR_PAIR(RED) },
        {"green",     SkColorSetRGB(  0, 128,   0),    SKIA_COLOR_PAIR(GREEN) },
        {"blue",      SkColorSetRGB(  0,   0, 255),    SKIA_COLOR_PAIR(BLUE) },
        {"yellow",    SkColorSetRGB(255, 255,   0),    SKIA_COLOR_PAIR(YELLOW) },
        {"aqua",      SkColorSetRGB(  0, 255, 255),    SKIA_COLOR_PAIR(CYAN) },
        {"fuchsia",   SkColorSetRGB(255,   0, 255),    SKIA_COLOR_PAIR(MAGENTA) },
    };
    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setTextSize(14);
    for (auto compare : colorCompare) {
        paint.setStyle(SkPaint::kFill_Style);
        paint.setColor(compare.fSVGColor);
        canvas->drawRect({5, 5, 15, 15}, paint);
        paint.setColor(SK_ColorBLACK);
        canvas->drawString(compare.fSVGName, 20, 16, paint);
        paint.setColor(compare.fSkiaColor);
        canvas->drawRect({105, 5, 115, 15}, paint);
        paint.setColor(SK_ColorBLACK);
        canvas->drawString(compare.fSkiaName, 120, 16, paint);
        paint.setStyle(SkPaint::kStroke_Style);
        canvas->drawRect({5, 5, 15, 15}, paint);
        canvas->drawRect({105, 5, 115, 15}, paint);
        canvas->translate(0, 20);
    }
}
$$$#
##

#Example
#Description
SK_ColorTRANSPARENT sets Color Alpha and components to zero.
##
#Image 3
    std::vector<uint32_t> srcPixels;
    constexpr int width = 256;
    constexpr int height = 256;
    srcPixels.resize(width * height);
    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
    pixmap.erase(SK_ColorTRANSPARENT);
    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
    pixmap.erase(SK_ColorTRANSPARENT, { 48, 48, 168, 168 } );
    SkBitmap bitmap;
    bitmap.installPixels(pixmap);
    canvas->drawBitmap(bitmap, 0, 0);
    canvas->drawBitmap(bitmap, 48, 48);
##

#Example
#Description
SK_ColorBLACK sets Color Alpha to one and components to zero.
##
    std::vector<uint32_t> srcPixels;
    constexpr int width = 256;
    constexpr int height = 256;
    srcPixels.resize(width * height);
    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
    pixmap.erase(SK_ColorTRANSPARENT);
    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
    pixmap.erase(SK_ColorBLACK, { 48, 48, 168, 168 } );
    SkBitmap bitmap;
    bitmap.installPixels(pixmap);
    canvas->drawBitmap(bitmap, 0, 0);
    canvas->drawBitmap(bitmap, 48, 48);
##

#Example
#Description
SK_ColorWHITE sets Color Alpha and components to one.
##
    std::vector<uint32_t> srcPixels;
    constexpr int width = 256;
    constexpr int height = 256;
    srcPixels.resize(width * height);
    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
    pixmap.erase(SK_ColorTRANSPARENT);
    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
    pixmap.erase(SK_ColorWHITE, { 48, 48, 168, 168 } );
    SkBitmap bitmap;
    bitmap.installPixels(pixmap);
    canvas->drawBitmap(bitmap, 0, 0);
    canvas->drawBitmap(bitmap, 48, 48);
##

#SeeAlso SK_ColorTRANSPARENT SkCanvas::clear SK_AlphaOPAQUE

#Subtopic Color_Constants ##

# ------------------------------------------------------------------------------

#Subtopic HSV
#Line # hue saturation value color representation ##

#Subtopic Hue
Hue represents an angle, in degrees, on a color wheel. Hue has a positive value
modulo 360, where zero degrees is red.
##

#Subtopic Saturation
Saturation represents the intensity of the color. Saturation varies from zero,
with no Hue contribution; to one, with full Hue contribution.
##

#Subtopic Value
Value represents the lightness of the color. Value varies from zero, black; to
one, full brightness.
##

#Method void SkRGBToHSV(U8CPU red, U8CPU green, U8CPU blue, SkScalar hsv[3])
#In Functions
#Line # converts RGB to HSV ##

Converts RGB to its HSV components.
hsv[0] contains HSV_Hue, a value from zero to less than 360.
hsv[1] contains HSV_Saturation, a value from zero to one.
hsv[2] contains HSV_Value, a value from zero to one.

#Param red  red component value from zero to 255 ##
#Param green  green component value from zero to 255 ##
#Param blue  blue component value from zero to 255 ##
#Param hsv  three element array which holds the resulting HSV components
##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   SkPaint bgPaint;
   bgPaint.setColor(0xafffffff);
   canvas->drawRect({20, 30, 110, 90}, bgPaint);
   SkScalar hsv[3];
   SkColor c = source.getColor(226, 128);
   SkRGBToHSV(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), hsv);
   canvas->drawString(("h: " + std::to_string(hsv[0]).substr(0, 6)).c_str(), 27, 45, SkPaint());
   canvas->drawString(("s: " + std::to_string(hsv[1]).substr(0, 6)).c_str(), 27, 65, SkPaint());
   canvas->drawString(("v: " + std::to_string(hsv[2]).substr(0, 6)).c_str(), 27, 85, SkPaint());
   canvas->drawLine(110, 90, 226, 128, SkPaint());
##

#SeeAlso SkColorToHSV SkHSVToColor

#Method ##

# ------------------------------------------------------------------------------

#Method static void SkColorToHSV(SkColor color, SkScalar hsv[3])
#In Functions
#Line # converts RGB to HSV ##

Converts ARGB to its HSV components. Alpha in ARGB is ignored.
hsv[0] contains HSV_Hue, and is assigned a value from zero to less than 360.
hsv[1] contains HSV_Saturation, a value from zero to one.
hsv[2] contains HSV_Value, a value from zero to one.

#Param color  ARGB color to convert
##
#Param hsv  three element array which holds the resulting HSV components
##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   for (int y = 0; y < 256; ++y) {
      for (int x = 0; x < 256; ++x) {
        SkScalar hsv[3];
        SkColorToHSV(source.getColor(x, y), hsv);
        hsv[1] = 1 - hsv[1];
        SkPaint paint;
        paint.setColor(SkHSVToColor(hsv));
        canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
     }
   }
##

#SeeAlso SkRGBToHSV SkHSVToColor

#Method ##

# ------------------------------------------------------------------------------

#Method SkColor SkHSVToColor(U8CPU alpha, const SkScalar hsv[3])
#In Functions
#Line # converts HSV with Alpha to RGB ##

Converts HSV components to an ARGB color. Alpha is passed through unchanged.
hsv[0] represents HSV_Hue, an angle from zero to less than 360.
hsv[1] represents HSV_Saturation, and varies from zero to one.
hsv[2] represents HSV_Value, and varies from zero to one.

Out of range hsv values are pinned.

#Param alpha  Alpha component of the returned ARGB color
##
#Param hsv  three element array which holds the input HSV components
##

#Return  ARGB equivalent to HSV
##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   for (int y = 0; y < 256; ++y) {
      for (int x = 0; x < 256; ++x) {
        SkColor color = source.getColor(x, y);
        SkScalar hsv[3];
        SkColorToHSV(color, hsv);
        hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;
        SkPaint paint;
        paint.setColor(SkHSVToColor(x + y, hsv));
        canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
     }
   }
##

#SeeAlso SkColorToHSV SkRGBToHSV

#Method ##

# ------------------------------------------------------------------------------

#Method static SkColor SkHSVToColor(const SkScalar hsv[3])
#In Functions
#Line # converts HSV to RGB ##

Converts HSV components to an ARGB color. Alpha is set to 255.
hsv[0] represents HSV_Hue, an angle from zero to less than 360.
hsv[1] represents HSV_Saturation, and varies from zero to one.
hsv[2] represents HSV_Value, and varies from zero to one.

Out of range hsv values are pinned.

#Param hsv  three element array which holds the input HSV components
##

#Return  RGB equivalent to HSV
##

#Example
#Image 3
   canvas->drawBitmap(source, 0, 0);
   for (int y = 0; y < 256; ++y) {
      for (int x = 0; x < 256; ++x) {
        SkColor color = source.getColor(x, y);
        SkScalar hsv[3];
        SkColorToHSV(color, hsv);
        hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;
        SkPaint paint;
        paint.setColor(SkHSVToColor(hsv));
        canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
     }
   }
##

#SeeAlso SkColorToHSV SkRGBToHSV

#Method ##

#Subtopic HSV ##

# ------------------------------------------------------------------------------

#Subtopic PM_Color
#Line # color components premultiplied by Alpha ##

#Typedef uint32_t SkPMColor
#Line # defines Premultiplied Color as 32 bits ##

#Code
#Populate
##

32-bit ARGB color value, Premultiplied. The byte order for this value is
configuration dependent, matching the format of kBGRA_8888_SkColorType bitmaps.
This is different from SkColor, which is Unpremultiplied, and is always in the
same byte order.

#Typedef ##

# ------------------------------------------------------------------------------

#Method SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
#In Functions
#Line # converts Unpremultiplied ARGB to Premultiplied PM_Color ##

Returns a SkPMColor value from Unpremultiplied 8-bit component values.

#Param a    amount of Alpha, from fully transparent (0) to fully opaque (255) ##
#Param r    amount of red, from no red (0) to full red (255) ##
#Param g    amount of green, from no green (0) to full green (255) ##
#Param b    amount of blue, from no blue (0) to full blue (255) ##

#Return Premultiplied Color ##

#Example
#Height 128
#Width 300
    SkPMColor premultiplied = SkPreMultiplyARGB(160, 128, 160, 192);
    canvas->drawString("Unpremultiplied:", 20, 20, SkPaint());
    canvas->drawString("alpha=160 red=128 green=160 blue=192", 20, 40, SkPaint());
    canvas->drawString("Premultiplied:", 20, 80, SkPaint());
    std::string str = "alpha=" + std::to_string(SkColorGetA(premultiplied));
    str += " red=" + std::to_string(SkColorGetR(premultiplied));
    str += " green=" + std::to_string(SkColorGetG(premultiplied));
    str += " blue=" + std::to_string(SkColorGetB(premultiplied));
    canvas->drawString(str.c_str(), 20, 100, SkPaint());
##

#SeeAlso SkPreMultiplyColor

#Method ##

# ------------------------------------------------------------------------------

#Method SkPMColor SkPreMultiplyColor(SkColor c)
#In Functions
#Line # converts Unpremultiplied Color to Premultiplied PM_Color ##

Returns PM_Color closest to Color c. Multiplies c RGB components by the c Alpha,
and arranges the bytes to match the format of kN32_SkColorType.

#Param c  Unpremultiplied ARGB Color  ##

#Return Premultiplied Color ##

#Example
#Height 128
#Width 300
    SkColor unpremultiplied = SkColorSetARGB(160, 128, 160, 192);
    SkPMColor premultiplied = SkPreMultiplyColor(unpremultiplied);
    canvas->drawString("Unpremultiplied:", 20, 20, SkPaint());
    std::string str = "alpha=" + std::to_string(SkColorGetA(unpremultiplied));
    str += " red=" + std::to_string(SkColorGetR(unpremultiplied));
    str += " green=" + std::to_string(SkColorGetG(unpremultiplied));
    str += " blue=" + std::to_string(SkColorGetB(unpremultiplied));
    canvas->drawString(str.c_str(), 20, 40, SkPaint());
    canvas->drawString("Premultiplied:", 20, 80, SkPaint());
    str = "alpha=" + std::to_string(SkColorGetA(premultiplied));
    str += " red=" + std::to_string(SkColorGetR(premultiplied));
    str += " green=" + std::to_string(SkColorGetG(premultiplied));
    str += " blue=" + std::to_string(SkColorGetB(premultiplied));
    canvas->drawString(str.c_str(), 20, 100, SkPaint());
##

#SeeAlso SkPreMultiplyARGB

#Method ##

#Subtopic PM_Color ##

#Topic Color ##
