Changeset 192138 in webkit


Ignore:
Timestamp:
Nov 7, 2015, 10:31:50 PM (10 years ago)
Author:
Simon Fraser
Message:

Use ColorSpaceSRGB for image buffers everywhere
https://bugs.webkit.org/show_bug.cgi?id=150990

Reviewed by Zalan Bujtas.

ColorSpaceSRGB and ColorSpaceDeviceRGB are equivalent now, so convert
code that creates image buffers tagged with ColorSpaceDeviceRGB to use ColorSpaceSRGB.

Source/WebCore:

  • platform/graphics/GraphicsContext.cpp:

(WebCore::GraphicsContext::createCompatibleBuffer):

  • platform/graphics/ImageBuffer.h:

(WebCore::ImageBuffer::create):

  • platform/graphics/cg/BitmapImageCG.cpp:

(WebCore::BitmapImage::checkForSolidColor):

  • platform/graphics/cg/ColorCG.cpp:

(WebCore::Color::Color):

  • platform/graphics/cg/GraphicsContextCG.cpp:

(WebCore::sRGBColorSpaceRef): Deleted.

  • platform/graphics/cg/ImageBufferCG.cpp:

(WebCore::ImageBuffer::putByteArray):

  • platform/graphics/cocoa/IOSurface.mm:

(IOSurface::createFromImage):

  • platform/graphics/filters/FEFlood.h:
  • platform/graphics/filters/FETile.cpp:

(WebCore::FETile::platformApplySoftware):

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::FilterEffect):

  • platform/graphics/filters/SourceGraphic.h:

(WebCore::SourceGraphic::SourceGraphic):

  • rendering/FilterEffectRenderer.cpp:

(WebCore::FilterEffectRenderer::build):
(WebCore::FilterEffectRenderer::apply):

  • rendering/RenderThemeMac.mm:

(WebCore::RenderThemeMac::paintProgressBar):

  • rendering/svg/RenderSVGResourceClipper.cpp:

(WebCore::RenderSVGResourceClipper::applyClippingToContext):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::buildPrimitives):

  • rendering/svg/RenderSVGResourceGradient.cpp:

(WebCore::createMaskAndSwapContextForTextGradient):

  • rendering/svg/RenderSVGResourceMasker.cpp:

(WebCore::RenderSVGResourceMasker::applyResource):

  • rendering/svg/RenderSVGResourcePattern.cpp:

(WebCore::RenderSVGResourcePattern::createTileImage):

  • svg/graphics/SVGImage.cpp:

(WebCore::SVGImage::drawPatternForContainer):

  • svg/graphics/filters/SVGFEImage.cpp:

(WebCore::FEImage::platformApplySoftware):

Source/WebKit2:

  • Shared/mac/RemoteLayerBackingStore.mm:

(WebKit::RemoteLayerBackingStore::decode):
(WebKit::RemoteLayerBackingStore::swapToValidFrontBuffer):

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _takeViewSnapshot]):
(-[WKWebView _snapshotRect:intoImageOfWidth:completionHandler:]):

Location:
trunk/Source
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r192133 r192138  
     12015-11-07  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Use ColorSpaceSRGB for image buffers everywhere
     4        https://bugs.webkit.org/show_bug.cgi?id=150990
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        ColorSpaceSRGB and ColorSpaceDeviceRGB are equivalent now, so convert
     9        code that creates image buffers tagged with ColorSpaceDeviceRGB to use ColorSpaceSRGB.
     10
     11        * platform/graphics/GraphicsContext.cpp:
     12        (WebCore::GraphicsContext::createCompatibleBuffer):
     13        * platform/graphics/ImageBuffer.h:
     14        (WebCore::ImageBuffer::create):
     15        * platform/graphics/cg/BitmapImageCG.cpp:
     16        (WebCore::BitmapImage::checkForSolidColor):
     17        * platform/graphics/cg/ColorCG.cpp:
     18        (WebCore::Color::Color):
     19        * platform/graphics/cg/GraphicsContextCG.cpp:
     20        (WebCore::sRGBColorSpaceRef): Deleted.
     21        * platform/graphics/cg/ImageBufferCG.cpp:
     22        (WebCore::ImageBuffer::putByteArray):
     23        * platform/graphics/cocoa/IOSurface.mm:
     24        (IOSurface::createFromImage):
     25        * platform/graphics/filters/FEFlood.h:
     26        * platform/graphics/filters/FETile.cpp:
     27        (WebCore::FETile::platformApplySoftware):
     28        * platform/graphics/filters/FilterEffect.cpp:
     29        (WebCore::FilterEffect::FilterEffect):
     30        * platform/graphics/filters/SourceGraphic.h:
     31        (WebCore::SourceGraphic::SourceGraphic):
     32        * rendering/FilterEffectRenderer.cpp:
     33        (WebCore::FilterEffectRenderer::build):
     34        (WebCore::FilterEffectRenderer::apply):
     35        * rendering/RenderThemeMac.mm:
     36        (WebCore::RenderThemeMac::paintProgressBar):
     37        * rendering/svg/RenderSVGResourceClipper.cpp:
     38        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
     39        * rendering/svg/RenderSVGResourceFilter.cpp:
     40        (WebCore::RenderSVGResourceFilter::buildPrimitives):
     41        * rendering/svg/RenderSVGResourceGradient.cpp:
     42        (WebCore::createMaskAndSwapContextForTextGradient):
     43        * rendering/svg/RenderSVGResourceMasker.cpp:
     44        (WebCore::RenderSVGResourceMasker::applyResource):
     45        * rendering/svg/RenderSVGResourcePattern.cpp:
     46        (WebCore::RenderSVGResourcePattern::createTileImage):
     47        * svg/graphics/SVGImage.cpp:
     48        (WebCore::SVGImage::drawPatternForContainer):
     49        * svg/graphics/filters/SVGFEImage.cpp:
     50        (WebCore::FEImage::platformApplySoftware):
     51
    1522015-11-07  Zalan Bujtas  <zalan@apple.com>
    253
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp

    r191617 r192138  
    641641    FloatSize scaledSize(static_cast<int>(ceil(size.width() * transform.xScale())), static_cast<int>(ceil(size.height() * transform.yScale())));
    642642
    643     std::unique_ptr<ImageBuffer> buffer = ImageBuffer::createCompatibleBuffer(scaledSize, 1, ColorSpaceDeviceRGB, *this, hasAlpha);
     643    std::unique_ptr<ImageBuffer> buffer = ImageBuffer::createCompatibleBuffer(scaledSize, 1, ColorSpaceSRGB, *this, hasAlpha);
    644644    if (!buffer)
    645645        return nullptr;
  • trunk/Source/WebCore/platform/graphics/ImageBuffer.h

    r190910 r192138  
    7070public:
    7171    // Will return a null pointer on allocation failure.
    72     static std::unique_ptr<ImageBuffer> create(const FloatSize& size, RenderingMode renderingMode, float resolutionScale = 1, ColorSpace colorSpace = ColorSpaceDeviceRGB)
     72    static std::unique_ptr<ImageBuffer> create(const FloatSize& size, RenderingMode renderingMode, float resolutionScale = 1, ColorSpace colorSpace = ColorSpaceSRGB)
    7373    {
    7474        bool success = false;
  • trunk/Source/WebCore/platform/graphics/cg/BitmapImageCG.cpp

    r189144 r192138  
    156156    if (CGImageGetWidth(image) == 1 && CGImageGetHeight(image) == 1) {
    157157        unsigned char pixel[4]; // RGBA
    158         RetainPtr<CGContextRef> bitmapContext = adoptCF(CGBitmapContextCreate(pixel, 1, 1, 8, sizeof(pixel), deviceRGBColorSpaceRef(),
     158        RetainPtr<CGContextRef> bitmapContext = adoptCF(CGBitmapContextCreate(pixel, 1, 1, 8, sizeof(pixel), sRGBColorSpaceRef(),
    159159            kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big));
    160160        if (!bitmapContext)
  • trunk/Source/WebCore/platform/graphics/cg/ColorCG.cpp

    r176140 r192138  
    6868    const CGFloat* components = CGColorGetComponents(color);
    6969#else
     70    // FIXME: can we remove this?
    7071    RetainPtr<CGColorRef> correctedColor = adoptCF(createCGColorWithDeviceRGBA(color));
    7172    if (!correctedColor)
  • trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp

    r191617 r192138  
    8282CGColorSpaceRef sRGBColorSpaceRef()
    8383{
    84 #if PLATFORM(IOS)
    85     return deviceRGBColorSpaceRef();
    86 #else
    8784    static CGColorSpaceRef sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
    8885#if PLATFORM(WIN)
     
    9491#endif // PLATFORM(WIN)
    9592    return sRGBSpace;
    96 #endif // PLATFORM(IOS)
    9793}
    9894
  • trunk/Source/WebCore/platform/graphics/cg/ImageBufferCG.cpp

    r191466 r192138  
    313313    IntSize sourceCopySize(sourceRect.width(), sourceRect.height());
    314314    // FIXME (149431): Should this ImageBuffer be unconditionally unaccelerated? Making it match the context seems to break putData().
    315     std::unique_ptr<ImageBuffer> sourceCopy = ImageBuffer::create(sourceCopySize, Unaccelerated, 1, ColorSpaceDeviceRGB);
     315    std::unique_ptr<ImageBuffer> sourceCopy = ImageBuffer::create(sourceCopySize, Unaccelerated, 1, ColorSpaceSRGB);
    316316    if (!sourceCopy)
    317317        return;
  • trunk/Source/WebCore/platform/graphics/cocoa/IOSurface.mm

    r190587 r192138  
    8989    size_t height = CGImageGetHeight(image);
    9090
    91     auto surface = IOSurface::create(IntSize(width, height), ColorSpaceDeviceRGB);
     91    auto surface = IOSurface::create(IntSize(width, height), ColorSpaceSRGB);
    9292    auto surfaceContext = surface->ensurePlatformContext();
    9393    CGContextDrawImage(surfaceContext, CGRectMake(0, 0, width, height), image);
  • trunk/Source/WebCore/platform/graphics/filters/FEFlood.h

    r191867 r192138  
    4242    // feFlood does not perform color interpolation of any kind, so the result is always in the current
    4343    // color space regardless of the value of color-interpolation-filters.
    44     void setOperatingColorSpace(ColorSpace) override { FilterEffect::setResultColorSpace(ColorSpaceDeviceRGB); }
    45     void setResultColorSpace(ColorSpace) override { FilterEffect::setResultColorSpace(ColorSpaceDeviceRGB); }
     44    void setOperatingColorSpace(ColorSpace) override { FilterEffect::setResultColorSpace(ColorSpaceSRGB); }
     45    void setResultColorSpace(ColorSpace) override { FilterEffect::setResultColorSpace(ColorSpaceSRGB); }
    4646#endif
    4747
  • trunk/Source/WebCore/platform/graphics/filters/FETile.cpp

    r191049 r192138  
    6565    }
    6666
    67     auto tileImage = SVGRenderingContext::createImageBuffer(tileRect, tileRect, ColorSpaceDeviceRGB, filter().renderingMode());
     67    auto tileImage = SVGRenderingContext::createImageBuffer(tileRect, tileRect, ColorSpaceSRGB, filter().renderingMode());
    6868    if (!tileImage)
    6969        return;
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r191867 r192138  
    4747    , m_clipsToBounds(true)
    4848    , m_operatingColorSpace(ColorSpaceLinearRGB)
    49     , m_resultColorSpace(ColorSpaceDeviceRGB)
     49    , m_resultColorSpace(ColorSpaceSRGB)
    5050{
    5151}
  • trunk/Source/WebCore/platform/graphics/filters/SourceGraphic.h

    r191867 r192138  
    4646        : FilterEffect(filter)
    4747    {
    48         setOperatingColorSpace(ColorSpaceDeviceRGB);
     48        setOperatingColorSpace(ColorSpaceSRGB);
    4949    }
    5050};
  • trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp

    r191049 r192138  
    285285            // property applied here should not clip to their primitive subregions.
    286286            effect->setClipsToBounds(consumer == FilterFunction);
    287             effect->setOperatingColorSpace(ColorSpaceDeviceRGB);
     287            effect->setOperatingColorSpace(ColorSpaceSRGB);
    288288           
    289289            if (filterOperation.type() != FilterOperation::REFERENCE) {
     
    340340    RefPtr<FilterEffect> effect = lastEffect();
    341341    effect->apply();
    342     effect->transformResultColorSpace(ColorSpaceDeviceRGB);
     342    effect->transformResultColorSpace(ColorSpaceSRGB);
    343343}
    344344
  • trunk/Source/WebCore/rendering/RenderThemeMac.mm

    r191991 r192138  
    11421142    trackInfo.filler1 = 0;
    11431143
    1144     std::unique_ptr<ImageBuffer> imageBuffer = ImageBuffer::createCompatibleBuffer(inflatedRect.size(), deviceScaleFactor, ColorSpaceDeviceRGB, paintInfo.context(), true);
     1144    std::unique_ptr<ImageBuffer> imageBuffer = ImageBuffer::createCompatibleBuffer(inflatedRect.size(), deviceScaleFactor, ColorSpaceSRGB, paintInfo.context(), true);
    11451145    if (!imageBuffer)
    11461146        return true;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp

    r190124 r192138  
    142142    if (shouldCreateClipperMaskImage && !repaintRect.isEmpty()) {
    143143        // FIXME (149469): This image buffer should not be unconditionally unaccelerated. Making it match the context breaks nested clipping, though.
    144         clipperMaskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceDeviceRGB, Unaccelerated);
     144        clipperMaskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceSRGB, Unaccelerated);
    145145        if (!clipperMaskImage)
    146146            return false;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r191403 r192138  
    9292        effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(&element, filterElement().primitiveUnits(), targetBoundingBox));
    9393        if (element.renderer())
    94             effect->setOperatingColorSpace(element.renderer()->style().svgStyle().colorInterpolationFilters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB);
     94            effect->setOperatingColorSpace(element.renderer()->style().svgStyle().colorInterpolationFilters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceSRGB);
    9595        builder->add(element.result(), WTF::move(effect));
    9696    }
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp

    r190124 r192138  
    6262    FloatRect repaintRect = textRootBlock->repaintRectInLocalCoordinates();
    6363
    64     auto maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceDeviceRGB, context->renderingMode());
     64    auto maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceSRGB, context->renderingMode());
    6565    if (!maskImage)
    6666        return false;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp

    r190124 r192138  
    6969    if (!maskerData->maskImage && !repaintRect.isEmpty()) {
    7070        const SVGRenderStyle& svgStyle = style().svgStyle();
    71         ColorSpace colorSpace = svgStyle.colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB;
     71        ColorSpace colorSpace = svgStyle.colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceSRGB;
    7272        // FIXME (149470): This image buffer should not be unconditionally unaccelerated. Making it match the context breaks alpha masking, though.
    7373        maskerData->maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, colorSpace, Unaccelerated);
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp

    r191748 r192138  
    249249{
    250250    clampedAbsoluteTileBoundaries = ImageBuffer::clampedRect(absoluteTileBoundaries);
    251     auto tileImage = SVGRenderingContext::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, ColorSpaceDeviceRGB, renderingMode);
     251    auto tileImage = SVGRenderingContext::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, ColorSpaceSRGB, renderingMode);
    252252    if (!tileImage)
    253253        return nullptr;
  • trunk/Source/WebCore/svg/graphics/SVGImage.cpp

    r191352 r192138  
    202202    imageBufferSize.scale(imageBufferScale.width(), imageBufferScale.height());
    203203
    204     std::unique_ptr<ImageBuffer> buffer = ImageBuffer::createCompatibleBuffer(expandedIntSize(imageBufferSize.size()), 1, ColorSpaceDeviceRGB, context, true);
     204    std::unique_ptr<ImageBuffer> buffer = ImageBuffer::createCompatibleBuffer(expandedIntSize(imageBufferSize.size()), 1, ColorSpaceSRGB, context, true);
    205205    if (!buffer) // Failed to allocate buffer.
    206206        return;
  • trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp

    r191049 r192138  
    113113    destRect.move(-paintLocation.x(), -paintLocation.y());
    114114
    115     // FEImage results are always in ColorSpaceDeviceRGB
    116     setResultColorSpace(ColorSpaceDeviceRGB);
     115    // FEImage results are always in ColorSpaceSRGB
     116    setResultColorSpace(ColorSpaceSRGB);
    117117
    118118    if (renderer) {
  • trunk/Source/WebKit2/ChangeLog

    r192123 r192138  
     12015-11-07  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Use ColorSpaceSRGB for image buffers everywhere
     4        https://bugs.webkit.org/show_bug.cgi?id=150990
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        ColorSpaceSRGB and ColorSpaceDeviceRGB are equivalent now, so convert
     9        code that creates image buffers tagged with ColorSpaceDeviceRGB to use ColorSpaceSRGB.
     10
     11        * Shared/mac/RemoteLayerBackingStore.mm:
     12        (WebKit::RemoteLayerBackingStore::decode):
     13        (WebKit::RemoteLayerBackingStore::swapToValidFrontBuffer):
     14        * UIProcess/API/Cocoa/WKWebView.mm:
     15        (-[WKWebView _takeViewSnapshot]):
     16        (-[WKWebView _snapshotRect:intoImageOfWidth:completionHandler:]):
     17
    1182015-11-06  Brady Eidson  <beidson@apple.com>
    219
  • trunk/Source/WebKit2/Shared/mac/RemoteLayerBackingStore.mm

    r183242 r192138  
    140140        if (!decoder.decode(sendRight))
    141141            return false;
    142         result.m_frontBuffer.surface = IOSurface::createFromSendRight(sendRight, ColorSpaceDeviceRGB);
     142        result.m_frontBuffer.surface = IOSurface::createFromSendRight(sendRight, ColorSpaceSRGB);
    143143        return true;
    144144    }
     
    187187
    188188        if (!m_frontBuffer.surface)
    189             m_frontBuffer.surface = IOSurface::create(expandedScaledSize, ColorSpaceDeviceRGB);
     189            m_frontBuffer.surface = IOSurface::create(expandedScaledSize, ColorSpaceSRGB);
    190190
    191191        setBufferVolatility(BufferType::Front, false);
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r192113 r192138  
    11541154
    11551155#if USE(IOSURFACE)
    1156     auto surface = WebCore::IOSurface::create(WebCore::expandedIntSize(snapshotSize), WebCore::ColorSpaceDeviceRGB);
     1156    auto surface = WebCore::IOSurface::create(WebCore::expandedIntSize(snapshotSize), WebCore::ColorSpaceSRGB);
    11571157    CARenderServerRenderLayerWithTransform(MACH_PORT_NULL, self.layer.context.contextId, reinterpret_cast<uint64_t>(self.layer), surface->surface(), 0, 0, &transform);
    11581158
     
    38263826    // If we are parented and thus won't incur a significant penalty from paging in tiles, snapshot the view hierarchy directly.
    38273827    if (CADisplay *display = self.window.screen._display) {
    3828         auto surface = WebCore::IOSurface::create(WebCore::expandedIntSize(WebCore::FloatSize(imageSize)), WebCore::ColorSpaceDeviceRGB);
     3828        auto surface = WebCore::IOSurface::create(WebCore::expandedIntSize(WebCore::FloatSize(imageSize)), WebCore::ColorSpaceSRGB);
    38293829        CGFloat imageScaleInViewCoordinates = imageWidth / rectInViewCoordinates.size.width;
    38303830        CATransform3D transform = CATransform3DMakeScale(imageScaleInViewCoordinates, imageScaleInViewCoordinates, 1);
Note: See TracChangeset for help on using the changeset viewer.