skia2/experimental/PdfViewer/SkPdfBasics.h
edisonn@google.com ab03e6816b more work on pdf fonts, more to come
Review URL: https://codereview.chromium.org/18117005

git-svn-id: http://skia.googlecode.com/svn/trunk@9813 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-06-28 18:51:20 +00:00

139 lines
3.6 KiB
C++

#ifndef __DEFINED__SkPdfBasics
#define __DEFINED__SkPdfBasics
#include "SkCanvas.h"
#include "SkPaint.h"
#include <iostream>
#include <cstdio>
#include <stack>
#define PDF_TRACE
//#define PDF_TRACE_DIFF_IN_PNG
//#define PDF_DEBUG_NO_CLIPING
//#define PDF_DEBUG_NO_PAGE_CLIPING
//#define PDF_DEBUG_3X
class SkPdfFont;
class SkPdfDoc;
class SkPdfObject;
class SkPdfResourceDictionary;
// TODO(edisonn): better class design.
struct PdfColorOperator {
std::string fColorSpace; // TODO(edisonn): use SkString
SkColor fColor;
double fOpacity; // ca or CA
// TODO(edisonn): add here other color space options.
void setRGBColor(SkColor color) {
// TODO(edisonn): ASSERT DeviceRGB is the color space.
fColor = color;
}
// TODO(edisonn): double check the default values for all fields.
PdfColorOperator() : fColor(SK_ColorBLACK), fOpacity(1) {}
void applyGraphicsState(SkPaint* paint) {
paint->setColor(SkColorSetA(fColor, fOpacity * 255));
}
};
// TODO(edisonn): better class design.
struct PdfGraphicsState {
SkMatrix fMatrix;
SkMatrix fMatrixTm;
SkMatrix fMatrixTlm;
double fCurPosX;
double fCurPosY;
double fCurFontSize;
bool fTextBlock;
SkPdfFont* fSkFont;
SkPath fPath;
bool fPathClosed;
// Clip that is applied after the drawing is done!!!
bool fHasClipPathToApply;
SkPath fClipPath;
PdfColorOperator fStroking;
PdfColorOperator fNonStroking;
double fLineWidth;
double fTextLeading;
double fWordSpace;
double fCharSpace;
SkPdfResourceDictionary* fResources;
SkBitmap fSMask;
PdfGraphicsState() {
fCurPosX = 0.0;
fCurPosY = 0.0;
fCurFontSize = 0.0;
fTextBlock = false;
fMatrix = SkMatrix::I();
fMatrixTm = SkMatrix::I();
fMatrixTlm = SkMatrix::I();
fPathClosed = true;
fLineWidth = 0;
fTextLeading = 0;
fWordSpace = 0;
fCharSpace = 0;
fHasClipPathToApply = false;
fResources = NULL;
fSkFont = NULL;
}
void applyGraphicsState(SkPaint* paint, bool stroking) {
if (stroking) {
fStroking.applyGraphicsState(paint);
} else {
fNonStroking.applyGraphicsState(paint);
}
// TODO(edisonn): get this from pdfContext->options,
// or pdfContext->addPaintOptions(&paint);
paint->setAntiAlias(true);
// TODO(edisonn): dashing, miter, ...
paint->setStrokeWidth(SkDoubleToScalar(fLineWidth));
}
};
// TODO(edisonn): better class design.
struct PdfInlineImage {
std::map<std::string, std::string> fKeyValuePairs;
std::string fImageData;
};
// TODO(edisonn): better class design.
struct PdfContext {
std::stack<SkPdfObject*> fObjectStack;
std::stack<PdfGraphicsState> fStateStack;
PdfGraphicsState fGraphicsState;
SkPdfDoc* fPdfDoc;
SkMatrix fOriginalMatrix;
PdfInlineImage fInlineImage;
PdfContext(SkPdfDoc* doc) : fPdfDoc(doc) {}
};
// TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered.
enum PdfResult {
kOK_PdfResult,
kPartial_PdfResult,
kNYI_PdfResult,
kIgnoreError_PdfResult,
kError_PdfResult,
kUnsupported_PdfResult,
kCount_PdfResult
};
#endif // __DEFINED__SkPdfBasics