Line data Source code
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 :
16 0 : static bool changes_alpha(const SkPaint& paint) {
17 0 : SkColorFilter* cf = paint.getColorFilter();
18 0 : return cf && !(cf->getFlags() & SkColorFilter::kAlphaUnchanged_Flag);
19 : }
20 :
21 0 : bool SkPaintPriv::Overwrites(const SkPaint* paint, ShaderOverrideOpacity overrideOpacity) {
22 0 : 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 0 : return overrideOpacity != kNotOpaque_ShaderOverrideOpacity;
26 : }
27 :
28 0 : SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity;
29 :
30 0 : if (!changes_alpha(*paint)) {
31 0 : const unsigned paintAlpha = paint->getAlpha();
32 0 : if (0xff == paintAlpha && overrideOpacity != kNotOpaque_ShaderOverrideOpacity &&
33 0 : (!paint->getShader() || paint->getShader()->isOpaque()))
34 : {
35 0 : opacityType = SkXfermode::kOpaque_SrcColorOpacity;
36 0 : } else if (0 == paintAlpha) {
37 0 : if (overrideOpacity == kNone_ShaderOverrideOpacity && !paint->getShader()) {
38 0 : opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity;
39 : } else {
40 0 : opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity;
41 : }
42 : }
43 : }
44 :
45 0 : return SkXfermode::IsOpaque(paint->getBlendMode(), opacityType);
46 : }
47 :
48 0 : bool SkPaintPriv::Overwrites(const SkBitmap& bitmap, const SkPaint* paint) {
49 0 : return Overwrites(paint, bitmap.isOpaque() ? kOpaque_ShaderOverrideOpacity
50 0 : : kNotOpaque_ShaderOverrideOpacity);
51 : }
52 :
53 0 : bool SkPaintPriv::Overwrites(const SkImage* image, const SkPaint* paint) {
54 0 : return Overwrites(paint, image->isOpaque() ? kOpaque_ShaderOverrideOpacity
55 0 : : kNotOpaque_ShaderOverrideOpacity);
56 : }
57 :
58 0 : void SkPaintPriv::ScaleFontMetrics(SkPaint::FontMetrics* metrics, SkScalar scale) {
59 0 : metrics->fTop *= scale;
60 0 : metrics->fAscent *= scale;
61 0 : metrics->fDescent *= scale;
62 0 : metrics->fBottom *= scale;
63 0 : metrics->fLeading *= scale;
64 0 : metrics->fAvgCharWidth *= scale;
65 0 : metrics->fXMin *= scale;
66 0 : metrics->fXMax *= scale;
67 0 : metrics->fXHeight *= scale;
68 0 : metrics->fUnderlineThickness *= scale;
69 0 : metrics->fUnderlinePosition *= scale;
70 0 : }
71 :
|