1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkEncodedInfo_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkEncodedInfo_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skcms/skcms.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 22*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 23*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker struct SkEncodedInfo { 26*c8dee2aaSAndroid Build Coastguard Worker public: 27*c8dee2aaSAndroid Build Coastguard Worker class ICCProfile { 28*c8dee2aaSAndroid Build Coastguard Worker public: 29*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ICCProfile> Make(sk_sp<SkData>); 30*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ICCProfile> Make(const skcms_ICCProfile&); 31*c8dee2aaSAndroid Build Coastguard Worker profileSkEncodedInfo32*c8dee2aaSAndroid Build Coastguard Worker const skcms_ICCProfile* profile() const { return &fProfile; } dataSkEncodedInfo33*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data() const { return fData; } 34*c8dee2aaSAndroid Build Coastguard Worker private: 35*c8dee2aaSAndroid Build Coastguard Worker ICCProfile(const skcms_ICCProfile&, sk_sp<SkData> = nullptr); 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker skcms_ICCProfile fProfile; 38*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> fData; 39*c8dee2aaSAndroid Build Coastguard Worker }; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker enum Alpha { 42*c8dee2aaSAndroid Build Coastguard Worker kOpaque_Alpha, 43*c8dee2aaSAndroid Build Coastguard Worker kUnpremul_Alpha, 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker // Each pixel is either fully opaque or fully transparent. 46*c8dee2aaSAndroid Build Coastguard Worker // There is no difference between requesting kPremul or kUnpremul. 47*c8dee2aaSAndroid Build Coastguard Worker kBinary_Alpha, 48*c8dee2aaSAndroid Build Coastguard Worker }; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker /* 51*c8dee2aaSAndroid Build Coastguard Worker * We strive to make the number of components per pixel obvious through 52*c8dee2aaSAndroid Build Coastguard Worker * our naming conventions. 53*c8dee2aaSAndroid Build Coastguard Worker * Ex: kRGB has 3 components. kRGBA has 4 components. 54*c8dee2aaSAndroid Build Coastguard Worker * 55*c8dee2aaSAndroid Build Coastguard Worker * This sometimes results in redundant Alpha and Color information. 56*c8dee2aaSAndroid Build Coastguard Worker * Ex: kRGB images must also be kOpaque. 57*c8dee2aaSAndroid Build Coastguard Worker */ 58*c8dee2aaSAndroid Build Coastguard Worker enum Color { 59*c8dee2aaSAndroid Build Coastguard Worker // PNG, WBMP 60*c8dee2aaSAndroid Build Coastguard Worker kGray_Color, 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker // PNG 63*c8dee2aaSAndroid Build Coastguard Worker kGrayAlpha_Color, 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker // PNG with Skia-specific sBIT 66*c8dee2aaSAndroid Build Coastguard Worker // Like kGrayAlpha, except this expects to be treated as 67*c8dee2aaSAndroid Build Coastguard Worker // kAlpha_8_SkColorType, which ignores the gray component. If 68*c8dee2aaSAndroid Build Coastguard Worker // decoded to full color (e.g. kN32), the gray component is respected 69*c8dee2aaSAndroid Build Coastguard Worker // (so it can share code with kGrayAlpha). 70*c8dee2aaSAndroid Build Coastguard Worker kXAlpha_Color, 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker // PNG 73*c8dee2aaSAndroid Build Coastguard Worker // 565 images may be encoded to PNG by specifying the number of 74*c8dee2aaSAndroid Build Coastguard Worker // significant bits for each channel. This is a strange 565 75*c8dee2aaSAndroid Build Coastguard Worker // representation because the image is still encoded with 8 bits per 76*c8dee2aaSAndroid Build Coastguard Worker // component. 77*c8dee2aaSAndroid Build Coastguard Worker k565_Color, 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker // PNG, GIF, BMP 80*c8dee2aaSAndroid Build Coastguard Worker kPalette_Color, 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker // PNG, RAW 83*c8dee2aaSAndroid Build Coastguard Worker kRGB_Color, 84*c8dee2aaSAndroid Build Coastguard Worker kRGBA_Color, 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker // BMP 87*c8dee2aaSAndroid Build Coastguard Worker kBGR_Color, 88*c8dee2aaSAndroid Build Coastguard Worker kBGRX_Color, 89*c8dee2aaSAndroid Build Coastguard Worker kBGRA_Color, 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker // JPEG, WEBP 92*c8dee2aaSAndroid Build Coastguard Worker kYUV_Color, 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker // WEBP 95*c8dee2aaSAndroid Build Coastguard Worker kYUVA_Color, 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker // JPEG 98*c8dee2aaSAndroid Build Coastguard Worker // Photoshop actually writes inverted CMYK data into JPEGs, where zero 99*c8dee2aaSAndroid Build Coastguard Worker // represents 100% ink coverage. For this reason, we treat CMYK JPEGs 100*c8dee2aaSAndroid Build Coastguard Worker // as having inverted CMYK. libjpeg-turbo warns that this may break 101*c8dee2aaSAndroid Build Coastguard Worker // other applications, but the CMYK JPEGs we see on the web expect to 102*c8dee2aaSAndroid Build Coastguard Worker // be treated as inverted CMYK. 103*c8dee2aaSAndroid Build Coastguard Worker kInvertedCMYK_Color, 104*c8dee2aaSAndroid Build Coastguard Worker kYCCK_Color, 105*c8dee2aaSAndroid Build Coastguard Worker }; 106*c8dee2aaSAndroid Build Coastguard Worker MakeSkEncodedInfo107*c8dee2aaSAndroid Build Coastguard Worker static SkEncodedInfo Make(int width, int height, Color color, Alpha alpha, 108*c8dee2aaSAndroid Build Coastguard Worker int bitsPerComponent) { 109*c8dee2aaSAndroid Build Coastguard Worker return Make(width, height, color, alpha, bitsPerComponent, nullptr); 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker MakeSkEncodedInfo112*c8dee2aaSAndroid Build Coastguard Worker static SkEncodedInfo Make(int width, int height, Color color, 113*c8dee2aaSAndroid Build Coastguard Worker Alpha alpha, int bitsPerComponent, std::unique_ptr<ICCProfile> profile) { 114*c8dee2aaSAndroid Build Coastguard Worker return Make(width, height, color, alpha, /*bitsPerComponent*/ bitsPerComponent, 115*c8dee2aaSAndroid Build Coastguard Worker std::move(profile), /*colorDepth*/ bitsPerComponent); 116*c8dee2aaSAndroid Build Coastguard Worker } 117*c8dee2aaSAndroid Build Coastguard Worker MakeSkEncodedInfo118*c8dee2aaSAndroid Build Coastguard Worker static SkEncodedInfo Make(int width, int height, Color color, 119*c8dee2aaSAndroid Build Coastguard Worker Alpha alpha, int bitsPerComponent, std::unique_ptr<ICCProfile> profile, 120*c8dee2aaSAndroid Build Coastguard Worker int colorDepth) { 121*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(1 == bitsPerComponent || 122*c8dee2aaSAndroid Build Coastguard Worker 2 == bitsPerComponent || 123*c8dee2aaSAndroid Build Coastguard Worker 4 == bitsPerComponent || 124*c8dee2aaSAndroid Build Coastguard Worker 8 == bitsPerComponent || 125*c8dee2aaSAndroid Build Coastguard Worker 16 == bitsPerComponent); 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker switch (color) { 128*c8dee2aaSAndroid Build Coastguard Worker case kGray_Color: 129*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kOpaque_Alpha == alpha); 130*c8dee2aaSAndroid Build Coastguard Worker break; 131*c8dee2aaSAndroid Build Coastguard Worker case kGrayAlpha_Color: 132*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kOpaque_Alpha != alpha); 133*c8dee2aaSAndroid Build Coastguard Worker break; 134*c8dee2aaSAndroid Build Coastguard Worker case kPalette_Color: 135*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(16 != bitsPerComponent); 136*c8dee2aaSAndroid Build Coastguard Worker break; 137*c8dee2aaSAndroid Build Coastguard Worker case kRGB_Color: 138*c8dee2aaSAndroid Build Coastguard Worker case kBGR_Color: 139*c8dee2aaSAndroid Build Coastguard Worker case kBGRX_Color: 140*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kOpaque_Alpha == alpha); 141*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(bitsPerComponent >= 8); 142*c8dee2aaSAndroid Build Coastguard Worker break; 143*c8dee2aaSAndroid Build Coastguard Worker case kYUV_Color: 144*c8dee2aaSAndroid Build Coastguard Worker case kInvertedCMYK_Color: 145*c8dee2aaSAndroid Build Coastguard Worker case kYCCK_Color: 146*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kOpaque_Alpha == alpha); 147*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(8 == bitsPerComponent); 148*c8dee2aaSAndroid Build Coastguard Worker break; 149*c8dee2aaSAndroid Build Coastguard Worker case kRGBA_Color: 150*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(bitsPerComponent >= 8); 151*c8dee2aaSAndroid Build Coastguard Worker break; 152*c8dee2aaSAndroid Build Coastguard Worker case kBGRA_Color: 153*c8dee2aaSAndroid Build Coastguard Worker case kYUVA_Color: 154*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(8 == bitsPerComponent); 155*c8dee2aaSAndroid Build Coastguard Worker break; 156*c8dee2aaSAndroid Build Coastguard Worker case kXAlpha_Color: 157*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kUnpremul_Alpha == alpha); 158*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(8 == bitsPerComponent); 159*c8dee2aaSAndroid Build Coastguard Worker break; 160*c8dee2aaSAndroid Build Coastguard Worker case k565_Color: 161*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(kOpaque_Alpha == alpha); 162*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(8 == bitsPerComponent); 163*c8dee2aaSAndroid Build Coastguard Worker break; 164*c8dee2aaSAndroid Build Coastguard Worker default: 165*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(false); 166*c8dee2aaSAndroid Build Coastguard Worker break; 167*c8dee2aaSAndroid Build Coastguard Worker } 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker return SkEncodedInfo(width, 170*c8dee2aaSAndroid Build Coastguard Worker height, 171*c8dee2aaSAndroid Build Coastguard Worker color, 172*c8dee2aaSAndroid Build Coastguard Worker alpha, 173*c8dee2aaSAndroid Build Coastguard Worker SkToU8(bitsPerComponent), 174*c8dee2aaSAndroid Build Coastguard Worker SkToU8(colorDepth), 175*c8dee2aaSAndroid Build Coastguard Worker std::move(profile)); 176*c8dee2aaSAndroid Build Coastguard Worker } 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker /* 179*c8dee2aaSAndroid Build Coastguard Worker * Returns a recommended SkImageInfo. 180*c8dee2aaSAndroid Build Coastguard Worker * 181*c8dee2aaSAndroid Build Coastguard Worker * TODO: Leave this up to the client. 182*c8dee2aaSAndroid Build Coastguard Worker */ makeImageInfoSkEncodedInfo183*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo makeImageInfo() const { 184*c8dee2aaSAndroid Build Coastguard Worker auto ct = kGray_Color == fColor ? kGray_8_SkColorType : 185*c8dee2aaSAndroid Build Coastguard Worker kXAlpha_Color == fColor ? kAlpha_8_SkColorType : 186*c8dee2aaSAndroid Build Coastguard Worker k565_Color == fColor ? kRGB_565_SkColorType : 187*c8dee2aaSAndroid Build Coastguard Worker kN32_SkColorType ; 188*c8dee2aaSAndroid Build Coastguard Worker auto alpha = kOpaque_Alpha == fAlpha ? kOpaque_SkAlphaType 189*c8dee2aaSAndroid Build Coastguard Worker : kUnpremul_SkAlphaType; 190*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> cs = fProfile ? SkColorSpace::Make(*fProfile->profile()) 191*c8dee2aaSAndroid Build Coastguard Worker : nullptr; 192*c8dee2aaSAndroid Build Coastguard Worker if (!cs) { 193*c8dee2aaSAndroid Build Coastguard Worker cs = SkColorSpace::MakeSRGB(); 194*c8dee2aaSAndroid Build Coastguard Worker } 195*c8dee2aaSAndroid Build Coastguard Worker return SkImageInfo::Make(fWidth, fHeight, ct, alpha, std::move(cs)); 196*c8dee2aaSAndroid Build Coastguard Worker } 197*c8dee2aaSAndroid Build Coastguard Worker widthSkEncodedInfo198*c8dee2aaSAndroid Build Coastguard Worker int width() const { return fWidth; } heightSkEncodedInfo199*c8dee2aaSAndroid Build Coastguard Worker int height() const { return fHeight; } colorSkEncodedInfo200*c8dee2aaSAndroid Build Coastguard Worker Color color() const { return fColor; } alphaSkEncodedInfo201*c8dee2aaSAndroid Build Coastguard Worker Alpha alpha() const { return fAlpha; } opaqueSkEncodedInfo202*c8dee2aaSAndroid Build Coastguard Worker bool opaque() const { return fAlpha == kOpaque_Alpha; } profileSkEncodedInfo203*c8dee2aaSAndroid Build Coastguard Worker const skcms_ICCProfile* profile() const { 204*c8dee2aaSAndroid Build Coastguard Worker if (!fProfile) return nullptr; 205*c8dee2aaSAndroid Build Coastguard Worker return fProfile->profile(); 206*c8dee2aaSAndroid Build Coastguard Worker } profileDataSkEncodedInfo207*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> profileData() const { 208*c8dee2aaSAndroid Build Coastguard Worker if (!fProfile) return nullptr; 209*c8dee2aaSAndroid Build Coastguard Worker return fProfile->data(); 210*c8dee2aaSAndroid Build Coastguard Worker } 211*c8dee2aaSAndroid Build Coastguard Worker bitsPerComponentSkEncodedInfo212*c8dee2aaSAndroid Build Coastguard Worker uint8_t bitsPerComponent() const { return fBitsPerComponent; } 213*c8dee2aaSAndroid Build Coastguard Worker bitsPerPixelSkEncodedInfo214*c8dee2aaSAndroid Build Coastguard Worker uint8_t bitsPerPixel() const { 215*c8dee2aaSAndroid Build Coastguard Worker switch (fColor) { 216*c8dee2aaSAndroid Build Coastguard Worker case kGray_Color: 217*c8dee2aaSAndroid Build Coastguard Worker return fBitsPerComponent; 218*c8dee2aaSAndroid Build Coastguard Worker case kXAlpha_Color: 219*c8dee2aaSAndroid Build Coastguard Worker case kGrayAlpha_Color: 220*c8dee2aaSAndroid Build Coastguard Worker return 2 * fBitsPerComponent; 221*c8dee2aaSAndroid Build Coastguard Worker case kPalette_Color: 222*c8dee2aaSAndroid Build Coastguard Worker return fBitsPerComponent; 223*c8dee2aaSAndroid Build Coastguard Worker case kRGB_Color: 224*c8dee2aaSAndroid Build Coastguard Worker case kBGR_Color: 225*c8dee2aaSAndroid Build Coastguard Worker case kYUV_Color: 226*c8dee2aaSAndroid Build Coastguard Worker case k565_Color: 227*c8dee2aaSAndroid Build Coastguard Worker return 3 * fBitsPerComponent; 228*c8dee2aaSAndroid Build Coastguard Worker case kRGBA_Color: 229*c8dee2aaSAndroid Build Coastguard Worker case kBGRA_Color: 230*c8dee2aaSAndroid Build Coastguard Worker case kBGRX_Color: 231*c8dee2aaSAndroid Build Coastguard Worker case kYUVA_Color: 232*c8dee2aaSAndroid Build Coastguard Worker case kInvertedCMYK_Color: 233*c8dee2aaSAndroid Build Coastguard Worker case kYCCK_Color: 234*c8dee2aaSAndroid Build Coastguard Worker return 4 * fBitsPerComponent; 235*c8dee2aaSAndroid Build Coastguard Worker default: 236*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(false); 237*c8dee2aaSAndroid Build Coastguard Worker return 0; 238*c8dee2aaSAndroid Build Coastguard Worker } 239*c8dee2aaSAndroid Build Coastguard Worker } 240*c8dee2aaSAndroid Build Coastguard Worker 241*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo(const SkEncodedInfo& orig) = delete; 242*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo& operator=(const SkEncodedInfo&) = delete; 243*c8dee2aaSAndroid Build Coastguard Worker 244*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo(SkEncodedInfo&& orig) = default; 245*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo& operator=(SkEncodedInfo&&) = default; 246*c8dee2aaSAndroid Build Coastguard Worker 247*c8dee2aaSAndroid Build Coastguard Worker // Explicit copy method, to avoid accidental copying. copySkEncodedInfo248*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo copy() const { 249*c8dee2aaSAndroid Build Coastguard Worker auto copy = SkEncodedInfo::Make( 250*c8dee2aaSAndroid Build Coastguard Worker fWidth, fHeight, fColor, fAlpha, fBitsPerComponent, nullptr, fColorDepth); 251*c8dee2aaSAndroid Build Coastguard Worker if (fProfile) { 252*c8dee2aaSAndroid Build Coastguard Worker copy.fProfile = std::make_unique<ICCProfile>(*fProfile); 253*c8dee2aaSAndroid Build Coastguard Worker } 254*c8dee2aaSAndroid Build Coastguard Worker return copy; 255*c8dee2aaSAndroid Build Coastguard Worker } 256*c8dee2aaSAndroid Build Coastguard Worker 257*c8dee2aaSAndroid Build Coastguard Worker // Return number of bits of R/G/B channel getColorDepthSkEncodedInfo258*c8dee2aaSAndroid Build Coastguard Worker uint8_t getColorDepth() const { 259*c8dee2aaSAndroid Build Coastguard Worker return fColorDepth; 260*c8dee2aaSAndroid Build Coastguard Worker } 261*c8dee2aaSAndroid Build Coastguard Worker 262*c8dee2aaSAndroid Build Coastguard Worker private: SkEncodedInfoSkEncodedInfo263*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo(int width, int height, Color color, Alpha alpha, 264*c8dee2aaSAndroid Build Coastguard Worker uint8_t bitsPerComponent, uint8_t colorDepth, std::unique_ptr<ICCProfile> profile) 265*c8dee2aaSAndroid Build Coastguard Worker : fWidth(width) 266*c8dee2aaSAndroid Build Coastguard Worker , fHeight(height) 267*c8dee2aaSAndroid Build Coastguard Worker , fColor(color) 268*c8dee2aaSAndroid Build Coastguard Worker , fAlpha(alpha) 269*c8dee2aaSAndroid Build Coastguard Worker , fBitsPerComponent(bitsPerComponent) 270*c8dee2aaSAndroid Build Coastguard Worker , fColorDepth(colorDepth) 271*c8dee2aaSAndroid Build Coastguard Worker , fProfile(std::move(profile)) 272*c8dee2aaSAndroid Build Coastguard Worker {} 273*c8dee2aaSAndroid Build Coastguard Worker 274*c8dee2aaSAndroid Build Coastguard Worker int fWidth; 275*c8dee2aaSAndroid Build Coastguard Worker int fHeight; 276*c8dee2aaSAndroid Build Coastguard Worker Color fColor; 277*c8dee2aaSAndroid Build Coastguard Worker Alpha fAlpha; 278*c8dee2aaSAndroid Build Coastguard Worker uint8_t fBitsPerComponent; 279*c8dee2aaSAndroid Build Coastguard Worker uint8_t fColorDepth; 280*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ICCProfile> fProfile; 281*c8dee2aaSAndroid Build Coastguard Worker }; 282*c8dee2aaSAndroid Build Coastguard Worker 283*c8dee2aaSAndroid Build Coastguard Worker #endif 284