• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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