Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
| 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 618 { | 618 { |
| 619 ImageData* imageData; | 619 ImageData* imageData; |
| 620 if (is3D()) { | 620 if (is3D()) { |
| 621 // Get non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL(). | 621 // Get non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL(). |
| 622 imageData = m_context->paintRenderingResultsToImageData(sourceBuffer); | 622 imageData = m_context->paintRenderingResultsToImageData(sourceBuffer); |
| 623 if (imageData) | 623 if (imageData) |
| 624 return imageData; | 624 return imageData; |
| 625 | 625 |
| 626 m_context->paintRenderingResultsToCanvas(sourceBuffer); | 626 m_context->paintRenderingResultsToCanvas(sourceBuffer); |
| 627 imageData = ImageData::create(m_size); | 627 imageData = ImageData::create(m_size); |
| 628 if (hasImageBuffer()) { | 628 if (imageData && hasImageBuffer()) { |
| 629 sk_sp<SkImage> snapshot = buffer()->newSkImageSnapshot(PreferNoAccel eration, reason); | 629 sk_sp<SkImage> snapshot = buffer()->newSkImageSnapshot(PreferNoAccel eration, reason); |
| 630 if (snapshot) { | 630 if (snapshot) { |
| 631 SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRG BA_8888_SkColorType, kUnpremul_SkAlphaType); | 631 SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRG BA_8888_SkColorType, kUnpremul_SkAlphaType); |
| 632 snapshot->readPixels(imageInfo, imageData->data()->data(), image Info.minRowBytes(), 0, 0); | 632 snapshot->readPixels(imageInfo, imageData->data()->data(), image Info.minRowBytes(), 0, 0); |
| 633 } | 633 } |
| 634 } | 634 } |
| 635 return imageData; | 635 return imageData; |
| 636 } | 636 } |
| 637 | 637 |
| 638 imageData = ImageData::create(m_size); | 638 imageData = ImageData::create(m_size); |
| 639 | 639 |
| 640 if (!m_context) | 640 if (!m_context || !imageData) |
| 641 return imageData; | 641 return imageData; |
| 642 | 642 |
| 643 DCHECK(m_context->is2d()); | 643 DCHECK(m_context->is2d()); |
| 644 if (hasImageBuffer()) { | 644 if (hasImageBuffer()) { |
| 645 sk_sp<SkImage> snapshot = buffer()->newSkImageSnapshot(PreferNoAccelerat ion, reason); | 645 sk_sp<SkImage> snapshot = buffer()->newSkImageSnapshot(PreferNoAccelerat ion, reason); |
| 646 if (snapshot) { | 646 if (snapshot) { |
| 647 SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRGBA_8 888_SkColorType, kUnpremul_SkAlphaType); | 647 SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRGBA_8 888_SkColorType, kUnpremul_SkAlphaType); |
| 648 snapshot->readPixels(imageInfo, imageData->data()->data(), imageInfo .minRowBytes(), 0, 0); | 648 snapshot->readPixels(imageInfo, imageData->data()->data(), imageInfo .minRowBytes(), 0, 0); |
| 649 } | 649 } |
| 650 } | 650 } |
| 651 | 651 |
| 652 return imageData; | 652 return imageData; |
| 653 } | 653 } |
| 654 | 654 |
| 655 String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double & quality, SourceDrawingBuffer sourceBuffer) const | 655 String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double & quality, SourceDrawingBuffer sourceBuffer) const |
| 656 { | 656 { |
| 657 if (!isPaintable()) | 657 if (!isPaintable()) |
| 658 return String("data:,"); | 658 return String("data:,"); |
| 659 | 659 |
| 660 String encodingMimeType = toEncodingMimeType(mimeType, EncodeReasonToDataURL ); | 660 String encodingMimeType = toEncodingMimeType(mimeType, EncodeReasonToDataURL ); |
| 661 | 661 |
| 662 ImageData* imageData = toImageData(sourceBuffer, SnapshotReasonToDataURL); | 662 ImageData* imageData = toImageData(sourceBuffer, SnapshotReasonToDataURL); |
| 663 | 663 |
| 664 if (!imageData) // allocation failure | |
| 665 return String("data:,"); | |
| 666 | |
| 664 return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataU RL(encodingMimeType, quality); | 667 return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataU RL(encodingMimeType, quality); |
| 665 } | 668 } |
| 666 | 669 |
| 667 String HTMLCanvasElement::toDataURL(const String& mimeType, const ScriptValue& q ualityArgument, ExceptionState& exceptionState) const | 670 String HTMLCanvasElement::toDataURL(const String& mimeType, const ScriptValue& q ualityArgument, ExceptionState& exceptionState) const |
| 668 { | 671 { |
| 669 if (surfaceLayerBridge()) { | 672 if (surfaceLayerBridge()) { |
| 670 exceptionState.throwDOMException(InvalidStateError, "canvas.toDataURL is not allowed for a canvas that has transferred its control to offscreen."); | 673 exceptionState.throwDOMException(InvalidStateError, "canvas.toDataURL is not allowed for a canvas that has transferred its control to offscreen."); |
| 671 return String(); | 674 return String(); |
| 672 } | 675 } |
| 673 if (!originClean()) { | 676 if (!originClean()) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 736 double quality = UndefinedQualityValue; | 739 double quality = UndefinedQualityValue; |
| 737 if (!qualityArgument.isEmpty()) { | 740 if (!qualityArgument.isEmpty()) { |
| 738 v8::Local<v8::Value> v8Value = qualityArgument.v8Value(); | 741 v8::Local<v8::Value> v8Value = qualityArgument.v8Value(); |
| 739 if (v8Value->IsNumber()) { | 742 if (v8Value->IsNumber()) { |
| 740 quality = v8Value.As<v8::Number>()->Value(); | 743 quality = v8Value.As<v8::Number>()->Value(); |
| 741 } | 744 } |
| 742 } | 745 } |
| 743 | 746 |
| 744 String encodingMimeType = toEncodingMimeType(mimeType, EncodeReasonToBlobCal lback); | 747 String encodingMimeType = toEncodingMimeType(mimeType, EncodeReasonToBlobCal lback); |
| 745 | 748 |
| 746 ImageData* imageData = toImageData(BackBuffer, SnapshotReasonToBlob); | 749 ImageData* imageData = toImageData(BackBuffer, SnapshotReasonToBlob); |
|
xlai (Olivia)
2016/09/22 17:51:11
toBlob is also calling toImageData(). Could you wr
| |
| 747 | 750 |
| 748 CanvasAsyncBlobCreator* asyncCreator = CanvasAsyncBlobCreator::create(imageD ata->data(), encodingMimeType, imageData->size(), callback, startTime, document( )); | 751 CanvasAsyncBlobCreator* asyncCreator = CanvasAsyncBlobCreator::create(imageD ata->data(), encodingMimeType, imageData->size(), callback, startTime, document( )); |
| 749 | 752 |
| 750 bool useIdlePeriodScheduling = (encodingMimeType != "image/webp"); | 753 bool useIdlePeriodScheduling = (encodingMimeType != "image/webp"); |
| 751 asyncCreator->scheduleAsyncBlobCreation(useIdlePeriodScheduling, quality); | 754 asyncCreator->scheduleAsyncBlobCreation(useIdlePeriodScheduling, quality); |
| 752 } | 755 } |
| 753 | 756 |
| 754 void HTMLCanvasElement::addListener(CanvasDrawListener* listener) | 757 void HTMLCanvasElement::addListener(CanvasDrawListener* listener) |
| 755 { | 758 { |
| 756 m_listeners.add(listener); | 759 m_listeners.add(listener); |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1287 | 1290 |
| 1288 bool HTMLCanvasElement::createSurfaceLayer() | 1291 bool HTMLCanvasElement::createSurfaceLayer() |
| 1289 { | 1292 { |
| 1290 DCHECK(!m_surfaceLayerBridge); | 1293 DCHECK(!m_surfaceLayerBridge); |
| 1291 std::unique_ptr<CanvasSurfaceLayerBridgeClient> bridgeClient = wrapUnique(ne w CanvasSurfaceLayerBridgeClientImpl()); | 1294 std::unique_ptr<CanvasSurfaceLayerBridgeClient> bridgeClient = wrapUnique(ne w CanvasSurfaceLayerBridgeClientImpl()); |
| 1292 m_surfaceLayerBridge = wrapUnique(new CanvasSurfaceLayerBridge(std::move(bri dgeClient))); | 1295 m_surfaceLayerBridge = wrapUnique(new CanvasSurfaceLayerBridge(std::move(bri dgeClient))); |
| 1293 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), this->height( )); | 1296 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), this->height( )); |
| 1294 } | 1297 } |
| 1295 | 1298 |
| 1296 } // namespace blink | 1299 } // namespace blink |
| OLD | NEW |