// Copyright (c) 2017 The Chromium Embedded Framework Authors. All rights // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. #ifndef CEF_TESTS_CEFCLIENT_BROWSER_IMAGE_CACHE_H_ #define CEF_TESTS_CEFCLIENT_BROWSER_IMAGE_CACHE_H_ #pragma once #include #include #include "include/base/cef_bind.h" #include "include/base/cef_ref_counted.h" #include "include/cef_image.h" #include "include/wrapper/cef_closure_task.h" #include "include/wrapper/cef_helpers.h" namespace client { // Simple image caching implementation. class ImageCache : public base::RefCountedThreadSafe { public: ImageCache(); // Image representation at a specific scale factor. struct ImageRep { ImageRep(const std::string& path, float scale_factor); // Full file system path. std::string path_; // Image scale factor (usually 1.0f or 2.0f). float scale_factor_; }; typedef std::vector ImageRepSet; // Unique image that may have multiple representations. struct ImageInfo { ImageInfo(const std::string& id, const ImageRepSet& reps, bool internal, bool force_reload); // Helper for returning an empty image. static ImageInfo Empty(); // Helpers for creating common representations. static ImageInfo Create1x(const std::string& id, const std::string& path_1x, bool internal); static ImageInfo Create2x(const std::string& id, const std::string& path_1x, const std::string& path_2x, bool internal); static ImageInfo Create2x(const std::string& id); // Image unique ID. std::string id_; // Image representations to load. ImageRepSet reps_; // True if the image is internal (loaded via LoadBinaryResource). bool internal_; // True to force reload. bool force_reload_; }; typedef std::vector ImageInfoSet; typedef std::vector> ImageSet; typedef base::Callback LoadImagesCallback; // Loads the images represented by |image_info|. Executes |callback| // either synchronously or asychronously on the UI thread after completion. void LoadImages(const ImageInfoSet& image_info, const LoadImagesCallback& callback); // Returns an image that has already been cached. Must be called on the // UI thread. CefRefPtr GetCachedImage(const std::string& image_id); private: // Only allow deletion via scoped_refptr. friend struct CefDeleteOnThread; friend class base::RefCountedThreadSafe; ~ImageCache(); enum ImageType { TYPE_NONE, TYPE_PNG, TYPE_JPEG, }; static ImageType GetImageType(const std::string& path); struct ImageContent; typedef std::vector ImageContentSet; // Load missing image contents on the FILE thread. void LoadMissing(const ImageInfoSet& image_info, const ImageSet& images, const LoadImagesCallback& callback); static bool LoadImageContents(const ImageInfo& info, ImageContent* content); static bool LoadImageContents(const std::string& path, bool internal, ImageType* type, std::string* contents); // Create missing CefImage representations on the UI thread. void UpdateCache(const ImageInfoSet& image_info, const ImageContentSet& contents, const LoadImagesCallback& callback); static CefRefPtr CreateImage(const std::string& image_id, const ImageContent& content); // Map image ID to image representation. Only accessed on the UI thread. typedef std::map> ImageMap; ImageMap image_map_; }; } // namespace client #endif // CEF_TESTS_CEFCLIENT_BROWSER_IMAGE_CACHE_H_