1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "printing/image.h" 6 7#include <ApplicationServices/ApplicationServices.h> 8 9#include "base/mac/scoped_cftyperef.h" 10#include "printing/metafile.h" 11#include "ui/gfx/rect.h" 12 13namespace printing { 14 15bool Image::LoadMetafile(const Metafile& metafile) { 16 // The printing system uses single-page metafiles (page indexes are 1-based). 17 const unsigned int page_number = 1; 18 gfx::Rect rect(metafile.GetPageBounds(page_number)); 19 if (rect.width() < 1 || rect.height() < 1) 20 return false; 21 22 size_ = rect.size(); 23 row_length_ = size_.width() * sizeof(uint32); 24 size_t bytes = row_length_ * size_.height(); 25 DCHECK(bytes); 26 27 data_.resize(bytes); 28 base::ScopedCFTypeRef<CGColorSpaceRef> color_space( 29 CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); 30 base::ScopedCFTypeRef<CGContextRef> bitmap_context( 31 CGBitmapContextCreate(&*data_.begin(), 32 size_.width(), 33 size_.height(), 34 8, 35 row_length_, 36 color_space, 37 kCGImageAlphaPremultipliedLast)); 38 DCHECK(bitmap_context.get()); 39 40 struct Metafile::MacRenderPageParams params; 41 params.shrink_to_fit = true; 42 metafile.RenderPage(page_number, bitmap_context, 43 CGRectMake(0, 0, size_.width(), size_.height()), params); 44 45 return true; 46} 47 48} // namespace printing 49