| Index: gfx/canvas_direct2d.cc
|
| ===================================================================
|
| --- gfx/canvas_direct2d.cc (revision 73487)
|
| +++ gfx/canvas_direct2d.cc (working copy)
|
| @@ -1,362 +0,0 @@
|
| -// Copyright (c) 2010 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 "gfx/canvas_direct2d.h"
|
| -
|
| -#include "base/scoped_ptr.h"
|
| -#include "gfx/brush.h"
|
| -#include "gfx/rect.h"
|
| -
|
| -namespace {
|
| -
|
| -// Converts a SkColor to a ColorF.
|
| -D2D1_COLOR_F SkColorToColorF(SkColor color) {
|
| - return D2D1::ColorF(static_cast<float>(SkColorGetR(color)) / 0xFF,
|
| - static_cast<float>(SkColorGetG(color)) / 0xFF,
|
| - static_cast<float>(SkColorGetB(color)) / 0xFF,
|
| - static_cast<float>(SkColorGetA(color)) / 0xFF);
|
| -}
|
| -
|
| -D2D1_RECT_F RectToRectF(int x, int y, int w, int h) {
|
| - return D2D1::RectF(static_cast<float>(x), static_cast<float>(y),
|
| - static_cast<float>(x + w), static_cast<float>(y + h));
|
| -}
|
| -
|
| -D2D1_RECT_F RectToRectF(const gfx::Rect& rect) {
|
| - return RectToRectF(rect.x(), rect.y(), rect.width(), rect.height());
|
| -}
|
| -
|
| -D2D1_POINT_2F PointToPoint2F(int x, int y) {
|
| - return D2D1::Point2F(static_cast<float>(x), static_cast<float>(y));
|
| -}
|
| -
|
| -D2D1_BITMAP_INTERPOLATION_MODE FilterToInterpolationMode(bool filter) {
|
| - return filter ? D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
|
| - : D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
|
| -}
|
| -
|
| -// Creates a Direct2D bitmap object from the contents of a SkBitmap. The caller
|
| -// is responsible for releasing this object.
|
| -ID2D1Bitmap* CreateD2D1BitmapFromSkBitmap(ID2D1RenderTarget* render_target,
|
| - const SkBitmap& bitmap) {
|
| - ID2D1Bitmap* d2d1_bitmap = NULL;
|
| - HRESULT hr = render_target->CreateBitmap(
|
| - D2D1::SizeU(bitmap.width(), bitmap.height()),
|
| - NULL,
|
| - NULL,
|
| - D2D1::BitmapProperties(
|
| - D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
|
| - D2D1_ALPHA_MODE_IGNORE)),
|
| - &d2d1_bitmap);
|
| - if (FAILED(hr))
|
| - return NULL;
|
| - bitmap.lockPixels();
|
| - d2d1_bitmap->CopyFromMemory(NULL, bitmap.getPixels(), bitmap.rowBytes());
|
| - bitmap.unlockPixels();
|
| - return d2d1_bitmap;
|
| -}
|
| -
|
| -// Creates a Direct2D bitmap brush from the contents of a SkBitmap. The caller
|
| -// is responsible for releasing this object.
|
| -ID2D1Brush* CreateD2D1BrushFromSkBitmap(ID2D1RenderTarget* render_target,
|
| - const SkBitmap& bitmap,
|
| - D2D1_EXTEND_MODE extend_mode_x,
|
| - D2D1_EXTEND_MODE extend_mode_y) {
|
| - ScopedComPtr<ID2D1Bitmap> d2d1_bitmap(
|
| - CreateD2D1BitmapFromSkBitmap(render_target, bitmap));
|
| -
|
| - ID2D1BitmapBrush* brush = NULL;
|
| - render_target->CreateBitmapBrush(
|
| - d2d1_bitmap,
|
| - D2D1::BitmapBrushProperties(extend_mode_x, extend_mode_y),
|
| - D2D1::BrushProperties(),
|
| - &brush);
|
| - return brush;
|
| -}
|
| -
|
| -// A platform wrapper for a Direct2D brush that makes sure the underlying
|
| -// ID2D1Brush COM object is released when this object is destroyed.
|
| -class Direct2DBrush : public gfx::Brush {
|
| - public:
|
| - explicit Direct2DBrush(ID2D1Brush* brush) : brush_(brush) {
|
| - }
|
| -
|
| - ID2D1Brush* brush() const { return brush_.get(); }
|
| -
|
| - private:
|
| - ScopedComPtr<ID2D1Brush> brush_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Direct2DBrush);
|
| -};
|
| -
|
| -
|
| -} // namespace
|
| -
|
| -namespace gfx {
|
| -
|
| -// static
|
| -ID2D1Factory* CanvasDirect2D::d2d1_factory_ = NULL;
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CanvasDirect2D, public:
|
| -
|
| -CanvasDirect2D::CanvasDirect2D(ID2D1RenderTarget* rt) : rt_(rt) {
|
| - // A RenderState entry is pushed onto the stack to track the clip count prior
|
| - // to any calls to Save*().
|
| - state_.push(RenderState());
|
| - rt_->BeginDraw();
|
| -}
|
| -
|
| -CanvasDirect2D::~CanvasDirect2D() {
|
| - // Unwind any clips that were pushed outside of any Save*()/Restore() pairs.
|
| - int clip_count = state_.top().clip_count;
|
| - for (int i = 0; i < clip_count; ++i)
|
| - rt_->PopAxisAlignedClip();
|
| - rt_->EndDraw();
|
| -}
|
| -
|
| -// static
|
| -ID2D1Factory* CanvasDirect2D::GetD2D1Factory() {
|
| - if (!d2d1_factory_)
|
| - D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2d1_factory_);
|
| - return d2d1_factory_;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CanvasDirect2D, Canvas implementation:
|
| -
|
| -void CanvasDirect2D::Save() {
|
| - SaveInternal(NULL);
|
| -}
|
| -
|
| -void CanvasDirect2D::SaveLayerAlpha(uint8 alpha) {
|
| - SaveLayerAlpha(alpha, gfx::Rect());
|
| -}
|
| -
|
| -void CanvasDirect2D::SaveLayerAlpha(uint8 alpha,
|
| - const gfx::Rect& layer_bounds) {
|
| - D2D1_RECT_F bounds = D2D1::InfiniteRect();
|
| - if (!layer_bounds.IsEmpty())
|
| - bounds = RectToRectF(layer_bounds);
|
| - ID2D1Layer* layer = NULL;
|
| - HRESULT hr = rt_->CreateLayer(NULL, &layer);
|
| - if (SUCCEEDED(hr)) {
|
| - rt_->PushLayer(D2D1::LayerParameters(bounds,
|
| - NULL,
|
| - D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
|
| - D2D1::IdentityMatrix(),
|
| - static_cast<float>(alpha) / 0xFF,
|
| - NULL,
|
| - D2D1_LAYER_OPTIONS_NONE),
|
| - layer);
|
| - }
|
| - SaveInternal(layer);
|
| -}
|
| -
|
| -void CanvasDirect2D::Restore() {
|
| - ID2D1Layer* layer = state_.top().layer;
|
| - if (layer) {
|
| - rt_->PopLayer();
|
| - layer->Release();
|
| - }
|
| -
|
| - int clip_count = state_.top().clip_count;
|
| - for (int i = 0; i < clip_count; ++i)
|
| - rt_->PopAxisAlignedClip();
|
| -
|
| - state_.pop();
|
| - // The state_ stack should never be empty - we should always have at least one
|
| - // entry to hold a clip count when there is no active save/restore entry.
|
| - CHECK(!state_.empty()) << "Called Restore() once too often!";
|
| -
|
| - rt_->RestoreDrawingState(drawing_state_block_);
|
| -}
|
| -
|
| -bool CanvasDirect2D::ClipRectInt(int x, int y, int w, int h) {
|
| - rt_->PushAxisAlignedClip(RectToRectF(x, y, w, h),
|
| - D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
| - // Increment the clip count so the call to PushAxisAlignedClip() can be
|
| - // balanced with a call to PopAxisAlignedClip in the next Restore().
|
| - ++state_.top().clip_count;
|
| - return w > 0 && h > 0;
|
| -}
|
| -
|
| -void CanvasDirect2D::TranslateInt(int x, int y) {
|
| - D2D1_MATRIX_3X2_F raw;
|
| - rt_->GetTransform(&raw);
|
| - D2D1::Matrix3x2F transform(raw._11, raw._12, raw._21, raw._22, raw._31,
|
| - raw._32);
|
| - transform = D2D1::Matrix3x2F::Translation(static_cast<float>(x),
|
| - static_cast<float>(y)) * transform;
|
| - rt_->SetTransform(transform);
|
| -}
|
| -
|
| -void CanvasDirect2D::ScaleInt(int x, int y) {
|
| - D2D1_MATRIX_3X2_F raw;
|
| - rt_->GetTransform(&raw);
|
| - D2D1::Matrix3x2F transform(raw._11, raw._12, raw._21, raw._22, raw._31,
|
| - raw._32);
|
| - transform = D2D1::Matrix3x2F::Scale(static_cast<float>(x),
|
| - static_cast<float>(y)) * transform;
|
| - rt_->SetTransform(transform);
|
| -}
|
| -
|
| -void CanvasDirect2D::FillRectInt(const SkColor& color,
|
| - int x, int y, int w, int h) {
|
| - ScopedComPtr<ID2D1SolidColorBrush> solid_brush;
|
| - rt_->CreateSolidColorBrush(SkColorToColorF(color), solid_brush.Receive());
|
| - rt_->FillRectangle(RectToRectF(x, y, w, h), solid_brush);
|
| -}
|
| -
|
| -void CanvasDirect2D::FillRectInt(const SkColor& color,
|
| - int x, int y, int w, int h,
|
| - SkXfermode::Mode mode) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::FillRectInt(const gfx::Brush* brush,
|
| - int x, int y, int w, int h) {
|
| - const Direct2DBrush* d2d_brush = static_cast<const Direct2DBrush*>(brush);
|
| - rt_->FillRectangle(RectToRectF(x, y, w, h), d2d_brush->brush());
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawRectInt(const SkColor& color,
|
| - int x, int y, int w, int h) {
|
| - ScopedComPtr<ID2D1SolidColorBrush> solid_brush;
|
| - rt_->CreateSolidColorBrush(SkColorToColorF(color), solid_brush.Receive());
|
| - rt_->DrawRectangle(RectToRectF(x, y, w, h), solid_brush);
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawRectInt(const SkColor& color,
|
| - int x, int y, int w, int h,
|
| - SkXfermode::Mode mode) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawRectInt(int x, int y, int w, int h,
|
| - const SkPaint& paint) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawLineInt(const SkColor& color,
|
| - int x1, int y1,
|
| - int x2, int y2) {
|
| - ScopedComPtr<ID2D1SolidColorBrush> solid_brush;
|
| - rt_->CreateSolidColorBrush(SkColorToColorF(color), solid_brush.Receive());
|
| - rt_->DrawLine(PointToPoint2F(x1, y1), PointToPoint2F(x2, y2), solid_brush);
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawBitmapInt(const SkBitmap& bitmap, int x, int y) {
|
| - ScopedComPtr<ID2D1Bitmap> d2d1_bitmap(
|
| - CreateD2D1BitmapFromSkBitmap(rt_, bitmap));
|
| - rt_->DrawBitmap(d2d1_bitmap,
|
| - RectToRectF(x, y, bitmap.width(), bitmap.height()),
|
| - 1.0f,
|
| - D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
|
| - RectToRectF(0, 0, bitmap.width(), bitmap.height()));
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawBitmapInt(const SkBitmap& bitmap,
|
| - int x, int y,
|
| - const SkPaint& paint) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawBitmapInt(const SkBitmap& bitmap,
|
| - int src_x, int src_y, int src_w, int src_h,
|
| - int dest_x, int dest_y,
|
| - int dest_w, int dest_h,
|
| - bool filter) {
|
| - ScopedComPtr<ID2D1Bitmap> d2d1_bitmap(
|
| - CreateD2D1BitmapFromSkBitmap(rt_, bitmap));
|
| - rt_->DrawBitmap(d2d1_bitmap,
|
| - RectToRectF(dest_x, dest_y, dest_w, dest_h),
|
| - 1.0f,
|
| - FilterToInterpolationMode(filter),
|
| - RectToRectF(src_x, src_y, src_w, src_h));
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawBitmapInt(const SkBitmap& bitmap,
|
| - int src_x, int src_y, int src_w, int src_h,
|
| - int dest_x, int dest_y,
|
| - int dest_w, int dest_h,
|
| - bool filter,
|
| - const SkPaint& paint) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawStringInt(const string16& text,
|
| - const gfx::Font& font,
|
| - const SkColor& color,
|
| - int x, int y, int w, int h) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawStringInt(const string16& text,
|
| - const gfx::Font& font,
|
| - const SkColor& color,
|
| - const gfx::Rect& display_rect) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawStringInt(const string16& text,
|
| - const gfx::Font& font,
|
| - const SkColor& color,
|
| - int x, int y, int w, int h,
|
| - int flags) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::DrawFocusRect(int x, int y, int width, int height) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void CanvasDirect2D::TileImageInt(const SkBitmap& bitmap,
|
| - int x, int y, int w, int h) {
|
| - ScopedComPtr<ID2D1Brush> brush(
|
| - CreateD2D1BrushFromSkBitmap(rt_, bitmap, D2D1_EXTEND_MODE_WRAP,
|
| - D2D1_EXTEND_MODE_WRAP));
|
| - rt_->FillRectangle(RectToRectF(x, y, w, h), brush);
|
| -}
|
| -
|
| -void CanvasDirect2D::TileImageInt(const SkBitmap& bitmap,
|
| - int src_x, int src_y,
|
| - int dest_x, int dest_y, int w, int h) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -gfx::NativeDrawingContext CanvasDirect2D::BeginPlatformPaint() {
|
| - DCHECK(!interop_rt_.get());
|
| - interop_rt_.QueryFrom(rt_);
|
| - HDC dc = NULL;
|
| - if (interop_rt_.get())
|
| - interop_rt_->GetDC(D2D1_DC_INITIALIZE_MODE_COPY, &dc);
|
| - return dc;
|
| -}
|
| -
|
| -void CanvasDirect2D::EndPlatformPaint() {
|
| - DCHECK(interop_rt_.get());
|
| - interop_rt_->ReleaseDC(NULL);
|
| - interop_rt_.release();
|
| -}
|
| -
|
| -CanvasSkia* CanvasDirect2D::AsCanvasSkia() {
|
| - return NULL;
|
| -}
|
| -
|
| -const CanvasSkia* CanvasDirect2D::AsCanvasSkia() const {
|
| - return NULL;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CanvasDirect2D, private:
|
| -
|
| -void CanvasDirect2D::SaveInternal(ID2D1Layer* layer) {
|
| - if (!drawing_state_block_)
|
| - GetD2D1Factory()->CreateDrawingStateBlock(drawing_state_block_.Receive());
|
| - rt_->SaveDrawingState(drawing_state_block_.get());
|
| - state_.push(RenderState(layer));
|
| -}
|
| -
|
| -} // namespace gfx
|
|
|