| // Copyright 2014 Google Inc. All Rights Reserved. |
| // |
| // 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. |
| |
| #ifndef COBALT_RENDER_TREE_IMAGE_NODE_H_ |
| #define COBALT_RENDER_TREE_IMAGE_NODE_H_ |
| |
| #include "base/compiler_specific.h" |
| #include "cobalt/base/type_id.h" |
| #include "cobalt/math/matrix3_f.h" |
| #include "cobalt/math/rect_f.h" |
| #include "cobalt/render_tree/image.h" |
| #include "cobalt/render_tree/node.h" |
| |
| namespace cobalt { |
| namespace render_tree { |
| |
| // An image that supports scaling and tiling. |
| class ImageNode : public Node { |
| public: |
| struct Builder { |
| Builder(const scoped_refptr<Image>& source, |
| const math::RectF& destination_rect); |
| Builder(const scoped_refptr<Image>& source, const math::Vector2dF& offset); |
| Builder(const scoped_refptr<Image>& source, |
| const math::RectF& destination_rect, |
| const math::Matrix3F& local_transform); |
| |
| bool operator==(const Builder& other) const { |
| return source == other.source && |
| destination_rect == other.destination_rect && |
| local_transform == other.local_transform; |
| } |
| |
| // A source of pixels. May be smaller or larger than layed out image. |
| // The class does not own the image, it merely refers it from a resource |
| // pool. |
| scoped_refptr<Image> source; |
| |
| // The destination rectangle into which the image will be rasterized. |
| math::RectF destination_rect; |
| |
| // A matrix expressing how the each point within the image box (defined |
| // by destination_rect) should be mapped to image data. The identity |
| // matrix would map the entire source image rectangle into the entire |
| // destination rectangle. As an example, if you were to pass in a scale |
| // matrix that scales the image coordinates by 0.5 in all directions, the |
| // image will appear zoomed out. |
| math::Matrix3F local_transform; |
| }; |
| |
| explicit ImageNode(const Builder& builder) : data_(builder) {} |
| |
| // If no width/height are specified, the native width and height of the |
| // image will be selected and used as the image node's width and height. |
| explicit ImageNode(const scoped_refptr<Image>& source); |
| // The specified image will render with the given width and height, which |
| // may result in scaling. |
| ImageNode(const scoped_refptr<Image>& image, |
| const math::RectF& destination_rect); |
| |
| ImageNode(const scoped_refptr<Image>& image, const math::Vector2dF& offset); |
| |
| // Allows users to additionally supply a local matrix to be applied to the |
| // normalized image coordinates. |
| ImageNode(const scoped_refptr<Image>& image, |
| const math::RectF& destination_rect, |
| const math::Matrix3F& local_transform); |
| |
| void Accept(NodeVisitor* visitor) OVERRIDE; |
| math::RectF GetBounds() const OVERRIDE; |
| |
| base::TypeId GetTypeId() const OVERRIDE { |
| return base::GetTypeId<ImageNode>(); |
| } |
| |
| const Builder& data() const { return data_; } |
| |
| private: |
| const Builder data_; |
| }; |
| |
| } // namespace render_tree |
| } // namespace cobalt |
| |
| #endif // COBALT_RENDER_TREE_IMAGE_NODE_H_ |