Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(342)

Unified Diff: ui/gfx/image/image_skia_operations.cc

Issue 10704113: Make tab/tabstrip high density compatible (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/image/image_skia_operations.h ('k') | ui/ui.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/image/image_skia_operations.cc
diff --git a/ui/gfx/image/image_skia_operations.cc b/ui/gfx/image/image_skia_operations.cc
new file mode 100644
index 0000000000000000000000000000000000000000..cbe2c8efc3f7c330e5229d2a19c2004a4be8b40b
--- /dev/null
+++ b/ui/gfx/image/image_skia_operations.cc
@@ -0,0 +1,167 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/image/image_skia_operations.h"
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "skia/ext/platform_canvas.h"
+#include "ui/base/layout.h"
+#include "ui/base/ui_base_switches.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/gfx/image/image_skia_rep.h"
+#include "ui/gfx/image/image_skia_source.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/size.h"
+#include "ui/gfx/skbitmap_operations.h"
+#include "ui/gfx/skia_util.h"
+
+namespace gfx {
+namespace {
+
+bool ScalingEnabled() {
+ static bool scale_images = !CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableScalingInImageSkiaOperations);
+ return scale_images;
+}
+
+// Creates 2x scaled image of the give |source|.
+ImageSkiaRep Create2XImageSkiaRep(const ImageSkiaRep& source) {
+ gfx::Size size(source.GetWidth() * 2.0f, source.GetHeight() * 2.0f);
+ skia::PlatformCanvas canvas(size.width(), size.height(), false);
+ SkRect resized_bounds = RectToSkRect(gfx::Rect(size));
+ canvas.drawBitmapRect(source.sk_bitmap(), NULL, resized_bounds);
+ SkBitmap resized_bitmap = canvas.getDevice()->accessBitmap(false);
+ return ImageSkiaRep(resized_bitmap, ui::SCALE_FACTOR_200P);
+}
+
+// A utility function to synchronize the scale factor of the two images.
+// When the command line option "--disable-scaling-in-image-skia-operation"
+// is provided, this function will fail if the scale factors of the two images
+// are different. This assumes that the platform only supports
+// 1x and 2x scale factors.
+// TODO(oshima): Remove and replace this with plain CHECK once
+// 2x images for all resources are provided.
+void MatchScale(ImageSkiaRep* first, ImageSkiaRep* second) {
+ if (first->scale_factor() != second->scale_factor()) {
+ CHECK(ScalingEnabled());
+ ImageSkiaRep* target = NULL;
+ if (first->scale_factor() == ui::SCALE_FACTOR_100P) {
+ target = first;
+ } else {
+ target = second;
+ }
+ *target = Create2XImageSkiaRep(*target);
+ }
+}
+
+class BlendingImageSource : public gfx::ImageSkiaSource {
+ public:
+ BlendingImageSource(const ImageSkia& first,
+ const ImageSkia& second,
+ double alpha)
+ : first_(first),
+ second_(second),
+ alpha_(alpha) {
+ }
+
+ // gfx::ImageSkiaSource overrides:
+ virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
+ ImageSkiaRep first_rep = first_.GetRepresentation(scale_factor);
+ ImageSkiaRep second_rep = second_.GetRepresentation(scale_factor);
+ MatchScale(&first_rep, &second_rep);
+ SkBitmap blended = SkBitmapOperations::CreateBlendedBitmap(
+ first_rep.sk_bitmap(), second_rep.sk_bitmap(), alpha_);
+ return ImageSkiaRep(blended, first_rep.scale_factor());
+ }
+
+ private:
+ const ImageSkia first_;
+ const ImageSkia second_;
+ double alpha_;
+
+ DISALLOW_COPY_AND_ASSIGN(BlendingImageSource);
+};
+
+class MaskedImageSource : public gfx::ImageSkiaSource {
+ public:
+ MaskedImageSource(const ImageSkia& rgb, const ImageSkia& alpha)
+ : rgb_(rgb),
+ alpha_(alpha) {
+ }
+
+ // gfx::ImageSkiaSource overrides:
+ virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
+ ImageSkiaRep rgb_rep = rgb_.GetRepresentation(scale_factor);
+ ImageSkiaRep alpha_rep = alpha_.GetRepresentation(scale_factor);
+ MatchScale(&rgb_rep, &alpha_rep);
+ return ImageSkiaRep(SkBitmapOperations::CreateMaskedBitmap(
+ rgb_rep.sk_bitmap(), alpha_rep.sk_bitmap()),
+ rgb_rep.scale_factor());
+ }
+
+ private:
+ const ImageSkia rgb_;
+ const ImageSkia alpha_;
+
+ DISALLOW_COPY_AND_ASSIGN(MaskedImageSource);
+};
+
+class TiledImageSource : public gfx::ImageSkiaSource {
+ public:
+ TiledImageSource(const ImageSkia& source,
+ int src_x, int src_y,
+ int dst_w, int dst_h)
+ : source_(source),
+ src_x_(src_x),
+ src_y_(src_y),
+ dst_w_(dst_w),
+ dst_h_(dst_h) {
+ }
+
+ // gfx::ImageSkiaSource overrides:
+ virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
+ ImageSkiaRep source_rep = source_.GetRepresentation(scale_factor);
+ float scale = ui::GetScaleFactorScale(source_rep.scale_factor());
+ return ImageSkiaRep(
+ SkBitmapOperations::CreateTiledBitmap(
+ source_rep.sk_bitmap(),
+ src_x_ * scale, src_y_ * scale, dst_w_ * scale, dst_h_ * scale),
+ source_rep.scale_factor());
+ }
+
+ private:
+ const ImageSkia& source_;
+ const int src_x_;
+ const int src_y_;
+ const int dst_w_;
+ const int dst_h_;
+
+ DISALLOW_COPY_AND_ASSIGN(TiledImageSource);
+};
+
+} // namespace;
+
+// static
+ImageSkia ImageSkiaOperations::CreateBlendedImage(const ImageSkia& first,
+ const ImageSkia& second,
+ double alpha) {
+ return ImageSkia(new BlendingImageSource(first, second, alpha), first.size());
+}
+
+// static
+ImageSkia ImageSkiaOperations::CreateMaskedImage(const ImageSkia& rgb,
+ const ImageSkia& alpha) {
+ return ImageSkia(new MaskedImageSource(rgb, alpha), rgb.size());
+}
+
+// static
+ImageSkia ImageSkiaOperations::CreateTiledImage(const ImageSkia& source,
+ int src_x, int src_y,
+ int dst_w, int dst_h) {
+ return ImageSkia(new TiledImageSource(source, src_x, src_y, dst_w, dst_h),
+ gfx::Size(dst_w, dst_h));
+}
+
+} // namespace gfx
« no previous file with comments | « ui/gfx/image/image_skia_operations.h ('k') | ui/ui.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698