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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 ImageDecodingStore::instance().removeCacheIndexedByGenerator(this); | 117 ImageDecodingStore::instance().removeCacheIndexedByGenerator(this); |
118 } | 118 } |
119 | 119 |
120 bool ImageFrameGenerator::decodeAndScale(SegmentReader* data, bool allDataReceiv
ed, size_t index, const SkImageInfo& info, void* pixels, size_t rowBytes) | 120 bool ImageFrameGenerator::decodeAndScale(SegmentReader* data, bool allDataReceiv
ed, size_t index, const SkImageInfo& info, void* pixels, size_t rowBytes) |
121 { | 121 { |
122 if (m_decodeFailed) | 122 if (m_decodeFailed) |
123 return false; | 123 return false; |
124 | 124 |
125 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index",
static_cast<int>(index)); | 125 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index",
static_cast<int>(index)); |
126 | 126 |
127 RefPtr<ExternalMemoryAllocator> externalAllocator = adoptRef(new ExternalMem
oryAllocator(info, pixels, rowBytes)); | |
128 | |
129 // This implementation does not support scaling so check the requested size. | 127 // This implementation does not support scaling so check the requested size. |
130 SkISize scaledSize = SkISize::Make(info.width(), info.height()); | 128 SkISize scaledSize = SkISize::Make(info.width(), info.height()); |
131 ASSERT(m_fullSize == scaledSize); | 129 ASSERT(m_fullSize == scaledSize); |
132 | 130 |
133 // TODO (scroggo): Convert tryToResumeDecode() and decode() to take a | 131 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack, |
134 // sk_sp<SkBitmap::Allocator> instead of a bare pointer. | 132 // because 1) it contains references to memory that will be invalid after |
135 SkBitmap bitmap = tryToResumeDecode(data, allDataReceived, index, scaledSize
, externalAllocator.get()); | 133 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live |
| 134 // longer than the call to the current method. |
| 135 ExternalMemoryAllocator externalAllocator(info, pixels, rowBytes); |
| 136 SkBitmap bitmap = tryToResumeDecode(data, allDataReceived, index, scaledSize
, &externalAllocator); |
| 137 DCHECK(externalAllocator.unique()); // Verify we have the only ref-count. |
| 138 |
136 if (bitmap.isNull()) | 139 if (bitmap.isNull()) |
137 return false; | 140 return false; |
138 | 141 |
139 // Check to see if the decoder has written directly to the pixel memory | 142 // Check to see if the decoder has written directly to the pixel memory |
140 // provided. If not, make a copy. | 143 // provided. If not, make a copy. |
141 ASSERT(bitmap.width() == scaledSize.width()); | 144 ASSERT(bitmap.width() == scaledSize.width()); |
142 ASSERT(bitmap.height() == scaledSize.height()); | 145 ASSERT(bitmap.height() == scaledSize.height()); |
143 SkAutoLockPixels bitmapLock(bitmap); | 146 SkAutoLockPixels bitmapLock(bitmap); |
144 if (bitmap.getPixels() != pixels) | 147 if (bitmap.getPixels() != pixels) |
145 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); | 148 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 return false; | 340 return false; |
338 | 341 |
339 // Setting a dummy ImagePlanes object signals to the decoder that we want to
do YUV decoding. | 342 // Setting a dummy ImagePlanes object signals to the decoder that we want to
do YUV decoding. |
340 std::unique_ptr<ImagePlanes> dummyImagePlanes = wrapUnique(new ImagePlanes); | 343 std::unique_ptr<ImagePlanes> dummyImagePlanes = wrapUnique(new ImagePlanes); |
341 decoder->setImagePlanes(std::move(dummyImagePlanes)); | 344 decoder->setImagePlanes(std::move(dummyImagePlanes)); |
342 | 345 |
343 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, sizeInfo->fW
idthBytes); | 346 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, sizeInfo->fW
idthBytes); |
344 } | 347 } |
345 | 348 |
346 } // namespace blink | 349 } // namespace blink |
OLD | NEW |