1/* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "SkBitmap.h" 9#include "SkColorFilter.h" 10#include "SkPaintPriv.h" 11#include "SkImage.h" 12#include "SkPaint.h" 13#include "SkShader.h" 14#include "SkXfermodePriv.h" 15 16static bool changes_alpha(const SkPaint& paint) { 17 SkColorFilter* cf = paint.getColorFilter(); 18 return cf && !(cf->getFlags() & SkColorFilter::kAlphaUnchanged_Flag); 19} 20 21bool SkPaintPriv::Overwrites(const SkPaint* paint, ShaderOverrideOpacity overrideOpacity) { 22 if (!paint) { 23 // No paint means we default to SRC_OVER, so we overwrite iff our shader-override 24 // is opaque, or we don't have one. 25 return overrideOpacity != kNotOpaque_ShaderOverrideOpacity; 26 } 27 28 SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; 29 30 if (!changes_alpha(*paint)) { 31 const unsigned paintAlpha = paint->getAlpha(); 32 if (0xff == paintAlpha && overrideOpacity != kNotOpaque_ShaderOverrideOpacity && 33 (!paint->getShader() || paint->getShader()->isOpaque())) 34 { 35 opacityType = SkXfermode::kOpaque_SrcColorOpacity; 36 } else if (0 == paintAlpha) { 37 if (overrideOpacity == kNone_ShaderOverrideOpacity && !paint->getShader()) { 38 opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; 39 } else { 40 opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; 41 } 42 } 43 } 44 45 return SkXfermode::IsOpaque(paint->getBlendMode(), opacityType); 46} 47 48bool SkPaintPriv::Overwrites(const SkBitmap& bitmap, const SkPaint* paint) { 49 return Overwrites(paint, bitmap.isOpaque() ? kOpaque_ShaderOverrideOpacity 50 : kNotOpaque_ShaderOverrideOpacity); 51} 52 53bool SkPaintPriv::Overwrites(const SkImage* image, const SkPaint* paint) { 54 return Overwrites(paint, image->isOpaque() ? kOpaque_ShaderOverrideOpacity 55 : kNotOpaque_ShaderOverrideOpacity); 56} 57 58void SkPaintPriv::ScaleFontMetrics(SkPaint::FontMetrics* metrics, SkScalar scale) { 59 metrics->fTop *= scale; 60 metrics->fAscent *= scale; 61 metrics->fDescent *= scale; 62 metrics->fBottom *= scale; 63 metrics->fLeading *= scale; 64 metrics->fAvgCharWidth *= scale; 65 metrics->fXMin *= scale; 66 metrics->fXMax *= scale; 67 metrics->fXHeight *= scale; 68 metrics->fUnderlineThickness *= scale; 69 metrics->fUnderlinePosition *= scale; 70} 71 72