| Index: gm/colorspace.cpp | 
| diff --git a/gm/colorspace.cpp b/gm/colorspace.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..cb75d21ffbeac67ee640ec4d9bd33ad1f758e974 | 
| --- /dev/null | 
| +++ b/gm/colorspace.cpp | 
| @@ -0,0 +1,92 @@ | 
| +/* | 
| + * Copyright 2016 Intel Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "gm.h" | 
| +#include "Resources.h" | 
| +#include "SkImage.h" | 
| +#include "SkData.h" | 
| +#include "SkColorSpace.h" | 
| + | 
| +#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 
| + | 
| +#ifdef SK_BUILD_FOR_MAC | 
| +#include <ApplicationServices/ApplicationServices.h> | 
| +#endif | 
| + | 
| +#ifdef SK_BUILD_FOR_IOS | 
| +#include <CoreGraphics/CoreGraphics.h> | 
| +#endif | 
| + | 
| +static void release_data(void* info, const void*, size_t len) { | 
| +    SkData* data = (SkData*)info; | 
| +    SkASSERT(data->size() == len); | 
| +    data->unref(); | 
| +} | 
| + | 
| +static SkColorSpace* extract_cs(SkImage* img) { | 
| +    SkData* data = img->refEncoded(); | 
| +    if (!data) { | 
| +        return nullptr; | 
| +    } | 
| + | 
| +    CGDataProviderRef provider = CGDataProviderCreateWithData(data, data->data(), data->size(), | 
| +                                                              release_data); | 
| +    CGImageRef cgimg = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, | 
| +                                                         kCGRenderingIntentDefault); | 
| +    CFDataRef cfdata = CGColorSpaceCopyICCProfile(CGImageGetColorSpace(cgimg)); | 
| + | 
| +    SkColorSpace* cs = SkColorSpace::NewICCProfile(CFDataGetBytePtr(cfdata), | 
| +                                                   CFDataGetLength(cfdata)); | 
| + | 
| +    CFRelease(cfdata); | 
| +    CGImageRelease(cgimg); | 
| +    CGDataProviderRelease(provider); | 
| +    return cs; | 
| +} | 
| +#else | 
| +static SkColorSpace* extract_cs(SkImage* img) { return nullptr; } | 
| +#endif | 
| + | 
| +// test images from http://www.color.org/version4html.xalter | 
| +// | 
| +DEF_SIMPLE_GM(colorspace, canvas, 570, 440) { | 
| +    SkImage* image[] = { | 
| +        GetResourceAsImage("Upper_Left.jpg"), | 
| +        GetResourceAsImage("Upper_Right.jpg"), | 
| +        GetResourceAsImage("Lower_Left.jpg"), | 
| +        GetResourceAsImage("Lower_Right.jpg"), | 
| +    }; | 
| + | 
| +    canvas->translate(10, 10); | 
| + | 
| +    const SkScalar w = SkIntToScalar(image[0]->width()); | 
| +    const SkScalar h = SkIntToScalar(image[0]->height()); | 
| + | 
| +    canvas->drawImage(image[0], 0, 0, nullptr); | 
| +    canvas->drawImage(image[1], w, 0, nullptr); | 
| +    canvas->drawImage(image[2], 0, h, nullptr); | 
| +    canvas->drawImage(image[3], w, h, nullptr); | 
| + | 
| +    SkAutoTUnref<SkColorSpace> dev(SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)); | 
| + | 
| +    for (auto img : image) { | 
| +        SkAutoTUnref<SkColorSpace> cs(extract_cs(img)); | 
| +        if (cs) { | 
| +            enum Result { | 
| +                kFailure_Result, | 
| +                kIdentity_Result, | 
| +                kNormal_Result, | 
| +            }; | 
| + | 
| +            SkFloat3x3 matrix; | 
| +            SkColorSpace::Result res = SkColorSpace::Concat(cs, dev, &matrix); | 
| +            SkDebugf("result[%d] ", res); | 
| +            matrix.dump(); | 
| +        } | 
| +        img->unref(); | 
| +    } | 
| +} | 
|  |