mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
I left this code along in my uber patch to remove the DOM and CSS, but it's just as dead. Also, move lone files out of dead directories into more sensible places.
79 lines
2.7 KiB
C++
79 lines
2.7 KiB
C++
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/bind.h"
|
|
#include "base/trace_event/trace_event.h"
|
|
#include "base/message_loop/message_loop.h"
|
|
#include "sky/engine/core/painting/CanvasImageDecoder.h"
|
|
#include "sky/engine/core/painting/CanvasImage.h"
|
|
#include "sky/engine/platform/SharedBuffer.h"
|
|
#include "sky/engine/platform/image-decoders/ImageDecoder.h"
|
|
#include "sky/engine/platform/mojo/data_pipe.h"
|
|
|
|
namespace blink {
|
|
|
|
PassRefPtr<CanvasImageDecoder> CanvasImageDecoder::create(
|
|
PassOwnPtr<ImageDecoderCallback> callback) {
|
|
return adoptRef(new CanvasImageDecoder(callback));
|
|
}
|
|
|
|
CanvasImageDecoder::CanvasImageDecoder(PassOwnPtr<ImageDecoderCallback> callback)
|
|
: callback_(callback), weak_factory_(this) {
|
|
CHECK(callback_);
|
|
}
|
|
|
|
CanvasImageDecoder::~CanvasImageDecoder() {
|
|
}
|
|
|
|
void CanvasImageDecoder::initWithConsumer(mojo::ScopedDataPipeConsumerHandle handle) {
|
|
if (!handle.is_valid()) {
|
|
base::MessageLoop::current()->PostTask(
|
|
FROM_HERE, base::Bind(&CanvasImageDecoder::RejectCallback,
|
|
weak_factory_.GetWeakPtr()));
|
|
return;
|
|
}
|
|
|
|
DrainDataPipeInBackground(handle.Pass(),
|
|
base::Bind(&CanvasImageDecoder::Decode, weak_factory_.GetWeakPtr()));
|
|
}
|
|
|
|
void CanvasImageDecoder::initWithList(const Uint8List& list) {
|
|
RefPtr<SharedBuffer> buffer = SharedBuffer::create();
|
|
buffer->append(reinterpret_cast<const char*>(list.data()),
|
|
list.num_elements());
|
|
base::MessageLoop::current()->PostTask(
|
|
FROM_HERE, base::Bind(&CanvasImageDecoder::Decode,
|
|
weak_factory_.GetWeakPtr(), buffer.release()));
|
|
}
|
|
|
|
void CanvasImageDecoder::Decode(PassRefPtr<SharedBuffer> buffer) {
|
|
TRACE_EVENT0("blink", "CanvasImageDecoder::Decode");
|
|
OwnPtr<ImageDecoder> decoder =
|
|
ImageDecoder::create(*buffer.get(), ImageSource::AlphaPremultiplied,
|
|
ImageSource::GammaAndColorProfileIgnored);
|
|
// decoder can be null if the buffer we was empty and we couldn't even guess
|
|
// what type of image to decode.
|
|
if (!decoder) {
|
|
callback_->handleEvent(nullptr);
|
|
return;
|
|
}
|
|
decoder->setData(buffer.get(), true);
|
|
if (decoder->failed() || decoder->frameCount() == 0) {
|
|
callback_->handleEvent(nullptr);
|
|
return;
|
|
}
|
|
|
|
RefPtr<CanvasImage> resultImage = CanvasImage::create();
|
|
ImageFrame* imageFrame = decoder->frameBufferAtIndex(0);
|
|
RefPtr<SkImage> skImage = adoptRef(SkImage::NewFromBitmap(imageFrame->getSkBitmap()));
|
|
resultImage->setImage(skImage.release());
|
|
callback_->handleEvent(resultImage.get());
|
|
}
|
|
|
|
void CanvasImageDecoder::RejectCallback() {
|
|
callback_->handleEvent(nullptr);
|
|
}
|
|
|
|
} // namespace blink
|