26ad17b8f8
Includes testing in DM and nanobench BUG=skia: Review URL: https://codereview.chromium.org/1402863002
64 lines
2.3 KiB
C++
64 lines
2.3 KiB
C++
/*
|
|
* Copyright 2015 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "SkBitmapRegionCanvas.h"
|
|
#include "SkBitmapRegionCodec.h"
|
|
#include "SkBitmapRegionDecoderInterface.h"
|
|
#include "SkBitmapRegionSampler.h"
|
|
#include "SkAndroidCodec.h"
|
|
#include "SkCodec.h"
|
|
#include "SkCodecPriv.h"
|
|
#include "SkImageDecoder.h"
|
|
|
|
SkBitmapRegionDecoderInterface* SkBitmapRegionDecoderInterface::CreateBitmapRegionDecoder(
|
|
SkData* data, Strategy strategy) {
|
|
switch (strategy) {
|
|
case kOriginal_Strategy: {
|
|
SkAutoTDelete<SkStreamRewindable> stream(new SkMemoryStream(data));
|
|
SkImageDecoder* decoder = SkImageDecoder::Factory(stream);
|
|
int width, height;
|
|
if (nullptr == decoder) {
|
|
SkCodecPrintf("Error: Could not create image decoder.\n");
|
|
return nullptr;
|
|
}
|
|
if (!decoder->buildTileIndex(stream.detach(), &width, &height)) {
|
|
SkCodecPrintf("Error: Could not build tile index.\n");
|
|
delete decoder;
|
|
return nullptr;
|
|
}
|
|
return new SkBitmapRegionSampler(decoder, width, height);
|
|
}
|
|
case kCanvas_Strategy: {
|
|
SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
|
|
if (nullptr == codec) {
|
|
SkCodecPrintf("Error: Failed to create decoder.\n");
|
|
return nullptr;
|
|
}
|
|
switch (codec->getScanlineOrder()) {
|
|
case SkCodec::kTopDown_SkScanlineOrder:
|
|
case SkCodec::kNone_SkScanlineOrder:
|
|
break;
|
|
default:
|
|
SkCodecPrintf("Error: Scanline ordering not supported.\n");
|
|
return nullptr;
|
|
}
|
|
return new SkBitmapRegionCanvas(codec.detach());
|
|
}
|
|
case kAndroidCodec_Strategy: {
|
|
SkAutoTDelete<SkAndroidCodec> codec = SkAndroidCodec::NewFromData(data);
|
|
if (NULL == codec) {
|
|
SkCodecPrintf("Error: Failed to create codec.\n");
|
|
return NULL;
|
|
}
|
|
return new SkBitmapRegionCodec(codec.detach());
|
|
}
|
|
default:
|
|
SkASSERT(false);
|
|
return nullptr;
|
|
}
|
|
}
|