| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "core/html/canvas/CanvasRenderingContext.h" | 26 #include "core/html/canvas/CanvasRenderingContext.h" |
| 27 | 27 |
| 28 #include "core/html/canvas/CanvasContextCreationAttributes.h" | 28 #include "core/html/canvas/CanvasContextCreationAttributes.h" |
| 29 #include "core/html/canvas/CanvasImageSource.h" | 29 #include "core/html/canvas/CanvasImageSource.h" |
| 30 #include "platform/RuntimeEnabledFeatures.h" | 30 #include "platform/RuntimeEnabledFeatures.h" |
| 31 #include "platform/weborigin/SecurityOrigin.h" | 31 #include "platform/weborigin/SecurityOrigin.h" |
| 32 #include "public/platform/Platform.h" | 32 #include "public/platform/Platform.h" |
| 33 | 33 |
| 34 constexpr const char* kLegacyCanvasColorSpaceName = "legacy-srgb"; | 34 constexpr const char* kLegacyCanvasColorSpaceName = "legacy-srgb"; |
| 35 constexpr const char* kSRGBCanvasColorSpaceName = "srgb"; | 35 constexpr const char* kSRGBCanvasColorSpaceName = "srgb"; |
| 36 constexpr const char* kLinearRGBCanvasColorSpaceName = "linear-rgb"; | 36 constexpr const char* kRec2020CanvasColorSpaceName = "rec2020"; |
| 37 constexpr const char* kRec2020CanvasColorSpaceName = "rec-2020"; | |
| 38 constexpr const char* kP3CanvasColorSpaceName = "p3"; | 37 constexpr const char* kP3CanvasColorSpaceName = "p3"; |
| 39 | 38 |
| 39 constexpr const char* kRGBA8CanvasPixelFormatName = "8-8-8-8"; |
| 40 constexpr const char* kRGB10A2CanvasPixelFormatName = "10-10-10-2"; |
| 41 constexpr const char* kRGBA12CanvasPixelFormatName = "12-12-12-12"; |
| 42 constexpr const char* kF16CanvasPixelFormatName = "float16"; |
| 43 |
| 40 namespace blink { | 44 namespace blink { |
| 41 | 45 |
| 42 CanvasRenderingContext::CanvasRenderingContext( | 46 CanvasRenderingContext::CanvasRenderingContext( |
| 43 HTMLCanvasElement* canvas, | 47 HTMLCanvasElement* canvas, |
| 44 OffscreenCanvas* offscreenCanvas, | 48 OffscreenCanvas* offscreenCanvas, |
| 45 const CanvasContextCreationAttributes& attrs) | 49 const CanvasContextCreationAttributes& attrs) |
| 46 : m_canvas(canvas), | 50 : m_canvas(canvas), |
| 47 m_offscreenCanvas(offscreenCanvas), | 51 m_offscreenCanvas(offscreenCanvas), |
| 48 m_colorSpace(kLegacyCanvasColorSpace), | 52 m_colorSpace(kLegacyCanvasColorSpace), |
| 53 m_pixelFormat(kRGBA8CanvasPixelFormat), |
| 54 m_linearPixelMath(false), |
| 49 m_creationAttributes(attrs) { | 55 m_creationAttributes(attrs) { |
| 50 if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() && | 56 if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() && |
| 51 RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) { | 57 RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) { |
| 58 // Set the color space. |
| 52 if (m_creationAttributes.colorSpace() == kSRGBCanvasColorSpaceName) | 59 if (m_creationAttributes.colorSpace() == kSRGBCanvasColorSpaceName) |
| 53 m_colorSpace = kSRGBCanvasColorSpace; | 60 m_colorSpace = kSRGBCanvasColorSpace; |
| 54 else if (m_creationAttributes.colorSpace() == | |
| 55 kLinearRGBCanvasColorSpaceName) | |
| 56 m_colorSpace = kLinearRGBCanvasColorSpace; | |
| 57 else if (m_creationAttributes.colorSpace() == kRec2020CanvasColorSpaceName) | 61 else if (m_creationAttributes.colorSpace() == kRec2020CanvasColorSpaceName) |
| 58 m_colorSpace = kRec2020CanvasColorSpace; | 62 m_colorSpace = kRec2020CanvasColorSpace; |
| 59 else if (m_creationAttributes.colorSpace() == kP3CanvasColorSpaceName) | 63 else if (m_creationAttributes.colorSpace() == kP3CanvasColorSpaceName) |
| 60 m_colorSpace = kP3CanvasColorSpace; | 64 m_colorSpace = kP3CanvasColorSpace; |
| 65 |
| 66 // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything |
| 67 // else falls back to SRGB + RGBA8. |
| 68 if (m_creationAttributes.pixelFormat() == kF16CanvasPixelFormatName) { |
| 69 m_pixelFormat = kF16CanvasPixelFormat; |
| 70 m_linearPixelMath = true; |
| 71 } else { |
| 72 m_colorSpace = kSRGBCanvasColorSpace; |
| 73 m_pixelFormat = kRGBA8CanvasPixelFormat; |
| 74 } |
| 61 } | 75 } |
| 62 // Make m_creationAttributes reflect the effective colorSpace rather than the | 76 |
| 63 // requested one | 77 // Make m_creationAttributes reflect the effective colorSpace, pixelFormat and |
| 78 // linearPixelMath rather than the requested one. |
| 64 m_creationAttributes.setColorSpace(colorSpaceAsString()); | 79 m_creationAttributes.setColorSpace(colorSpaceAsString()); |
| 80 m_creationAttributes.setPixelFormat(pixelFormatAsString()); |
| 81 m_creationAttributes.setLinearPixelMath(linearPixelMath()); |
| 65 } | 82 } |
| 66 | 83 |
| 67 WTF::String CanvasRenderingContext::colorSpaceAsString() const { | 84 WTF::String CanvasRenderingContext::colorSpaceAsString() const { |
| 68 switch (m_colorSpace) { | 85 switch (m_colorSpace) { |
| 69 case kLegacyCanvasColorSpace: | 86 case kLegacyCanvasColorSpace: |
| 70 return kLegacyCanvasColorSpaceName; | 87 return kLegacyCanvasColorSpaceName; |
| 71 case kSRGBCanvasColorSpace: | 88 case kSRGBCanvasColorSpace: |
| 72 return kSRGBCanvasColorSpaceName; | 89 return kSRGBCanvasColorSpaceName; |
| 73 case kLinearRGBCanvasColorSpace: | |
| 74 return kLinearRGBCanvasColorSpaceName; | |
| 75 case kRec2020CanvasColorSpace: | 90 case kRec2020CanvasColorSpace: |
| 76 return kRec2020CanvasColorSpaceName; | 91 return kRec2020CanvasColorSpaceName; |
| 77 case kP3CanvasColorSpace: | 92 case kP3CanvasColorSpace: |
| 78 return kP3CanvasColorSpaceName; | 93 return kP3CanvasColorSpaceName; |
| 79 }; | 94 }; |
| 80 CHECK(false); | 95 CHECK(false); |
| 81 return ""; | 96 return ""; |
| 82 } | 97 } |
| 83 | 98 |
| 99 WTF::String CanvasRenderingContext::pixelFormatAsString() const { |
| 100 switch (m_pixelFormat) { |
| 101 case kRGBA8CanvasPixelFormat: |
| 102 return kRGBA8CanvasPixelFormatName; |
| 103 case kRGB10A2CanvasPixelFormat: |
| 104 return kRGB10A2CanvasPixelFormatName; |
| 105 case kRGBA12CanvasPixelFormat: |
| 106 return kRGBA12CanvasPixelFormatName; |
| 107 case kF16CanvasPixelFormat: |
| 108 return kF16CanvasPixelFormatName; |
| 109 }; |
| 110 CHECK(false); |
| 111 return ""; |
| 112 } |
| 113 |
| 84 gfx::ColorSpace CanvasRenderingContext::gfxColorSpace() const { | 114 gfx::ColorSpace CanvasRenderingContext::gfxColorSpace() const { |
| 85 switch (m_colorSpace) { | 115 switch (m_colorSpace) { |
| 86 case kLegacyCanvasColorSpace: | 116 case kLegacyCanvasColorSpace: |
| 117 return gfx::ColorSpace::CreateSRGB(); |
| 87 case kSRGBCanvasColorSpace: | 118 case kSRGBCanvasColorSpace: |
| 119 if (m_pixelFormat == kF16CanvasPixelFormat) |
| 120 return gfx::ColorSpace::CreateSCRGBLinear(); |
| 88 return gfx::ColorSpace::CreateSRGB(); | 121 return gfx::ColorSpace::CreateSRGB(); |
| 89 case kLinearRGBCanvasColorSpace: | |
| 90 return gfx::ColorSpace::CreateSCRGBLinear(); | |
| 91 case kRec2020CanvasColorSpace: | 122 case kRec2020CanvasColorSpace: |
| 92 return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::BT2020, | 123 return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::BT2020, |
| 93 gfx::ColorSpace::TransferID::IEC61966_2_1); | 124 gfx::ColorSpace::TransferID::IEC61966_2_1); |
| 94 case kP3CanvasColorSpace: | 125 case kP3CanvasColorSpace: |
| 95 return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::SMPTEST432_1, | 126 return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::SMPTEST432_1, |
| 96 gfx::ColorSpace::TransferID::IEC61966_2_1); | 127 gfx::ColorSpace::TransferID::IEC61966_2_1); |
| 97 } | 128 } |
| 98 NOTREACHED(); | 129 NOTREACHED(); |
| 99 return gfx::ColorSpace(); | 130 return gfx::ColorSpace(); |
| 100 } | 131 } |
| 101 | 132 |
| 102 sk_sp<SkColorSpace> CanvasRenderingContext::skSurfaceColorSpace() const { | 133 sk_sp<SkColorSpace> CanvasRenderingContext::skSurfaceColorSpace() const { |
| 103 if (skSurfacesUseColorSpace()) | 134 if (skSurfacesUseColorSpace()) |
| 104 return gfxColorSpace().ToSkColorSpace(); | 135 return gfxColorSpace().ToSkColorSpace(); |
| 105 return nullptr; | 136 return nullptr; |
| 106 } | 137 } |
| 107 | 138 |
| 108 bool CanvasRenderingContext::skSurfacesUseColorSpace() const { | 139 bool CanvasRenderingContext::skSurfacesUseColorSpace() const { |
| 109 return m_colorSpace != kLegacyCanvasColorSpace; | 140 return m_colorSpace != kLegacyCanvasColorSpace; |
| 110 } | 141 } |
| 111 | 142 |
| 112 ColorBehavior CanvasRenderingContext::colorBehaviorForMediaDrawnToCanvas() | 143 ColorBehavior CanvasRenderingContext::colorBehaviorForMediaDrawnToCanvas() |
| 113 const { | 144 const { |
| 114 if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) | 145 if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) |
| 115 return ColorBehavior::transformTo(gfxColorSpace()); | 146 return ColorBehavior::transformTo(gfxColorSpace()); |
| 116 return ColorBehavior::transformToGlobalTarget(); | 147 return ColorBehavior::transformToGlobalTarget(); |
| 117 } | 148 } |
| 118 | 149 |
| 119 SkColorType CanvasRenderingContext::colorType() const { | 150 SkColorType CanvasRenderingContext::colorType() const { |
| 120 switch (m_colorSpace) { | 151 if (m_pixelFormat == kF16CanvasPixelFormat) |
| 121 case kLinearRGBCanvasColorSpace: | 152 return kRGBA_F16_SkColorType; |
| 122 case kRec2020CanvasColorSpace: | 153 return kN32_SkColorType; |
| 123 case kP3CanvasColorSpace: | |
| 124 return kRGBA_F16_SkColorType; | |
| 125 default: | |
| 126 return kN32_SkColorType; | |
| 127 } | |
| 128 } | 154 } |
| 129 | 155 |
| 130 void CanvasRenderingContext::dispose() { | 156 void CanvasRenderingContext::dispose() { |
| 131 if (m_finalizeFrameScheduled) { | 157 if (m_finalizeFrameScheduled) { |
| 132 Platform::current()->currentThread()->removeTaskObserver(this); | 158 Platform::current()->currentThread()->removeTaskObserver(this); |
| 133 } | 159 } |
| 134 | 160 |
| 135 // HTMLCanvasElement and CanvasRenderingContext have a circular reference. | 161 // HTMLCanvasElement and CanvasRenderingContext have a circular reference. |
| 136 // When the pair is no longer reachable, their destruction order is non- | 162 // When the pair is no longer reachable, their destruction order is non- |
| 137 // deterministic, so the first of the two to be destroyed needs to notify | 163 // deterministic, so the first of the two to be destroyed needs to notify |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 246 } |
| 221 return taintOrigin; | 247 return taintOrigin; |
| 222 } | 248 } |
| 223 | 249 |
| 224 DEFINE_TRACE(CanvasRenderingContext) { | 250 DEFINE_TRACE(CanvasRenderingContext) { |
| 225 visitor->trace(m_canvas); | 251 visitor->trace(m_canvas); |
| 226 visitor->trace(m_offscreenCanvas); | 252 visitor->trace(m_offscreenCanvas); |
| 227 } | 253 } |
| 228 | 254 |
| 229 } // namespace blink | 255 } // namespace blink |
| OLD | NEW |