diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-03-20 15:13:04 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-03-20 15:13:04 +0000 |
commit | 0a89c90d18ab5082f2fde5076ce422aac493bb00 (patch) | |
tree | d452e5b901b8519c27d5b17e4ca2c44f7db570e7 | |
parent | d5c9e996dff7169cd6bfbf5c6d1543fca512c1a5 (diff) |
reverting to 3437
git-svn-id: http://skia.googlecode.com/svn/trunk@3439 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gm/gm.cpp | 2 | ||||
-rw-r--r-- | gm/gm.h | 30 | ||||
-rw-r--r-- | gm/gmmain.cpp | 35 | ||||
-rw-r--r-- | gyp/gmslides.gypi | 1 | ||||
-rw-r--r-- | gyp/images.gyp | 12 | ||||
-rw-r--r-- | gyp/libjpeg.gyp | 13 | ||||
-rw-r--r-- | samplecode/SampleApp.cpp | 54 | ||||
-rw-r--r-- | src/images/SkImageDecoder_Factory.cpp | 31 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libbmp.cpp | 4 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libgif.cpp | 4 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libico.cpp | 5 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libjpeg.cpp | 70 | ||||
-rw-r--r-- | src/images/SkImageDecoder_wbmp.cpp | 4 | ||||
-rw-r--r-- | src/images/SkJpegUtility.cpp | 24 |
14 files changed, 96 insertions, 193 deletions
@@ -8,8 +8,6 @@ #include "gm.h" using namespace skiagm; -SkString GM::gResourcePath; - GM::GM() { fBGColor = SK_ColorWHITE; } @@ -18,18 +18,18 @@ #include "SkTRegistry.h" namespace skiagm { - - static inline SkISize make_isize(int w, int h) { - SkISize sz; - sz.set(w, h); - return sz; - } + + static inline SkISize make_isize(int w, int h) { + SkISize sz; + sz.set(w, h); + return sz; + } class GM { public: GM(); virtual ~GM(); - + enum Flags { kSkipPDF_Flag = 1 << 0, kSkipPicture_Flag = 1 << 1 @@ -39,7 +39,7 @@ namespace skiagm { void drawBackground(SkCanvas*); void drawContent(SkCanvas*); - SkISize getISize() { return this->onISize(); } + SkISize getISize() { return this->onISize(); } const char* shortName(); uint32_t getFlags() const { @@ -53,16 +53,10 @@ namespace skiagm { // GM's getISize bounds. void drawSizeBounds(SkCanvas*, SkColor); - static void SetResourcePath(const char* resourcePath) { - gResourcePath = resourcePath; - } - - protected: - static SkString gResourcePath; - - virtual void onDraw(SkCanvas*) = 0; - virtual void onDrawBackground(SkCanvas*); - virtual SkISize onISize() = 0; + protected: + virtual void onDraw(SkCanvas*) = 0; + virtual void onDrawBackground(SkCanvas*); + virtual SkISize onISize() = 0; virtual SkString onShortName() = 0; virtual uint32_t onGetFlags() const { return 0; } diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp index 61095e173f..6f53ce8f7b 100644 --- a/gm/gmmain.cpp +++ b/gm/gmmain.cpp @@ -589,9 +589,9 @@ static ErrorBitfield test_picture_serialization(GM* gm, static void usage(const char * argv0) { SkDebugf( - "%s [-w writePath] [-r readPath] [-d diffPath] [-i resourcePath]\n" - " [--noreplay] [--serialize] [--forceBWtext] [--nopdf] \n" - " [--nodeferred] [--match substring] [--notexturecache]" + "%s [-w writePath] [-r readPath] [-d diffPath] [--noreplay]\n" + " [--serialize] [--forceBWtext] [--nopdf] [--nodeferred]\n" + " [--match substring] [--notexturecache]" #if SK_MESA " [--mesagl]" #endif @@ -601,7 +601,6 @@ static void usage(const char * argv0) { " readPath: directory to read reference images from;\n" " reports if any pixels mismatch between reference and new images\n"); SkDebugf(" diffPath: directory to write difference images in.\n"); - SkDebugf(" resourcePath: directory that stores image resources.\n"); SkDebugf(" --noreplay: do not exercise SkPicture replay.\n"); SkDebugf( " --serialize: exercise SkPicture serialization & deserialization.\n"); @@ -661,7 +660,6 @@ int main(int argc, char * const argv[]) { const char* writePath = NULL; // if non-null, where we write the originals const char* readPath = NULL; // if non-null, were we read from to compare const char* diffPath = NULL; // if non-null, where we write our diffs (from compare) - const char* resourcePath = NULL;// if non-null, where we read from for image resources SkTDArray<const char*> fMatches; @@ -690,11 +688,6 @@ int main(int argc, char * const argv[]) { if (argv < stop && **argv) { diffPath = *argv; } - } else if (strcmp(*argv, "-i") == 0) { - argv++; - if (argv < stop && **argv) { - resourcePath = *argv; - } } else if (strcmp(*argv, "--forceBWtext") == 0) { gForceBWtext = true; } else if (strcmp(*argv, "--noreplay") == 0) { @@ -716,19 +709,17 @@ int main(int argc, char * const argv[]) { useMesa = true; #endif } else if (strcmp(*argv, "--notexturecache") == 0) { - disableTextureCache = true; + disableTextureCache = true; } else { - usage(commandName); - return -1; + usage(commandName); + return -1; } } if (argv != stop) { - usage(commandName); - return -1; + usage(commandName); + return -1; } - GM::SetResourcePath(resourcePath); - int maxW = -1; int maxH = -1; Iter iter; @@ -772,10 +763,6 @@ int main(int argc, char * const argv[]) { fprintf(stderr, "writing to %s\n", writePath); } - if (resourcePath) { - fprintf(stderr, "reading resources from %s\n", resourcePath); - } - // Accumulate success of all tests. int testsRun = 0; int testsPassed = 0; @@ -841,10 +828,10 @@ int main(int argc, char * const argv[]) { if (doDeferred && !testErrors && (kGPU_Backend == gRec[i].fBackend || - kRaster_Backend == gRec[i].fBackend)) { + kRaster_Backend == gRec[i].fBackend)) { testErrors |= test_deferred_drawing(gm, gRec[i], - forwardRenderedBitmap, - diffPath, gGrContext, rt.get()); + forwardRenderedBitmap, + diffPath, gGrContext, rt.get()); } if ((ERROR_NONE == testErrors) && doReplay && diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index 601aa88e85..ec223fb07b 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -9,7 +9,6 @@ '../gm/bitmapfilters.cpp', '../gm/bitmapscroll.cpp', '../gm/blurs.cpp', - '../gm/cmykjpeg.cpp', '../gm/colormatrix.cpp', '../gm/complexclip.cpp', '../gm/complexclip2.cpp', diff --git a/gyp/images.gyp b/gyp/images.gyp index d0b5c1a715..a93ba065e8 100644 --- a/gyp/images.gyp +++ b/gyp/images.gyp @@ -5,7 +5,6 @@ 'type': 'static_library', 'dependencies': [ 'utils.gyp:utils', - 'libjpeg.gyp:libjpeg', ], 'include_dirs': [ '../include/config', @@ -34,7 +33,6 @@ '../src/images/SkImageDecoder_libgif.cpp', '../src/images/SkImageDecoder_libico.cpp', '../src/images/SkImageDecoder_libpng.cpp', - '../src/images/SkImageDecoder_libjpeg.cpp', '../src/images/SkImageDecoder_wbmp.cpp', '../src/images/SkImageEncoder.cpp', '../src/images/SkImageEncoder_Factory.cpp', @@ -55,11 +53,14 @@ 'conditions': [ [ 'skia_os == "win"', { 'sources!': [ + '../include/images/SkJpegUtility.h', + '../src/images/SkFDStream.cpp', '../src/images/SkImageDecoder_Factory.cpp', '../src/images/SkImageDecoder_libgif.cpp', '../src/images/SkImageDecoder_libpng.cpp', '../src/images/SkImageEncoder_Factory.cpp', + '../src/images/SkJpegUtility.cpp', '../src/images/SkMovie_gif.cpp', ], 'link_settings': { @@ -74,10 +75,13 @@ }], [ 'skia_os == "mac"', { 'sources!': [ + '../include/images/SkJpegUtility.h', + '../src/images/SkImageDecoder_Factory.cpp', '../src/images/SkImageDecoder_libpng.cpp', '../src/images/SkImageDecoder_libgif.cpp', '../src/images/SkImageEncoder_Factory.cpp', + '../src/images/SkJpegUtility.cpp', '../src/images/SkMovie_gif.cpp', ], },{ #else if skia_os != mac @@ -87,7 +91,10 @@ }], [ 'skia_os in ["linux", "freebsd", "openbsd", "solaris"]', { 'sources!': [ + '../include/images/SkJpegUtility.h', + '../src/images/SkImageDecoder_libgif.cpp', + '../src/images/SkJpegUtility.cpp', '../src/images/SkMovie_gif.cpp', ], # libpng stuff: @@ -106,6 +113,7 @@ }], [ 'skia_os == "android"', { 'sources!': [ + '../src/images/SkJpegUtility.cpp', ], 'dependencies': [ 'android_system.gyp:gif', diff --git a/gyp/libjpeg.gyp b/gyp/libjpeg.gyp index d628f66464..4826f48dab 100644 --- a/gyp/libjpeg.gyp +++ b/gyp/libjpeg.gyp @@ -13,19 +13,6 @@ 'dependencies': [ '../third_party/externals/libjpeg/libjpeg.gyp:libjpeg', ], - - 'conditions': [ - [ 'os_posix != 1 or OS == "mac"', { - # need to set include path when using our own version - 'direct_dependent_settings': { - 'include_dirs': [ - '../third_party/externals/libjpeg', - ], - }, - },], - ], - - }, ], } diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index c93bae8e57..d40a670e3a 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -590,44 +590,7 @@ static inline SampleWindow::DeviceType cycle_devicetype(SampleWindow::DeviceType return gCT[ct]; } -static void usage(const char * argv0) { - SkDebugf("%s [sampleName] [-i resourcePath]\n", argv0); - SkDebugf(" sampleName: sample at which to start.\n"); - SkDebugf(" resourcePath: directory that stores image resources.\n"); -} - SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager) : INHERITED(hwnd) { - - const char* resourcePath = NULL; - fCurrIndex = -1; - - const char* const commandName = argv[0]; - char* const* stop = argv + argc; - for (++argv; argv < stop; ++argv) { - if (strcmp(*argv, "-i") == 0) { - argv++; - if (argv < stop && **argv) { - resourcePath = *argv; - } - } else { - fCurrIndex = findByTitle(*argv); - if (fCurrIndex < 0) { - fprintf(stderr, "Unknown sample \"%s\"\n", *argv); - } - } - } - - if (fCurrIndex < 0) { - SkString title; - if (readTitleFromPrefs(&title)) { - fCurrIndex = findByTitle(title.c_str()); - } - } - - if (fCurrIndex < 0) { - fCurrIndex = 0; - } - gSampleWindow = this; #ifdef PIPE_FILE @@ -731,8 +694,6 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev this->setVisibleP(true); this->setClipToBounds(false); - skiagm::GM::SetResourcePath(resourcePath); - SkGMRegistyToSampleRegistry(); { const SkViewRegister* reg = SkViewRegister::Head(); @@ -741,7 +702,22 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev reg = reg->next(); } } + fCurrIndex = 0; + if (argc > 1) { + fCurrIndex = findByTitle(argv[1]); + if (fCurrIndex < 0) { + fprintf(stderr, "Unknown sample \"%s\"\n", argv[1]); + } + } else { + SkString title; + if (readTitleFromPrefs(&title)) { + fCurrIndex = findByTitle(title.c_str()); + } + } + if (fCurrIndex < 0) { + fCurrIndex = 0; + } this->loadView((*fSamples[fCurrIndex])()); fPDFData = NULL; diff --git a/src/images/SkImageDecoder_Factory.cpp b/src/images/SkImageDecoder_Factory.cpp index 048ed21a69..f3cb120a47 100644 --- a/src/images/SkImageDecoder_Factory.cpp +++ b/src/images/SkImageDecoder_Factory.cpp @@ -12,37 +12,6 @@ #include "SkStream.h" #include "SkTRegistry.h" -//extern SkImageDecoder* sk_libbmp_dfactory(SkStream*); -//extern SkImageDecoder* sk_libgif_dfactory(SkStream*); -//extern SkImageDecoder* sk_libico_dfactory(SkStream*); -extern SkImageDecoder* sk_libjpeg_dfactory(SkStream*); -//extern SkImageDecoder* sk_libpng_dfactory(SkStream*); -//extern SkImageDecoder* sk_wbmp_dfactory(SkStream*); - -// To get the various image decoding classes to register themselves -// pre-main we need to ensure they are linked into the application. -// Ultimately we need to move to using DLLs rather than tightly -// coupling the factory with the file format classes. -void ForceLinking() -{ - SkImageDecoder* codec = NULL; - - // TODO: rather than force the linking here expose a - // "Sk*ImageDecoderCreate" function for each codec - // and let the app add these calls to force the linking. - // Besides decoupling the codecs from the factory this - // will also give the app the ability to circumvent the - // factory and explicitly create a decoder w/o reaching - // into Skia's guts - -// codec = sk_libbmp_dfactory(NULL); -// codec = sk_libgif_dfactory(NULL); -// codec = sk_libico_dfactory(NULL); - codec = sk_libjpeg_dfactory(NULL); -// codec = sk_libpng_dfactory(NULL); -// codec = sk_wbmp_dfactory(NULL); -} - typedef SkTRegistry<SkImageDecoder*, SkStream*> DecodeReg; // N.B. You can't use "DecodeReg::gHead here" due to complex C++ diff --git a/src/images/SkImageDecoder_libbmp.cpp b/src/images/SkImageDecoder_libbmp.cpp index 8683e21a7f..b5e49e8cda 100644 --- a/src/images/SkImageDecoder_libbmp.cpp +++ b/src/images/SkImageDecoder_libbmp.cpp @@ -27,7 +27,7 @@ protected: virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode mode); }; -SkImageDecoder* sk_libbmp_dfactory(SkStream* stream) { +static SkImageDecoder* Factory(SkStream* stream) { static const char kBmpMagic[] = { 'B', 'M' }; size_t len = stream->getLength(); @@ -41,7 +41,7 @@ SkImageDecoder* sk_libbmp_dfactory(SkStream* stream) { return NULL; } -static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libbmp_dfactory); +static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory); /////////////////////////////////////////////////////////////////////////////// diff --git a/src/images/SkImageDecoder_libgif.cpp b/src/images/SkImageDecoder_libgif.cpp index 3bc33c3d07..7a451a0560 100644 --- a/src/images/SkImageDecoder_libgif.cpp +++ b/src/images/SkImageDecoder_libgif.cpp @@ -330,7 +330,7 @@ DONE: #include "SkTRegistry.h" -static SkImageDecoder* sk_libgif_dfactory(SkStream* stream) { +static SkImageDecoder* Factory(SkStream* stream) { char buf[GIF_STAMP_LEN]; if (stream->read(buf, GIF_STAMP_LEN) == GIF_STAMP_LEN) { if (memcmp(GIF_STAMP, buf, GIF_STAMP_LEN) == 0 || @@ -342,4 +342,4 @@ static SkImageDecoder* sk_libgif_dfactory(SkStream* stream) { return NULL; } -static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libgif_dfactory); +static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory); diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp index 226c84af54..bb6bc95188 100644 --- a/src/images/SkImageDecoder_libico.cpp +++ b/src/images/SkImageDecoder_libico.cpp @@ -24,6 +24,7 @@ protected: virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode); }; +SkImageDecoder* SkCreateICOImageDecoder(); SkImageDecoder* SkCreateICOImageDecoder() { return new SkICOImageDecoder; } @@ -370,7 +371,7 @@ static void editPixelBit32(const int pixelNo, const unsigned char* buf, #include "SkTRegistry.h" -SkImageDecoder* sk_libico_dfactory(SkStream* stream) { +static SkImageDecoder* Factory(SkStream* stream) { // Check to see if the first four bytes are 0,0,1,0 // FIXME: Is that required and sufficient? SkAutoMalloc autoMal(4); @@ -385,5 +386,5 @@ SkImageDecoder* sk_libico_dfactory(SkStream* stream) { return SkNEW(SkICOImageDecoder); } -static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libico_dfactory); +static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory); diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp index 5cb45a2e0a..77d383af97 100644 --- a/src/images/SkImageDecoder_libjpeg.cpp +++ b/src/images/SkImageDecoder_libjpeg.cpp @@ -146,29 +146,6 @@ static bool return_false(const jpeg_decompress_struct& cinfo, return false; // must always return false } -// Convert a scanline of CMYK samples to RGBX in place. Note that this -// method moves the "scanline" pointer in its processing -static void convert_CMYK_to_RGB(uint8_t* scanline, unsigned int width) { - // At this point we've received CMYK pixels from libjpeg. We - // perform a crude conversion to RGB (based on the formulae - // from easyrgb.com): - // CMYK -> CMY - // C = ( C * (1 - K) + K ) // for each CMY component - // CMY -> RGB - // R = ( 1 - C ) * 255 // for each RGB component - // Unfortunately we are seeing inverted CMYK so all the original terms - // are 1-. This yields: - // CMYK -> CMY - // C = ( (1-C) * (1 - (1-K) + (1-K) ) -> C = 1 - C*K - // The conversion from CMY->RGB remains the same - for (unsigned int x = 0; x < width; ++x, scanline += 4) { - scanline[0] = SkMulDiv255Round(scanline[0], scanline[3]); - scanline[1] = SkMulDiv255Round(scanline[1], scanline[3]); - scanline[2] = SkMulDiv255Round(scanline[2], scanline[3]); - scanline[3] = 255; - } -} - bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { #ifdef TIME_DECODE AutoTimeMillis atm("JPEG Decode"); @@ -179,7 +156,7 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { jpeg_decompress_struct cinfo; skjpeg_error_mgr sk_err; - skjpeg_source_mgr sk_stream(stream, this, false); + skjpeg_source_mgr sk_stream(stream, this); cinfo.err = jpeg_std_error(&sk_err); sk_err.error_exit = skjpeg_error_exit; @@ -224,14 +201,7 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { cinfo.do_block_smoothing = 0; /* default format is RGB */ - if (cinfo.jpeg_color_space == JCS_CMYK) { - // libjpeg cannot convert from CMYK to RGB - here we set up - // so libjpeg will give us CMYK samples back and we will - // later manually convert them to RGB - cinfo.out_color_space = JCS_CMYK; - } else { - cinfo.out_color_space = JCS_RGB; - } + cinfo.out_color_space = JCS_RGB; SkBitmap::Config config = this->getPrefConfig(k32Bit_SrcDepth, false); // only these make sense for jpegs @@ -243,9 +213,9 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { #ifdef ANDROID_RGB cinfo.dither_mode = JDITHER_NONE; - if (SkBitmap::kARGB_8888_Config == config && JCS_CMYK != cinfo.out_color_space) { + if (config == SkBitmap::kARGB_8888_Config) { cinfo.out_color_space = JCS_RGBA_8888; - } else if (SkBitmap::kRGB_565_Config == config && JCS_CMYK != cinfo.out_color_space) { + } else if (config == SkBitmap::kRGB_565_Config) { cinfo.out_color_space = JCS_RGB_565; if (this->getDitherImage()) { cinfo.dither_mode = JDITHER_ORDERED; @@ -330,13 +300,10 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { return true; } #endif - + // check for supported formats SkScaledBitmapSampler::SrcConfig sc; - if (JCS_CMYK == cinfo.out_color_space) { - // In this case we will manually convert the CMYK values to RGB - sc = SkScaledBitmapSampler::kRGBX; - } else if (3 == cinfo.out_color_components && JCS_RGB == cinfo.out_color_space) { + if (3 == cinfo.out_color_components && JCS_RGB == cinfo.out_color_space) { sc = SkScaledBitmapSampler::kRGB; #ifdef ANDROID_RGB } else if (JCS_RGBA_8888 == cinfo.out_color_space) { @@ -355,7 +322,7 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { sampleSize); bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); - // jpegs are always opaque (i.e. have no per-pixel alpha) + // jpegs are always opauqe (i.e. have no per-pixel alpha) bm->setIsOpaque(true); if (SkImageDecoder::kDecodeBounds_Mode == mode) { @@ -365,13 +332,12 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { return return_false(cinfo, *bm, "allocPixelRef"); } - SkAutoLockPixels alp(*bm); + SkAutoLockPixels alp(*bm); if (!sampler.begin(bm, sc, this->getDitherImage())) { return return_false(cinfo, *bm, "sampler.begin"); } - // The CMYK work-around relies on 4 components per pixel here - uint8_t* srcRow = (uint8_t*)srcStorage.reset(cinfo.output_width * 4); + uint8_t* srcRow = (uint8_t*)srcStorage.alloc(cinfo.output_width * 4); // Possibly skip initial rows [sampler.srcY0] if (!skip_src_rows(&cinfo, srcRow, sampler.srcY0())) { @@ -388,11 +354,7 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { if (this->shouldCancelDecode()) { return return_false(cinfo, *bm, "shouldCancelDecode"); } - - if (JCS_CMYK == cinfo.out_color_space) { - convert_CMYK_to_RGB(srcRow, cinfo.output_width); - } - + sampler.next(srcRow); if (bm->height() - 1 == y) { // we're done @@ -631,7 +593,7 @@ protected: jpeg_start_compress(&cinfo, TRUE); const int width = bm.width(); - uint8_t* oneRowP = (uint8_t*)oneRow.reset(width * 3); + uint8_t* oneRowP = (uint8_t*)oneRow.alloc(width * 3); const SkPMColor* colors = ctLocker.lockColors(bm); const void* srcRow = bm.getPixels(); @@ -656,7 +618,7 @@ protected: #include "SkTRegistry.h" -SkImageDecoder* sk_libjpeg_dfactory(SkStream* stream) { +static SkImageDecoder* DFactory(SkStream* stream) { static const char gHeader[] = { 0xFF, 0xD8, 0xFF }; static const size_t HEADER_SIZE = sizeof(gHeader); @@ -672,11 +634,9 @@ SkImageDecoder* sk_libjpeg_dfactory(SkStream* stream) { return SkNEW(SkJPEGImageDecoder); } -static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { +static SkImageEncoder* EFactory(SkImageEncoder::Type t) { return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; } - -static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libjpeg_dfactory); -static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efactory); - +static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(DFactory); +static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(EFactory); diff --git a/src/images/SkImageDecoder_wbmp.cpp b/src/images/SkImageDecoder_wbmp.cpp index 262cf547cd..a7d910f0bc 100644 --- a/src/images/SkImageDecoder_wbmp.cpp +++ b/src/images/SkImageDecoder_wbmp.cpp @@ -151,7 +151,7 @@ bool SkWBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap, #include "SkTRegistry.h" -SkImageDecoder* sk_wbmp_dfactory(SkStream* stream) { +static SkImageDecoder* Factory(SkStream* stream) { wbmp_head head; if (head.init(stream)) { @@ -160,5 +160,5 @@ SkImageDecoder* sk_wbmp_dfactory(SkStream* stream) { return NULL; } -static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_wbmp_dfactory); +static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory); diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp index e28c51229f..aa5237fa0b 100644 --- a/src/images/SkJpegUtility.cpp +++ b/src/images/SkJpegUtility.cpp @@ -14,9 +14,26 @@ static void sk_init_source(j_decompress_ptr cinfo) { skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; src->next_input_byte = (const JOCTET*)src->fBuffer; src->bytes_in_buffer = 0; + src->current_offset = 0; src->fStream->rewind(); } +static boolean sk_seek_input_data(j_decompress_ptr cinfo, long byte_offset) { + skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; + + if (byte_offset > src->current_offset) { + (void)src->fStream->skip(byte_offset - src->current_offset); + } else { + src->fStream->rewind(); + (void)src->fStream->skip(byte_offset); + } + + src->current_offset = byte_offset; + src->next_input_byte = (const JOCTET*)src->fBuffer; + src->bytes_in_buffer = 0; + return TRUE; +} + static boolean sk_fill_input_buffer(j_decompress_ptr cinfo) { skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; if (src->fDecoder != NULL && src->fDecoder->shouldCancelDecode()) { @@ -29,6 +46,7 @@ static boolean sk_fill_input_buffer(j_decompress_ptr cinfo) { return FALSE; } + src->current_offset += bytes; src->next_input_byte = (const JOCTET*)src->fBuffer; src->bytes_in_buffer = bytes; return TRUE; @@ -46,6 +64,7 @@ static void sk_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { cinfo->err->error_exit((j_common_ptr)cinfo); return; } + src->current_offset += bytes; bytesToSkip -= bytes; } src->next_input_byte = (const JOCTET*)src->fBuffer; @@ -77,7 +96,9 @@ static void sk_term_source(j_decompress_ptr /*cinfo*/) {} static void skmem_init_source(j_decompress_ptr cinfo) { skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; src->next_input_byte = (const JOCTET*)src->fMemoryBase; + src->start_input_byte = (const JOCTET*)src->fMemoryBase; src->bytes_in_buffer = src->fMemoryBaseSize; + src->current_offset = src->fMemoryBaseSize; } static boolean skmem_fill_input_buffer(j_decompress_ptr cinfo) { @@ -106,6 +127,8 @@ skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, bool ownStream) : fStream(stream) { fDecoder = decoder; const void* baseAddr = stream->getMemoryBase(); + size_t bufferSize = 4096; + size_t len; fMemoryBase = NULL; fUnrefStream = ownStream; fMemoryBaseSize = 0; @@ -115,6 +138,7 @@ skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, skip_input_data = sk_skip_input_data; resync_to_restart = sk_resync_to_restart; term_source = sk_term_source; + seek_input_data = sk_seek_input_data; // SkDebugf("**************** use memorybase %p %d\n", fMemoryBase, fMemoryBaseSize); } |