Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(301)

Side by Side Diff: third_party/WebKit/Source/core/frame/ImageBitmap.cpp

Issue 2771813003: Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData (Closed)
Patch Set: Fixing issues Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "core/frame/ImageBitmap.h" 5 #include "core/frame/ImageBitmap.h"
6 6
7 #include "core/html/HTMLCanvasElement.h" 7 #include "core/html/HTMLCanvasElement.h"
8 #include "core/html/HTMLVideoElement.h" 8 #include "core/html/HTMLVideoElement.h"
9 #include "core/html/ImageData.h" 9 #include "core/html/ImageData.h"
10 #include "core/offscreencanvas/OffscreenCanvas.h" 10 #include "core/offscreencanvas/OffscreenCanvas.h"
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 IntRect srcRect = cropRect ? intersection(parsedOptions.cropRect, dataSrcRect) 782 IntRect srcRect = cropRect ? intersection(parsedOptions.cropRect, dataSrcRect)
783 : dataSrcRect; 783 : dataSrcRect;
784 784
785 // treat non-premultiplyAlpha as a special case 785 // treat non-premultiplyAlpha as a special case
786 if (!parsedOptions.premultiplyAlpha) { 786 if (!parsedOptions.premultiplyAlpha) {
787 unsigned char* srcAddr = data->data()->data(); 787 unsigned char* srcAddr = data->data()->data();
788 788
789 // Using kN32 type, swizzle input if necessary. 789 // Using kN32 type, swizzle input if necessary.
790 SkImageInfo info = SkImageInfo::Make( 790 SkImageInfo info = SkImageInfo::Make(
791 parsedOptions.cropRect.width(), parsedOptions.cropRect.height(), 791 parsedOptions.cropRect.width(), parsedOptions.cropRect.height(),
792 kN32_SkColorType, kUnpremul_SkAlphaType, data->getSkColorSpace()); 792 kN32_SkColorType, kUnpremul_SkAlphaType, data->skColorSpace());
793 unsigned bytesPerPixel = static_cast<unsigned>(info.bytesPerPixel()); 793 unsigned bytesPerPixel = static_cast<unsigned>(info.bytesPerPixel());
794 unsigned srcPixelBytesPerRow = bytesPerPixel * data->size().width(); 794 unsigned srcPixelBytesPerRow = bytesPerPixel * data->size().width();
795 unsigned dstPixelBytesPerRow = 795 unsigned dstPixelBytesPerRow =
796 bytesPerPixel * parsedOptions.cropRect.width(); 796 bytesPerPixel * parsedOptions.cropRect.width();
797 sk_sp<SkImage> skImage; 797 sk_sp<SkImage> skImage;
798 if (parsedOptions.cropRect == IntRect(IntPoint(), data->size())) { 798 if (parsedOptions.cropRect == IntRect(IntPoint(), data->size())) {
799 swizzleImageData(srcAddr, data->size().height(), srcPixelBytesPerRow, 799 swizzleImageData(srcAddr, data->size().height(), srcPixelBytesPerRow,
800 parsedOptions.flipY); 800 parsedOptions.flipY);
801 skImage = 801 skImage =
802 SkImage::MakeRasterCopy(SkPixmap(info, srcAddr, dstPixelBytesPerRow)); 802 SkImage::MakeRasterCopy(SkPixmap(info, srcAddr, dstPixelBytesPerRow));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 srcAddr[srcStartCopyPosition + j]; 859 srcAddr[srcStartCopyPosition + j];
860 } 860 }
861 } 861 }
862 } 862 }
863 } 863 }
864 skImage = newSkImageFromRaster(info, std::move(copiedDataBuffer), 864 skImage = newSkImageFromRaster(info, std::move(copiedDataBuffer),
865 dstPixelBytesPerRow); 865 dstPixelBytesPerRow);
866 } 866 }
867 if (!skImage) 867 if (!skImage)
868 return; 868 return;
869 if (data->getSkColorSpace()) { 869 if (data->skColorSpace()) {
870 parsedOptions.latestColorSpace = data->getSkColorSpace(); 870 parsedOptions.latestColorSpace = data->skColorSpace();
871 applyColorSpaceConversion(skImage, parsedOptions); 871 applyColorSpaceConversion(skImage, parsedOptions);
872 } 872 }
873 if (parsedOptions.shouldScaleInput) { 873 if (parsedOptions.shouldScaleInput) {
874 m_image = StaticBitmapImage::create( 874 m_image = StaticBitmapImage::create(
875 scaleSkImage(skImage, parsedOptions.resizeWidth, 875 scaleSkImage(skImage, parsedOptions.resizeWidth,
876 parsedOptions.resizeHeight, parsedOptions.resizeQuality, 876 parsedOptions.resizeHeight, parsedOptions.resizeQuality,
877 parsedOptions.latestColorType, data->getSkColorSpace())); 877 parsedOptions.latestColorType, data->skColorSpace()));
878 } else { 878 } else {
879 m_image = StaticBitmapImage::create(skImage); 879 m_image = StaticBitmapImage::create(skImage);
880 } 880 }
881 if (!m_image) 881 if (!m_image)
882 return; 882 return;
883 m_image->setPremultiplied(parsedOptions.premultiplyAlpha); 883 m_image->setPremultiplied(parsedOptions.premultiplyAlpha);
884 return; 884 return;
885 } 885 }
886 886
887 std::unique_ptr<ImageBuffer> buffer = 887 std::unique_ptr<ImageBuffer> buffer =
888 ImageBuffer::create(parsedOptions.cropRect.size(), NonOpaque, 888 ImageBuffer::create(parsedOptions.cropRect.size(), NonOpaque,
889 DoNotInitializeImagePixels, data->getSkColorSpace()); 889 DoNotInitializeImagePixels, data->skColorSpace());
890 if (!buffer) 890 if (!buffer)
891 return; 891 return;
892 892
893 if (srcRect.isEmpty()) { 893 if (srcRect.isEmpty()) {
894 m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot( 894 m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(
895 PreferNoAcceleration, SnapshotReasonUnknown)); 895 PreferNoAcceleration, SnapshotReasonUnknown));
896 return; 896 return;
897 } 897 }
898 898
899 IntPoint dstPoint = IntPoint(std::min(0, -parsedOptions.cropRect.x()), 899 IntPoint dstPoint = IntPoint(std::min(0, -parsedOptions.cropRect.x()),
900 std::min(0, -parsedOptions.cropRect.y())); 900 std::min(0, -parsedOptions.cropRect.y()));
901 if (parsedOptions.cropRect.x() < 0) 901 if (parsedOptions.cropRect.x() < 0)
902 dstPoint.setX(-parsedOptions.cropRect.x()); 902 dstPoint.setX(-parsedOptions.cropRect.x());
903 if (parsedOptions.cropRect.y() < 0) 903 if (parsedOptions.cropRect.y() < 0)
904 dstPoint.setY(-parsedOptions.cropRect.y()); 904 dstPoint.setY(-parsedOptions.cropRect.y());
905 905
906 buffer->putByteArray(Unmultiplied, data->data()->data(), data->size(), 906 buffer->putByteArray(Unmultiplied, data->data()->data(), data->size(),
907 srcRect, dstPoint); 907 srcRect, dstPoint);
908 sk_sp<SkImage> skImage = 908 sk_sp<SkImage> skImage =
909 buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown); 909 buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown);
910 if (parsedOptions.flipY) 910 if (parsedOptions.flipY)
911 skImage = flipSkImageVertically(skImage.get(), EnforceAlphaPremultiply); 911 skImage = flipSkImageVertically(skImage.get(), EnforceAlphaPremultiply);
912 if (!skImage) 912 if (!skImage)
913 return; 913 return;
914 if (parsedOptions.shouldScaleInput) { 914 if (parsedOptions.shouldScaleInput) {
915 sk_sp<SkSurface> surface = SkSurface::MakeRaster(SkImageInfo::MakeN32Premul( 915 sk_sp<SkSurface> surface = SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(
916 parsedOptions.resizeWidth, parsedOptions.resizeHeight, 916 parsedOptions.resizeWidth, parsedOptions.resizeHeight,
917 data->getSkColorSpace())); 917 data->skColorSpace()));
918 if (!surface) 918 if (!surface)
919 return; 919 return;
920 SkPaint paint; 920 SkPaint paint;
921 paint.setFilterQuality(parsedOptions.resizeQuality); 921 paint.setFilterQuality(parsedOptions.resizeQuality);
922 SkRect dstDrawRect = 922 SkRect dstDrawRect =
923 SkRect::MakeWH(parsedOptions.resizeWidth, parsedOptions.resizeHeight); 923 SkRect::MakeWH(parsedOptions.resizeWidth, parsedOptions.resizeHeight);
924 surface->getCanvas()->drawImageRect(skImage, dstDrawRect, &paint); 924 surface->getCanvas()->drawImageRect(skImage, dstDrawRect, &paint);
925 skImage = surface->makeImageSnapshot(); 925 skImage = surface->makeImageSnapshot();
926 } 926 }
927 if (data->getSkColorSpace()) { 927 if (data->skColorSpace()) {
928 parsedOptions.latestColorSpace = data->getSkColorSpace(); 928 parsedOptions.latestColorSpace = data->skColorSpace();
929 applyColorSpaceConversion(skImage, parsedOptions); 929 applyColorSpaceConversion(skImage, parsedOptions);
930 } 930 }
931 m_image = StaticBitmapImage::create(std::move(skImage)); 931 m_image = StaticBitmapImage::create(std::move(skImage));
932 } 932 }
933 933
934 ImageBitmap::ImageBitmap(ImageBitmap* bitmap, 934 ImageBitmap::ImageBitmap(ImageBitmap* bitmap,
935 Optional<IntRect> cropRect, 935 Optional<IntRect> cropRect,
936 const ImageBitmapOptions& options) { 936 const ImageBitmapOptions& options) {
937 RefPtr<Image> input = bitmap->bitmapImage(); 937 RefPtr<Image> input = bitmap->bitmapImage();
938 if (!input) 938 if (!input)
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 void ImageBitmap::adjustDrawRects(FloatRect* srcRect, 1125 void ImageBitmap::adjustDrawRects(FloatRect* srcRect,
1126 FloatRect* dstRect) const {} 1126 FloatRect* dstRect) const {}
1127 1127
1128 FloatSize ImageBitmap::elementSize(const FloatSize&) const { 1128 FloatSize ImageBitmap::elementSize(const FloatSize&) const {
1129 return FloatSize(width(), height()); 1129 return FloatSize(width(), height());
1130 } 1130 }
1131 1131
1132 DEFINE_TRACE(ImageBitmap) {} 1132 DEFINE_TRACE(ImageBitmap) {}
1133 1133
1134 } // namespace blink 1134 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698