| /* |
| * 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 |