// 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 "printing/image.h"

#include <ApplicationServices/ApplicationServices.h>

#include "base/mac/scoped_cftyperef.h"
#include "printing/metafile.h"
#include "ui/gfx/rect.h"

namespace printing {

bool Image::LoadMetafile(const Metafile& metafile) {
  // The printing system uses single-page metafiles (page indexes are 1-based).
  const unsigned int page_number = 1;
  gfx::Rect rect(metafile.GetPageBounds(page_number));
  if (rect.width() < 1 || rect.height() < 1)
    return false;

  size_ = rect.size();
  row_length_ = size_.width() * sizeof(uint32);
  size_t bytes = row_length_ * size_.height();
  DCHECK(bytes);

  data_.resize(bytes);
  base::ScopedCFTypeRef<CGColorSpaceRef> color_space(
      CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
  base::ScopedCFTypeRef<CGContextRef> bitmap_context(
      CGBitmapContextCreate(&*data_.begin(),
                            size_.width(),
                            size_.height(),
                            8,
                            row_length_,
                            color_space,
                            kCGImageAlphaPremultipliedLast));
  DCHECK(bitmap_context.get());

  struct Metafile::MacRenderPageParams params;
  params.shrink_to_fit = true;
  metafile.RenderPage(page_number, bitmap_context,
                      CGRectMake(0, 0, size_.width(), size_.height()), params);

  return true;
}

}  // namespace printing
