| // 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_RENDERER_RASTERIZER_SKIA_IMAGE_H_ |
| #define COBALT_RENDERER_RASTERIZER_SKIA_IMAGE_H_ |
| |
| #include "cobalt/base/type_id.h" |
| #include "cobalt/math/rect.h" |
| #include "cobalt/math/size.h" |
| #include "cobalt/render_tree/image.h" |
| #include "cobalt/render_tree/resource_provider.h" |
| #include "starboard/decode_target.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| |
| namespace cobalt { |
| namespace renderer { |
| |
| namespace backend { |
| class TextureEGL; |
| } // namespace backend |
| |
| namespace rasterizer { |
| namespace skia { |
| |
| // Introduce a base class for both software and hardware Skia images. They |
| // should both be able to return a SkBitmap that can be used in subsequent |
| // Skia draw calls. |
| class Image : public render_tree::Image { |
| public: |
| // Ensures that any queued backend initialization of this image object is |
| // completed after this method returns. This can only be called from the |
| // rasterizer thread. When an Image is created (from any thread), the |
| // construction of its backend is message queued to be initialized on the |
| // render thread, however it is possible (via animations) for the image |
| // to be referenced in a render tree before then, and thus this function will |
| // fast-track the initialization of the backend object if it has not yet |
| // executed. |
| // Returns true if an initialization actually took place. |
| virtual bool EnsureInitialized() = 0; |
| |
| // Mechanism to allow dynamic type checking on Image objects. |
| virtual base::TypeId GetTypeId() const = 0; |
| |
| // A helper function for DCHECKing that given image data is indeed in |
| // premultiplied alpha format. Note that because of the nature of |
| // premultiplied alpha, it is possible for a non-premultiplied alpha image |
| // to slip by these checks. |
| static void DCheckForPremultipliedAlpha(const math::Size& dimensions, |
| int source_pitch_in_bytes, |
| render_tree::PixelFormat pixel_format, |
| const uint8_t* source_pixels); |
| |
| // While of course most skia::Image objects can be rendered in Skia, sometimes |
| // this is not true, such as when they are backed by SbDecodeTarget objects |
| // that assume a specific rasterizer such as GLES2. In this case, we can |
| // fallback to a rasterizer-provided renderer function. |
| virtual bool CanRenderInSkia() const { return true; } |
| }; |
| |
| // A single-plane image is an image where all data to describe a single pixel |
| // is stored contiguously. This style of image is by far the most common. |
| class SinglePlaneImage : public Image { |
| public: |
| virtual const SkBitmap* GetBitmap() const = 0; |
| |
| base::TypeId GetTypeId() const OVERRIDE { |
| return base::GetTypeId<SinglePlaneImage>(); |
| } |
| |
| // If GLES2 is backing this image, this function can be called to return a |
| // reference to that EGL texture. |
| virtual const backend::TextureEGL* GetTextureEGL() const { return NULL; } |
| |
| // If not-null, indicates a rectangle within the image in which the valid |
| // pixel data is to be found. |
| virtual const math::Rect* GetContentRegion() const { return NULL; } |
| }; |
| |
| // A multi-plane image is one where different channels may have different planes |
| // (i.e. sub-images) stored in different regions of memory. A multi-plane |
| // image can be defined in terms of a set of single-plane images. |
| class MultiPlaneImage : public Image { |
| public: |
| virtual render_tree::MultiPlaneImageFormat GetFormat() const = 0; |
| virtual const SkBitmap* GetBitmap(int plane_index) const = 0; |
| virtual const backend::TextureEGL* GetTextureEGL(int plane_index) const { |
| return NULL; |
| } |
| |
| base::TypeId GetTypeId() const OVERRIDE { |
| return base::GetTypeId<MultiPlaneImage>(); |
| } |
| |
| // All currently supported MultiPlaneImage formats do not feature alpha. |
| bool IsOpaque() const OVERRIDE { return true; } |
| }; |
| |
| } // namespace skia |
| } // namespace rasterizer |
| } // namespace renderer |
| } // namespace cobalt |
| |
| #endif // COBALT_RENDERER_RASTERIZER_SKIA_IMAGE_H_ |