Add SkColorSpace to SkImageInfo
authormsarett <msarett@google.com>
Fri, 27 May 2016 14:39:02 +0000 (07:39 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 27 May 2016 14:39:02 +0000 (07:39 -0700)
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=2000713003

Review-Url: https://codereview.chromium.org/2000713003

include/codec/SkEncodedInfo.h
include/core/SkImageInfo.h
src/codec/SkCodec.cpp
src/core/SkBitmap.cpp
src/core/SkImageInfo.cpp
src/core/SkMipMap.cpp
tests/ImageIsOpaqueTest.cpp

index 0c5bd0b..d35aa2b 100644 (file)
@@ -9,7 +9,8 @@
 #define SkEncodedInfo_DEFINED
 
 #include "SkImageInfo.h"
-#include "../private/SkImageInfoPriv.h"
+
+class SkColorSpace;
 
 struct SkEncodedInfo {
 public:
@@ -116,22 +117,21 @@ public:
      * Returns an SkImageInfo with Skia color and alpha types that are the
      * closest possible match to the encoded info.
      */
-    SkImageInfo makeImageInfo(int width, int height) const {
-        SkColorProfileType profileType = SkDefaultColorProfile();
+    SkImageInfo makeImageInfo(int width, int height, const sk_sp<SkColorSpace>& colorSpace) const {
         switch (fColor) {
             case kGray_Color:
                 SkASSERT(kOpaque_Alpha == fAlpha);
                 return SkImageInfo::Make(width, height, kGray_8_SkColorType,
-                                         kOpaque_SkAlphaType, profileType);
+                                         kOpaque_SkAlphaType, colorSpace);
             case kGrayAlpha_Color:
                 SkASSERT(kOpaque_Alpha != fAlpha);
                 return SkImageInfo::Make(width, height, kN32_SkColorType,
-                        kUnpremul_SkAlphaType, profileType);
+                        kUnpremul_SkAlphaType, colorSpace);
             case kPalette_Color: {
                 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAlphaType :
                         kUnpremul_SkAlphaType;
                 return SkImageInfo::Make(width, height, kIndex_8_SkColorType,
-                                         alphaType, profileType);
+                                         alphaType, colorSpace);
             }
             case kRGB_Color:
             case kBGR_Color:
@@ -141,13 +141,13 @@ public:
             case kYCCK_Color:
                 SkASSERT(kOpaque_Alpha == fAlpha);
                 return SkImageInfo::Make(width, height, kN32_SkColorType,
-                                         kOpaque_SkAlphaType, profileType);
+                                         kOpaque_SkAlphaType, colorSpace);
             case kRGBA_Color:
             case kBGRA_Color:
             case kYUVA_Color:
                 SkASSERT(kOpaque_Alpha != fAlpha);
                 return SkImageInfo::Make(width, height, kN32_SkColorType,
-                                         kUnpremul_SkAlphaType, profileType);
+                                         kUnpremul_SkAlphaType, colorSpace);
             default:
                 SkASSERT(false);
                 return SkImageInfo::MakeUnknown();
index 4b308c0..af3d739 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef SkImageInfo_DEFINED
 #define SkImageInfo_DEFINED
 
+#include "SkColorSpace.h"
 #include "SkMath.h"
 #include "SkRect.h"
 #include "SkSize.h"
@@ -182,7 +183,8 @@ enum SkColorProfileType {
 struct SK_API SkImageInfo {
 public:
     SkImageInfo()
-        : fWidth(0)
+        : fColorSpace(nullptr)
+        , fWidth(0)
         , fHeight(0)
         , fColorType(kUnknown_SkColorType)
         , fAlphaType(kUnknown_SkAlphaType)
@@ -191,15 +193,18 @@ public:
 
     static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at,
                             SkColorProfileType pt = kLinear_SkColorProfileType) {
-        return SkImageInfo(width, height, ct, at, pt);
+        return SkImageInfo(width, height, ct, at, pt, nullptr);
     }
 
+    static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at,
+                            sk_sp<SkColorSpace> cs);
+
     /**
      *  Sets colortype to the native ARGB32 type.
      */
     static SkImageInfo MakeN32(int width, int height, SkAlphaType at,
                                SkColorProfileType pt = kLinear_SkColorProfileType) {
-        return SkImageInfo(width, height, kN32_SkColorType, at, pt);
+        return SkImageInfo(width, height, kN32_SkColorType, at, pt, nullptr);
     }
 
     /**
@@ -207,7 +212,7 @@ public:
      */
     static SkImageInfo MakeN32Premul(int width, int height,
                                      SkColorProfileType pt = kLinear_SkColorProfileType) {
-        return SkImageInfo(width, height, kN32_SkColorType, kPremul_SkAlphaType, pt);
+        return SkImageInfo(width, height, kN32_SkColorType, kPremul_SkAlphaType, pt, nullptr);
     }
 
     /**
@@ -220,12 +225,12 @@ public:
 
     static SkImageInfo MakeA8(int width, int height) {
         return SkImageInfo(width, height, kAlpha_8_SkColorType, kPremul_SkAlphaType,
-                           kLinear_SkColorProfileType);
+                           kLinear_SkColorProfileType, nullptr);
     }
 
     static SkImageInfo MakeUnknown(int width, int height) {
         return SkImageInfo(width, height, kUnknown_SkColorType, kUnknown_SkAlphaType,
-                           kLinear_SkColorProfileType);
+                           kLinear_SkColorProfileType, nullptr);
     }
 
     static SkImageInfo MakeUnknown() {
@@ -236,6 +241,9 @@ public:
     int height() const { return fHeight; }
     SkColorType colorType() const { return fColorType; }
     SkAlphaType alphaType() const { return fAlphaType; }
+    SkColorSpace* colorSpace() const { return fColorSpace.get(); }
+
+    // Deprecated
     SkColorProfileType profileType() const { return fProfileType; }
 
     bool isEmpty() const { return fWidth <= 0 || fHeight <= 0; }
@@ -244,6 +252,7 @@ public:
         return SkAlphaTypeIsOpaque(fAlphaType);
     }
 
+    // Deprecated
     bool isLinear() const { return kLinear_SkColorProfileType == fProfileType; }
     bool isSRGB() const { return kSRGB_SkColorProfileType == fProfileType; }
 
@@ -255,15 +264,15 @@ public:
      *  but with the specified width and height.
      */
     SkImageInfo makeWH(int newWidth, int newHeight) const {
-        return SkImageInfo::Make(newWidth, newHeight, fColorType, fAlphaType, fProfileType);
+        return SkImageInfo(newWidth, newHeight, fColorType, fAlphaType, fProfileType, fColorSpace);
     }
 
     SkImageInfo makeAlphaType(SkAlphaType newAlphaType) const {
-        return SkImageInfo::Make(fWidth, fHeight, fColorType, newAlphaType, fProfileType);
+        return SkImageInfo(fWidth, fHeight, fColorType, newAlphaType, fProfileType, fColorSpace);
     }
     
     SkImageInfo makeColorType(SkColorType newColorType) const {
-        return SkImageInfo::Make(fWidth, fHeight, newColorType, fAlphaType, fProfileType);
+        return SkImageInfo(fWidth, fHeight, newColorType, fAlphaType, fProfileType, fColorSpace);
     }
 
     int bytesPerPixel() const { return SkColorTypeBytesPerPixel(fColorType); }
@@ -285,10 +294,14 @@ public:
     }
 
     bool operator==(const SkImageInfo& other) const {
-        return 0 == memcmp(this, &other, sizeof(other));
+        return fWidth == other.fWidth && fHeight == other.fHeight &&
+               fColorType == other.fColorType && fAlphaType == other.fAlphaType &&
+               fProfileType == other.fProfileType && fColorSpace == other.fColorSpace;
     }
     bool operator!=(const SkImageInfo& other) const {
-        return 0 != memcmp(this, &other, sizeof(other));
+        return fWidth != other.fWidth || fHeight != other.fHeight ||
+               fColorType != other.fColorType || fAlphaType != other.fAlphaType ||
+               fProfileType != other.fProfileType || fColorSpace != other.fColorSpace;
     }
 
     void unflatten(SkReadBuffer&);
@@ -314,17 +327,29 @@ public:
         return rowBytes >= rb;
     }
 
+    void reset() {
+        fWidth = 0;
+        fHeight = 0;
+        fColorType = kUnknown_SkColorType;
+        fAlphaType = kUnknown_SkAlphaType;
+        fProfileType = kLinear_SkColorProfileType;
+        fColorSpace = nullptr;
+    }
+
     SkDEBUGCODE(void validate() const;)
 
 private:
+    sk_sp<SkColorSpace> fColorSpace;
     int                 fWidth;
     int                 fHeight;
     SkColorType         fColorType;
     SkAlphaType         fAlphaType;
     SkColorProfileType  fProfileType;
 
-    SkImageInfo(int width, int height, SkColorType ct, SkAlphaType at, SkColorProfileType pt)
-        : fWidth(width)
+    SkImageInfo(int width, int height, SkColorType ct, SkAlphaType at, SkColorProfileType pt,
+                sk_sp<SkColorSpace> cs)
+        : fColorSpace(std::move(cs))
+        , fWidth(width)
         , fHeight(height)
         , fColorType(ct)
         , fAlphaType(at)
index 955c86d..3da7f5f 100644 (file)
@@ -117,10 +117,10 @@ SkCodec* SkCodec::NewFromData(SkData* data, SkPngChunkReader* reader) {
 SkCodec::SkCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
         sk_sp<SkColorSpace> colorSpace, Origin origin)
     : fEncodedInfo(info)
-    , fSrcInfo(info.makeImageInfo(width, height))
+    , fSrcInfo(info.makeImageInfo(width, height, colorSpace))
     , fStream(stream)
     , fNeedsRewind(false)
-    , fColorSpace(colorSpace)
+    , fColorSpace(std::move(colorSpace))
     , fOrigin(origin)
     , fDstInfo()
     , fOptions()
index 3bb763b..f9deb83 100644 (file)
@@ -53,6 +53,7 @@ SkBitmap& SkBitmap::operator=(const SkBitmap& src) {
 
         // inc src reference counts
         SkSafeRef(src.fPixelRef);
+        SkSafeRef(src.fInfo.colorSpace());
 
         // we reset our locks if we get blown away
         fPixelLockCount = 0;
@@ -97,6 +98,7 @@ void SkBitmap::swap(SkBitmap& other) {
 
 void SkBitmap::reset() {
     this->freePixels();
+    this->fInfo.reset();
     sk_bzero(this, sizeof(*this));
 }
 
index 5f0a491..81a68f3 100644 (file)
@@ -30,6 +30,11 @@ static bool color_type_is_valid(SkColorType colorType) {
     return (colorType >= 0) && (colorType <= kLastEnum_SkColorType);
 }
 
+SkImageInfo SkImageInfo::Make(int width, int height, SkColorType ct, SkAlphaType at,
+                              sk_sp<SkColorSpace> cs) {
+    return SkImageInfo(width, height, ct, at, SkDefaultColorProfile(), std::move(cs));
+}
+
 void SkImageInfo::unflatten(SkReadBuffer& buffer) {
     fWidth = buffer.read32();
     fHeight = buffer.read32();
index f579aae..c851d64 100644 (file)
@@ -451,7 +451,7 @@ SkMipMap* SkMipMap::Build(const SkPixmap& src, SkDiscardableFactoryProc fact) {
         height = SkTMax(1, height >> 1);
         rowBytes = SkToU32(SkColorTypeMinRowBytes(ct, width));
 
-        levels[i].fPixmap = SkPixmap(SkImageInfo::Make(width, height, ct, at), addr, rowBytes);
+        new (&levels[i].fPixmap) SkPixmap(SkImageInfo::Make(width, height, ct, at), addr, rowBytes);
         levels[i].fScale  = SkSize::Make(SkIntToScalar(width)  / src.width(),
                                          SkIntToScalar(height) / src.height());
 
index d513e89..52d3b97 100644 (file)
@@ -24,10 +24,10 @@ static void test_flatten(skiatest::Reporter* reporter, const SkImageInfo& info)
     SkASSERT(wb.bytesWritten() < sizeof(storage));
 
     SkReadBuffer rb(storage, wb.bytesWritten());
-    SkImageInfo info2;
 
     // pick a noisy byte pattern, so we ensure that unflatten sets all of our fields
-    memset(&info2, 0xB8, sizeof(info2));
+    SkImageInfo info2 = SkImageInfo::Make(0xB8, 0xB8, (SkColorType) 0xB8, (SkAlphaType) 0xB8,
+                                          (SkColorProfileType) 0xB8);
 
     info2.unflatten(rb);
     REPORTER_ASSERT(reporter, rb.offset() == wb.bytesWritten());