| /* | 
 |  * Copyright (C) 2011 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. | 
 |  */ | 
 |  | 
 | #define LOG_TAG "OpenGLRenderer" | 
 |  | 
 | #include "ShapeCache.h" | 
 |  | 
 | namespace android { | 
 | namespace uirenderer { | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Rounded rects | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | RoundRectShapeCache::RoundRectShapeCache(): ShapeCache<RoundRectShapeCacheEntry>( | 
 |         "round rect", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) { | 
 | } | 
 |  | 
 | PathTexture* RoundRectShapeCache::getRoundRect(float width, float height, | 
 |         float rx, float ry, SkPaint* paint) { | 
 |     RoundRectShapeCacheEntry entry(width, height, rx, ry, paint); | 
 |     PathTexture* texture = get(entry); | 
 |  | 
 |     if (!texture) { | 
 |         SkPath path; | 
 |         SkRect r; | 
 |         r.set(0.0f, 0.0f, width, height); | 
 |         path.addRoundRect(r, rx, ry, SkPath::kCW_Direction); | 
 |  | 
 |         texture = addTexture(entry, &path, paint); | 
 |     } | 
 |  | 
 |     return texture; | 
 | } | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Circles | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | CircleShapeCache::CircleShapeCache(): ShapeCache<CircleShapeCacheEntry>( | 
 |         "circle", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) { | 
 | } | 
 |  | 
 | PathTexture* CircleShapeCache::getCircle(float radius, SkPaint* paint) { | 
 |     CircleShapeCacheEntry entry(radius, paint); | 
 |     PathTexture* texture = get(entry); | 
 |  | 
 |     if (!texture) { | 
 |         SkPath path; | 
 |         path.addCircle(radius, radius, radius, SkPath::kCW_Direction); | 
 |  | 
 |         texture = addTexture(entry, &path, paint); | 
 |     } | 
 |  | 
 |     return texture; | 
 | } | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Ovals | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | OvalShapeCache::OvalShapeCache(): ShapeCache<OvalShapeCacheEntry>( | 
 |         "oval", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) { | 
 | } | 
 |  | 
 | PathTexture* OvalShapeCache::getOval(float width, float height, SkPaint* paint) { | 
 |     OvalShapeCacheEntry entry(width, height, paint); | 
 |     PathTexture* texture = get(entry); | 
 |  | 
 |     if (!texture) { | 
 |         SkPath path; | 
 |         SkRect r; | 
 |         r.set(0.0f, 0.0f, width, height); | 
 |         path.addOval(r, SkPath::kCW_Direction); | 
 |  | 
 |         texture = addTexture(entry, &path, paint); | 
 |     } | 
 |  | 
 |     return texture; | 
 | } | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Rects | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | RectShapeCache::RectShapeCache(): ShapeCache<RectShapeCacheEntry>( | 
 |         "rect", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) { | 
 | } | 
 |  | 
 | PathTexture* RectShapeCache::getRect(float width, float height, SkPaint* paint) { | 
 |     RectShapeCacheEntry entry(width, height, paint); | 
 |     PathTexture* texture = get(entry); | 
 |  | 
 |     if (!texture) { | 
 |         SkPath path; | 
 |         path.addRect(0.0f, 0.0f, width, height, SkPath::kCW_Direction); | 
 |  | 
 |         texture = addTexture(entry, &path, paint); | 
 |     } | 
 |  | 
 |     return texture; | 
 | } | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Arcs | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | ArcShapeCache::ArcShapeCache(): ShapeCache<ArcShapeCacheEntry>( | 
 |         "arc", PROPERTY_SHAPE_CACHE_SIZE, DEFAULT_SHAPE_CACHE_SIZE) { | 
 | } | 
 |  | 
 | PathTexture* ArcShapeCache::getArc(float width, float height, | 
 |         float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { | 
 |     ArcShapeCacheEntry entry(width, height, startAngle, sweepAngle, useCenter, paint); | 
 |     PathTexture* texture = get(entry); | 
 |  | 
 |     if (!texture) { | 
 |         SkPath path; | 
 |         SkRect r; | 
 |         r.set(0.0f, 0.0f, width, height); | 
 |         if (useCenter) { | 
 |             path.moveTo(r.centerX(), r.centerY()); | 
 |         } | 
 |         path.arcTo(r, startAngle, sweepAngle, !useCenter); | 
 |         if (useCenter) { | 
 |             path.close(); | 
 |         } | 
 |  | 
 |         texture = addTexture(entry, &path, paint); | 
 |     } | 
 |  | 
 |     return texture; | 
 | } | 
 |  | 
 | }; // namespace uirenderer | 
 | }; // namespace android |