1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "OpenGLRenderer"
18
19 #include "ShapeCache.h"
20
21 namespace android {
22 namespace uirenderer {
23
24 ///////////////////////////////////////////////////////////////////////////////
25 // Rounded rects
26 ///////////////////////////////////////////////////////////////////////////////
27
RoundRectShapeCache()28 RoundRectShapeCache::RoundRectShapeCache(): ShapeCache<RoundRectShapeCacheEntry>(
29 "round rect", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
30 }
31
getRoundRect(float width,float height,float rx,float ry,SkPaint * paint)32 PathTexture* RoundRectShapeCache::getRoundRect(float width, float height,
33 float rx, float ry, SkPaint* paint) {
34 RoundRectShapeCacheEntry entry(width, height, rx, ry, paint);
35 PathTexture* texture = get(entry);
36
37 if (!texture) {
38 SkPath path;
39 SkRect r;
40 r.set(0.0f, 0.0f, width, height);
41 path.addRoundRect(r, rx, ry, SkPath::kCW_Direction);
42
43 texture = addTexture(entry, &path, paint);
44 }
45
46 return texture;
47 }
48
49 ///////////////////////////////////////////////////////////////////////////////
50 // Circles
51 ///////////////////////////////////////////////////////////////////////////////
52
CircleShapeCache()53 CircleShapeCache::CircleShapeCache(): ShapeCache<CircleShapeCacheEntry>(
54 "circle", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
55 }
56
getCircle(float radius,SkPaint * paint)57 PathTexture* CircleShapeCache::getCircle(float radius, SkPaint* paint) {
58 CircleShapeCacheEntry entry(radius, paint);
59 PathTexture* texture = get(entry);
60
61 if (!texture) {
62 SkPath path;
63 path.addCircle(radius, radius, radius, SkPath::kCW_Direction);
64
65 texture = addTexture(entry, &path, paint);
66 }
67
68 return texture;
69 }
70
71 ///////////////////////////////////////////////////////////////////////////////
72 // Ovals
73 ///////////////////////////////////////////////////////////////////////////////
74
OvalShapeCache()75 OvalShapeCache::OvalShapeCache(): ShapeCache<OvalShapeCacheEntry>(
76 "oval", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
77 }
78
getOval(float width,float height,SkPaint * paint)79 PathTexture* OvalShapeCache::getOval(float width, float height, SkPaint* paint) {
80 OvalShapeCacheEntry entry(width, height, paint);
81 PathTexture* texture = get(entry);
82
83 if (!texture) {
84 SkPath path;
85 SkRect r;
86 r.set(0.0f, 0.0f, width, height);
87 path.addOval(r, SkPath::kCW_Direction);
88
89 texture = addTexture(entry, &path, paint);
90 }
91
92 return texture;
93 }
94
95 ///////////////////////////////////////////////////////////////////////////////
96 // Rects
97 ///////////////////////////////////////////////////////////////////////////////
98
RectShapeCache()99 RectShapeCache::RectShapeCache(): ShapeCache<RectShapeCacheEntry>(
100 "rect", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
101 }
102
getRect(float width,float height,SkPaint * paint)103 PathTexture* RectShapeCache::getRect(float width, float height, SkPaint* paint) {
104 RectShapeCacheEntry entry(width, height, paint);
105 PathTexture* texture = get(entry);
106
107 if (!texture) {
108 SkPath path;
109 path.addRect(0.0f, 0.0f, width, height, SkPath::kCW_Direction);
110
111 texture = addTexture(entry, &path, paint);
112 }
113
114 return texture;
115 }
116
117 ///////////////////////////////////////////////////////////////////////////////
118 // Arcs
119 ///////////////////////////////////////////////////////////////////////////////
120
ArcShapeCache()121 ArcShapeCache::ArcShapeCache(): ShapeCache<ArcShapeCacheEntry>(
122 "arc", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
123 }
124
getArc(float width,float height,float startAngle,float sweepAngle,bool useCenter,SkPaint * paint)125 PathTexture* ArcShapeCache::getArc(float width, float height,
126 float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
127 ArcShapeCacheEntry entry(width, height, startAngle, sweepAngle, useCenter, paint);
128 PathTexture* texture = get(entry);
129
130 if (!texture) {
131 SkPath path;
132 SkRect r;
133 r.set(0.0f, 0.0f, width, height);
134 if (useCenter) {
135 path.moveTo(r.centerX(), r.centerY());
136 }
137 path.arcTo(r, startAngle, sweepAngle, !useCenter);
138 if (useCenter) {
139 path.close();
140 }
141
142 texture = addTexture(entry, &path, paint);
143 }
144
145 return texture;
146 }
147
148 }; // namespace uirenderer
149 }; // namespace android
150