15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/image.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ApplicationServices/ApplicationServices.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Image::LoadMetafile(const Metafile& metafile) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The printing system uses single-page metafiles (page indexes are 1-based).
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned int page_number = 1;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(metafile.GetPageBounds(page_number));
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rect.width() < 1 || rect.height() < 1)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_ = rect.size();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  row_length_ = size_.width() * sizeof(uint32);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t bytes = row_length_ * size_.height();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bytes);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_.resize(bytes);
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ScopedCFTypeRef<CGColorSpaceRef> color_space(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ScopedCFTypeRef<CGContextRef> bitmap_context(
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CGBitmapContextCreate(&*data_.begin(),
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            size_.width(),
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            size_.height(),
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            8,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            row_length_,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            color_space,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            kCGImageAlphaPremultipliedLast));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bitmap_context.get());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Metafile::MacRenderPageParams params;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.shrink_to_fit = true;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile.RenderPage(page_number, bitmap_context,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      CGRectMake(0, 0, size_.width(), size_.height()), params);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
49