1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 29b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 49b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 79b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 89b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 109b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#ifndef SkPDFDevice_DEFINED 119b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#define SkPDFDevice_DEFINED 129b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 131f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com#include "SkBitmapDevice.h" 145e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "SkBitmap.h" 15b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org#include "SkCanvas.h" 16a518086928494319b8968abc09808eff492c194fvandebo@chromium.org#include "SkPaint.h" 17a518086928494319b8968abc09808eff492c194fvandebo@chromium.org#include "SkPath.h" 18608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org#include "SkPicture.h" 19238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org#include "SkRect.h" 209fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org#include "SkRefCnt.h" 219fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org#include "SkStream.h" 22b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com#include "SkTDArray.h" 23e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org#include "SkTemplates.h" 249b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 259b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFArray; 269b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFDevice; 279b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFDict; 2828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.orgclass SkPDFFont; 296112c215fbdd53388e64ece36e6c7bba0fe3a451vandebo@chromium.orgclass SkPDFFormXObject; 309859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.orgclass SkPDFGlyphSetMap; 319b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFGraphicState; 329b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFObject; 3347401354074549d8591da7fa115241766d3ee3d2commit-bot@chromium.orgclass SkPDFResourceDict; 34da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.orgclass SkPDFShader; 359b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFStream; 36a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.comclass SkRRect; 37a20e42c08b6b92c1022e5b27da3f92a429d0c815edisonn@google.comtemplate <typename T> class SkTSet; 389b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 399fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org// Private classes. 409fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.orgstruct ContentEntry; 419fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.orgstruct GraphicStateEntry; 42b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comstruct NamedDestination; 439fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org 449b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org/** \class SkPDFDevice 459b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 469b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org The drawing context for the PDF backend. 479b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org*/ 481f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comclass SkPDFDevice : public SkBitmapDevice { 499b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgpublic: 509b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org /** Create a PDF drawing context with the given width and height. 519b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org * 72 points/in means letter paper is 612x792. 52152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org * @param pageSize Page size in points. 53152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org * @param contentSize The content size of the page in points. This will be 54152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org * combined with the initial transform to determine the drawing area 55152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org * (as reported by the width and height methods). Anything outside 56152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org * of the drawing area will be clipped. 5775f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * @param initialTransform The initial transform to apply to the page. 5875f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * This may be useful to, for example, move the origin in and 5975f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * over a bit to account for a margin, scale the canvas, 6075f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * or apply a rotation. Note1: the SkPDFDevice also applies 6175f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * a scale+translate transform to move the origin from the 6275f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * bottom left (PDF default) to the top left. Note2: drawDevice 6375f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * (used by layer restore) draws the device after this initial 64cde92111d50a96b6d0f3e166fbac7c9bc6eca349reed@google.com * transform is applied, so the PDF device does an 6575f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * inverse scale+translate to accommodate the one that SkPDFDevice 6675f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org * always does. 679b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 685e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org // Deprecated, please use SkDocument::CreatePdf() instead. 69152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org SK_API SkPDFDevice(const SkISize& pageSize, const SkISize& contentSize, 70152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org const SkMatrix& initialTransform); 71152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org SK_API virtual ~SkPDFDevice(); 729b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 73982cb875f01e247843b9a79082f680cdcf234c2creed@google.com virtual void clear(SkColor color) SK_OVERRIDE; 7477bcaa324a574584331322d98768582d9232f7fcvandebo@chromium.org 759b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org /** These are called inside the per-device-layer loop for each draw call. 769b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org When these are called, we have already applied any saveLayer operations, 779b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org and are handling any looping from the paint, and any effects from the 789b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org DrawFilter. 799b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 80982cb875f01e247843b9a79082f680cdcf234c2creed@google.com virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE; 819b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, 829b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org size_t count, const SkPoint[], 83982cb875f01e247843b9a79082f680cdcf234c2creed@google.com const SkPaint& paint) SK_OVERRIDE; 849b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawRect(const SkDraw&, const SkRect& r, const SkPaint& paint); 85a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com virtual void drawRRect(const SkDraw&, const SkRRect& rr, 86a8e33a92e27ca1523601226cad83c79a7e00c93bscroggo@google.com const SkPaint& paint) SK_OVERRIDE; 87ff3903202e5bce39016bac896ba6a417dc707d52vandebo@chromium.org virtual void drawPath(const SkDraw&, const SkPath& origpath, 8802cc5aa736086320649d8a932515691ae18a0dd5vandebo@chromium.org const SkPaint& paint, const SkMatrix* prePathMatrix, 89982cb875f01e247843b9a79082f680cdcf234c2creed@google.com bool pathIsMutable) SK_OVERRIDE; 902ae67e70cd06be3f64c6290be7724af8ce6bc853edisonn@google.com virtual void drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, 912ae67e70cd06be3f64c6290be7724af8ce6bc853edisonn@google.com const SkRect* src, const SkRect& dst, 92eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org const SkPaint& paint, 93eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org SkCanvas::DrawBitmapRectFlags flags) SK_OVERRIDE; 949b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap, 95982cb875f01e247843b9a79082f680cdcf234c2creed@google.com const SkMatrix& matrix, const SkPaint&) SK_OVERRIDE; 969b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap, int x, int y, 97982cb875f01e247843b9a79082f680cdcf234c2creed@google.com const SkPaint& paint) SK_OVERRIDE; 989b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawText(const SkDraw&, const void* text, size_t len, 99982cb875f01e247843b9a79082f680cdcf234c2creed@google.com SkScalar x, SkScalar y, const SkPaint&) SK_OVERRIDE; 1009b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawPosText(const SkDraw&, const void* text, size_t len, 1019b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org const SkScalar pos[], SkScalar constY, 102982cb875f01e247843b9a79082f680cdcf234c2creed@google.com int scalarsPerPos, const SkPaint&) SK_OVERRIDE; 1039b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len, 1049b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 105982cb875f01e247843b9a79082f680cdcf234c2creed@google.com const SkPaint& paint) SK_OVERRIDE; 1069b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, 1079b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org int vertexCount, const SkPoint verts[], 1089b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org const SkPoint texs[], const SkColor colors[], 1099b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org SkXfermode* xmode, const uint16_t indices[], 110982cb875f01e247843b9a79082f680cdcf234c2creed@google.com int indexCount, const SkPaint& paint) SK_OVERRIDE; 1111f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, 112982cb875f01e247843b9a79082f680cdcf234c2creed@google.com const SkPaint&) SK_OVERRIDE; 1139b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 11440a1ae4df28810aa5aa5cf2627d8387b2dfb867arobertphillips@google.com virtual void onAttachToCanvas(SkCanvas* canvas) SK_OVERRIDE; 11540a1ae4df28810aa5aa5cf2627d8387b2dfb867arobertphillips@google.com virtual void onDetachFromCanvas() SK_OVERRIDE; 11640a1ae4df28810aa5aa5cf2627d8387b2dfb867arobertphillips@google.com 1178dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org enum DrawingArea { 1189510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org kContent_DrawingArea, // Drawing area for the page content. 1199510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org kMargin_DrawingArea, // Drawing area for the margin content. 1208dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org }; 1218dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org 1228dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org /** Sets the drawing area for the device. Subsequent draw calls are directed 123769fa6a013baca6d7404e2bf096a34a7e3635fa5ctguil@chromium.org * to the specific drawing area (margin or content). The default drawing 1248dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org * area is the content drawing area. 1259510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org * 1269510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org * Currently if margin content is drawn and then a complex (for PDF) xfer 1279510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org * mode is used, like SrcIn, Clear, etc, the margin content will get 1289510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org * clipped. A simple way to avoid the bug is to always draw the margin 1299510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org * content last. 1308dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org */ 13117b78946096265d80215a6c946286ecaa35ea7edepoger@google.com SK_API void setDrawingArea(DrawingArea drawingArea); 1328dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org 133d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com /** Sets the DCTEncoder for images. 134d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * @param encoder The encoder to encode a bitmap as JPEG (DCT). 135d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * Result of encodings are cached, if the encoder changes the 136d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * behaivor dynamically and an image is added to a second catalog, 137d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * we will likely use the result of the first encoding call. 138d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * By returning false from the encoder function, the encoder result 139d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * is not used. 140d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * Callers might not want to encode small images, as the time spent 141d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * encoding and decoding might not be worth the space savings, 142d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com * if any at all. 143d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com */ 144608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org void setDCTEncoder(SkPicture::EncodeBitmap encoder) { 145d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com fEncoder = encoder; 146d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com } 147d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 1489b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org // PDF specific methods. 1499b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 1501feb33068b1313d2647c50b90ae8e0a3d510db2ereed@google.com /** Returns the resource dictionary for this device. 1519b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 15247401354074549d8591da7fa115241766d3ee3d2commit-bot@chromium.org SK_API SkPDFResourceDict* getResourceDict(); 1539b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 154f0ec2666d9a3f0f1662f0d63b5147628c49648aavandebo@chromium.org /** Get the fonts used on this device. 155f0ec2666d9a3f0f1662f0d63b5147628c49648aavandebo@chromium.org */ 1563509f050810ab95cc36265f3b486b9569799041dvandebo@chromium.org SK_API const SkTDArray<SkPDFFont*>& getFontResources() const; 157f0ec2666d9a3f0f1662f0d63b5147628c49648aavandebo@chromium.org 158b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com /** Add our named destinations to the supplied dictionary. 159b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com * @param dict Dictionary to add destinations to. 160b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com * @param page The PDF object representing the page for this device. 161b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com */ 162b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com void appendDestinations(SkPDFDict* dict, SkPDFObject* page); 163b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com 1642a006c112743e07ce258ca223631fc19233f5ddcreed@google.com /** Returns a copy of the media box for this device. The caller is required 1652a006c112743e07ce258ca223631fc19233f5ddcreed@google.com * to unref() this when it is finished. 1669b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 1672a006c112743e07ce258ca223631fc19233f5ddcreed@google.com SK_API SkPDFArray* copyMediaBox() const; 1689b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 1692a006c112743e07ce258ca223631fc19233f5ddcreed@google.com /** Get the annotations from this page, or NULL if there are none. 170238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org */ 1712a006c112743e07ce258ca223631fc19233f5ddcreed@google.com SK_API SkPDFArray* getAnnotations() const { return fAnnotations; } 172238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org 173c2a9b7fe5640af8f0c371561f1ac71b045d6d8ecvandebo@chromium.org /** Returns a SkStream with the page contents. The caller is responsible 174c2a9b7fe5640af8f0c371561f1ac71b045d6d8ecvandebo@chromium.org for a reference to the returned value. 1755667afc5cb4a8cd15a27667f222b6d9c94d61c38reed@google.com DEPRECATED: use copyContentToData() 1769b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */ 1773509f050810ab95cc36265f3b486b9569799041dvandebo@chromium.org SK_API SkStream* content() const; 1789b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 1795667afc5cb4a8cd15a27667f222b6d9c94d61c38reed@google.com /** Returns a SkStream with the page contents. The caller is responsible 1805667afc5cb4a8cd15a27667f222b6d9c94d61c38reed@google.com * for calling data->unref() when it is finished. 1815667afc5cb4a8cd15a27667f222b6d9c94d61c38reed@google.com */ 1825667afc5cb4a8cd15a27667f222b6d9c94d61c38reed@google.com SK_API SkData* copyContentToData() const; 1839859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org 1843509f050810ab95cc36265f3b486b9569799041dvandebo@chromium.org SK_API const SkMatrix& initialTransform() const { 1853509f050810ab95cc36265f3b486b9569799041dvandebo@chromium.org return fInitialTransform; 1863509f050810ab95cc36265f3b486b9569799041dvandebo@chromium.org } 18761d267879bdf85c84b05f0519eb53b9322abbf0evandebo@chromium.org 1889859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org /** Returns a SkPDFGlyphSetMap which represents glyph usage of every font 1899859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org * that shows on this device. 1909859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org */ 1919859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org const SkPDFGlyphSetMap& getFontGlyphUsage() const { 1929859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org return *(fFontGlyphUsage.get()); 1939859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org } 19474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 195b55deeb1c7c692023603639a9b29c0e3de124eacreed@google.com 1968c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org /** 1978c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * rasterDpi - the DPI at which features without native PDF support 1988c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * will be rasterized (e.g. draw image with perspective, 1998c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * draw text with perspective, ...) 2008c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * A larger DPI would create a PDF that reflects the original 2018c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * intent with better fidelity, but it can make for larger 2028c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * PDF files too, which would use more memory while rendering, 2038c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * and it would be slower to be processed or sent online or 2048c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * to printer. 2058c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org */ 2068c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org void setRasterDpi(SkScalar rasterDpi) { 2078c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org fRasterDpi = rasterDpi; 2088c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org } 2098c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org 21073a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.comprotected: 211ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org virtual bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE; 21273a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com 2139b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgprivate: 214769fa6a013baca6d7404e2bf096a34a7e3635fa5ctguil@chromium.org // TODO(vandebo): push most of SkPDFDevice's state into a core object in 215b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org // order to get the right access levels without using friend. 21613d14a9dbd2cf0a9654045cc967e92626690631avandebo@chromium.org friend class ScopedContentEntry; 217a0c7edbb0804144ab320951db5c741eea247fc0fvandebo@chromium.org 218152612938020fa46999f33668027d5bc0f7afd18ctguil@chromium.org SkISize fPageSize; 2199fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org SkISize fContentSize; 22075f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org SkMatrix fInitialTransform; 2219fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org SkClipStack fExistingClipStack; 2229fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org SkRegion fExistingClipRegion; 2232a006c112743e07ce258ca223631fc19233f5ddcreed@google.com SkPDFArray* fAnnotations; 22447401354074549d8591da7fa115241766d3ee3d2commit-bot@chromium.org SkPDFResourceDict* fResourceDict; 225b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com SkTDArray<NamedDestination*> fNamedDestinations; 2269b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 2279b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org SkTDArray<SkPDFGraphicState*> fGraphicStateResources; 2289b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org SkTDArray<SkPDFObject*> fXObjectResources; 22928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkTDArray<SkPDFFont*> fFontResources; 230421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org SkTDArray<SkPDFObject*> fShaderResources; 2319b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 232e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<ContentEntry> fContentEntries; 233b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org ContentEntry* fLastContentEntry; 234e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<ContentEntry> fMarginContentEntries; 2358dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org ContentEntry* fLastMarginContentEntry; 2368dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org DrawingArea fDrawingArea; 2378dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org 23840a1ae4df28810aa5aa5cf2627d8387b2dfb867arobertphillips@google.com const SkClipStack* fClipStack; 23940a1ae4df28810aa5aa5cf2627d8387b2dfb867arobertphillips@google.com 2408dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org // Accessor and setter functions based on the current DrawingArea. 241e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<ContentEntry>* getContentEntries(); 2428dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org ContentEntry* getLastContentEntry(); 2438dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org void setLastContentEntry(ContentEntry* contentEntry); 2449b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 2459859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org // Glyph ids used for each font on this device. 246e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<SkPDFGlyphSetMap> fFontGlyphUsage; 2479859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org 248608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org SkPicture::EncodeBitmap fEncoder; 2498c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org SkScalar fRasterDpi; 250d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 251a0c7edbb0804144ab320951db5c741eea247fc0fvandebo@chromium.org SkPDFDevice(const SkISize& layerSize, const SkClipStack& existingClipStack, 252a0c7edbb0804144ab320951db5c741eea247fc0fvandebo@chromium.org const SkRegion& existingClipRegion); 253a0c7edbb0804144ab320951db5c741eea247fc0fvandebo@chromium.org 2541f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com // override from SkBaseDevice 25515a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE; 256e97f0856a8044866b12527819d14cdfbcdfd96f2bsalomon@google.com 25777bcaa324a574584331322d98768582d9232f7fcvandebo@chromium.org void init(); 2589859428e71c6041928e6dd741ae3284017e78e81vandebo@chromium.org void cleanUp(bool clearFontUsage); 259fc641d09e5a1a9f7fae369ae06a8b96089faf57breed@google.com SkPDFFormXObject* createFormXObjectFromDevice(); 2609fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org 2613b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org void drawFormXObjectWithMask(int xObjectIndex, 2623b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkPDFFormXObject* mask, 263481aef68333e01c19badda456d8e60bd1f1bee2avandebo@chromium.org const SkClipStack* clipStack, 264481aef68333e01c19badda456d8e60bd1f1bee2avandebo@chromium.org const SkRegion& clipRegion, 2653b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkXfermode::Mode mode, 266481aef68333e01c19badda456d8e60bd1f1bee2avandebo@chromium.org bool invertClip); 267466f3d66f09285d2d988315bacde573a5359ce54vandebo@chromium.org 268b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org // If the paint or clip is such that we shouldn't draw anything, this 269b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org // returns NULL and does not create a content entry. 270b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org // setUpContentEntry and finishContentEntry can be used directly, but 27113d14a9dbd2cf0a9654045cc967e92626690631avandebo@chromium.org // the preferred method is to use the ScopedContentEntry helper class. 272b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org ContentEntry* setUpContentEntry(const SkClipStack* clipStack, 273b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org const SkRegion& clipRegion, 274b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org const SkMatrix& matrix, 275b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org const SkPaint& paint, 276b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org bool hasText, 277fc641d09e5a1a9f7fae369ae06a8b96089faf57breed@google.com SkPDFFormXObject** dst); 278b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org void finishContentEntry(SkXfermode::Mode xfermode, 2793b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkPDFFormXObject* dst, 2803b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkPath* shape); 281481aef68333e01c19badda456d8e60bd1f1bee2avandebo@chromium.org bool isContentEmpty(); 282481aef68333e01c19badda456d8e60bd1f1bee2avandebo@chromium.org 2839fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org void populateGraphicStateEntryFromPaint(const SkMatrix& matrix, 2849fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkClipStack& clipStack, 2859fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkRegion& clipRegion, 2869fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkPaint& paint, 2879fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org bool hasText, 2889fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org GraphicStateEntry* entry); 2896112c215fbdd53388e64ece36e6c7bba0fe3a451vandebo@chromium.org int addGraphicStateResource(SkPDFGraphicState* gs); 2903b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org int addXObjectResource(SkPDFObject* xObject); 2919fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org 292b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org void updateFont(const SkPaint& paint, uint16_t glyphID, 293b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org ContentEntry* contentEntry); 2949db86bb9cd1b77be0afc504ccc07026e4282d7e7ctguil@chromium.org int getFontResourceIndex(SkTypeface* typeface, uint16_t glyphID); 2959fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org 296b069c8cfcd5df285193eb334b3bc33438782e8davandebo@chromium.org void internalDrawPaint(const SkPaint& paint, ContentEntry* contentEntry); 2979fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org void internalDrawBitmap(const SkMatrix& matrix, 29878dad54080ad806be89adb5cc0e3c530b031cdafvandebo@chromium.org const SkClipStack* clipStack, 2999fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkRegion& clipRegion, 3009fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkBitmap& bitmap, 3019fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkIRect* srcRect, 3029fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org const SkPaint& paint); 3039b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 3048dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org /** Helper method for copyContentToData. It is responsible for copying the 3058dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org * list of content entries |entry| to |data|. 3068dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org */ 3078dcf74f27690476193f5d4ca34fba2e87ca7c98dctguil@chromium.org void copyContentEntriesToData(ContentEntry* entry, SkWStream* data) const; 3089510ccc06bbfa5e888f66578042674be98d8ac60ctguil@chromium.org 309d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org#ifdef SK_PDF_USE_PATHOPS 31092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org bool handleInversePath(const SkDraw& d, const SkPath& origPath, 311a9ebd161a7c08515f0c4bd885e61c4b52688ececedisonn@google.com const SkPaint& paint, bool pathIsMutable, 312a9ebd161a7c08515f0c4bd885e61c4b52688ececedisonn@google.com const SkMatrix* prePathMatrix = NULL); 313d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org#endif 314b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com bool handleRectAnnotation(const SkRect& r, const SkMatrix& matrix, 315b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com const SkPaint& paint); 316b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com bool handlePointAnnotation(const SkPoint* points, size_t count, 317b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com const SkMatrix& matrix, const SkPaint& paint); 318b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com SkPDFDict* createLinkAnnotation(const SkRect& r, const SkMatrix& matrix); 319b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com void handleLinkToURL(SkData* urlData, const SkRect& r, 320b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com const SkMatrix& matrix); 321b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com void handleLinkToNamedDest(SkData* nameData, const SkRect& r, 322b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com const SkMatrix& matrix); 323b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com void defineNamedDestination(SkData* nameData, const SkPoint& point, 324b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com const SkMatrix& matrix); 325238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org 3261f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com typedef SkBitmapDevice INHERITED; 3275e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 3285e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org // TODO(edisonn): Only SkDocument_PDF and SkPDFImageShader should be able to create 3295e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org // an SkPDFDevice 3305e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org //friend class SkDocument_PDF; 3315e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org //friend class SkPDFImageShader; 3329b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org}; 3339b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org 3349b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#endif 335