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

Unified Diff: src/codec/SkCodec_libgif.cpp

Issue 1321433002: Add subsetting to SkScaledCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@gif-scan
Patch Set: Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: src/codec/SkCodec_libgif.cpp
diff --git a/src/codec/SkCodec_libgif.cpp b/src/codec/SkCodec_libgif.cpp
index 0dfc75fd9c478a4ff659aa3ea56ad49afd164825..91ef75b2f8e839f011e9056001dda3f3e2872321 100644
--- a/src/codec/SkCodec_libgif.cpp
+++ b/src/codec/SkCodec_libgif.cpp
@@ -101,7 +101,7 @@ static uint32_t find_trans_index(const SavedImage& image) {
* It is used in a SkAutoTCallIProc template
*/
void SkGifCodec::CloseGif(GifFileType* gif) {
- DGifCloseFile(gif, NULL);
+ DGifCloseFile(gif, nullptr);
}
/*
@@ -109,7 +109,7 @@ void SkGifCodec::CloseGif(GifFileType* gif) {
* decoder
*/
void SkGifCodec::FreeExtension(SavedImage* image) {
- if (NULL != image->ExtensionBlocks) {
+ if (nullptr != image->ExtensionBlocks) {
GifFreeExtensions(&image->ExtensionBlockCount, &image->ExtensionBlocks);
}
}
@@ -222,8 +222,8 @@ SkGifCodec::SkGifCodec(const SkImageInfo& srcInfo, SkStream* stream, GifFileType
, fFillIndex(0)
, fFrameDims(SkIRect::MakeEmpty())
, fFrameIsSubset(false)
- , fColorTable(NULL)
- , fSwizzler(NULL)
+ , fColorTable(nullptr)
+ , fSwizzler(nullptr)
{}
bool SkGifCodec::onRewind() {
@@ -377,7 +377,7 @@ void SkGifCodec::initializeColorTable(const SkImageInfo& dstInfo, SkPMColor* inp
// Set up our own color table
const uint32_t maxColors = 256;
SkPMColor colorPtr[256];
- if (NULL != inputColorCount) {
+ if (nullptr != inputColorCount) {
// We set the number of colors to maxColors in order to ensure
// safe memory accesses. Otherwise, an invalid pixel could
// access memory outside of our color table array.
@@ -387,12 +387,12 @@ void SkGifCodec::initializeColorTable(const SkImageInfo& dstInfo, SkPMColor* inp
// Get local color table
ColorMapObject* colorMap = fGif->Image.ColorMap;
// If there is no local color table, use the global color table
- if (NULL == colorMap) {
+ if (nullptr == colorMap) {
colorMap = fGif->SColorMap;
}
uint32_t colorCount = 0;
- if (NULL != colorMap) {
+ if (nullptr != colorMap) {
colorCount = colorMap->ColorCount;
// giflib guarantees these properties
SkASSERT(colorCount == (unsigned) (1 << (colorMap->BitsPerPixel)));
@@ -457,10 +457,10 @@ SkCodec::Result SkGifCodec::prepareToDecode(const SkImageInfo& dstInfo, SkPMColo
}
SkCodec::Result SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo,
- ZeroInitialized zeroInit) {
+ ZeroInitialized zeroInit, int subsetLeft, int subsetWidth) {
const SkPMColor* colorPtr = get_color_ptr(fColorTable.get());
- fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex,
- colorPtr, dstInfo, zeroInit, this->getInfo()));
+ fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex, colorPtr, dstInfo, zeroInit,
+ this->getInfo(), subsetLeft, subsetWidth));
scroggo 2015/10/02 18:27:03 If we stick these on options, we can update SkSwiz
if (nullptr != fSwizzler.get()) {
return kSuccess;
}
@@ -492,7 +492,8 @@ SkCodec::Result SkGifCodec::onGetPixels(const SkImageInfo& dstInfo,
// Initialize the swizzler
if (fFrameIsSubset) {
const SkImageInfo subsetDstInfo = dstInfo.makeWH(fFrameDims.width(), fFrameDims.height());
- if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitialized)) {
+ if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitialized, 0,
+ fFrameDims.width())) {
return gif_error("Could not initialize swizzler.\n", kUnimplemented);
}
@@ -506,7 +507,8 @@ SkCodec::Result SkGifCodec::onGetPixels(const SkImageInfo& dstInfo,
dst = SkTAddOffset<void*>(dst, dstRowBytes * fFrameDims.top() +
dstBytesPerPixel * fFrameDims.left());
} else {
- if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized)) {
+ if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized, 0,
+ dstInfo.width())) {
return gif_error("Could not initialize swizzler.\n", kUnimplemented);
}
}
@@ -531,7 +533,8 @@ uint32_t SkGifCodec::onGetFillValue(SkColorType colorType, SkAlphaType alphaType
}
SkCodec::Result SkGifCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
- const SkCodec::Options& opts, SkPMColor inputColorPtr[], int* inputColorCount) {
+ const SkCodec::Options& opts, SkPMColor inputColorPtr[], int* inputColorCount,
+ int subsetLeft, int subsetWidth) {
Result result = this->prepareToDecode(dstInfo, inputColorPtr, inputColorCount, this->options());
if (kSuccess != result) {
@@ -548,15 +551,18 @@ SkCodec::Result SkGifCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
// Initialize the swizzler
if (fFrameIsSubset) {
int sampleX;
- SkScaledCodec::ComputeSampleSize(dstInfo, this->getInfo(), &sampleX, NULL);
+ SkScaledCodec::ComputeSampleSize(dstInfo.dimensions(), this->getInfo().dimensions(),
+ &sampleX, NULL);
const SkImageInfo subsetDstInfo = dstInfo.makeWH(
get_scaled_dimension(fFrameDims.width(), sampleX),
fFrameDims.height());
- if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitialized)) {
+ if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitialized, subsetLeft,
+ subsetWidth)) {
return gif_error("Could not initialize swizzler.\n", kUnimplemented);
}
} else {
- if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized)) {
+ if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized, subsetLeft,
+ subsetWidth)) {
return gif_error("Could not initialize swizzler.\n", kUnimplemented);
}
}
@@ -569,7 +575,7 @@ int SkGifCodec::onGetScanlines(void* dst, int count, size_t rowBytes) {
int rowsAfterFrame = 0;
if (fFrameIsSubset) {
// Fill the requested rows
- SkSwizzler::Fill(dst, this->dstInfo().makeWH(this->dstInfo().width(), count), rowBytes,
+ SkSwizzler::Fill(dst, this->dstInfo().makeWH(this->subsetWidth(), count), rowBytes,
this->onGetFillValue(this->dstInfo().colorType(), this->dstInfo().alphaType()),
this->options().fZeroInitialized);

Powered by Google App Engine
This is Rietveld 408576698