Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 | 8 |
| 9 #include "SkImageDecoder.h" | 9 #include "SkImageDecoder_libjpeg.h" |
| 10 #include "SkImageEncoder.h" | 10 |
| 11 #include "SkJpegUtility.h" | 11 #include "SkJpegUtility.h" |
| 12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
| 13 #include "SkDither.h" | 13 #include "SkDither.h" |
| 14 #include "SkScaledBitmapSampler.h" | 14 #include "SkScaledBitmapSampler.h" |
| 15 #include "SkStream.h" | 15 #include "SkStream.h" |
| 16 #include "SkTemplates.h" | 16 #include "SkTemplates.h" |
| 17 #include "SkTime.h" | 17 #include "SkTime.h" |
| 18 #include "SkUtils.h" | 18 #include "SkUtils.h" |
| 19 #include "SkRTConf.h" | 19 #include "SkRTConf.h" |
| 20 #include "SkRect.h" | 20 #include "SkRect.h" |
| (...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1364 return Write_16_YUV; | 1364 return Write_16_YUV; |
| 1365 case kARGB_4444_SkColorType: | 1365 case kARGB_4444_SkColorType: |
| 1366 return Write_4444_YUV; | 1366 return Write_4444_YUV; |
| 1367 case kIndex_8_SkColorType: | 1367 case kIndex_8_SkColorType: |
| 1368 return Write_Index_YUV; | 1368 return Write_Index_YUV; |
| 1369 default: | 1369 default: |
| 1370 return NULL; | 1370 return NULL; |
| 1371 } | 1371 } |
| 1372 } | 1372 } |
| 1373 | 1373 |
| 1374 SkImageDecoder::Format SkDetectFormatJPEGImageDecoder(SkStreamRewindable* stream ) { | |
|
scroggo
2014/11/12 18:00:12
nit: The change is easier to follow without moving
Kimmo Kinnunen
2014/11/18 08:29:45
Done.
| |
| 1375 static const unsigned char gHeader[] = { 0xFF, 0xD8, 0xFF }; | |
| 1376 static const size_t HEADER_SIZE = sizeof(gHeader); | |
| 1377 | |
| 1378 char buffer[HEADER_SIZE]; | |
| 1379 size_t len = stream->read(buffer, HEADER_SIZE); | |
| 1380 | |
| 1381 if (len != HEADER_SIZE) { | |
| 1382 return SkImageDecoder::kUnknown_Format; // can't read enough | |
| 1383 } | |
| 1384 if (memcmp(buffer, gHeader, HEADER_SIZE)) { | |
| 1385 return SkImageDecoder::kUnknown_Format; | |
| 1386 } | |
| 1387 return SkImageDecoder::kJPEG_Format; | |
| 1388 } | |
| 1389 | |
| 1390 SkImageDecoder* SkCreateJPEGImageDecoder(SkStreamRewindable* stream) { | |
| 1391 if (SkDetectFormatJPEGImageDecoder(stream) == SkImageDecoder::kJPEG_Format) { | |
| 1392 return SkNEW(SkJPEGImageDecoder); | |
| 1393 } | |
| 1394 return NULL; | |
| 1395 } | |
| 1396 | |
| 1374 class SkJPEGImageEncoder : public SkImageEncoder { | 1397 class SkJPEGImageEncoder : public SkImageEncoder { |
| 1375 protected: | 1398 protected: |
| 1376 virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) { | 1399 virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) { |
| 1377 #ifdef TIME_ENCODE | 1400 #ifdef TIME_ENCODE |
| 1378 SkAutoTime atm("JPEG Encode"); | 1401 SkAutoTime atm("JPEG Encode"); |
| 1379 #endif | 1402 #endif |
| 1380 | 1403 |
| 1381 SkAutoLockPixels alp(bm); | 1404 SkAutoLockPixels alp(bm); |
| 1382 if (NULL == bm.getPixels()) { | 1405 if (NULL == bm.getPixels()) { |
| 1383 return false; | 1406 return false; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1438 srcRow = (const void*)((const char*)srcRow + bm.rowBytes()); | 1461 srcRow = (const void*)((const char*)srcRow + bm.rowBytes()); |
| 1439 } | 1462 } |
| 1440 | 1463 |
| 1441 jpeg_finish_compress(&cinfo); | 1464 jpeg_finish_compress(&cinfo); |
| 1442 jpeg_destroy_compress(&cinfo); | 1465 jpeg_destroy_compress(&cinfo); |
| 1443 | 1466 |
| 1444 return true; | 1467 return true; |
| 1445 } | 1468 } |
| 1446 }; | 1469 }; |
| 1447 | 1470 |
| 1448 /////////////////////////////////////////////////////////////////////////////// | 1471 SkImageEncoder* SkCreateJPEGImageEncoder(SkImageEncoder::Type t) { |
| 1449 DEFINE_DECODER_CREATOR(JPEGImageDecoder); | |
| 1450 DEFINE_ENCODER_CREATOR(JPEGImageEncoder); | |
| 1451 /////////////////////////////////////////////////////////////////////////////// | |
| 1452 | |
| 1453 static bool is_jpeg(SkStreamRewindable* stream) { | |
| 1454 static const unsigned char gHeader[] = { 0xFF, 0xD8, 0xFF }; | |
| 1455 static const size_t HEADER_SIZE = sizeof(gHeader); | |
| 1456 | |
| 1457 char buffer[HEADER_SIZE]; | |
| 1458 size_t len = stream->read(buffer, HEADER_SIZE); | |
| 1459 | |
| 1460 if (len != HEADER_SIZE) { | |
| 1461 return false; // can't read enough | |
| 1462 } | |
| 1463 if (memcmp(buffer, gHeader, HEADER_SIZE)) { | |
| 1464 return false; | |
| 1465 } | |
| 1466 return true; | |
| 1467 } | |
| 1468 | |
| 1469 | |
| 1470 static SkImageDecoder* sk_libjpeg_dfactory(SkStreamRewindable* stream) { | |
| 1471 if (is_jpeg(stream)) { | |
| 1472 return SkNEW(SkJPEGImageDecoder); | |
| 1473 } | |
| 1474 return NULL; | |
| 1475 } | |
| 1476 | |
| 1477 static SkImageDecoder::Format get_format_jpeg(SkStreamRewindable* stream) { | |
| 1478 if (is_jpeg(stream)) { | |
| 1479 return SkImageDecoder::kJPEG_Format; | |
| 1480 } | |
| 1481 return SkImageDecoder::kUnknown_Format; | |
| 1482 } | |
| 1483 | |
| 1484 static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) { | |
| 1485 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; | 1472 return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL; |
| 1486 } | 1473 } |
| 1487 | |
| 1488 static SkImageDecoder_DecodeReg gDReg(sk_libjpeg_dfactory); | |
| 1489 static SkImageDecoder_FormatReg gFormatReg(get_format_jpeg); | |
| 1490 static SkImageEncoder_EncodeReg gEReg(sk_libjpeg_efactory); | |
| OLD | NEW |