summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Chromium Automerger <chromium-automerger@android>2013-12-13 16:15:20 +0000
committerAndroid Chromium Automerger <chromium-automerger@android>2013-12-13 16:15:20 +0000
commite69bc09ae4a12f72e1918c0cb1729da7aac1a79e (patch)
tree5e9813d7adc6faf0e6cdea5ebe562894fd986cca
parentc7b485d522cbbc645a353daaeebc05b3f0561f87 (diff)
parent6f0382ecf74fd0b4921f52404b4d1a7a10229216 (diff)
downloadsrc-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.cpp2
-rw-r--r--core/SkPixelRef.cpp8
-rw-r--r--core/SkXfermode.cpp18
-rw-r--r--effects/SkXfermodeImageFilter.cpp14
-rw-r--r--pdf/SkPDFFont.cpp7
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));