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