OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 115 |
116 ImageFrameGenerator::~ImageFrameGenerator() { | 116 ImageFrameGenerator::~ImageFrameGenerator() { |
117 ImageDecodingStore::instance().removeCacheIndexedByGenerator(this); | 117 ImageDecodingStore::instance().removeCacheIndexedByGenerator(this); |
118 } | 118 } |
119 | 119 |
120 bool ImageFrameGenerator::decodeAndScale(SegmentReader* data, | 120 bool ImageFrameGenerator::decodeAndScale(SegmentReader* data, |
121 bool allDataReceived, | 121 bool allDataReceived, |
122 size_t index, | 122 size_t index, |
123 const SkImageInfo& info, | 123 const SkImageInfo& info, |
124 void* pixels, | 124 void* pixels, |
125 size_t rowBytes) { | 125 size_t rowBytes, |
| 126 SkFilterQuality quality) { |
126 if (m_decodeFailed) | 127 if (m_decodeFailed) |
127 return false; | 128 return false; |
128 | 129 |
129 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index", | 130 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index", |
130 static_cast<int>(index)); | 131 static_cast<int>(index)); |
131 | 132 |
132 // This implementation does not support scaling so check the requested size. | |
133 SkISize scaledSize = SkISize::Make(info.width(), info.height()); | 133 SkISize scaledSize = SkISize::Make(info.width(), info.height()); |
134 ASSERT(m_fullSize == scaledSize); | 134 const bool doScaleAfterDecoding = m_fullSize != scaledSize; |
135 | 135 |
136 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack, | 136 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack, |
137 // because 1) it contains references to memory that will be invalid after | 137 // because 1) it contains references to memory that will be invalid after |
138 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live | 138 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live |
139 // longer than the call to the current method. | 139 // longer than the call to the current method. |
140 ExternalMemoryAllocator externalAllocator(info, pixels, rowBytes); | 140 ExternalMemoryAllocator externalAllocator(info, pixels, rowBytes); |
141 SkBitmap bitmap = tryToResumeDecode(data, allDataReceived, index, scaledSize, | 141 SkBitmap bitmap = |
142 &externalAllocator); | 142 tryToResumeDecode(data, allDataReceived, index, m_fullSize, |
| 143 doScaleAfterDecoding ? nullptr : &externalAllocator); |
143 DCHECK(externalAllocator.unique()); // Verify we have the only ref-count. | 144 DCHECK(externalAllocator.unique()); // Verify we have the only ref-count. |
144 | 145 |
145 if (bitmap.isNull()) | 146 if (bitmap.isNull()) |
146 return false; | 147 return false; |
147 | 148 |
148 // Check to see if the decoder has written directly to the pixel memory | 149 // Check to see if the decoder has written directly to the pixel memory |
149 // provided. If not, make a copy. | 150 // provided. If not, make a copy. |
150 ASSERT(bitmap.width() == scaledSize.width()); | 151 DCHECK_NE(bitmap.width(), m_fullSize.width()); |
151 ASSERT(bitmap.height() == scaledSize.height()); | 152 DCHECK_NE(bitmap.height(), m_fullSize.height()); |
152 SkAutoLockPixels bitmapLock(bitmap); | 153 SkAutoLockPixels bitmapLock(bitmap); |
153 if (bitmap.getPixels() != pixels) | 154 if (bitmap.getPixels() != pixels) { |
154 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); | 155 if (!doScaleAfterDecoding) |
| 156 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); |
| 157 SkPixmap pixmap; |
| 158 SkPixmap scaled(info, pixels, rowBytes); |
| 159 return bitmap.peekPixels(&pixmap) && pixmap.scalePixels(scaled, quality); |
| 160 } |
| 161 DCHECK(!doScaleAfterDecoding); |
155 return true; | 162 return true; |
156 } | 163 } |
157 | 164 |
158 bool ImageFrameGenerator::decodeToYUV(SegmentReader* data, | 165 bool ImageFrameGenerator::decodeToYUV(SegmentReader* data, |
159 size_t index, | 166 size_t index, |
160 const SkISize componentSizes[3], | 167 const SkISize componentSizes[3], |
161 void* planes[3], | 168 void* planes[3], |
162 const size_t rowBytes[3]) { | 169 const size_t rowBytes[3]) { |
163 // TODO (scroggo): The only interesting thing this uses from the | 170 // TODO (scroggo): The only interesting thing this uses from the |
164 // ImageFrameGenerator is m_decodeFailed. Move this into | 171 // ImageFrameGenerator is m_decodeFailed. Move this into |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 // do YUV decoding. | 381 // do YUV decoding. |
375 std::unique_ptr<ImagePlanes> dummyImagePlanes = | 382 std::unique_ptr<ImagePlanes> dummyImagePlanes = |
376 WTF::wrapUnique(new ImagePlanes); | 383 WTF::wrapUnique(new ImagePlanes); |
377 decoder->setImagePlanes(std::move(dummyImagePlanes)); | 384 decoder->setImagePlanes(std::move(dummyImagePlanes)); |
378 | 385 |
379 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, | 386 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, |
380 sizeInfo->fWidthBytes); | 387 sizeInfo->fWidthBytes); |
381 } | 388 } |
382 | 389 |
383 } // namespace blink | 390 } // namespace blink |
OLD | NEW |