1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4f966fd35cf37562df7aaaf08a490582b764ba170ctguil@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.
7f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org */
8f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
10f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org#ifndef SkPDFUtils_DEFINED
11f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org#define SkPDFUtils_DEFINED
12f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org
13683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org#include "SkPaint.h"
14f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#include "SkPath.h"
15f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org
16f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.orgclass SkMatrix;
17f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.orgclass SkPath;
18f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.orgclass SkPDFArray;
198989d31cf0472cc73484d74e45c54a24fed2dc00vandebo@chromium.orgstruct SkRect;
20c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.comclass SkWStream;
21f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org
22f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#if 0
23f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#define PRINT_NOT_IMPL(str) fprintf(stderr, str)
24f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#else
25f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#define PRINT_NOT_IMPL(str)
26f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org#endif
27f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org
28f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org#define NOT_IMPLEMENTED(condition, assert)                         \
29f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org    do {                                                           \
30330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com        if ((bool)(condition)) {                                   \
31f71b2103d56dde247605b718a0c89123ad8f0094vandebo@chromium.org            PRINT_NOT_IMPL("NOT_IMPLEMENTED: " #condition "\n");   \
32f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org            SkDEBUGCODE(SkASSERT(!assert);)                        \
33f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org        }                                                          \
34a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org    } while (0)
35f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org
36f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.orgclass SkPDFUtils {
37f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.orgpublic:
3893a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    static SkPDFArray* RectToArray(const SkRect& rect);
39f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org    static SkPDFArray* MatrixToArray(const SkMatrix& matrix);
4075f97e452e8f2ee55cd2b283df7d7734f48bc2bfvandebo@chromium.org    static void AppendTransform(const SkMatrix& matrix, SkWStream* content);
41cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org
42cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org    static void MoveTo(SkScalar x, SkScalar y, SkWStream* content);
43cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org    static void AppendLine(SkScalar x, SkScalar y, SkWStream* content);
44f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org    static void AppendCubic(SkScalar ctl1X, SkScalar ctl1Y,
45f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org                            SkScalar ctl2X, SkScalar ctl2Y,
46cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org                            SkScalar dstX, SkScalar dstY, SkWStream* content);
479fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org    static void AppendRectangle(const SkRect& rect, SkWStream* content);
48683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    static void EmitPath(const SkPath& path, SkPaint::Style paintStyle,
498b2bc252faed7c751cf9248c3833c0631f498b7dhalcanary                         bool doConsumeDegerates, SkWStream* content);
508b2bc252faed7c751cf9248c3833c0631f498b7dhalcanary    static void EmitPath(const SkPath& path, SkPaint::Style paintStyle,
518b2bc252faed7c751cf9248c3833c0631f498b7dhalcanary                         SkWStream* content) {
528b2bc252faed7c751cf9248c3833c0631f498b7dhalcanary        SkPDFUtils::EmitPath(path, paintStyle, true, content);
538b2bc252faed7c751cf9248c3833c0631f498b7dhalcanary    }
54cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org    static void ClosePath(SkWStream* content);
55f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org    static void PaintPath(SkPaint::Style style, SkPath::FillType fill,
56cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org                          SkWStream* content);
57cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org    static void StrokePath(SkWStream* content);
586112c215fbdd53388e64ece36e6c7bba0fe3a451vandebo@chromium.org    static void DrawFormXObject(int objectIndex, SkWStream* content);
596112c215fbdd53388e64ece36e6c7bba0fe3a451vandebo@chromium.org    static void ApplyGraphicState(int objectIndex, SkWStream* content);
6093a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    static void ApplyPattern(int objectIndex, SkWStream* content);
618e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary
628e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    // 3 = '-', '.', and '\0' characters.
638e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    // 9 = number of significant digits
648e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    // abs(FLT_MIN_10_EXP) = number of zeros in FLT_MIN
658e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    static const size_t kMaximumFloatDecimalLength = 3 + 9 - FLT_MIN_10_EXP;
668e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    // FloatToDecimal is exposed for unit tests.
678e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary    static size_t FloatToDecimal(float value,
688e9f5e39d774198a5a5d9345bc9f863e855c593bhalcanary                                 char output[kMaximumFloatDecimalLength]);
69bc4696b9176e05940a7c2d6778276cdbc55ccd61halcanary    static void AppendScalar(SkScalar value, SkWStream* stream);
70bc4696b9176e05940a7c2d6778276cdbc55ccd61halcanary    static SkString FormatString(const char* input, size_t len);
71f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org};
72f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org
73f966fd35cf37562df7aaaf08a490582b764ba170ctguil@chromium.org#endif
74