static int force_glyph_encoding(const SkPaint& paint, const void* text,
size_t len, SkGlyphStorage* storage,
- uint16_t** glyphIDs) {
+ const uint16_t** glyphIDs) {
// Make sure we have a glyph id encoding.
if (paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding) {
int numGlyphs = paint.textToGlyphs(text, len, NULL);
// For user supplied glyph ids we need to validate them.
SkASSERT((len & 1) == 0);
int numGlyphs = SkToInt(len / 2);
- const uint16_t* input =
- reinterpret_cast<uint16_t*>(const_cast<void*>((text)));
+ const uint16_t* input = static_cast<const uint16_t*>(text);
int maxGlyphID = max_glyphid_for_typeface(paint.getTypeface());
int validated;
}
}
if (validated >= numGlyphs) {
- *glyphIDs = reinterpret_cast<uint16_t*>(const_cast<void*>((text)));
+ *glyphIDs = static_cast<const uint16_t*>(text);
return numGlyphs;
}
}
SkGlyphStorage storage(0);
- uint16_t* glyphIDs = NULL;
+ const uint16_t* glyphIDs = NULL;
int numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs);
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
while (numGlyphs > consumedGlyphCount) {
updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry());
SkPDFFont* font = content.entry()->fState.fFont;
+ //TODO: the const_cast here is a bug if the encoding started out as glyph encoding.
int availableGlyphs =
- font->glyphsToPDFFontEncoding(glyphIDs + consumedGlyphCount,
+ font->glyphsToPDFFontEncoding(const_cast<uint16_t*>(glyphIDs) + consumedGlyphCount,
numGlyphs - consumedGlyphCount);
fFontGlyphUsage->noteGlyphUsage(font, glyphIDs + consumedGlyphCount,
availableGlyphs);
}
SkGlyphStorage storage(0);
- uint16_t* glyphIDs = NULL;
- size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage,
- &glyphIDs);
+ const uint16_t* glyphIDs = NULL;
+ size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs);
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
SkDrawCacheProc glyphCacheProc = textPaint.getDrawCacheProc();
SkPDFFont* font = content.entry()->fState.fFont;
uint16_t encodedValue = glyphIDs[i];
if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) {
+ // The current pdf font cannot encode the current glyph.
+ // Try to get a pdf font which can encode the current glyph.
updateFont(textPaint, glyphIDs[i], content.entry());
- i--;
- continue;
+ font = content.entry()->fState.fFont;
+ if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) {
+ SkDEBUGFAIL("PDF could not encode glyph.");
+ continue;
+ }
}
+
fFontGlyphUsage->noteGlyphUsage(font, &encodedValue, 1);
SkScalar x = pos[i * scalarsPerPos];
SkScalar y = scalarsPerPos == 1 ? constY : pos[i * scalarsPerPos + 1];
align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y);
- set_text_transform(x, y, textPaint.getTextSkewX(),
- &content.entry()->fContent);
+ set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fContent);
SkString encodedString =
- SkPDFString::FormatString(&encodedValue, 1,
- font->multiByteGlyphs());
+ SkPDFString::FormatString(&encodedValue, 1, font->multiByteGlyphs());
content.entry()->fContent.writeText(encodedString.c_str());
content.entry()->fContent.writeText(" Tj\n");
}
fClipStack = NULL;
}
-SkSurface* SkPDFDevice::newSurface(const SkImageInfo& info) {
- return SkSurface::NewRaster(info);
+SkSurface* SkPDFDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps& props) {
+ return SkSurface::NewRaster(info, &props);
}
ContentEntry* SkPDFDevice::getLastContentEntry() {
const int w = SkScalarCeilToInt(physicalPerspectiveOutline.getBounds().width());
const int h = SkScalarCeilToInt(physicalPerspectiveOutline.getBounds().height());
- if (!perspectiveBitmap.allocPixels(SkImageInfo::MakeN32Premul(w, h))) {
+ if (!perspectiveBitmap.tryAllocN32Pixels(w, h)) {
return;
}
perspectiveBitmap.eraseColor(SK_ColorTRANSPARENT);
return;
}
- SkAutoTUnref<SkPDFImage> image(
- SkPDFImage::CreateImage(*bitmap, subset, fEncoder));
+ SkAutoTUnref<SkPDFObject> image(
+ SkPDFCreateImageObject(*bitmap, subset, fEncoder));
if (!image) {
return;
}