Home | History | Annotate | Download | only in docs
      1 #Topic Image_Info
      2 #Alias Image_Info_Reference ##
      3 
      4 #Code
      5 #Populate
      6 ##
      7 
      8 Image_Info specifies the dimensions and encoding of the pixels in a Bitmap.
      9 The dimensions are integral width and height. The encoding is how pixel
     10 bits describe Color_Alpha, transparency; Color components red, blue,
     11 and green; and Color_Space, the range and linearity of colors.
     12 
     13 Image_Info describes an uncompressed raster pixels. In contrast, Image
     14 additionally describes compressed pixels like PNG, and Surface describes
     15 destinations on the GPU. Image and Surface may be specified by Image_Info,
     16 but Image and Surface may not contain Image_Info.
     17 
     18 # ------------------------------------------------------------------------------
     19 #Subtopic Alpha_Type
     20 #Line # encoding for pixel transparency ##
     21 #Alias Alpha_Type ##
     22 #Alias Alpha_Types ##
     23 
     24 #PhraseDef list_of_alpha_types
     25 kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType,
     26 kUnpremul_SkAlphaType
     27 ##
     28 
     29 #Enum SkAlphaType
     30 #Line # encoding for pixel transparency ##
     31 
     32 #Code
     33 #Populate
     34 ##
     35 
     36 Describes how to interpret the alpha component of a pixel. A pixel may
     37 be opaque, or Color_Alpha, describing multiple levels of transparency.
     38 
     39 In simple blending, Color_Alpha weights the draw color and the destination
     40 color to create a new color. If alpha describes a weight from zero to one,
     41 new color is set to: #Formula # draw color * alpha + destination color * (1 - alpha) ##.
     42 
     43 In practice alpha is encoded in two or more bits, where 1.0 equals all bits set.
     44 
     45 RGB may have Color_Alpha included in each component value; the stored
     46 value is the original RGB multiplied by Color_Alpha. Premultiplied color
     47 components improve performance.
     48 
     49 #Const kUnknown_SkAlphaType 0
     50 #Line # uninitialized ##
     51     Alpha_Type is uninitialized.
     52 ##
     53 #Const kOpaque_SkAlphaType 1
     54 #Line # pixel is opaque ##
     55 #Details Opaque
     56     Pixels are opaque. The Color_Type must have no explicit alpha
     57     component, or all alpha components must be set to their maximum value.
     58 ##
     59 #Const kPremul_SkAlphaType 2
     60 #Line # pixel components are Premultiplied by Alpha ##
     61 #Details Premul
     62     Pixels have Alpha Premultiplied into color components.
     63     Surface pixels must be Premultiplied.
     64 ##
     65 #Const kUnpremul_SkAlphaType 3
     66 #Line # pixel components are independent of Alpha ##
     67 #Details Unpremul
     68     Pixel color component values are independent of alpha value.
     69     Images generated from encoded data like PNG do not Premultiply pixel color
     70     components. kUnpremul_SkAlphaType is supported for Image pixels, but not for
     71     Surface pixels.
     72 ##
     73 #Const kLastEnum_SkAlphaType 3
     74 #Line # last valid value ##
     75     Used by tests to iterate through all valid values.
     76 ##
     77 
     78 #NoExample
     79 ##
     80 
     81 #SeeAlso SkColorType SkColorSpace
     82 
     83 #Enum SkAlphaType ##
     84 
     85 #Subtopic Opaque
     86 #Line # hints all pixels are opaque ##
     87 Use kOpaque_SkAlphaType as a hint to optimize drawing when Alpha component
     88 of all pixel is set to its maximum value of 1.0; all alpha component bits are set.
     89 If Image_Info is set to kOpaque_SkAlphaType but all alpha values are not 1.0,
     90 results are undefined.
     91 
     92 #Example
     93 #Height 64
     94 #Description
     95 SkPreMultiplyARGB parameter a is set to 255, its maximum value, and is interpreted
     96 as Color_Alpha of 1.0. kOpaque_SkAlphaType may be set to improve performance.
     97 If SkPreMultiplyARGB parameter a is set to a value smaller than 255,
     98 kPremul_SkAlphaType must be used instead to avoid undefined results.
     99 The four displayed values are the original component values, though not necessarily
    100 in the same order.
    101 ##
    102     SkPMColor color = SkPreMultiplyARGB(255, 50, 100, 150);
    103     SkString s;
    104     s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
    105                             SkColorGetG(color), SkColorGetB(color));
    106     SkPaint paint;
    107     paint.setAntiAlias(true);
    108     canvas->drawString(s, 10, 62, paint);
    109     canvas->scale(50, 50);
    110     SkBitmap bitmap;
    111     SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kOpaque_SkAlphaType);
    112     if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
    113         canvas->drawBitmap(bitmap, 0, 0);
    114     }
    115 ##
    116 
    117 #Subtopic Opaque ##
    118 
    119 #Subtopic Premul
    120 #Line # stores components scaled by Alpha ##
    121 Use kPremul_SkAlphaType when stored color components are the original color
    122 multiplied by the alpha component. The alpha component range of 0.0 to 1.0 is
    123 achieved by dividing the integer bit value by the maximum bit value.
    124 
    125 #Code
    126 stored color = original color * alpha / max alpha
    127 ##
    128 
    129 The color component must be equal to or smaller than the alpha component,
    130 or the results are undefined.
    131 
    132 #Example
    133 #Description
    134 SkPreMultiplyARGB parameter a is set to 150, less than its maximum value, and is
    135 interpreted as Color_Alpha of about 0.6. kPremul_SkAlphaType must be set, since
    136 SkPreMultiplyARGB parameter a is set to a value smaller than 255,
    137 to avoid undefined results.
    138 The four displayed values reflect that the alpha component has been multiplied
    139 by the original color.
    140 ##
    141 #Height 64
    142     SkPMColor color = SkPreMultiplyARGB(150, 50, 100, 150);
    143     SkString s;
    144     s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
    145                             SkColorGetG(color), SkColorGetB(color));
    146     SkPaint paint;
    147     paint.setAntiAlias(true);
    148     canvas->drawString(s, 10, 62, paint);
    149     canvas->scale(50, 50);
    150     SkBitmap bitmap;
    151     SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kPremul_SkAlphaType);
    152     if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
    153         canvas->drawBitmap(bitmap, 0, 0);
    154     }
    155 ##
    156 
    157 #Subtopic Premul ##
    158 
    159 #Subtopic Unpremul
    160 #Line # stores components without Alpha scaling ##
    161 Use kUnpremul_SkAlphaType if stored color components are not divided by the
    162 alpha component. Some drawing destinations may not support
    163 kUnpremul_SkAlphaType.
    164 
    165 #Bug 7079
    166 #Example
    167 #Height 64
    168 #Description
    169 SkColorSetARGB parameter a is set to 150, less than its maximum value, and is
    170 interpreted as Color_Alpha of about 0.6. color is not Premultiplied;
    171 color components may have values greater than color alpha.
    172 The four displayed values are the original component values, though not necessarily
    173 in the same order.
    174 ##
    175     SkColor color = SkColorSetARGB(150, 50, 100, 255);
    176     SkString s;
    177     s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
    178                             SkColorGetG(color), SkColorGetB(color));
    179     SkPaint paint;
    180     paint.setAntiAlias(true);
    181     canvas->drawString(s, 10, 62, paint);
    182     canvas->scale(50, 50);
    183     SkBitmap bitmap;
    184     SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kUnpremul_SkAlphaType);
    185     if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
    186         canvas->drawBitmap(bitmap, 0, 0);
    187     }
    188 ##
    189 
    190 #Subtopic Unpremul ##
    191 
    192 #Method static bool SkAlphaTypeIsOpaque(SkAlphaType at)
    193 #In Property
    194 #Line # returns if Alpha_Type equals kOpaque_SkAlphaType ##
    195 #Populate
    196 
    197 #NoExample
    198 ##
    199 ##
    200 
    201 #Subtopic Alpha_Type ##
    202 
    203 # ------------------------------------------------------------------------------
    204 #Subtopic Color_Type
    205 #Line # encoding for pixel color ##
    206 #Alias Color_Type ##
    207 #Alias Color_Types ##
    208 
    209 #PhraseDef list_of_color_types
    210 kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
    211 kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
    212 kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
    213 kGray_8_SkColorType, kRGBA_F16_SkColorType
    214 ##
    215 
    216 #Enum SkColorType
    217 #Line # encoding for pixel color ##
    218 
    219 #Code
    220 #Populate
    221 ##
    222 
    223 Describes how pixel bits encode color. A pixel may be an alpha mask, a
    224 grayscale, RGB, or ARGB.
    225 
    226 kN32_SkColorType selects the native 32-bit ARGB format. On Little_Endian
    227 processors, pixels containing 8-bit ARGB components pack into 32-bit
    228 kBGRA_8888_SkColorType. On Big_Endian processors, pixels pack into 32-bit
    229 kRGBA_8888_SkColorType.
    230 
    231 #Const kUnknown_SkColorType 0
    232 #Line # uninitialized ##
    233     Color_Type is set to kUnknown_SkColorType by default. If set,
    234     encoding format and size is unknown.
    235 ##
    236 
    237 #Const kAlpha_8_SkColorType 1
    238 #Line # pixel with Alpha in 8-bit byte ##
    239 #Details Alpha_8
    240     Stores 8-bit byte pixel encoding that represents transparency. Value of zero
    241     is completely transparent; a value of 255 is completely opaque.
    242 ##
    243 
    244 #Const kRGB_565_SkColorType 2
    245 #Line # pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word ##
    246 #Details RGB_565
    247     Stores 16-bit word pixel encoding that contains five bits of blue,
    248     six bits of green, and five bits of red.
    249 ##
    250 
    251 #Const kARGB_4444_SkColorType 3
    252 #Line # pixel with 4 bits for alpha, red, green, blue; in 16-bit word ##
    253 #Details ARGB_4444
    254     Stores 16-bit word pixel encoding that contains four bits of alpha,
    255     four bits of blue, four bits of green, and four bits of red.
    256 ##
    257 
    258 #Const kRGBA_8888_SkColorType 4
    259 #Line # pixel with 8 bits for red, green, blue, alpha; in 32-bit word ##
    260 #Details RGBA_8888
    261     Stores 32-bit word pixel encoding that contains eight bits of red,
    262     eight bits of green, eight bits of blue, and eight bits of alpha.
    263 ##
    264 
    265 #Const kRGB_888x_SkColorType 5
    266 #Line # pixel with 8 bits each for red, green, blue; in 32-bit word ##
    267 #Details RGB_888
    268     Stores 32-bit word pixel encoding that contains eight bits of red,
    269     eight bits of green, eight bits of blue, and eight unused bits.
    270 ##
    271 
    272 #Const kBGRA_8888_SkColorType 6
    273 #Line # pixel with 8 bits for blue, green, red, alpha; in 32-bit word ##
    274 #Details BGRA_8888
    275     Stores 32-bit word pixel encoding that contains eight bits of blue,
    276     eight bits of green, eight bits of red, and eight bits of alpha.
    277 ##
    278 
    279 #Const kRGBA_1010102_SkColorType 7
    280 #Line # 10 bits for red, green, blue; 2 bits for alpha; in 32-bit word ##
    281 #Details RGBA_1010102
    282     Stores 32-bit word pixel encoding that contains ten bits of red,
    283     ten bits of green, ten bits of blue, and two bits of alpha.
    284 ##
    285 
    286 #Const kRGB_101010x_SkColorType 8
    287 #Line # pixel with 10 bits each for red, green, blue; in 32-bit word ##
    288 #Details RGB_101010
    289     Stores 32-bit word pixel encoding that contains ten bits of red,
    290     ten bits of green, ten bits of blue, and two unused bits.
    291 ##
    292 
    293 #Const kGray_8_SkColorType 9
    294 #Line # pixel with grayscale level in 8-bit byte ##
    295 #Details Gray_8
    296     Stores 8-bit byte pixel encoding that equivalent to equal values for red,
    297     blue, and green, representing colors from black to white.
    298 ##
    299 
    300 #Const kRGBA_F16_SkColorType 10
    301 #Line # pixel with half floats for red, green, blue, alpha; in 64-bit word ##
    302 #Details RGBA_F16
    303     Stores 64-bit word pixel encoding that contains 16 bits of blue,
    304     16 bits of green, 16 bits of red, and 16 bits of alpha. Each component
    305     is encoded as a half float.
    306 ##
    307 
    308 #Const kRGBA_F32_SkColorType 11
    309 #Line # pixel using C float for red, green, blue, alpha; in 128-bit word ##
    310 #Details RGBA_F32
    311     Stores 128-bit word pixel encoding that contains 32 bits of blue,
    312     32 bits of green, 32 bits of red, and 32 bits of alpha. Each component
    313     is encoded as a single precision float.
    314 ##
    315 
    316 #Const kLastEnum_SkColorType 11
    317 #NoJustify
    318 #Line # last valid value ##
    319     Used by tests to iterate through all valid values.
    320 ##
    321 
    322 #Const kN32_SkColorType 4 or 6
    323 #Alias Native_Color_Type ##
    324 #NoJustify
    325 #Line # native ARGB 32-bit encoding ##
    326     Encodes ARGB as either kRGBA_8888_SkColorType or
    327     kBGRA_8888_SkColorType, whichever is native to the platform.
    328 ##
    329 
    330 #NoExample
    331 ##
    332 
    333 #SeeAlso SkAlphaType SkColorSpace
    334 
    335 #Enum SkColorType ##
    336 
    337 #Subtopic Alpha_8
    338 #Line # encodes transparency only ##
    339     Alpha pixels encode transparency without color information. Value of zero is
    340     completely transparent; a value of 255 is completely opaque. Bitmap
    341     pixels do not visibly draw, because its pixels have no color information.
    342     When SkColorType is set to kAlpha_8_SkColorType, the paired SkAlphaType is
    343     ignored.
    344 
    345     #Example
    346         #Description
    347         Alpha pixels can modify another draw. orangePaint fills the bounds of bitmap,
    348         with its transparency set to alpha8 pixel value.
    349         ##
    350         #Height 64
    351         canvas->scale(16, 16);
    352         SkBitmap bitmap;
    353         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kAlpha_8_SkColorType, kOpaque_SkAlphaType);
    354         bitmap.allocPixels(imageInfo);
    355         SkCanvas offscreen(bitmap);
    356         offscreen.clear(SK_ColorGREEN);
    357         SkPaint orangePaint;
    358         orangePaint.setARGB(0xFF, 0xFF, 0xA5, 0x00);
    359         canvas->drawBitmap(bitmap, 0, 0, &orangePaint);
    360         uint8_t alpha8[] = { 0xFF, 0xBB, 0x77, 0x33 };
    361         SkPixmap alphaPixmap(imageInfo, &alpha8, imageInfo.minRowBytes());
    362         if (bitmap.writePixels(alphaPixmap, 0, 0)) {
    363             canvas->drawBitmap(bitmap, 2, 2, &orangePaint);
    364         }
    365     ##
    366     #SeeAlso Alpha Gray_8
    367 ##
    368 
    369 #Subtopic RGB_565
    370 #Line # encodes RGB in 16 bits ##
    371     kRGB_565_SkColorType encodes RGB to fit in a 16-bit word. Red and blue
    372     components use five bits describing 32 levels. Green components, more sensitive
    373     to the eye, use six bits describing 64 levels. kRGB_565_SkColorType has no
    374     bits for Alpha.
    375     
    376     Pixels are fully opaque as if its Color_Alpha was set to one, and should
    377     always be paired with kOpaque_SkAlphaType.
    378 
    379     #Illustration
    380 
    381     #Example
    382     #Height 96
    383         canvas->scale(16, 16);
    384         SkBitmap bitmap;
    385         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_565_SkColorType, kOpaque_SkAlphaType);
    386         bitmap.allocPixels(imageInfo);
    387         SkCanvas offscreen(bitmap);
    388         offscreen.clear(SK_ColorGREEN);
    389         canvas->drawBitmap(bitmap, 0, 0);
    390         auto pack565 = [](unsigned r, unsigned g, unsigned b) -> uint16_t {
    391             return (b << 0) | (g << 5) | (r << 11);
    392         };
    393         uint16_t red565[] =  { pack565(0x1F, 0x00, 0x00), pack565(0x17, 0x00, 0x00),
    394                                pack565(0x0F, 0x00, 0x00), pack565(0x07, 0x00, 0x00) };
    395         uint16_t blue565[] = { pack565(0x00, 0x00, 0x1F), pack565(0x00, 0x00, 0x17),
    396                                pack565(0x00, 0x00, 0x0F), pack565(0x00, 0x00, 0x07) };
    397         SkPixmap redPixmap(imageInfo, &red565, imageInfo.minRowBytes());
    398         if (bitmap.writePixels(redPixmap, 0, 0)) {
    399             canvas->drawBitmap(bitmap, 2, 2);
    400         }
    401         SkPixmap bluePixmap(imageInfo, &blue565, imageInfo.minRowBytes());
    402         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    403             canvas->drawBitmap(bitmap, 4, 4);
    404         }
    405     ##
    406     #SeeAlso ARGB_4444 RGBA_8888
    407 ##
    408 
    409 #Subtopic ARGB_4444
    410 #Line # encodes ARGB in 16 bits ##
    411     kARGB_4444_SkColorType encodes ARGB to fit in 16-bit word. Each
    412     component: alpha, blue, green, and red; use four bits, describing 16 levels.
    413     Note that kARGB_4444_SkColorType is misnamed; the acronym does not
    414     describe the actual component order.
    415 
    416     #Illustration
    417 
    418     If paired with kPremul_SkAlphaType: blue, green, and red components are
    419     Premultiplied by the alpha value. If blue, green, or red is greater than alpha,
    420     the drawn result is undefined.
    421 
    422     If paired with kUnpremul_SkAlphaType: alpha, blue, green, and red components
    423     may have any value. There may be a performance penalty with Unpremultiplied
    424     pixels.
    425 
    426     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    427     blue, green, and red components are fully opaque. If any alpha component is
    428     less than 15, the drawn result is undefined.
    429 
    430     #Bug 7648
    431 
    432     #Example
    433     #Height 96
    434         canvas->scale(16, 16);
    435         SkBitmap bitmap;
    436         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType);
    437         bitmap.allocPixels(imageInfo);
    438         SkCanvas offscreen(bitmap);
    439         offscreen.clear(SK_ColorGREEN);
    440         canvas->drawBitmap(bitmap, 0, 0);
    441         auto pack4444 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint16_t {
    442             return (a << 0) | (b << 4) | (g << 8) | (r << 12);
    443         };
    444         uint16_t red4444[] =  { pack4444(0xF, 0xF, 0x0, 0x0), pack4444(0xF, 0xb, 0x0, 0x0),
    445                                 pack4444(0xF, 0x7, 0x0, 0x0), pack4444(0xF, 0x3, 0x0, 0x0) };
    446         uint16_t blue4444[] = { pack4444(0xF, 0x0, 0x0, 0xF), pack4444(0xF, 0x0, 0x0, 0xb),
    447                                 pack4444(0xF, 0x0, 0x0, 0x7), pack4444(0xF, 0x0, 0x0, 0x3) };
    448         SkPixmap redPixmap(imageInfo, &red4444, imageInfo.minRowBytes());
    449         if (bitmap.writePixels(redPixmap, 0, 0)) {
    450             canvas->drawBitmap(bitmap, 2, 2);
    451         }
    452         SkPixmap bluePixmap(imageInfo, &blue4444, imageInfo.minRowBytes());
    453         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    454             canvas->drawBitmap(bitmap, 4, 4);
    455         }
    456     ##
    457     #SeeAlso RGBA_8888
    458 ##
    459 
    460 #Subtopic RGBA_8888
    461 #Line # encodes ARGB Big_Endian in 32 bits ##
    462     kRGBA_8888_SkColorType encodes ARGB into a 32-bit word. Each component:
    463     red, green, blue, alpha; use eight bits, describing 256 levels.
    464 
    465     #Illustration
    466 
    467     If paired with kPremul_SkAlphaType: red, green, and blue components are
    468     Premultiplied by the alpha value. If red, green, or blue is greater than alpha,
    469     the drawn result is undefined.
    470 
    471     If paired with kUnpremul_SkAlphaType: alpha, red, green, and blue components
    472     may have any value. There may be a performance penalty with Unpremultiplied
    473     pixels.
    474 
    475     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    476     red, green, and blue components are fully opaque. If any alpha component is
    477     less than 255, the drawn result is undefined.
    478 
    479     On Big_Endian platforms, kRGBA_8888_SkColorType is the native Color_Type, and
    480     will have the best performance. Use kN32_SkColorType to choose the best
    481     Color_Type for the platform at compile time.
    482 
    483     #Example
    484     #Height 96
    485         canvas->scale(16, 16);
    486         SkBitmap bitmap;
    487         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
    488         bitmap.allocPixels(imageInfo);
    489         SkCanvas offscreen(bitmap);
    490         offscreen.clear(SK_ColorGREEN);
    491         canvas->drawBitmap(bitmap, 0, 0);
    492         auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {
    493             return (r << 0) | (g << 8) | (b << 16) | (a << 24);
    494         };
    495         uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),
    496                                pack8888(0xFF, 0x77, 0x0, 0x0), pack8888(0xFF, 0x33, 0x0, 0x0) };
    497         uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),
    498                                 pack8888(0xFF, 0x0, 0x0, 0x077), pack8888(0xFF, 0x0, 0x0, 0x033) };
    499         SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());
    500         if (bitmap.writePixels(redPixmap, 0, 0)) {
    501             canvas->drawBitmap(bitmap, 2, 2);
    502         }
    503         SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());
    504         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    505             canvas->drawBitmap(bitmap, 4, 4);
    506         }
    507     ##
    508     #SeeAlso RGB_888 BGRA_8888
    509 ##
    510 
    511 #Subtopic RGB_888
    512 #Line # encodes RGB in 32 bits ##
    513     kRGB_888x_SkColorType encodes RGB into a 32-bit word. Each component:
    514     red, green, blue; use eight bits, describing 256 levels. Eight bits are
    515     unused. Pixels described by kRGB_888x_SkColorType are fully opaque as if 
    516     their Color_Alpha was set to one, and should always be paired with
    517     kOpaque_SkAlphaType.
    518 
    519     #Illustration
    520 
    521     #Example
    522     #Bug 7645
    523     #Height 96
    524     #Platform cpu
    525         canvas->scale(16, 16);
    526         SkBitmap bitmap;
    527         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_888x_SkColorType, kOpaque_SkAlphaType);
    528         bitmap.allocPixels(imageInfo);
    529         SkCanvas offscreen(bitmap);
    530         offscreen.clear(SK_ColorGREEN);
    531         canvas->drawBitmap(bitmap, 0, 0);
    532         auto pack888 = [](unsigned r, unsigned g, unsigned b) -> uint32_t {
    533             return (r << 0) | (g << 8) | (b << 16);
    534         };
    535         uint32_t red888[] =  { pack888(0xFF, 0x00, 0x00), pack888(0xbb, 0x00, 0x00),
    536             pack888(0x77, 0x00, 0x00), pack888(0x33, 0x00, 0x00) };
    537         uint32_t blue888[] = { pack888(0x00, 0x00, 0xFF), pack888(0x00, 0x00, 0xbb),
    538             pack888(0x00, 0x00, 0x77), pack888(0x00, 0x00, 0x33) };
    539         if (bitmap.installPixels(imageInfo, (void*) red888, imageInfo.minRowBytes())) {
    540             canvas->drawBitmap(bitmap, 2, 2);
    541         }
    542         if (bitmap.installPixels(imageInfo, (void*) blue888, imageInfo.minRowBytes())) {
    543             canvas->drawBitmap(bitmap, 4, 4);
    544         }
    545     ##
    546     #SeeAlso RGBA_8888 BGRA_8888
    547 ##
    548 
    549 #Subtopic BGRA_8888
    550 #Line # encodes ARGB Little_Endian in 32 bits ##
    551     kBGRA_8888_SkColorType encodes ARGB into a 32-bit word. Each component:
    552     blue, green, red, and alpha; use eight bits, describing 256 levels.
    553 
    554     #Illustration
    555 
    556     If paired with kPremul_SkAlphaType: blue, green, and red components are
    557     Premultiplied by the alpha value. If blue, green, or red is greater than alpha,
    558     the drawn result is undefined.
    559 
    560     If paired with kUnpremul_SkAlphaType: blue, green, red, and alpha components
    561     may have any value. There may be a performance penalty with Unpremultiplied
    562     pixels.
    563 
    564     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    565     blue, green, and red components are fully opaque. If any alpha component is
    566     less than 255, the drawn result is undefined.
    567 
    568     On Little_Endian platforms, kBGRA_8888_SkColorType is the native Color_Type,
    569     and will have the best performance. Use kN32_SkColorType to choose the best
    570     Color_Type for the platform at compile time.
    571 
    572     #Example
    573     #Height 96
    574         canvas->scale(16, 16);
    575         SkBitmap bitmap;
    576         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
    577         bitmap.allocPixels(imageInfo);
    578         SkCanvas offscreen(bitmap);
    579         offscreen.clear(SK_ColorGREEN);
    580         canvas->drawBitmap(bitmap, 0, 0);
    581         auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {
    582             return (b << 0) | (g << 8) | (r << 16) | (a << 24);
    583         };
    584         uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),
    585                                pack8888(0xFF, 0x99, 0x0, 0x0), pack8888(0xFF, 0x55, 0x0, 0x0) };
    586         uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),
    587                                 pack8888(0xFF, 0x0, 0x0, 0x099), pack8888(0xFF, 0x0, 0x0, 0x055) };
    588         SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());
    589         if (bitmap.writePixels(redPixmap, 0, 0)) {
    590             canvas->drawBitmap(bitmap, 2, 2);
    591         }
    592         SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());
    593         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    594             canvas->drawBitmap(bitmap, 4, 4);
    595         }
    596     ##
    597     #SeeAlso RGBA_8888
    598 ##
    599 
    600 #Subtopic RGBA_1010102
    601 #Line # encodes ARGB ten bits per color component ##
    602     kRGBA_1010102_SkColorType encodes ARGB into a 32-bit word. Each
    603     Color component: red, green, and blue; use ten bits, describing 1024 levels.
    604     Two bits contain alpha, describing four levels. Possible alpha
    605     values are zero: fully transparent; one: 33% opaque; two: 67% opaque;
    606     three: fully opaque.
    607 
    608     At present, Color in Paint does not provide enough precision to
    609     draw all colors possible to a kRGBA_1010102_SkColorType Surface.
    610 
    611     #Illustration
    612 
    613     If paired with kPremul_SkAlphaType: red, green, and blue components are
    614     Premultiplied by the alpha value. If red, green, or blue is greater than the
    615     alpha replicated to ten bits, the drawn result is undefined.
    616 
    617     If paired with kUnpremul_SkAlphaType: alpha, red, green, and blue components
    618     may have any value. There may be a performance penalty with Unpremultiplied
    619     pixels.
    620 
    621     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    622     red, green, and blue components are fully opaque. If any alpha component is
    623     less than three, the drawn result is undefined.
    624 
    625     #Example
    626     #Bug 7645
    627     #Height 96
    628     #Platform cpu
    629         canvas->scale(16, 16);
    630         SkBitmap bitmap;
    631         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_1010102_SkColorType, kOpaque_SkAlphaType);
    632         bitmap.allocPixels(imageInfo);
    633         SkCanvas offscreen(bitmap);
    634         offscreen.clear(SK_ColorGREEN);
    635         canvas->drawBitmap(bitmap, 0, 0);
    636         auto pack1010102 = [](unsigned r, unsigned g, unsigned b, unsigned a) -> uint32_t {
    637             return (r << 0) | (g << 10) | (b << 20) | (a << 30);
    638         };
    639         uint32_t redBits[] =  { pack1010102(0x3FF, 0x000, 0x000, 0x3),
    640                                 pack1010102(0x2ff, 0x000, 0x000, 0x3),
    641                                 pack1010102(0x1ff, 0x000, 0x000, 0x3),
    642                                 pack1010102(0x0ff, 0x000, 0x000, 0x3) };
    643         uint32_t blueBits[] = { pack1010102(0x000, 0x000, 0x3FF, 0x3),
    644                                 pack1010102(0x000, 0x000, 0x2ff, 0x3),
    645                                 pack1010102(0x000, 0x000, 0x1ff, 0x3),
    646                                 pack1010102(0x000, 0x000, 0x0ff, 0x3) };
    647         if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {
    648             canvas->drawBitmap(bitmap, 2, 2);
    649         }
    650         SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());
    651         if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {
    652             canvas->drawBitmap(bitmap, 4, 4);
    653         }
    654     ##
    655     #SeeAlso RGB_101010 RGBA_8888
    656 ##
    657 
    658 #Subtopic RGB_101010
    659 #Line # encodes RGB ten bits per color component ##
    660     kRGB_101010x_SkColorType encodes RGB into a 32-bit word. Each
    661     Color component: red, green, and blue; use ten bits, describing 1024 levels.
    662     Two bits are unused. Pixels described by kRGB_101010x_SkColorType are fully
    663     opaque as if its Color_Alpha was set to one, and should always be paired
    664     with kOpaque_SkAlphaType.
    665 
    666     At present, Color in Paint does not provide enough precision to
    667     draw all colors possible to a kRGB_101010x_SkColorType Surface.
    668 
    669     #Illustration
    670 
    671     #Example
    672     #Bug 7645
    673     #Height 96
    674     #Platform cpu
    675         canvas->scale(16, 16);
    676         SkBitmap bitmap;
    677         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_101010x_SkColorType, kOpaque_SkAlphaType);
    678         bitmap.allocPixels(imageInfo);
    679         SkCanvas offscreen(bitmap);
    680         offscreen.clear(SK_ColorGREEN);
    681         canvas->drawBitmap(bitmap, 0, 0);
    682         auto pack101010x = [](unsigned r, unsigned g, unsigned b) -> uint32_t {
    683             return (r << 0) | (g << 10) | (b << 20);
    684         };
    685         uint32_t redBits[] =  { pack101010x(0x3FF, 0x000, 0x000), pack101010x(0x2ff, 0x000, 0x000),
    686         pack101010x(0x1ff, 0x000, 0x000), pack101010x(0x0ff, 0x000, 0x000) };
    687         uint32_t blueBits[] = { pack101010x(0x000, 0x000, 0x3FF), pack101010x(0x000, 0x000, 0x2ff),
    688         pack101010x(0x000, 0x000, 0x1ff), pack101010x(0x000, 0x000, 0x0ff) };
    689         if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {
    690             canvas->drawBitmap(bitmap, 2, 2);
    691         }
    692         SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());
    693         if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {
    694             canvas->drawBitmap(bitmap, 4, 4);
    695         }
    696     ##
    697     #SeeAlso RGBA_1010102
    698 ##
    699 
    700 #Subtopic Gray_8
    701 #Line # encodes level of grayscale in 8 bits ##
    702     kGray_8_SkColorType encodes grayscale level in eight bits that is equivalent
    703     to equal values for red, blue, and green, representing colors from black to
    704     white.  Pixels described by kGray_8_SkColorType are fully
    705     opaque as if its Color_Alpha was set to one, and should always be paired with
    706     kOpaque_SkAlphaType.
    707 
    708     #Example
    709     #Height 64
    710         canvas->scale(16, 16);
    711         SkBitmap bitmap;
    712         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kGray_8_SkColorType, kOpaque_SkAlphaType);
    713         bitmap.allocPixels(imageInfo);
    714         SkCanvas offscreen(bitmap);
    715         offscreen.clear(SK_ColorGREEN);
    716         canvas->drawBitmap(bitmap, 0, 0);
    717         uint8_t gray8[] = { 0xFF, 0xBB, 0x77, 0x33 };
    718         SkPixmap grayPixmap(imageInfo, &gray8, imageInfo.minRowBytes());
    719         if (bitmap.writePixels(grayPixmap, 0, 0)) {
    720             canvas->drawBitmap(bitmap, 2, 2);
    721         }
    722     ##
    723     #SeeAlso Alpha_8
    724 ##
    725 
    726 #Subtopic RGBA_F16
    727 #Line # encodes ARGB as half floats ##
    728     kRGBA_F16_SkColorType encodes ARGB into a 64-bit word. Each component:
    729     blue, green, red, and alpha; use 16 bits, describing a floating point value,
    730     from -65500 to 65000 with 3.31 decimal digits of precision.
    731 
    732     At present, Color in Paint does not provide enough precision or range to
    733     draw all colors possible to a kRGBA_F16_SkColorType Surface.
    734 
    735     Each component encodes a floating point value using
    736     #A Half floats # https://www.khronos.org/opengl/wiki/Small_Float_Formats ##
    737     . Meaningful colors are represented by the range 0.0 to 1.0, although smaller
    738     and larger values may be useful when used in combination with Transfer_Mode.
    739 
    740     #Illustration
    741 
    742     If paired with kPremul_SkAlphaType: blue, green, and red components are
    743     Premultiplied by the alpha value. If blue, green, or red is greater than alpha,
    744     the drawn result is undefined.
    745 
    746     If paired with kUnpremul_SkAlphaType: blue, green, red, and alpha components
    747     may have any value. There may be a performance penalty with Unpremultiplied
    748     pixels.
    749 
    750     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    751     blue, green, and red components are fully opaque. If any alpha component is
    752     less than one, the drawn result is undefined.
    753 
    754     #ToDo
    755     FloatToHalf should be replaced with SkFloatToHalf if/when that's made public
    756     ##
    757 
    758     #Example
    759     #Height 96
    760     #Function
    761     union FloatUIntUnion {
    762         uint32_t fUInt;
    763         float    fFloat;
    764     };
    765 
    766     uint16_t FloatToHalf(float f) {
    767         static const FloatUIntUnion magic = { 15 << 23 };
    768         static const uint32_t round_mask = ~0xfffu;
    769         FloatUIntUnion floatUnion;
    770         floatUnion.fFloat = f;
    771         uint32_t sign = floatUnion.fUInt & 0x80000000u;
    772         floatUnion.fUInt ^= sign;
    773         floatUnion.fUInt &= round_mask;
    774         floatUnion.fFloat *= magic.fFloat;
    775         floatUnion.fUInt -= round_mask;
    776         return (floatUnion.fUInt >> 13) | (sign >> 16);
    777     }
    778     ##
    779 
    780     void draw(SkCanvas* canvas) {
    781         canvas->scale(16, 16);
    782         SkBitmap bitmap;
    783         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
    784         bitmap.allocPixels(imageInfo);
    785         SkCanvas offscreen(bitmap);
    786         offscreen.clear(SK_ColorGREEN);
    787         canvas->drawBitmap(bitmap, 0, 0);
    788         auto H = [](float c) -> uint16_t {
    789             return FloatToHalf(c);
    790         };
    791                                  //     R        G        B        A
    792         uint16_t red_f16[][4] =  { { H(1.0), H(0.0), H(0.0), H(1.0) },
    793                                    { H(.75), H(0.0), H(0.0), H(1.0) },
    794                                    { H(.50), H(0.0), H(0.0), H(1.0) },
    795                                    { H(.25), H(0.0), H(0.0), H(1.0) } };
    796         uint16_t blue_f16[][4] = { { H(0.0), H(0.0), H(1.0), H(1.0) },
    797                                    { H(0.0), H(0.0), H(.75), H(1.0) },
    798                                    { H(0.0), H(0.0), H(.50), H(1.0) },
    799                                    { H(0.0), H(0.0), H(.25), H(1.0) } };
    800         SkPixmap redPixmap(imageInfo, red_f16, imageInfo.minRowBytes());
    801         if (bitmap.writePixels(redPixmap, 0, 0)) {
    802             canvas->drawBitmap(bitmap, 2, 2);
    803         }
    804         SkPixmap bluePixmap(imageInfo, blue_f16, imageInfo.minRowBytes());
    805         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    806             canvas->drawBitmap(bitmap, 4, 4);
    807         }
    808     }
    809     ##
    810     #SeeAlso SkColor4f
    811 ##
    812 
    813 #Subtopic RGBA_F32
    814 #Line # encodes ARGB as single precision floats ##
    815     kRGBA_F32_SkColorType encodes ARGB into a 128-bit word. Each component:
    816     blue, green, red, and alpha; use 32 bits, describing a floating point value,
    817     from -3.402823e+38 to 3.402823e+38 with 7.225 decimal digits of precision.
    818 
    819     At present, Color in Paint does not provide enough precision or range to
    820     draw all colors possible to a kRGBA_F32_SkColorType Surface.
    821 
    822     Each component encodes a floating point value using
    823     #A single-precision floats # https://en.wikipedia.org/wiki/Single-precision_floating-point_format ##
    824     . Meaningful colors are represented by the range 0.0 to 1.0, although smaller
    825     and larger values may be useful when used in combination with Transfer_Mode.
    826 
    827     #Illustration
    828 
    829     If paired with kPremul_SkAlphaType: blue, green, and red components are
    830     Premultiplied by the alpha value. If blue, green, or red is greater than alpha,
    831     the drawn result is undefined.
    832 
    833     If paired with kUnpremul_SkAlphaType: blue, green, red, and alpha components
    834     may have any value. There may be a performance penalty with Unpremultiplied
    835     pixels.
    836 
    837     If paired with kOpaque_SkAlphaType: all alpha component values are at the maximum;
    838     blue, green, and red components are fully opaque. If any alpha component is
    839     less than one, the drawn result is undefined.
    840 
    841     #NoExample
    842         canvas->scale(16, 16);
    843         SkBitmap bitmap;
    844         SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F32_SkColorType, kPremul_SkAlphaType);
    845         bitmap.allocPixels(imageInfo);
    846         SkCanvas offscreen(bitmap);
    847         offscreen.clear(SK_ColorGREEN);
    848         canvas->drawBitmap(bitmap, 0, 0);
    849                              //    R    G    B    A
    850         float red_f32[][4] =  { { 1.0, 0.0, 0.0, 1.0 },
    851                                 { .75, 0.0, 0.0, 1.0 },
    852                                 { .50, 0.0, 0.0, 1.0 },
    853                                 { .25, 0.0, 0.0, 1.0 } };
    854         float blue_f32[][4] = { { 0.0, 0.0, 1.0, 1.0 },
    855                                 { 0.0, 0.0, .75, 1.0 },
    856                                 { 0.0, 0.0, .50, 1.0 },
    857                                 { 0.0, 0.0, .25, 1.0 } };
    858         SkPixmap redPixmap(imageInfo, red_f32, imageInfo.minRowBytes());
    859         if (bitmap.writePixels(redPixmap, 0, 0)) {
    860             canvas->drawBitmap(bitmap, 2, 2);
    861         }
    862         SkPixmap bluePixmap(imageInfo, blue_f32, imageInfo.minRowBytes());
    863         if (bitmap.writePixels(bluePixmap, 0, 0)) {
    864             canvas->drawBitmap(bitmap, 4, 4);
    865         }
    866     ##
    867     #SeeAlso SkColor4f
    868 ##
    869 
    870 
    871 #Subtopic Color_Type ##
    872 
    873 # ------------------------------------------------------------------------------
    874 
    875 #Method int SkColorTypeBytesPerPixel(SkColorType ct)
    876 #In Property
    877 #Line # returns Color_Type byte size ##
    878 #Populate
    879 
    880 #Example
    881 #Height 192
    882     const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
    883                              "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
    884     SkPaint paint;
    885     paint.setTypeface(SkTypeface::MakeFromName("monospace", SkFontStyle()));
    886     paint.setAntiAlias(true);
    887     paint.setTextSize(10);
    888     int y = 15;
    889     canvas->drawString("    colorType  bytes", 10, y, paint);
    890     for (SkColorType colorType : { #list_of_color_types#
    891                                  } ) {
    892         int result = SkColorTypeBytesPerPixel(colorType);
    893         SkString string;
    894         string.printf("%13s %4d", colors[(int) colorType], result);
    895         canvas->drawString(string, 10, y += 14, paint);
    896     }
    897 ##
    898 #SeeAlso SkImageInfo::bytesPerPixel
    899 ##
    900 
    901 # ------------------------------------------------------------------------------
    902 
    903 #Method bool SkColorTypeIsAlwaysOpaque(SkColorType ct)
    904 #In Property
    905 #Line # returns if Color_Type includes Color_Alpha ##
    906 #Populate
    907 
    908 #Example
    909 #Height 192
    910     const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
    911                              "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
    912     SkPaint paint;
    913     paint.setTypeface(SkTypeface::MakeFromName("monospace", SkFontStyle()));
    914     paint.setAntiAlias(true);
    915     paint.setTextSize(10);
    916     int y = 15;
    917     canvas->drawString("    colorType  bytes", 10, y, paint);
    918     for (SkColorType colorType : { #list_of_color_types#
    919                                  } ) {
    920         bool result = SkColorTypeIsAlwaysOpaque(colorType);
    921         SkString string;
    922         string.printf("%13s %6s", colors[(int) colorType], result ? "true" : "false");
    923         canvas->drawString(string, 10, y += 14, paint);
    924     }
    925 ##
    926 #SeeAlso SkColorTypeValidateAlphaType
    927 ##
    928 
    929 # ------------------------------------------------------------------------------
    930 
    931 #Method bool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType,
    932                                          SkAlphaType* canonical = nullptr)
    933 #In Property
    934 #Line # returns if Alpha_Type is valid ##
    935 #Populate
    936 
    937 #Example
    938 #Height 640
    939     const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
    940                              "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
    941     const char* alphas[] = {"Unknown ", "Opaque  ", "Premul  ", "Unpremul"};
    942     SkAlphaType alphaTypes[] = { #list_of_alpha_types#
    943                                };
    944     SkPaint paint;
    945     paint.setTypeface(SkTypeface::MakeFromName("monospace", SkFontStyle()));
    946     paint.setAntiAlias(true);
    947     paint.setTextSize(10);
    948     int y = 15;
    949     canvas->drawString("   colorType   alphaType  canonical", 10, y, paint);
    950     for (SkColorType colorType : { #list_of_color_types#
    951                                  } ) {
    952         for (SkAlphaType alphaType : alphaTypes) {
    953             SkAlphaType canonicalAlphaType  = kUnknown_SkAlphaType;
    954             bool result = SkColorTypeValidateAlphaType(colorType, alphaType, &canonicalAlphaType);
    955             SkString string;
    956             string.printf("%13s %10s %10s", colors[(int) colorType], alphas[(int) alphaType],
    957                      result ? alphas[(int) canonicalAlphaType] : "------  ");
    958             canvas->drawString(string, 10, y += 14, paint);
    959         }
    960     }
    961 ##
    962 #SeeAlso SkColorTypeIsAlwaysOpaque
    963 ##
    964 
    965 # ------------------------------------------------------------------------------
    966 #Subtopic YUV_ColorSpace
    967 #Line # color range of YUV pixels ##
    968 #Alias YUV_ColorSpace ##
    969 
    970 #Enum SkYUVColorSpace
    971 #Line # color range of YUV pixels ##
    972 
    973 #Code
    974 #Populate
    975 ##
    976 
    977 Describes color range of YUV pixels. The color mapping from YUV to RGB varies
    978 depending on the source. YUV pixels may be generated by JPEG images, standard
    979 video streams, or high definition video streams. Each has its own mapping from
    980 YUV and RGB.
    981 
    982 JPEG YUV values encode the full range of 0 to 255 for all three components.
    983 Video YUV values range from 16 to 235 for all three components. Details of
    984 encoding and conversion to RGB are described in
    985 #A YCbCr color space # https://en.wikipedia.org/wiki/YCbCr ##
    986 .
    987 
    988 #Const kJPEG_SkYUVColorSpace 0
    989 #Line # describes full range ##
    990 Describes standard JPEG color space;
    991 #A CCIR 601 # https://en.wikipedia.org/wiki/Rec._601 ##
    992 with full range of 0 to 255 for components.
    993 ##
    994 #Const kRec601_SkYUVColorSpace 1
    995 #Line # describes SDTV range ##
    996 Describes standard used by standard definition television;
    997 #A CCIR 601 # https://en.wikipedia.org/wiki/Rec._601 ##
    998 with studio range of 16 to 235 range for components.
    999 ##
   1000 #Const kRec709_SkYUVColorSpace 2
   1001 #Line # describes HDTV range ##
   1002 Describes standard used by high definition television;
   1003 #A Rec. 709 # https://en.wikipedia.org/wiki/Rec._709 ##
   1004 with studio range of 16 to 235 range for components.
   1005 ##
   1006 #Const kLastEnum_SkYUVColorSpace 2
   1007 #Line # last valid value ##
   1008     Used by tests to iterate through all valid values.
   1009 ##
   1010 
   1011 #NoExample
   1012 ##
   1013 
   1014 #SeeAlso SkImage::MakeFromYUVTexturesCopy SkImage::MakeFromNV12TexturesCopy
   1015 
   1016 #Enum SkYUVColorSpace ##
   1017 #Subtopic YUV_ColorSpace ##
   1018 
   1019 # ------------------------------------------------------------------------------
   1020 
   1021 #Struct SkImageInfo
   1022 
   1023 #Code
   1024 #Populate
   1025 ##
   1026 
   1027 Describes pixel dimensions and encoding. Bitmap, Image, Pixmap, and Surface
   1028 can be created from Image_Info. Image_Info can be retrieved from Bitmap and
   1029 Pixmap, but not from Image and Surface. For example, Image and Surface
   1030 implementations may defer pixel depth, so may not completely specify Image_Info.
   1031 
   1032 Image_Info contains dimensions, the pixel integral width and height. It encodes
   1033 how pixel bits describe Color_Alpha, transparency; Color components red, blue,
   1034 and green; and Color_Space, the range and linearity of colors.
   1035 
   1036 # ------------------------------------------------------------------------------
   1037 
   1038 #Method SkImageInfo()
   1039 
   1040 #In Constructors
   1041 #Line # creates with zeroed dimensions, kUnknown_SkColorType, kUnknown_SkAlphaType ##
   1042 #Populate
   1043 
   1044 #Example
   1045 #Height 32
   1046 #Description
   1047 An empty Image_Info may be passed to SkCanvas::accessTopLayerPixels as storage
   1048 for the Canvas actual Image_Info.
   1049 ##
   1050   SkImageInfo imageInfo;
   1051   size_t rowBytes;
   1052   SkIPoint origin;
   1053   (void) canvas->accessTopLayerPixels(&imageInfo, &rowBytes, &origin);
   1054   const char* alphaType[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
   1055   SkString string;
   1056   string.printf("k%s_SkAlphaType", alphaType[(int) imageInfo.alphaType()]);
   1057   SkPaint paint;
   1058   canvas->drawString(string, 20, 20, paint);
   1059 ##
   1060 
   1061 #SeeAlso Make MakeN32 MakeS32 MakeA8
   1062 
   1063 #Method ##
   1064 
   1065 # ------------------------------------------------------------------------------
   1066 
   1067 #Method static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at,
   1068                             sk_sp<SkColorSpace> cs = nullptr)
   1069 #In Constructors
   1070 #Line # creates Image_Info from dimensions, Color_Type, Alpha_Type, Color_Space ##
   1071 #Populate
   1072 
   1073 #Example
   1074 #Height 48
   1075     uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
   1076                             { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
   1077                             { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
   1078                             { 0x90, 0x81, 0xC5, 0x71, 0x33 },
   1079                             { 0x75, 0x55, 0x44, 0x40, 0x30 }};
   1080     SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
   1081     SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
   1082     SkBitmap bitmap;
   1083     bitmap.installPixels(pixmap);
   1084     canvas->scale(8, 8);
   1085     canvas->drawBitmap(bitmap, 0, 0);
   1086 ##
   1087 
   1088 #SeeAlso MakeN32 MakeN32Premul MakeS32 MakeA8
   1089 
   1090 #Method ##
   1091 
   1092 # ------------------------------------------------------------------------------
   1093 
   1094 #Method static SkImageInfo MakeN32(int width, int height, SkAlphaType at,
   1095                                sk_sp<SkColorSpace> cs = nullptr)
   1096 #In Constructors
   1097 #Line # creates Image_Info with Native_Color_Type ##
   1098 #Populate
   1099 
   1100 #Example
   1101 #Height 128
   1102     SkBitmap bitmap;
   1103     bitmap.allocPixels(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType));
   1104     SkCanvas offscreen(bitmap);
   1105     offscreen.clear(SK_ColorWHITE);
   1106     SkPaint paint;
   1107     offscreen.drawString("g", 0, 10, paint);
   1108     canvas->scale(8, 8);
   1109     canvas->drawBitmap(bitmap, 0, 0);
   1110 ##
   1111 
   1112 #SeeAlso Make MakeN32Premul MakeS32 MakeA8
   1113 
   1114 #Method ##
   1115 
   1116 # ------------------------------------------------------------------------------
   1117 
   1118 #Method static SkImageInfo MakeS32(int width, int height, SkAlphaType at)
   1119 
   1120 #In Constructors
   1121 #Line # creates Image_Info with Native_Color_Type, sRGB Color_Space ##
   1122 #Populate
   1123 
   1124 #Example
   1125 #Set sRGB
   1126 #Height 128
   1127 #Description
   1128 Top gradient is drawn to offScreen without Color_Space. It is darker than middle
   1129 gradient, drawn to offScreen with sRGB Color_Space. Bottom gradient shares bits
   1130 with middle, but does not specify the Color_Space in noColorSpaceBitmap. A source
   1131 without Color_Space is treated as sRGB; the bottom gradient is identical to the
   1132 middle gradient.
   1133 ##
   1134     const int width = 256;
   1135     const int height = 32;
   1136     SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
   1137     SkColor  gradColors[] = { 0xFFAA0055, 0xFF11CC88 };
   1138     SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 } };
   1139     SkPaint gradPaint;
   1140     gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
   1141                     SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
   1142     SkBitmap bitmap;
   1143     bitmap.allocPixels(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));
   1144     SkCanvas offScreen(bitmap);
   1145     offScreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
   1146     canvas->drawBitmap(bitmap, 0, 0);
   1147     bitmap.allocPixels(SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType));
   1148     SkCanvas sRGBOffscreen(bitmap);
   1149     sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
   1150     canvas->drawBitmap(bitmap, 0, 48);
   1151     SkBitmap noColorSpaceBitmap;
   1152     noColorSpaceBitmap.setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));
   1153     noColorSpaceBitmap.setPixels(bitmap.getAddr(0, 0));
   1154     canvas->drawBitmap(noColorSpaceBitmap, 0, 96);
   1155 ##
   1156 
   1157 #SeeAlso Make MakeN32 MakeN32Premul MakeA8
   1158 
   1159 #Method ##
   1160 
   1161 # ------------------------------------------------------------------------------
   1162 
   1163 #Method static SkImageInfo MakeN32Premul(int width, int height, sk_sp<SkColorSpace> cs = nullptr)
   1164 
   1165 #In Constructors
   1166 #Line # creates Image_Info with Native_Color_Type, kPremul_SkAlphaType ##
   1167 #Populate
   1168 
   1169 #Example
   1170 #Height 128
   1171     SkBitmap bitmap;
   1172     bitmap.allocPixels(SkImageInfo::MakeN32Premul(18, 18));
   1173     SkCanvas offscreen(bitmap);
   1174     offscreen.clear(SK_ColorWHITE);
   1175     SkPaint paint;
   1176     paint.setAntiAlias(true);
   1177     paint.setTextSize(15);
   1178     offscreen.drawString("\xF0\x9F\x98\xB8", 1, 15, paint);
   1179     canvas->scale(6, 6);
   1180     canvas->drawBitmap(bitmap, 0, 0);
   1181 ##
   1182 
   1183 #SeeAlso MakeN32 MakeS32 MakeA8 Make
   1184 
   1185 #Method ##
   1186 
   1187 # ------------------------------------------------------------------------------
   1188 
   1189 #Method static SkImageInfo MakeN32Premul(const SkISize& size)
   1190 
   1191 #In Constructors
   1192 #Populate
   1193 
   1194 #Example
   1195 #Height 128
   1196     SkBitmap bitmap;
   1197     bitmap.allocPixels(SkImageInfo::MakeN32Premul({18, 18}));
   1198     SkCanvas offscreen(bitmap);
   1199     offscreen.clear(SK_ColorWHITE);
   1200     SkPaint paint;
   1201     paint.setAntiAlias(true);
   1202     paint.setTextSize(15);
   1203     offscreen.drawString("\xF0\x9F\x98\xB9", 1, 15, paint);
   1204     canvas->scale(6, 6);
   1205     canvas->drawBitmap(bitmap, 0, 0);
   1206 ##
   1207 
   1208 #SeeAlso MakeN32 MakeS32 MakeA8 Make
   1209 
   1210 #Method ##
   1211 
   1212 # ------------------------------------------------------------------------------
   1213 
   1214 #Method static SkImageInfo MakeA8(int width, int height)
   1215 
   1216 #In Constructors
   1217 #Line # creates Image_Info with kAlpha_8_SkColorType, kPremul_SkAlphaType ##
   1218 #Populate
   1219 
   1220 #Example
   1221 #Height 64
   1222     uint8_t pixels[][8] = { { 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00},
   1223                             { 0x00, 0x7f, 0xff, 0x3f, 0x3f, 0x7f, 0x3f, 0x00},
   1224                             { 0x3f, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f, 0x00},
   1225                             { 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x7f, 0x3f, 0x00},
   1226                             { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00},
   1227                             { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x3f, 0x7f, 0x3f},
   1228                             { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f},
   1229                             { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x3f, 0x7f, 0x3f} };
   1230     SkBitmap bitmap;
   1231     bitmap.installPixels(SkImageInfo::MakeA8(8, 8),
   1232             (void*) pixels, sizeof(pixels[0]));
   1233     SkPaint paint;
   1234     canvas->scale(4, 4);
   1235     for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {
   1236         paint.setColor(color);
   1237         canvas->drawBitmap(bitmap, 0, 0, &paint);
   1238         canvas->translate(12, 0);
   1239     }
   1240 ##
   1241 
   1242 #SeeAlso MakeN32 MakeS32 Make
   1243 
   1244 #Method ##
   1245 
   1246 # ------------------------------------------------------------------------------
   1247 
   1248 #Method static SkImageInfo MakeUnknown(int width, int height)
   1249 
   1250 #In Constructors
   1251 #Line # creates Image_Info with kUnknown_SkColorType, kUnknown_SkAlphaType ##
   1252 #Populate
   1253 
   1254 #Example
   1255 #Height 32
   1256 #Width 384
   1257 SkImageInfo info;  // default constructor
   1258 SkString string;
   1259 string.printf("SkImageInfo() %c= SkImageInfo::MakeUnknown(0, 0)",
   1260               info == SkImageInfo::MakeUnknown(0, 0) ? '=' : '!');
   1261 SkPaint paint;
   1262 canvas->drawString(string, 0, 12, paint);
   1263 ##
   1264 
   1265 #SeeAlso SkImageInfo() MakeN32 MakeS32 Make
   1266 
   1267 #Method ##
   1268 
   1269 # ------------------------------------------------------------------------------
   1270 
   1271 #Method static SkImageInfo MakeUnknown()
   1272 
   1273 #In Constructors
   1274 #Populate
   1275 
   1276 #Example
   1277 #Height 32
   1278 #Width 384
   1279 SkImageInfo info;  // default constructor
   1280 SkString string;
   1281 string.printf("SkImageInfo() %c= SkImageInfo::MakeUnknown()",
   1282               info == SkImageInfo::MakeUnknown() ? '=' : '!');
   1283 SkPaint paint;
   1284 canvas->drawString(string, 0, 12, paint);
   1285 ##
   1286 
   1287 #SeeAlso SkImageInfo() MakeN32 MakeS32 Make
   1288 
   1289 #Method ##
   1290 
   1291 
   1292 # ------------------------------------------------------------------------------
   1293 #Subtopic Property
   1294 #Line # metrics and attributes ##
   1295 ##
   1296 
   1297 #Method int width() const
   1298 #In Property
   1299 #Line # returns pixel column count ##
   1300 #Populate
   1301 
   1302 #Example
   1303 #Image 4
   1304 #Height 96
   1305    canvas->translate(10, 10);
   1306    canvas->drawBitmap(source, 0, 0);
   1307    SkImageInfo imageInfo = source.info();
   1308    canvas->translate(0, imageInfo.height());
   1309    SkPaint paint;
   1310    canvas->drawLine(0, 10, imageInfo.width(), 10, paint);
   1311    canvas->drawString("width", imageInfo.width() / 2 - 15, 25, paint);
   1312 ##
   1313 
   1314 #SeeAlso height SkBitmap::width SkPixelRef::width SkImage::width SkSurface::width
   1315 
   1316 #Method ##
   1317 
   1318 # ------------------------------------------------------------------------------
   1319 
   1320 #Method int height() const
   1321 #In Property
   1322 #Line # returns pixel row count ##
   1323 #Populate
   1324 
   1325 #Example
   1326 #Image 4
   1327 #Height 96
   1328    canvas->translate(10, 20);
   1329    canvas->drawBitmap(source, 0, 0);
   1330    SkImageInfo imageInfo = source.info();
   1331    SkPaint paint;
   1332    canvas->drawLine(imageInfo.width() + 10, 0, imageInfo.width() + 10, imageInfo.height(), paint);
   1333    canvas->drawString("height", imageInfo.width() + 15, imageInfo.height() / 2, paint);
   1334 ##
   1335 
   1336 #SeeAlso width SkBitmap::height SkPixelRef::height SkImage::height SkSurface::height
   1337 
   1338 #Method ##
   1339 
   1340 # ------------------------------------------------------------------------------
   1341 
   1342 #Method SkColorType colorType() const
   1343 #In Property
   1344 #Line # returns Color_Type ##
   1345 Returns Color_Type, one of: #list_of_color_types#.
   1346 
   1347 #Return Color_Type ##
   1348 
   1349 #Example
   1350     const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
   1351                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"};
   1352     SkImageInfo info = SkImageInfo::MakeA8(16, 32);
   1353     SkDebugf("color type: k" "%s" "_SkColorType\n", colors[info.colorType()]);
   1354 #StdOut
   1355 color type: kAlpha_8_SkColorType
   1356 ##
   1357 ##
   1358 
   1359 #SeeAlso alphaType SkPixmap::colorType SkBitmap::colorType
   1360 
   1361 #Method ##
   1362 
   1363 # ------------------------------------------------------------------------------
   1364 
   1365 #Method SkAlphaType alphaType() const
   1366 #In Property
   1367 #Line # returns Alpha_Type ##
   1368 Returns Alpha_Type, one of: #list_of_alpha_types#.
   1369 
   1370 #Return Alpha_Type ##
   1371 
   1372 #Example
   1373     const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
   1374     SkImageInfo info = SkImageInfo::MakeA8(16, 32);
   1375     SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[info.alphaType()]);
   1376 #StdOut
   1377 alpha type: kPremul_SkAlphaType
   1378 ##
   1379 ##
   1380 
   1381 #SeeAlso colorType SkPixmap::alphaType SkBitmap::alphaType
   1382 
   1383 #Method ##
   1384 
   1385 # ------------------------------------------------------------------------------
   1386 
   1387 #Method SkColorSpace* colorSpace() const
   1388 #In Property
   1389 #Line # returns Color_Space ##
   1390 #Populate
   1391 
   1392 #Example
   1393 #Description
   1394 SkColorSpace::MakeSRGBLinear creates Color_Space with linear gamma
   1395 and an sRGB gamut. This Color_Space gamma is not close to sRGB gamma.
   1396 ##
   1397     SkImageInfo info = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
   1398             SkColorSpace::MakeSRGBLinear());
   1399     SkColorSpace* colorSpace = info.colorSpace();
   1400     SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
   1401             colorSpace->gammaCloseToSRGB() ? "true" : "false",
   1402             colorSpace->gammaIsLinear() ? "true" : "false",
   1403             colorSpace->isSRGB() ? "true" : "false");
   1404 #StdOut
   1405 gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false
   1406 ##
   1407 ##
   1408 
   1409 #SeeAlso Color_Space SkPixmap::colorSpace SkBitmap::colorSpace
   1410 
   1411 #Method ##
   1412 
   1413 # ------------------------------------------------------------------------------
   1414 
   1415 #Method sk_sp<SkColorSpace> refColorSpace() const
   1416 #In Property
   1417 #Line # returns Color_Space ##
   1418 #Populate
   1419 
   1420 #Example
   1421     SkImageInfo info1 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
   1422             SkColorSpace::MakeSRGBLinear());
   1423     SkImageInfo info2 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
   1424             info1.refColorSpace());
   1425     SkColorSpace* colorSpace = info2.colorSpace();
   1426     SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
   1427             colorSpace->gammaCloseToSRGB() ? "true" : "false",
   1428             colorSpace->gammaIsLinear() ? "true" : "false",
   1429             colorSpace->isSRGB() ? "true" : "false");
   1430 ##
   1431 
   1432 #SeeAlso Color_Space SkBitmap::refColorSpace
   1433 
   1434 #Method ##
   1435 
   1436 # ------------------------------------------------------------------------------
   1437 
   1438 #Method bool isEmpty() const
   1439 #In Property
   1440 #Line # returns if dimensions contain pixels ##
   1441 #Populate
   1442 
   1443 #Example
   1444     for (int width : { 0, 2 } ) {
   1445         for (int height : { 0, 2 } ) {
   1446              SkImageInfo imageInfo= SkImageInfo::MakeA8(width, height);
   1447              SkDebugf("width: %d height: %d empty: %s\n", width, height,
   1448                       imageInfo.isEmpty() ? "true" : "false");
   1449         }
   1450     }
   1451 #StdOut
   1452 width: 0 height: 0 empty: true
   1453 width: 0 height: 2 empty: true
   1454 width: 2 height: 0 empty: true
   1455 width: 2 height: 2 empty: false
   1456 ##
   1457 ##
   1458 
   1459 #SeeAlso dimensions bounds SkBitmap::empty SkPixmap::bounds
   1460 
   1461 #Method ##
   1462 
   1463 # ------------------------------------------------------------------------------
   1464 
   1465 #Method bool isOpaque() const
   1466 #In Property
   1467 #Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
   1468 #Populate
   1469 
   1470 #Example
   1471     const int height = 2;
   1472     const int width = 2;
   1473     SkBitmap bitmap;
   1474     SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
   1475     bitmap.setInfo(imageInfo);
   1476     for (int index = 0; index < 2; ++index) {
   1477         bitmap.allocPixels();
   1478         bitmap.eraseColor(0x00000000);
   1479         SkDebugf("isOpaque: %s\n", imageInfo.isOpaque() ? "true" : "false");
   1480         bitmap.eraseColor(0xFFFFFFFF);
   1481         SkDebugf("isOpaque: %s\n", imageInfo.isOpaque() ? "true" : "false");
   1482         imageInfo = imageInfo.makeAlphaType(kOpaque_SkAlphaType);
   1483         bitmap.setInfo(imageInfo);
   1484     }
   1485 #StdOut
   1486 isOpaque: false
   1487 isOpaque: false
   1488 isOpaque: true
   1489 isOpaque: true
   1490 ##
   1491 ##
   1492 
   1493 #SeeAlso Color_Alpha SkColorTypeValidateAlphaType SkBitmap::isOpaque SkImage::isOpaque SkPixmap::isOpaque
   1494 
   1495 #Method ##
   1496 
   1497 # ------------------------------------------------------------------------------
   1498 
   1499 #Method SkISize dimensions() const
   1500 #In Property
   1501 #Line # returns width() and height() ##
   1502 #Populate
   1503 
   1504 #Example
   1505     const int height = 2;
   1506     const int width = 2;
   1507     SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
   1508     SkISize dimensions = imageInfo.dimensions();
   1509     SkIRect bounds = imageInfo.bounds();
   1510     SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
   1511     SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
   1512 #StdOut
   1513 dimensionsAsBounds == bounds
   1514 ##
   1515 ##
   1516 
   1517 #SeeAlso width height bounds SkBitmap::dimensions
   1518 
   1519 #Method ##
   1520 
   1521 # ------------------------------------------------------------------------------
   1522 
   1523 #Method SkIRect bounds() const
   1524 #In Property
   1525 #Line # returns width() and height() as Rectangle ##
   1526 #Populate
   1527 
   1528 #Example
   1529 #Height 64
   1530 #Image 4
   1531     canvas->scale(.5f, .5f);
   1532     SkImageInfo imageInfo = source.info();
   1533     SkIRect bounds = imageInfo.bounds();
   1534     for (int x : { 0, bounds.width() } ) {
   1535         for (int y : { 0, bounds.height() } ) {
   1536             canvas->drawBitmap(source, x, y);
   1537         }
   1538     }
   1539 ##
   1540 
   1541 #SeeAlso width height dimensions
   1542 
   1543 #Method ##
   1544 
   1545 # ------------------------------------------------------------------------------
   1546 
   1547 #Method bool gammaCloseToSRGB() const
   1548 #In Property
   1549 #Line # returns if Color_Space gamma is approximately the same as sRGB ##
   1550 
   1551 Returns true if associated Color_Space is not nullptr, and Color_Space gamma
   1552 is approximately the same as sRGB.
   1553 This includes the
   1554 ###$
   1555 $A sRGB transfer function $ https://en.wikipedia.org/wiki/SRGB#The_sRGB_transfer_function_(%22gamma%22) $$
   1556 $$$#
   1557 as well as a gamma curve described by a 2.2 exponent.
   1558 
   1559 #Return true if Color_Space gamma is approximately the same as sRGB ##
   1560 
   1561 #Example
   1562 #Height 144
   1563     const int width = 256;
   1564     const int height = 64;
   1565     auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {
   1566         SkString string;
   1567         string.printf("%s gamma is %s" "close to sRGB", what, closeToSRGB ? "" : "not ");
   1568         SkPaint paint;
   1569         paint.setAntiAlias(true);
   1570         canvas->drawString(string, 20, 56, paint);
   1571     };
   1572     SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };
   1573     SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };
   1574     SkPaint gradPaint;
   1575     gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
   1576                     SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
   1577     canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);
   1578     drawLabel("canvas", canvas->imageInfo().gammaCloseToSRGB());
   1579     SkBitmap bitmap;
   1580     SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);
   1581     bitmap.allocPixels(offscreenInfo);
   1582     SkCanvas sRGBOffscreen(bitmap);
   1583     sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
   1584     canvas->translate(0, 80);
   1585     canvas->drawBitmap(bitmap, 0, 0);
   1586     drawLabel("offscreen", offscreenInfo.gammaCloseToSRGB());
   1587 ##
   1588 
   1589 #SeeAlso SkColorSpace::gammaCloseToSRGB
   1590 
   1591 #Method ##
   1592 
   1593 # ------------------------------------------------------------------------------
   1594 
   1595 #Method SkImageInfo makeWH(int newWidth, int newHeight) const
   1596 #In Constructors
   1597 #Line # creates Image_Info with changed dimensions ##
   1598 #Populate
   1599 
   1600 #Example
   1601 #Height 144
   1602 #Image 3
   1603     SkImageInfo canvasImageInfo = canvas->imageInfo();
   1604     SkRect canvasBounds = SkRect::Make(canvasImageInfo.bounds());
   1605     canvas->drawBitmapRect(source, source.bounds(), canvasBounds, nullptr);
   1606     SkImageInfo insetImageInfo =
   1607               canvasImageInfo.makeWH(canvasBounds.width() / 2, canvasBounds.height() / 2);
   1608     SkBitmap inset;
   1609     inset.allocPixels(insetImageInfo);
   1610     SkCanvas offscreen(inset);
   1611     offscreen.drawBitmapRect(source, source.bounds(), SkRect::Make(inset.bounds()), nullptr);
   1612     canvas->drawBitmap(inset, canvasBounds.width() / 4, canvasBounds.height() / 4);
   1613 ##
   1614 
   1615 #SeeAlso Make makeAlphaType makeColorSpace makeColorType
   1616 
   1617 #Method ##
   1618 
   1619 # ------------------------------------------------------------------------------
   1620 
   1621 #Method SkImageInfo makeAlphaType(SkAlphaType newAlphaType) const
   1622 #In Constructors
   1623 #Line # creates Image_Info with changed Alpha_Type ##
   1624 #Populate
   1625 
   1626 #Example
   1627 #Image 3
   1628     const int width = 256;
   1629     const int height = 128;
   1630     SkColor pixels[height][width];
   1631     for (int y = 0; y < height; ++y) {
   1632         for (int x = 0; x < width; ++x) {
   1633             int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));
   1634             int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));
   1635             int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));
   1636             int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));
   1637             pixels[y][x] =
   1638                 SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);
   1639         }
   1640     }
   1641     SkBitmap bitmap;
   1642     SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
   1643     bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);
   1644     canvas->drawBitmap(source, 0, 0);
   1645     canvas->drawBitmap(bitmap, 0, 0);
   1646     SkImageInfo unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);
   1647     bitmap.installPixels(unpremulInfo, (void*) pixels, sizeof(SkColor) * width);
   1648     canvas->drawBitmap(bitmap, 0, 128);
   1649 ##
   1650 
   1651 #SeeAlso Make MakeA8 makeColorType makeColorSpace
   1652 
   1653 #Method ##
   1654 
   1655 # ------------------------------------------------------------------------------
   1656 
   1657 #Method SkImageInfo makeColorType(SkColorType newColorType) const
   1658 #In Constructors
   1659 #Line # creates Image_Info with changed Color_Type ##
   1660 #Populate
   1661 
   1662 #Example
   1663     const int width = 256;
   1664     const int height = 128;
   1665     SkColor pixels[height][width];
   1666     for (int y = 0; y < height; ++y) {
   1667         for (int x = 0; x < width; ++x) {
   1668             int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));
   1669             int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));
   1670             int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));
   1671             int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));
   1672             pixels[y][x] =
   1673                 SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);
   1674         }
   1675     }
   1676     SkBitmap bitmap;
   1677     SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
   1678     bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);
   1679     canvas->drawBitmap(source, 0, 0);
   1680     canvas->drawBitmap(bitmap, 0, 0);
   1681     SkImageInfo rgbaInfo = info.makeColorType(kRGBA_8888_SkColorType);
   1682     bitmap.installPixels(rgbaInfo, (void*) pixels, sizeof(SkColor) * width);
   1683     canvas->drawBitmap(bitmap, 0, 128);
   1684 ##
   1685 
   1686 #SeeAlso Make makeAlphaType makeColorSpace
   1687 
   1688 #Method ##
   1689 
   1690 # ------------------------------------------------------------------------------
   1691 
   1692 #Method SkImageInfo makeColorSpace(sk_sp<SkColorSpace> cs) const
   1693 #In Constructors
   1694 #Line # creates Image_Info with changed Color_Space ##
   1695 #Populate
   1696 
   1697 #Example
   1698 #Height 224
   1699     const int width = 256;
   1700     const int height = 64;
   1701     auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {
   1702         SkString string;
   1703         string.printf("%s gamma is %s" "close to sRGB", what, closeToSRGB ? "" : "not ");
   1704         SkPaint paint;
   1705         paint.setAntiAlias(true);
   1706         canvas->drawString(string, 20, 56, paint);
   1707     };
   1708     SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };
   1709     SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };
   1710     SkPaint gradPaint;
   1711     gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
   1712             SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
   1713     canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);
   1714     drawLabel("canvas", canvas->imageInfo().gammaCloseToSRGB());
   1715     SkBitmap bitmap;
   1716     SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);
   1717     bitmap.allocPixels(offscreenInfo);
   1718     SkCanvas sRGBOffscreen(bitmap);
   1719     sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
   1720     canvas->translate(0, 80);
   1721     canvas->drawBitmap(bitmap, 0, 0);
   1722     drawLabel("offscreen", offscreenInfo.gammaCloseToSRGB());
   1723     SkImageInfo linearGamma =
   1724             offscreenInfo.makeColorSpace(offscreenInfo.colorSpace()->makeLinearGamma());
   1725     bitmap.allocPixels(linearGamma);
   1726     SkCanvas lgOffscreen(bitmap);
   1727     lgOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
   1728     canvas->translate(0, 80);
   1729     canvas->drawBitmap(bitmap, 0, 0);
   1730     drawLabel("linear", linearGamma.gammaCloseToSRGB());
   1731 ##
   1732 
   1733 #SeeAlso Make MakeS32 makeAlphaType makeColorType
   1734 
   1735 #Method ##
   1736 
   1737 # ------------------------------------------------------------------------------
   1738 
   1739 #Method int bytesPerPixel() const
   1740 #In Property
   1741 #Line # returns number of bytes in pixel based on Color_Type ##
   1742 #Populate
   1743 
   1744 #Example
   1745     const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
   1746                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"};
   1747     for (SkColorType colorType : { #list_of_color_types#
   1748                                  } ) {
   1749         SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);
   1750         SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d\n",
   1751                 colors[colorType], 13 - strlen(colors[colorType]), " ",
   1752                 info.bytesPerPixel());
   1753     }
   1754 #StdOut
   1755 color: kUnknown_SkColorType      bytesPerPixel: 0
   1756 color: kAlpha_8_SkColorType      bytesPerPixel: 1
   1757 color: kRGB_565_SkColorType      bytesPerPixel: 2
   1758 color: kARGB_4444_SkColorType    bytesPerPixel: 2
   1759 color: kRGBA_8888_SkColorType    bytesPerPixel: 4
   1760 color: kRGB_888x_SkColorType     bytesPerPixel: 4
   1761 color: kBGRA_8888_SkColorType    bytesPerPixel: 4
   1762 color: kRGBA_1010102_SkColorType bytesPerPixel: 4
   1763 color: kRGB_101010x_SkColorType  bytesPerPixel: 4
   1764 color: kGray_8_SkColorType       bytesPerPixel: 1
   1765 color: kRGBA_F16_SkColorType     bytesPerPixel: 8
   1766 ##
   1767 ##
   1768 
   1769 #SeeAlso width shiftPerPixel SkBitmap::bytesPerPixel
   1770 
   1771 #Method ##
   1772 
   1773 # ------------------------------------------------------------------------------
   1774 
   1775 #Method int shiftPerPixel() const
   1776 #In Property
   1777 #Line # returns bit shift from pixels to bytes ##
   1778 #Populate
   1779 
   1780 #Example
   1781     const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
   1782                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"};
   1783     for (SkColorType colorType : { #list_of_color_types#
   1784                                  } ) {
   1785         SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);
   1786         SkDebugf("color: k" "%s" "_SkColorType" "%*s" "shiftPerPixel: %d\n",
   1787                 colors[colorType], 14 - strlen(colors[colorType]), " ",
   1788                 info.shiftPerPixel());
   1789     }
   1790 #StdOut
   1791 color: kUnknown_SkColorType       shiftPerPixel: 0
   1792 color: kAlpha_8_SkColorType       shiftPerPixel: 0
   1793 color: kRGB_565_SkColorType       shiftPerPixel: 1
   1794 color: kARGB_4444_SkColorType     shiftPerPixel: 1
   1795 color: kRGBA_8888_SkColorType     shiftPerPixel: 2
   1796 color: kRGB_888x_SkColorType      shiftPerPixel: 2
   1797 color: kBGRA_8888_SkColorType     shiftPerPixel: 2
   1798 color: kRGBA_1010102_SkColorType  shiftPerPixel: 2
   1799 color: kRGB_101010x_SkColorType   shiftPerPixel: 2
   1800 color: kGray_8_SkColorType        shiftPerPixel: 0
   1801 color: kRGBA_F16_SkColorType      shiftPerPixel: 3
   1802 ##
   1803 ##
   1804 
   1805 #SeeAlso bytesPerPixel minRowBytes SkBitmap::shiftPerPixel SkPixmap::shiftPerPixel
   1806 
   1807 #Method ##
   1808 
   1809 # ------------------------------------------------------------------------------
   1810 
   1811 #Method uint64_t minRowBytes64() const
   1812 #In Property
   1813 #Line # returns width() times bytesPerPixel in 64 bits ##
   1814 #Populate
   1815 
   1816 #Example
   1817     for (int shift = 24; shift < 32; ++shift) {
   1818         int width = 1 << shift;
   1819         SkImageInfo imageInfo =
   1820                 SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
   1821         uint64_t minRowBytes = imageInfo.minRowBytes64();
   1822         bool widthTooLarge = (uint64_t) (int32_t) minRowBytes != minRowBytes;
   1823         SkDebugf("RGBA_F16 width %d (0x%08x) %s\n",
   1824                 width, width, widthTooLarge ? "too large" : "OK");
   1825     }
   1826 #StdOut
   1827 RGBA_F16 width 16777216 (0x01000000) OK
   1828 RGBA_F16 width 33554432 (0x02000000) OK
   1829 RGBA_F16 width 67108864 (0x04000000) OK
   1830 RGBA_F16 width 134217728 (0x08000000) OK
   1831 RGBA_F16 width 268435456 (0x10000000) too large
   1832 RGBA_F16 width 536870912 (0x20000000) too large
   1833 RGBA_F16 width 1073741824 (0x40000000) too large
   1834 RGBA_F16 width -2147483648 (0x80000000) too large
   1835 ##
   1836 ##
   1837 
   1838 #SeeAlso minRowBytes computeByteSize computeMinByteSize validRowBytes
   1839 
   1840 #Method ##
   1841 
   1842 # ------------------------------------------------------------------------------
   1843 
   1844 #Method size_t minRowBytes() const
   1845 #In Property
   1846 #Line # returns width() times bytesPerPixel in 32 bits ##
   1847 #Populate
   1848 
   1849 #Example
   1850     for (int shift = 24; shift < 32; ++shift) {
   1851         int width = 1 << shift;
   1852         SkImageInfo imageInfo =
   1853                 SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
   1854         size_t minRowBytes = imageInfo.minRowBytes();
   1855         bool widthTooLarge = !minRowBytes;
   1856         SkDebugf("RGBA_F16 width %d (0x%08x) %s\n",
   1857                 width, width, widthTooLarge ? "too large" : "OK");
   1858     }
   1859 #StdOut
   1860 RGBA_F16 width 16777216 (0x01000000) OK
   1861 RGBA_F16 width 33554432 (0x02000000) OK
   1862 RGBA_F16 width 67108864 (0x04000000) OK
   1863 RGBA_F16 width 134217728 (0x08000000) OK
   1864 RGBA_F16 width 268435456 (0x10000000) too large
   1865 RGBA_F16 width 536870912 (0x20000000) too large
   1866 RGBA_F16 width 1073741824 (0x40000000) too large
   1867 RGBA_F16 width -2147483648 (0x80000000) too large
   1868 ##
   1869 ##
   1870 
   1871 #SeeAlso minRowBytes64 computeByteSize computeMinByteSize validRowBytes
   1872 
   1873 #Method ##
   1874 
   1875 # ------------------------------------------------------------------------------
   1876 
   1877 #Method size_t computeOffset(int x, int y, size_t rowBytes) const
   1878 #In Utility
   1879 #Line # returns byte offset within pixel array ##
   1880 #Populate
   1881 
   1882 #Example
   1883 #Height 128
   1884     uint8_t pixels[][12] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},
   1885                              { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
   1886                              { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},
   1887                              { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},
   1888                              { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
   1889                              { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},
   1890                              { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},
   1891                              { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00} };
   1892     SkImageInfo imageInfo = SkImageInfo::MakeA8(8, 8);
   1893     SkBitmap bitmap;
   1894     bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));
   1895     SkPaint paint;
   1896     paint.setColor(SK_ColorRED);
   1897     canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);
   1898     size_t offset = imageInfo.computeOffset(2, 3, sizeof(pixels[0]));
   1899     pixels[0][offset] = 0x7F;
   1900     offset = imageInfo.computeOffset(5, 3, sizeof(pixels[0]));
   1901     pixels[0][offset] = 0x7F;
   1902     bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));
   1903     canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(128, 128), &paint);
   1904 ##
   1905 
   1906 #SeeAlso height width minRowBytes computeByteSize
   1907 
   1908 #Method ##
   1909 
   1910 # ------------------------------------------------------------------------------
   1911 
   1912 #Method bool operator==(const SkImageInfo& other) const
   1913 #Line # compares Image_Info for equality ##
   1914 #Populate
   1915 
   1916 #Example
   1917     SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);
   1918     SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);
   1919     SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
   1920     info2 = info2.makeWH(10, 20);
   1921     SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
   1922     info2 = info2.makeColorType(kGray_8_SkColorType);
   1923     SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
   1924     info2 = info2.makeAlphaType(kPremul_SkAlphaType);
   1925     SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
   1926 #StdOut
   1927 info1 != info2
   1928 info1 != info2
   1929 info1 != info2
   1930 info1 == info2
   1931 ##
   1932 ##
   1933 
   1934 #SeeAlso operator!=(const SkImageInfo& other) const SkColorSpace::Equals
   1935 
   1936 #Method ##
   1937 
   1938 # ------------------------------------------------------------------------------
   1939 
   1940 #Method bool operator!=(const SkImageInfo& other) const
   1941 #Line # compares Image_Info for inequality ##
   1942 #Populate
   1943 
   1944 #Example
   1945     SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);
   1946     SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);
   1947     SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
   1948     info2 = info2.makeWH(10, 20);
   1949     SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
   1950     info2 = info2.makeColorType(kGray_8_SkColorType);
   1951     SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
   1952     info2 = info2.makeAlphaType(kPremul_SkAlphaType);
   1953     SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
   1954 #StdOut
   1955 info1 != info2
   1956 info1 != info2
   1957 info1 != info2
   1958 info1 == info2
   1959 ##
   1960 ##
   1961 
   1962 #SeeAlso operator==(const SkImageInfo& other) const SkColorSpace::Equals
   1963 
   1964 #Method ##
   1965 
   1966 # ------------------------------------------------------------------------------
   1967 
   1968 #Method size_t computeByteSize(size_t rowBytes) const
   1969 #In Utility
   1970 #Line # returns memory required by pixel buffer with given row bytes ##
   1971 #Populate
   1972 
   1973 #Example
   1974 #Height 130
   1975     SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
   1976     const size_t size = info.computeByteSize(100000);
   1977     SkAutoTMalloc<SkPMColor> storage(size);
   1978     SkPMColor* pixels = storage.get();
   1979     SkBitmap bitmap;
   1980     bitmap.setInfo(info);
   1981     bitmap.setPixels(pixels);
   1982     bitmap.eraseColor(SK_ColorRED);
   1983     canvas->scale(50, 50);
   1984     canvas->rotate(8);
   1985     canvas->drawBitmap(bitmap, 2, 0);
   1986 ##
   1987 
   1988 #SeeAlso computeMinByteSize validRowBytes
   1989 
   1990 #Method ##
   1991 
   1992 # ------------------------------------------------------------------------------
   1993 
   1994 #Method size_t computeMinByteSize() const
   1995 #In Utility
   1996 #Line # returns least memory required by pixel buffer ##
   1997 #Populate
   1998 
   1999 #Example
   2000 #Height 130
   2001     SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
   2002     const size_t size = info.computeMinByteSize();
   2003     SkAutoTMalloc<SkPMColor> storage(size);
   2004     SkPMColor* pixels = storage.get();
   2005     SkBitmap bitmap;
   2006     bitmap.setInfo(info);
   2007     bitmap.setPixels(pixels);
   2008     bitmap.eraseColor(SK_ColorRED);
   2009     canvas->scale(50, 50);
   2010     canvas->rotate(8);
   2011     canvas->drawBitmap(bitmap, 2, 0);
   2012 ##
   2013 
   2014 #SeeAlso computeByteSize validRowBytes
   2015 
   2016 #Method ##
   2017 
   2018 # ------------------------------------------------------------------------------
   2019 
   2020 #Method static bool ByteSizeOverflowed(size_t byteSize)
   2021 #In Utility
   2022 #Line # checks result of computeByteSize and computeMinByteSize ##
   2023 #Populate
   2024 
   2025 #Example
   2026     SkImageInfo info = SkImageInfo::MakeN32Premul(2, 1000000000);
   2027     for (size_t rowBytes = 100000000; rowBytes < 10000000000000LL; rowBytes *= 10) {
   2028         const size_t size = info.computeByteSize(rowBytes);
   2029         SkDebugf("rowBytes:%llu size:%llu overflowed:%s\n", rowBytes, size,
   2030                  SkImageInfo::ByteSizeOverflowed(size) ? "true" : "false");
   2031     }
   2032 #StdOut
   2033 rowBytes:100000000 size:99999999900000008 overflowed:false
   2034 rowBytes:1000000000 size:999999999000000008 overflowed:false
   2035 rowBytes:10000000000 size:9999999990000000008 overflowed:false
   2036 rowBytes:100000000000 size:18446744073709551615 overflowed:true
   2037 rowBytes:1000000000000 size:18446744073709551615 overflowed:true
   2038 ##
   2039 ##
   2040 
   2041 #SeeAlso computeByteSize computeMinByteSize validRowBytes
   2042 
   2043 #Method ##
   2044 
   2045 # ------------------------------------------------------------------------------
   2046 
   2047 #Method bool validRowBytes(size_t rowBytes) const
   2048 #In Utility
   2049 #Line # checks if row bytes is large enough to contain pixel row ##
   2050 #Populate
   2051 
   2052 #Example
   2053     SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);
   2054     for (size_t rowBytes = 60; rowBytes < 72; rowBytes += sizeof(SkPMColor)) {
   2055         SkDebugf("validRowBytes(%llu): %s\n", rowBytes, info.validRowBytes(rowBytes) ?
   2056                  "true" : "false");
   2057     }
   2058 #StdOut
   2059 validRowBytes(60): false
   2060 validRowBytes(64): true
   2061 validRowBytes(68): true
   2062 ##
   2063 ##
   2064 
   2065 #SeeAlso ByteSizeOverflowed computeByteSize computeMinByteSize
   2066 
   2067 #Method ##
   2068 
   2069 # ------------------------------------------------------------------------------
   2070 
   2071 #Method void reset()
   2072 #In Constructors
   2073 #Line # sets zero dimensions, kUnknown_SkColorType, kUnknown_SkAlphaType ##
   2074 #Populate
   2075 
   2076 #Example
   2077     SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);
   2078     SkImageInfo copy = info;
   2079     SkDebugf("info %c= copy\n", info == copy ? '=' : '!');
   2080     copy.reset();
   2081     SkDebugf("info %c= reset copy\n", info == copy ? '=' : '!');
   2082     SkDebugf("SkImageInfo() %c= reset copy\n", SkImageInfo() == copy ? '=' : '!');
   2083 #StdOut
   2084 info == copy
   2085 info != reset copy
   2086 SkImageInfo() == reset copy
   2087 ##
   2088 ##
   2089 
   2090 #SeeAlso SkImageInfo()
   2091 
   2092 #Method ##
   2093 
   2094 # ------------------------------------------------------------------------------
   2095 #Subtopic Utility
   2096 #Line # rarely called management functions ##
   2097 ##
   2098 
   2099 #Method void validate() const
   2100 #In Utility
   2101 #Line # asserts if Image_Info is invalid (debug only) ##
   2102 #Populate
   2103 
   2104 #NoExample
   2105 ##
   2106 
   2107 #SeeAlso validRowBytes SkBitmap::validate
   2108 
   2109 #Method ##
   2110 
   2111 #Struct SkImageInfo ##
   2112 
   2113 #Topic Image_Info ##
   2114