1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/*
* Copyright 2006, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "config.h"
#include "AndroidLog.h"
#include "android_graphics.h"
#include "Document.h"
#include "IntRect.h"
#include "Node.h"
#include "RenderSkinButton.h"
#include "SkCanvas.h"
#include "SkNinePatch.h"
#include "SkRect.h"
#include "utils/Debug.h"
struct PatchData {
const char* name;
int8_t outset, margin;
};
static const PatchData gFiles[] =
{
{ "res/drawable/btn_default_normal_disable.9.png", 2, 7 },
{ "res/drawable/btn_default_normal.9.png", 2, 7 },
{ "res/drawable/btn_default_selected.9.png", 2, 7 }
};
static SkBitmap gButton[sizeof(gFiles)/sizeof(gFiles[0])];
static bool gDecoded;
namespace WebCore {
void RenderSkinButton::Init(android::AssetManager* am)
{
static bool gInited;
if (gInited)
return;
gInited = true;
gDecoded = true;
for (size_t i = 0; i < sizeof(gFiles)/sizeof(gFiles[0]); i++) {
if (!RenderSkinAndroid::DecodeBitmap(am, gFiles[i].name, &gButton[i])) {
gDecoded = false;
ANDROID_LOGD("RenderSkinButton::Init: button assets failed to decode\n\tBrowser buttons will not draw");
break;
}
}
// Ensure our enums properly line up with our arrays.
android::CompileTimeAssert<(RenderSkinAndroid::kDisabled == 0)> a1;
android::CompileTimeAssert<(RenderSkinAndroid::kNormal == 1)> a2;
android::CompileTimeAssert<(RenderSkinAndroid::kFocused == 2)> a3;
}
void RenderSkinButton::Draw(SkCanvas* canvas, const IntRect& r, RenderSkinAndroid::State newState)
{
// If we failed to decode, do nothing. This way the browser still works,
// and webkit will still draw the label and layout space for us.
if (!gDecoded) {
return;
}
// Ensure that the state is within the valid range of our array.
SkASSERT(newState < RenderSkinAndroid::kNumStates && newState >= 0);
// Set up the ninepatch information for drawing.
SkRect bounds;
android_setrect(&bounds, r);
const PatchData& pd = gFiles[newState];
int marginValue = pd.margin + pd.outset;
SkIRect margin;
margin.set(marginValue, marginValue, marginValue, marginValue);
// Draw to the canvas.
SkNinePatch::DrawNine(canvas, bounds, gButton[newState], margin);
}
} //WebCore
|