| OLD | NEW | 
|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "modules/canvas2d/BaseRenderingContext2D.h" | 5 #include "modules/canvas2d/BaseRenderingContext2D.h" | 
| 6 | 6 | 
| 7 #include "bindings/core/v8/ExceptionMessages.h" | 7 #include "bindings/core/v8/ExceptionMessages.h" | 
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" | 
| 9 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 9 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 
| 10 #include "core/css/parser/CSSParser.h" | 10 #include "core/css/parser/CSSParser.h" | 
| (...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 849         return value.getAsHTMLCanvasElement().get(); | 849         return value.getAsHTMLCanvasElement().get(); | 
| 850     if (value.isImageBitmap()) | 850     if (value.isImageBitmap()) | 
| 851         return value.getAsImageBitmap().get(); | 851         return value.getAsImageBitmap().get(); | 
| 852     ASSERT_NOT_REACHED(); | 852     ASSERT_NOT_REACHED(); | 
| 853     return nullptr; | 853     return nullptr; | 
| 854 } | 854 } | 
| 855 | 855 | 
| 856 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , double x, double y, ExceptionState& exceptionState) | 856 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , double x, double y, ExceptionState& exceptionState) | 
| 857 { | 857 { | 
| 858     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 858     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 
| 859     FloatSize sourceRectSize = imageSourceInternal->elementSize(); | 859     FloatSize canvasSize(width(), height()); | 
| 860     FloatSize destRectSize = imageSourceInternal->defaultDestinationSize(); | 860     FloatSize sourceRectSize = imageSourceInternal->elementSize(canvasSize); | 
|  | 861     FloatSize destRectSize = imageSourceInternal->defaultDestinationSize(canvasS
      ize); | 
| 861     drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.
      height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState); | 862     drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.
      height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState); | 
| 862 } | 863 } | 
| 863 | 864 | 
| 864 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , | 865 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , | 
| 865     double x, double y, double width, double height, ExceptionState& exceptionSt
      ate) | 866     double x, double y, double width, double height, ExceptionState& exceptionSt
      ate) | 
| 866 { | 867 { | 
| 867     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 868     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 
| 868     FloatSize sourceRectSize = imageSourceInternal->elementSize(); | 869     FloatSize canvasSize(this->width(), this->height()); | 
|  | 870     FloatSize sourceRectSize = imageSourceInternal->elementSize(canvasSize); | 
| 869     drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.
      height(), x, y, width, height, exceptionState); | 871     drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.
      height(), x, y, width, height, exceptionState); | 
| 870 } | 872 } | 
| 871 | 873 | 
| 872 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , | 874 void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource
      , | 
| 873     double sx, double sy, double sw, double sh, | 875     double sx, double sy, double sw, double sh, | 
| 874     double dx, double dy, double dw, double dh, ExceptionState& exceptionState) | 876     double dx, double dy, double dw, double dh, ExceptionState& exceptionState) | 
| 875 { | 877 { | 
| 876     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 878     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 
| 877     drawImage(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
      e); | 879     drawImage(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
      e); | 
| 878 } | 880 } | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 970     if (!drawingCanvas()) | 972     if (!drawingCanvas()) | 
| 971         return; | 973         return; | 
| 972 | 974 | 
| 973     RefPtr<Image> image; | 975     RefPtr<Image> image; | 
| 974     SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; | 976     SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; | 
| 975     if (!imageSource->isVideoElement()) { | 977     if (!imageSource->isVideoElement()) { | 
| 976         AccelerationHint hint = imageBuffer()->isAccelerated() ? PreferAccelerat
      ion : PreferNoAcceleration; | 978         AccelerationHint hint = imageBuffer()->isAccelerated() ? PreferAccelerat
      ion : PreferNoAcceleration; | 
| 977         image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint, S
      napshotReasonDrawImage); | 979         image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint, S
      napshotReasonDrawImage); | 
| 978         if (sourceImageStatus == UndecodableSourceImageStatus) | 980         if (sourceImageStatus == UndecodableSourceImageStatus) | 
| 979             exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
      ement provided is in the 'broken' state."); | 981             exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
      ement provided is in the 'broken' state."); | 
| 980         if (!image || !image->width() || !image->height()) | 982         if (!image || !image->defaultConcreteObjectSizeWidth() || !image->defaul
      tConcreteObjectSizeHeight()) | 
| 981             return; | 983             return; | 
| 982     } else { | 984     } else { | 
| 983         if (!static_cast<HTMLVideoElement*>(imageSource)->hasAvailableVideoFrame
      ()) | 985         if (!static_cast<HTMLVideoElement*>(imageSource)->hasAvailableVideoFrame
      ()) | 
| 984             return; | 986             return; | 
| 985     } | 987     } | 
| 986 | 988 | 
| 987     if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
      isfinite(dh) | 989     if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
      isfinite(dh) | 
| 988         || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
      d::isfinite(sh) | 990         || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
      d::isfinite(sh) | 
| 989         || !dw || !dh || !sw || !sh) | 991         || !dw || !dh || !sw || !sh) | 
| 990         return; | 992         return; | 
| 991 | 993 | 
| 992     FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); | 994     FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); | 
| 993     FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); | 995     FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); | 
| 994 | 996 | 
| 995     clipRectsToImageRect(FloatRect(FloatPoint(), imageSource->elementSize()), &s
      rcRect, &dstRect); | 997     FloatSize canvasSize(width(), height()); | 
|  | 998     FloatSize elementSize(imageSource->elementSize(canvasSize)); | 
|  | 999     clipRectsToImageRect(FloatRect(FloatPoint(), elementSize), &srcRect, &dstRec
      t); | 
| 996 | 1000 | 
| 997     imageSource->adjustDrawRects(&srcRect, &dstRect); | 1001     imageSource->adjustDrawRects(&srcRect, &dstRect); | 
| 998 | 1002 | 
| 999     if (srcRect.isEmpty()) | 1003     if (srcRect.isEmpty()) | 
| 1000         return; | 1004         return; | 
| 1001 | 1005 | 
| 1002     DisableDeferralReason reason = DisableDeferralReasonUnknown; | 1006     DisableDeferralReason reason = DisableDeferralReasonUnknown; | 
| 1003     if (shouldDisableDeferral(imageSource, &reason) || image->isTextureBacked()) | 1007     if (shouldDisableDeferral(imageSource, &reason) || image->isTextureBacked()) | 
| 1004         disableDeferral(reason); | 1008         disableDeferral(reason); | 
| 1005 | 1009 | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1016         }, dstRect, CanvasRenderingContext2DState::ImagePaintType, | 1020         }, dstRect, CanvasRenderingContext2DState::ImagePaintType, | 
| 1017         imageSource->isOpaque() ? CanvasRenderingContext2DState::OpaqueImage : C
      anvasRenderingContext2DState::NonOpaqueImage); | 1021         imageSource->isOpaque() ? CanvasRenderingContext2DState::OpaqueImage : C
      anvasRenderingContext2DState::NonOpaqueImage); | 
| 1018 | 1022 | 
| 1019     validateStateStack(); | 1023     validateStateStack(); | 
| 1020 | 1024 | 
| 1021     bool isExpensive = false; | 1025     bool isExpensive = false; | 
| 1022 | 1026 | 
| 1023     if (ExpensiveCanvasHeuristicParameters::SVGImageSourcesAreExpensive && image
      Source->isSVGSource()) | 1027     if (ExpensiveCanvasHeuristicParameters::SVGImageSourcesAreExpensive && image
      Source->isSVGSource()) | 
| 1024         isExpensive = true; | 1028         isExpensive = true; | 
| 1025 | 1029 | 
| 1026     if (imageSource->elementSize().width() * imageSource->elementSize().height()
       > width() * height() * ExpensiveCanvasHeuristicParameters::ExpensiveImageSizeRa
      tio) | 1030     if (elementSize.width() * elementSize.height() > width() * height() * Expens
      iveCanvasHeuristicParameters::ExpensiveImageSizeRatio) | 
| 1027         isExpensive = true; | 1031         isExpensive = true; | 
| 1028 | 1032 | 
| 1029     if (isExpensive) { | 1033     if (isExpensive) { | 
| 1030         ImageBuffer* buffer = imageBuffer(); | 1034         ImageBuffer* buffer = imageBuffer(); | 
| 1031         if (buffer) | 1035         if (buffer) | 
| 1032             buffer->setHasExpensiveOp(); | 1036             buffer->setHasExpensiveOp(); | 
| 1033     } | 1037     } | 
| 1034 | 1038 | 
| 1035     if (imageSource->isCanvasElement() && static_cast<HTMLCanvasElement*>(imageS
      ource)->is3D()) { | 1039     if (imageSource->isCanvasElement() && static_cast<HTMLCanvasElement*>(imageS
      ource)->is3D()) { | 
| 1036         // WebGL to 2D canvas: must flush graphics context to prevent a race | 1040         // WebGL to 2D canvas: must flush graphics context to prevent a race | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1082         return nullptr; | 1086         return nullptr; | 
| 1083 | 1087 | 
| 1084     SourceImageStatus status; | 1088     SourceImageStatus status; | 
| 1085     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 1089     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 
| 1086     RefPtr<Image> imageForRendering = imageSourceInternal->getSourceImageForCanv
      as(&status, PreferNoAcceleration, SnapshotReasonCreatePattern); | 1090     RefPtr<Image> imageForRendering = imageSourceInternal->getSourceImageForCanv
      as(&status, PreferNoAcceleration, SnapshotReasonCreatePattern); | 
| 1087 | 1091 | 
| 1088     switch (status) { | 1092     switch (status) { | 
| 1089     case NormalSourceImageStatus: | 1093     case NormalSourceImageStatus: | 
| 1090         break; | 1094         break; | 
| 1091     case ZeroSizeCanvasSourceImageStatus: | 1095     case ZeroSizeCanvasSourceImageStatus: | 
| 1092         exceptionState.throwDOMException(InvalidStateError, String::format("The 
      canvas %s is 0.", imageSourceInternal->elementSize().width() ? "height" : "width
      ")); | 1096         exceptionState.throwDOMException(InvalidStateError, String::format("The 
      canvas %s is 0.", imageSourceInternal->elementSize(FloatSize(width(), height()))
      .width() ? "height" : "width")); | 
| 1093         return nullptr; | 1097         return nullptr; | 
| 1094     case UndecodableSourceImageStatus: | 1098     case UndecodableSourceImageStatus: | 
| 1095         exceptionState.throwDOMException(InvalidStateError, "Source image is in 
      the 'broken' state."); | 1099         exceptionState.throwDOMException(InvalidStateError, "Source image is in 
      the 'broken' state."); | 
| 1096         return nullptr; | 1100         return nullptr; | 
| 1097     case InvalidSourceImageStatus: | 1101     case InvalidSourceImageStatus: | 
| 1098         imageForRendering = Image::nullImage(); | 1102         imageForRendering = Image::nullImage(); | 
| 1099         break; | 1103         break; | 
| 1100     case IncompleteSourceImageStatus: | 1104     case IncompleteSourceImageStatus: | 
| 1101         return nullptr; | 1105         return nullptr; | 
| 1102     default: | 1106     default: | 
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1357 | 1361 | 
| 1358     imageBuffer()->willOverwriteCanvas(); | 1362     imageBuffer()->willOverwriteCanvas(); | 
| 1359 } | 1363 } | 
| 1360 | 1364 | 
| 1361 DEFINE_TRACE(BaseRenderingContext2D) | 1365 DEFINE_TRACE(BaseRenderingContext2D) | 
| 1362 { | 1366 { | 
| 1363     visitor->trace(m_stateStack); | 1367     visitor->trace(m_stateStack); | 
| 1364 } | 1368 } | 
| 1365 | 1369 | 
| 1366 } // namespace blink | 1370 } // namespace blink | 
| OLD | NEW | 
|---|