// Copyright 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 "cc/quads/tile_draw_quad.h"

#include "base/logging.h"
#include "base/trace_event/trace_event_argument.h"
#include "base/values.h"
#include "third_party/khronos/GLES2/gl2.h"

namespace cc {

TileDrawQuad::TileDrawQuad()
    : resource_id(0) {
}

TileDrawQuad::~TileDrawQuad() {
}

void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                          const gfx::Rect& rect,
                          const gfx::Rect& opaque_rect,
                          const gfx::Rect& visible_rect,
                          unsigned resource_id,
                          const gfx::RectF& tex_coord_rect,
                          const gfx::Size& texture_size,
                          bool swizzle_contents,
                          bool nearest_neighbor) {
  ContentDrawQuadBase::SetNew(shared_quad_state,
                              DrawQuad::TILED_CONTENT,
                              rect,
                              opaque_rect,
                              visible_rect,
                              tex_coord_rect,
                              texture_size,
                              swizzle_contents,
                              nearest_neighbor);
  this->resource_id = resource_id;
}

void TileDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
                          const gfx::Rect& rect,
                          const gfx::Rect& opaque_rect,
                          const gfx::Rect& visible_rect,
                          bool needs_blending,
                          unsigned resource_id,
                          const gfx::RectF& tex_coord_rect,
                          const gfx::Size& texture_size,
                          bool swizzle_contents,
                          bool nearest_neighbor) {
  ContentDrawQuadBase::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect,
                              opaque_rect, visible_rect, needs_blending,
                              tex_coord_rect, texture_size, swizzle_contents,
                              nearest_neighbor);
  this->resource_id = resource_id;
}

void TileDrawQuad::IterateResources(
    const ResourceIteratorCallback& callback) {
  resource_id = callback.Run(resource_id);
}

const TileDrawQuad* TileDrawQuad::MaterialCast(const DrawQuad* quad) {
  DCHECK(quad->material == DrawQuad::TILED_CONTENT);
  return static_cast<const TileDrawQuad*>(quad);
}

void TileDrawQuad::ExtendValue(base::trace_event::TracedValue* value) const {
  ContentDrawQuadBase::ExtendValue(value);
  value->SetInteger("resource_id", resource_id);
}

}  // namespace cc
