// Copyright 2013 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 "cc/test/pixel_test_output_surface.h"

#include "cc/output/output_surface_client.h"
#include "ui/gfx/transform.h"

namespace cc {

PixelTestOutputSurface::PixelTestOutputSurface(
    scoped_refptr<ContextProvider> context_provider,
    scoped_refptr<ContextProvider> worker_context_provider,
    bool flipped_output_surface)
    : OutputSurface(context_provider, worker_context_provider),
      external_stencil_test_(false) {
  capabilities_.flipped_output_surface = flipped_output_surface;
}

PixelTestOutputSurface::PixelTestOutputSurface(
    scoped_refptr<ContextProvider> context_provider,
    bool flipped_output_surface)
    : PixelTestOutputSurface(context_provider,
                             nullptr,
                             flipped_output_surface) {
}

PixelTestOutputSurface::PixelTestOutputSurface(
    scoped_ptr<SoftwareOutputDevice> software_device)
    : OutputSurface(software_device.Pass()), external_stencil_test_(false) {
}

void PixelTestOutputSurface::Reshape(const gfx::Size& size,
                                     float scale_factor) {
  gfx::Size expanded_size(size.width() + surface_expansion_size_.width(),
                          size.height() + surface_expansion_size_.height());
  OutputSurface::Reshape(expanded_size, scale_factor);
}

bool PixelTestOutputSurface::HasExternalStencilTest() const {
  return external_stencil_test_;
}

void PixelTestOutputSurface::SwapBuffers(CompositorFrame* frame) {
  PostSwapBuffersComplete();
  client_->DidSwapBuffers();
}

}  // namespace cc
