1 /* libs/graphics/animator/SkHitTest.cpp
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18 #include "SkHitTest.h"
19
20 #if SK_USE_CONDENSED_INFO == 0
21
22 const SkMemberInfo SkHitTest::fInfo[] = {
23 SK_MEMBER_ARRAY(bullets, Displayable),
24 SK_MEMBER_ARRAY(hits, Int),
25 SK_MEMBER_ARRAY(targets, Displayable),
26 SK_MEMBER(value, Boolean)
27 };
28
29 #endif
30
31 DEFINE_GET_MEMBER(SkHitTest);
32
SkHitTest()33 SkHitTest::SkHitTest() : value(false) {
34 }
35
draw(SkAnimateMaker & maker)36 bool SkHitTest::draw(SkAnimateMaker& maker) {
37 hits.setCount(bullets.count());
38 value = false;
39 int bulletCount = bullets.count();
40 int targetCount = targets.count();
41 for (int bIndex = 0; bIndex < bulletCount; bIndex++) {
42 SkDisplayable* bullet = bullets[bIndex];
43 SkRect bBounds;
44 bullet->getBounds(&bBounds);
45 hits[bIndex] = -1;
46 if (bBounds.fLeft == (int16_t)0x8000U)
47 continue;
48 for (int tIndex = 0; tIndex < targetCount; tIndex++) {
49 SkDisplayable* target = targets[tIndex];
50 SkRect tBounds;
51 target->getBounds(&tBounds);
52 if (bBounds.intersect(tBounds)) {
53 hits[bIndex] = tIndex;
54 value = true;
55 break;
56 }
57 }
58 }
59 return false;
60 }
61
enable(SkAnimateMaker & maker)62 bool SkHitTest::enable(SkAnimateMaker& maker) {
63 for (int bIndex = 0; bIndex < bullets.count(); bIndex++) {
64 SkDisplayable* bullet = bullets[bIndex];
65 bullet->enableBounder();
66 }
67 for (int tIndex = 0; tIndex < targets.count(); tIndex++) {
68 SkDisplayable* target = targets[tIndex];
69 target->enableBounder();
70 }
71 return false;
72 }
73
hasEnable() const74 bool SkHitTest::hasEnable() const {
75 return true;
76 }
77
preferredChild(SkDisplayTypes type)78 const SkMemberInfo* SkHitTest::preferredChild(SkDisplayTypes type) {
79 if (bullets.count() == 0)
80 return getMember("bullets");
81 return getMember("targets"); // !!! cwap! need to refer to member through enum like kScope instead
82 }
83
84