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