• 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         SkRect bounds;
109         bounds.set(0.0f, 0.0f, width, height);
110 
111         float left, top, offset;
112         uint32_t rectWidth, rectHeight;
113         computeBounds(bounds, paint, left, top, offset, rectWidth, rectHeight);
114 
115         if (!checkTextureSize(rectWidth, rectHeight)) return NULL;
116 
117         purgeCache(rectWidth, rectHeight);
118 
119         SkBitmap bitmap;
120         initBitmap(bitmap, rectWidth, rectHeight);
121 
122         SkPaint pathPaint(*paint);
123         initPaint(pathPaint);
124 
125         SkCanvas canvas(bitmap);
126         canvas.translate(-left + offset, -top + offset);
127         canvas.drawRect(bounds, pathPaint);
128 
129         texture = createTexture(0, 0, offset, rectWidth, rectHeight, 0);
130         addTexture(entry, &bitmap, texture);
131     }
132 
133     return texture;
134 }
135 
136 ///////////////////////////////////////////////////////////////////////////////
137 // Arcs
138 ///////////////////////////////////////////////////////////////////////////////
139 
ArcShapeCache()140 ArcShapeCache::ArcShapeCache(): ShapeCache<ArcShapeCacheEntry>(
141         "arc", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) {
142 }
143 
getArc(float width,float height,float startAngle,float sweepAngle,bool useCenter,SkPaint * paint)144 PathTexture* ArcShapeCache::getArc(float width, float height,
145         float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
146     ArcShapeCacheEntry entry(width, height, startAngle, sweepAngle, useCenter, paint);
147     PathTexture* texture = get(entry);
148 
149     if (!texture) {
150         SkPath path;
151         SkRect r;
152         r.set(0.0f, 0.0f, width, height);
153         if (useCenter) {
154             path.moveTo(r.centerX(), r.centerY());
155         }
156         path.arcTo(r, startAngle, sweepAngle, !useCenter);
157         if (useCenter) {
158             path.close();
159         }
160 
161         texture = addTexture(entry, &path, paint);
162     }
163 
164     return texture;
165 }
166 
167 }; // namespace uirenderer
168 }; // namespace android
169