diff options
author | Android Chromium Automerger <chromium-automerger@android> | 2013-12-13 16:15:20 +0000 |
---|---|---|
committer | Android Chromium Automerger <chromium-automerger@android> | 2013-12-13 16:15:20 +0000 |
commit | e69bc09ae4a12f72e1918c0cb1729da7aac1a79e (patch) | |
tree | 5e9813d7adc6faf0e6cdea5ebe562894fd986cca | |
parent | c7b485d522cbbc645a353daaeebc05b3f0561f87 (diff) | |
parent | 6f0382ecf74fd0b4921f52404b4d1a7a10229216 (diff) | |
download | src-e69bc09ae4a12f72e1918c0cb1729da7aac1a79e.tar.gz |
Merge third_party/skia/src from https://chromium.googlesource.com/external/skia/src.git at 6f0382ecf74fd0b4921f52404b4d1a7a10229216
This commit was generated by merge_from_chromium.py.
Change-Id: Iba7856da13fdc5faed41728f1eba7633ba32eb61
-rw-r--r-- | core/SkAdvancedTypefaceMetrics.cpp | 2 | ||||
-rw-r--r-- | core/SkPixelRef.cpp | 8 | ||||
-rw-r--r-- | core/SkXfermode.cpp | 18 | ||||
-rw-r--r-- | effects/SkXfermodeImageFilter.cpp | 14 | ||||
-rw-r--r-- | pdf/SkPDFFont.cpp | 7 |
5 files changed, 32 insertions, 17 deletions
diff --git a/core/SkAdvancedTypefaceMetrics.cpp b/core/SkAdvancedTypefaceMetrics.cpp index ce64a42d..f9b25dc9 100644 --- a/core/SkAdvancedTypefaceMetrics.cpp +++ b/core/SkAdvancedTypefaceMetrics.cpp @@ -169,6 +169,8 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( Data advance = kInvalidAdvance; if (gId < lastIndex) { // Get glyph id only when subset is NULL, or the id is in subset. + SkASSERT(!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength && + static_cast<uint32_t>(gId) <= subsetGlyphIDs[subsetIndex])); if (!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength && static_cast<uint32_t>(gId) == subsetGlyphIDs[subsetIndex])) { diff --git a/core/SkPixelRef.cpp b/core/SkPixelRef.cpp index b5daf0b5..e93882a4 100644 --- a/core/SkPixelRef.cpp +++ b/core/SkPixelRef.cpp @@ -82,8 +82,9 @@ void SkPixelRef::setMutex(SkBaseMutex* mutex) { // just need a > 0 value, so pick a funny one to aid in debugging #define SKPIXELREF_PRELOCKED_LOCKCOUNT 123456789 -SkPixelRef::SkPixelRef(const SkImageInfo&, SkBaseMutex* mutex) { +SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) { this->setMutex(mutex); + fInfo = info; fPixels = NULL; fColorTable = NULL; // we do not track ownership of this fLockCount = 0; @@ -92,8 +93,9 @@ SkPixelRef::SkPixelRef(const SkImageInfo&, SkBaseMutex* mutex) { fPreLocked = false; } -SkPixelRef::SkPixelRef(const SkImageInfo&) { +SkPixelRef::SkPixelRef(const SkImageInfo& info) { this->setMutex(NULL); + fInfo = info; fPixels = NULL; fColorTable = NULL; // we do not track ownership of this fLockCount = 0; @@ -106,6 +108,8 @@ SkPixelRef::SkPixelRef(const SkImageInfo&) { // THIS GUY IS DEPRECATED -- don't use me! SkPixelRef::SkPixelRef(SkBaseMutex* mutex) { this->setMutex(mutex); + // Fill with dummy values. + sk_bzero(&fInfo, sizeof(fInfo)); fPixels = NULL; fColorTable = NULL; // we do not track ownership of this fLockCount = 0; diff --git a/core/SkXfermode.cpp b/core/SkXfermode.cpp index 8cb79c2d..176bcb50 100644 --- a/core/SkXfermode.cpp +++ b/core/SkXfermode.cpp @@ -468,16 +468,18 @@ static inline void clipColor(int* r, int* g, int* b, int a) { int L = Lum(*r, *g, *b); int n = minimum(*r, *g, *b); int x = maximum(*r, *g, *b); - if(n < 0) { - *r = L + SkMulDiv(*r - L, L, L - n); - *g = L + SkMulDiv(*g - L, L, L - n); - *b = L + SkMulDiv(*b - L, L, L - n); + int denom; + if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non zero + *r = L + SkMulDiv(*r - L, L, denom); + *g = L + SkMulDiv(*g - L, L, denom); + *b = L + SkMulDiv(*b - L, L, denom); } - if (x > a) { - *r = L + SkMulDiv(*r - L, a - L, x - L); - *g = L + SkMulDiv(*g - L, a - L, x - L); - *b = L + SkMulDiv(*b - L, a - L, x - L); + if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non zero + int numer = a - L; + *r = L + SkMulDiv(*r - L, numer, denom); + *g = L + SkMulDiv(*g - L, numer, denom); + *b = L + SkMulDiv(*b - L, numer, denom); } } diff --git a/effects/SkXfermodeImageFilter.cpp b/effects/SkXfermodeImageFilter.cpp index 3ab52950..4674ff44 100644 --- a/effects/SkXfermodeImageFilter.cpp +++ b/effects/SkXfermodeImageFilter.cpp @@ -61,21 +61,22 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy, return false; } - SkIRect bounds; + SkIRect bounds, foregroundBounds; background.getBounds(&bounds); + bounds.offset(backgroundOffset); + foreground.getBounds(&foregroundBounds); + foregroundBounds.offset(foregroundOffset); + bounds.join(foregroundBounds); if (!applyCropRect(&bounds, ctm)) { return false; } - backgroundOffset.fX -= bounds.left(); - backgroundOffset.fY -= bounds.top(); - foregroundOffset.fX -= bounds.left(); - foregroundOffset.fY -= bounds.top(); SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); if (NULL == device.get()) { return false; } SkCanvas canvas(device); + canvas.translate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top())); SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), @@ -83,6 +84,9 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy, paint.setXfermode(fMode); canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), SkIntToScalar(foregroundOffset.fY), &paint); + canvas.clipRect(SkRect::Make(foregroundBounds), SkRegion::kDifference_Op); + paint.setColor(SK_ColorTRANSPARENT); + canvas.drawPaint(paint); *dst = device->accessBitmap(false); offset->fX += bounds.left(); offset->fY += bounds.top(); diff --git a/pdf/SkPDFFont.cpp b/pdf/SkPDFFont.cpp index ef9c3bbc..07ecbba3 100644 --- a/pdf/SkPDFFont.cpp +++ b/pdf/SkPDFFont.cpp @@ -1156,8 +1156,11 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { if (fontInfo()->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) { // Generate glyph id array. SkTDArray<uint32_t> glyphIDs; - glyphIDs.push(0); // Always include glyph 0. if (subset) { + // Always include glyph 0. + if (!subset->has(0)) { + glyphIDs.push(0); + } subset->exportTo(&glyphIDs); } @@ -1165,7 +1168,7 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { info = SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo; info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>( info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo); - uint32_t* glyphs = (glyphIDs.count() == 1) ? NULL : glyphIDs.begin(); + uint32_t* glyphs = (glyphIDs.count() == 0) ? NULL : glyphIDs.begin(); uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0; SkAutoTUnref<SkAdvancedTypefaceMetrics> fontMetrics( typeface()->getAdvancedTypefaceMetrics(info, glyphs, glyphsCount)); |