Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(574)

Side by Side Diff: src/device/xps/SkXPSDevice.cpp

Issue 14873006: XPS ttc handling. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Fix clang error about typename and dependent type. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « include/device/xps/SkXPSDevice.h ('k') | src/sfnt/SkOTTable_name.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef UNICODE 8 #ifndef UNICODE
9 #define UNICODE 9 #define UNICODE
10 #endif 10 #endif
11 #ifndef _UNICODE 11 #ifndef _UNICODE
12 #define _UNICODE 12 #define _UNICODE
13 #endif 13 #endif
14 #include "SkTypes.h" 14 #include "SkTypes.h"
15 #include <ObjBase.h> 15 #include <ObjBase.h>
16 #include <XpsObjectModel.h> 16 #include <XpsObjectModel.h>
17 #include <T2EmbApi.h> 17 #include <T2EmbApi.h>
18 #include <FontSub.h> 18 #include <FontSub.h>
19 19
20 #include "SkColor.h" 20 #include "SkColor.h"
21 #include "SkConstexprMath.h" 21 #include "SkConstexprMath.h"
22 #include "SkData.h" 22 #include "SkData.h"
23 #include "SkDraw.h" 23 #include "SkDraw.h"
24 #include "SkDrawProcs.h" 24 #include "SkDrawProcs.h"
25 #include "SkEndian.h"
25 #include "SkFontHost.h" 26 #include "SkFontHost.h"
26 #include "SkGlyphCache.h" 27 #include "SkGlyphCache.h"
27 #include "SkHRESULT.h" 28 #include "SkHRESULT.h"
28 #include "SkImageEncoder.h" 29 #include "SkImageEncoder.h"
29 #include "SkIStream.h" 30 #include "SkIStream.h"
30 #include "SkMaskFilter.h" 31 #include "SkMaskFilter.h"
31 #include "SkPaint.h" 32 #include "SkPaint.h"
32 #include "SkPoint.h" 33 #include "SkPoint.h"
33 #include "SkRasterizer.h" 34 #include "SkRasterizer.h"
35 #include "SkSFNTHeader.h"
34 #include "SkShader.h" 36 #include "SkShader.h"
35 #include "SkSize.h" 37 #include "SkSize.h"
36 #include "SkStream.h" 38 #include "SkStream.h"
37 #include "SkTDArray.h" 39 #include "SkTDArray.h"
38 #include "SkTLazy.h" 40 #include "SkTLazy.h"
39 #include "SkTScopedComPtr.h" 41 #include "SkTScopedComPtr.h"
42 #include "SkTTCFHeader.h"
40 #include "SkTypefacePriv.h" 43 #include "SkTypefacePriv.h"
41 #include "SkUtils.h" 44 #include "SkUtils.h"
42 #include "SkXPSDevice.h" 45 #include "SkXPSDevice.h"
43 46
44 //Windows defines a FLOAT type, 47 //Windows defines a FLOAT type,
45 //make it clear when converting a scalar that this is what is wanted. 48 //make it clear when converting a scalar that this is what is wanted.
46 #define SkScalarToFLOAT(n) SkScalarToFloat(n) 49 #define SkScalarToFLOAT(n) SkScalarToFloat(n)
47 50
48 //Dummy representation of a GUID from create_id. 51 //Dummy representation of a GUID from create_id.
49 #define L_GUID_ID L"XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX" 52 #define L_GUID_ID L"XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX"
(...skipping 23 matching lines...) Expand all
73 guid.Data4[0], 76 guid.Data4[0],
74 guid.Data4[1], 77 guid.Data4[1],
75 sep, 78 sep,
76 guid.Data4[2], 79 guid.Data4[2],
77 guid.Data4[3], 80 guid.Data4[3],
78 guid.Data4[4], 81 guid.Data4[4],
79 guid.Data4[5], 82 guid.Data4[5],
80 guid.Data4[6], 83 guid.Data4[6],
81 guid.Data4[7]); 84 guid.Data4[7]);
82 } 85 }
86
83 /** 87 /**
84 Creates a GUID based id and places it into buffer. 88 Creates a GUID based id and places it into buffer.
85 buffer should have space for at least GUID_ID_LEN wide characters. 89 buffer should have space for at least GUID_ID_LEN wide characters.
86 The string will always be wchar null terminated. 90 The string will always be wchar null terminated.
87 XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX0 91 XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX0
88 The string may begin with a digit, 92 The string may begin with a digit,
89 and so may not be suitable as a bare resource key. 93 and so may not be suitable as a bare resource key.
90 */ 94 */
91 static HRESULT create_id(wchar_t* buffer, size_t bufferSize, 95 static HRESULT create_id(wchar_t* buffer, size_t bufferSize,
92 wchar_t sep = '-') { 96 wchar_t sep = '-') {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 IXpsOMImageResource** image) { 176 IXpsOMImageResource** image) {
173 SkTScopedComPtr<IXpsOMThumbnailGenerator> thumbnailGenerator; 177 SkTScopedComPtr<IXpsOMThumbnailGenerator> thumbnailGenerator;
174 HRM(CoCreateInstance( 178 HRM(CoCreateInstance(
175 CLSID_XpsOMThumbnailGenerator, 179 CLSID_XpsOMThumbnailGenerator,
176 NULL, 180 NULL,
177 CLSCTX_INPROC_SERVER, 181 CLSCTX_INPROC_SERVER,
178 IID_PPV_ARGS(&thumbnailGenerator)), 182 IID_PPV_ARGS(&thumbnailGenerator)),
179 "Could not create thumbnail generator."); 183 "Could not create thumbnail generator.");
180 184
181 SkTScopedComPtr<IOpcPartUri> partUri; 185 SkTScopedComPtr<IOpcPartUri> partUri;
182 static const size_t size = SK_MAX( 186 static const size_t size = SkTUMax<
183 SK_ARRAY_COUNT(L"/Documents/1/Metadata/.png") + SK_DIGITS_IN(pageNum), 187 SK_ARRAY_COUNT(L"/Documents/1/Metadata/.png") + SK_DIGITS_IN(pageNum),
184 SK_ARRAY_COUNT(L"/Metadata/" L_GUID_ID L".png") 188 SK_ARRAY_COUNT(L"/Metadata/" L_GUID_ID L".png")
185 ); 189 >::value;
186 wchar_t buffer[size]; 190 wchar_t buffer[size];
187 if (pageNum > 0) { 191 if (pageNum > 0) {
188 swprintf_s(buffer, size, L"/Documents/1/Metadata/%u.png", pageNum); 192 swprintf_s(buffer, size, L"/Documents/1/Metadata/%u.png", pageNum);
189 } else { 193 } else {
190 wchar_t id[GUID_ID_LEN]; 194 wchar_t id[GUID_ID_LEN];
191 HR(create_id(id, GUID_ID_LEN)); 195 HR(create_id(id, GUID_ID_LEN));
192 swprintf_s(buffer, size, L"/Metadata/%s.png", id); 196 swprintf_s(buffer, size, L"/Metadata/%s.png", id);
193 } 197 }
194 HRM(this->fXpsFactory->CreatePartUri(buffer, &partUri), 198 HRM(this->fXpsFactory->CreatePartUri(buffer, &partUri),
195 "Could not create thumbnail part uri."); 199 "Could not create thumbnail part uri.");
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 331
328 return true; 332 return true;
329 } 333 }
330 334
331 static HRESULT subset_typeface(SkXPSDevice::TypefaceUse* current) { 335 static HRESULT subset_typeface(SkXPSDevice::TypefaceUse* current) {
332 //CreateFontPackage wants unsigned short. 336 //CreateFontPackage wants unsigned short.
333 //Microsoft, Y U NO stdint.h? 337 //Microsoft, Y U NO stdint.h?
334 SkTDArray<unsigned short> keepList; 338 SkTDArray<unsigned short> keepList;
335 current->glyphsUsed->exportTo(&keepList); 339 current->glyphsUsed->exportTo(&keepList);
336 340
341 int ttcCount = (current->ttcIndex + 1);
342
337 //The following are declared with the types required by CreateFontPackage. 343 //The following are declared with the types required by CreateFontPackage.
338 unsigned char *puchFontPackageBuffer; 344 unsigned char *fontPackageBufferRaw = NULL;
339 unsigned long pulFontPackageBufferSize; 345 unsigned long fontPackageBufferSize;
340 unsigned long pulBytesWritten; 346 unsigned long bytesWritten;
341 unsigned long result = CreateFontPackage( 347 unsigned long result = CreateFontPackage(
342 (unsigned char *) current->fontData->getMemoryBase(), 348 (unsigned char *) current->fontData->getMemoryBase(),
343 (unsigned long) current->fontData->getLength(), 349 (unsigned long) current->fontData->getLength(),
344 &puchFontPackageBuffer, 350 &fontPackageBufferRaw,
345 &pulFontPackageBufferSize, 351 &fontPackageBufferSize,
346 &pulBytesWritten, 352 &bytesWritten,
347 TTFCFP_FLAGS_SUBSET | TTFCFP_FLAGS_GLYPHLIST,// | TTFCFP_FLAGS_TTC, 353 TTFCFP_FLAGS_SUBSET | TTFCFP_FLAGS_GLYPHLIST | (ttcCount > 0 ? TTFCFP_FL AGS_TTC : 0),
348 0,//TTC index 354 current->ttcIndex,
349 TTFCFP_SUBSET, 355 TTFCFP_SUBSET,
350 0, 356 0,
351 0, 357 0,
352 0, 358 0,
353 keepList.begin(), 359 keepList.begin(),
354 keepList.count(), 360 keepList.count(),
355 sk_malloc_throw, 361 sk_malloc_throw,
356 sk_realloc_throw, 362 sk_realloc_throw,
357 sk_free, 363 sk_free,
358 NULL); 364 NULL);
365 SkAutoTMalloc<unsigned char> fontPackageBuffer(fontPackageBufferRaw);
359 if (result != NO_ERROR) { 366 if (result != NO_ERROR) {
360 SkDEBUGF(("CreateFontPackage Error %lu", result)); 367 SkDEBUGF(("CreateFontPackage Error %lu", result));
361 return E_UNEXPECTED; 368 return E_UNEXPECTED;
362 } 369 }
363 370
364 SkMemoryStream* newStream = new SkMemoryStream; 371 // If it was originally a ttc, keep it a ttc.
365 newStream->setMemoryOwned(puchFontPackageBuffer, pulBytesWritten); 372 // CreateFontPackage over-allocates, realloc usually decreases the size subs tantially.
373 size_t extra;
374 if (ttcCount > 0) {
375 // Create space for a ttc header.
376 extra = sizeof(SkTTCFHeader) + (ttcCount * sizeof(SK_OT_ULONG));
377 fontPackageBuffer.realloc(bytesWritten + extra);
378 //overlap is certain, use memmove
379 memmove(fontPackageBuffer.get() + extra, fontPackageBuffer.get(), bytesW ritten);
380
381 // Write the ttc header.
382 SkTTCFHeader* ttcfHeader = reinterpret_cast<SkTTCFHeader*>(fontPackageBu ffer.get());
383 ttcfHeader->ttcTag = SkTTCFHeader::TAG;
384 ttcfHeader->version = SkTTCFHeader::version_1;
385 ttcfHeader->numOffsets = SkEndian_SwapBE32(ttcCount);
386 SK_OT_ULONG* offsetPtr = SkTAfter<SK_OT_ULONG>(ttcfHeader);
387 for (int i = 0; i < ttcCount; ++i, ++offsetPtr) {
388 *offsetPtr = SkEndian_SwapBE32(extra);
389 }
390
391 // Fix up offsets in sfnt table entries.
392 SkSFNTHeader* sfntHeader = SkTAddOffset<SkSFNTHeader>(fontPackageBuffer. get(), extra);
393 int numTables = SkEndian_SwapBE16(sfntHeader->numTables);
394 SkSFNTHeader::TableDirectoryEntry* tableDirectory =
395 SkTAfter<SkSFNTHeader::TableDirectoryEntry>(sfntHeader);
396 for (int i = 0; i < numTables; ++i, ++tableDirectory) {
397 tableDirectory->offset = SkEndian_SwapBE32(
398 SkEndian_SwapBE32(tableDirectory->offset) + extra);
399 }
400 } else {
401 extra = 0;
402 fontPackageBuffer.realloc(bytesWritten);
403 }
404
405 SkAutoTUnref<SkMemoryStream> newStream(new SkMemoryStream());
406 newStream->setMemoryOwned(fontPackageBuffer.detach(), bytesWritten + extra);
407
366 SkTScopedComPtr<IStream> newIStream; 408 SkTScopedComPtr<IStream> newIStream;
367 SkIStream::CreateFromSkStream(newStream, true, &newIStream); 409 SkIStream::CreateFromSkStream(newStream.detach(), true, &newIStream);
368 410
369 XPS_FONT_EMBEDDING embedding; 411 XPS_FONT_EMBEDDING embedding;
370 HRM(current->xpsFont->GetEmbeddingOption(&embedding), 412 HRM(current->xpsFont->GetEmbeddingOption(&embedding),
371 "Could not get embedding option from font."); 413 "Could not get embedding option from font.");
372 414
373 SkTScopedComPtr<IOpcPartUri> partUri; 415 SkTScopedComPtr<IOpcPartUri> partUri;
374 HRM(current->xpsFont->GetPartName(&partUri), 416 HRM(current->xpsFont->GetPartName(&partUri),
375 "Could not get part uri from font."); 417 "Could not get part uri from font.");
376 418
377 HRM(current->xpsFont->SetContent( 419 HRM(current->xpsFont->SetContent(
(...skipping 1649 matching lines...) Expand 10 before | Expand all | Expand 10 after
2027 return S_OK; 2069 return S_OK;
2028 } 2070 }
2029 } 2071 }
2030 } 2072 }
2031 2073
2032 //TODO: create glyph only fonts 2074 //TODO: create glyph only fonts
2033 //and let the host deal with what kind of font we're looking at. 2075 //and let the host deal with what kind of font we're looking at.
2034 XPS_FONT_EMBEDDING embedding = XPS_FONT_EMBEDDING_RESTRICTED; 2076 XPS_FONT_EMBEDDING embedding = XPS_FONT_EMBEDDING_RESTRICTED;
2035 2077
2036 SkTScopedComPtr<IStream> fontStream; 2078 SkTScopedComPtr<IStream> fontStream;
2037 SkStream* fontData = typeface->openStream(NULL); 2079 int ttcIndex;
2080 SkStream* fontData = typeface->openStream(&ttcIndex);
2038 HRM(SkIStream::CreateFromSkStream(fontData, true, &fontStream), 2081 HRM(SkIStream::CreateFromSkStream(fontData, true, &fontStream),
2039 "Could not create font stream."); 2082 "Could not create font stream.");
2040 2083
2041 const size_t size = 2084 const size_t size =
2042 SK_ARRAY_COUNT(L"/Resources/Fonts/" L_GUID_ID L".odttf"); 2085 SK_ARRAY_COUNT(L"/Resources/Fonts/" L_GUID_ID L".odttf");
2043 wchar_t buffer[size]; 2086 wchar_t buffer[size];
2044 wchar_t id[GUID_ID_LEN]; 2087 wchar_t id[GUID_ID_LEN];
2045 HR(create_id(id, GUID_ID_LEN)); 2088 HR(create_id(id, GUID_ID_LEN));
2046 swprintf_s(buffer, size, L"/Resources/Fonts/%s.odttf", id); 2089 swprintf_s(buffer, size, L"/Resources/Fonts/%s.odttf", id);
2047 2090
2048 SkTScopedComPtr<IOpcPartUri> partUri; 2091 SkTScopedComPtr<IOpcPartUri> partUri;
2049 HRM(this->fXpsFactory->CreatePartUri(buffer, &partUri), 2092 HRM(this->fXpsFactory->CreatePartUri(buffer, &partUri),
2050 "Could not create font resource part uri."); 2093 "Could not create font resource part uri.");
2051 2094
2052 SkTScopedComPtr<IXpsOMFontResource> xpsFontResource; 2095 SkTScopedComPtr<IXpsOMFontResource> xpsFontResource;
2053 HRM(this->fXpsFactory->CreateFontResource(fontStream.get(), 2096 HRM(this->fXpsFactory->CreateFontResource(fontStream.get(),
2054 embedding, 2097 embedding,
2055 partUri.get(), 2098 partUri.get(),
2056 FALSE, 2099 FALSE,
2057 &xpsFontResource), 2100 &xpsFontResource),
2058 "Could not create font resource."); 2101 "Could not create font resource.");
2059 2102
2103 //TODO: change openStream to return -1 for non-ttc, get rid of this.
2104 uint8_t* data = (uint8_t*)fontData->getMemoryBase();
2105 bool isTTC = (data &&
2106 fontData->getLength() >= sizeof(SkTTCFHeader) &&
2107 ((SkTTCFHeader*)data)->ttcTag == SkTTCFHeader::TAG);
2108
2060 TypefaceUse& newTypefaceUse = this->fTypefaces.push_back(); 2109 TypefaceUse& newTypefaceUse = this->fTypefaces.push_back();
2061 newTypefaceUse.typefaceId = typefaceID; 2110 newTypefaceUse.typefaceId = typefaceID;
2111 newTypefaceUse.ttcIndex = isTTC ? ttcIndex : -1;
2062 newTypefaceUse.fontData = fontData; 2112 newTypefaceUse.fontData = fontData;
2063 newTypefaceUse.xpsFont = xpsFontResource.release(); 2113 newTypefaceUse.xpsFont = xpsFontResource.release();
2064 2114
2065 SkAutoGlyphCache agc = SkAutoGlyphCache(paint, NULL, &SkMatrix::I()); 2115 SkAutoGlyphCache agc = SkAutoGlyphCache(paint, NULL, &SkMatrix::I());
2066 SkGlyphCache* glyphCache = agc.getCache(); 2116 SkGlyphCache* glyphCache = agc.getCache();
2067 unsigned int glyphCount = glyphCache->getGlyphCount(); 2117 unsigned int glyphCount = glyphCache->getGlyphCount();
2068 newTypefaceUse.glyphsUsed = new SkBitSet(glyphCount); 2118 newTypefaceUse.glyphsUsed = new SkBitSet(glyphCount);
2069 2119
2070 *typefaceUse = &newTypefaceUse; 2120 *typefaceUse = &newTypefaceUse;
2071 return S_OK; 2121 return S_OK;
2072 } 2122 }
2073 2123
2074 HRESULT SkXPSDevice::AddGlyphs(const SkDraw& d, 2124 HRESULT SkXPSDevice::AddGlyphs(const SkDraw& d,
2075 IXpsOMObjectFactory* xpsFactory, 2125 IXpsOMObjectFactory* xpsFactory,
2076 IXpsOMCanvas* canvas, 2126 IXpsOMCanvas* canvas,
2077 IXpsOMFontResource* font, 2127 TypefaceUse* font,
2078 LPCWSTR text, 2128 LPCWSTR text,
2079 XPS_GLYPH_INDEX* xpsGlyphs, 2129 XPS_GLYPH_INDEX* xpsGlyphs,
2080 UINT32 xpsGlyphsLen, 2130 UINT32 xpsGlyphsLen,
2081 XPS_POINT *origin, 2131 XPS_POINT *origin,
2082 FLOAT fontSize, 2132 FLOAT fontSize,
2083 XPS_STYLE_SIMULATION sims, 2133 XPS_STYLE_SIMULATION sims,
2084 const SkMatrix& transform, 2134 const SkMatrix& transform,
2085 const SkPaint& paint) { 2135 const SkPaint& paint) {
2086 SkTScopedComPtr<IXpsOMGlyphs> glyphs; 2136 SkTScopedComPtr<IXpsOMGlyphs> glyphs;
2087 HRM(xpsFactory->CreateGlyphs(font, &glyphs), "Could not create glyphs."); 2137 HRM(xpsFactory->CreateGlyphs(font->xpsFont, &glyphs), "Could not create glyp hs.");
2138 HRM(glyphs->SetFontFaceIndex(font->ttcIndex), "Could not set glyph font face index.");
2088 2139
2089 //XPS uses affine transformations for everything... 2140 //XPS uses affine transformations for everything...
2090 //...except positioning text. 2141 //...except positioning text.
2091 bool useCanvasForClip; 2142 bool useCanvasForClip;
2092 if ((transform.getType() & ~SkMatrix::kTranslate_Mask) == 0) { 2143 if ((transform.getType() & ~SkMatrix::kTranslate_Mask) == 0) {
2093 origin->x += SkScalarToFLOAT(transform.getTranslateX()); 2144 origin->x += SkScalarToFLOAT(transform.getTranslateX());
2094 origin->y += SkScalarToFLOAT(transform.getTranslateY()); 2145 origin->y += SkScalarToFLOAT(transform.getTranslateY());
2095 useCanvasForClip = false; 2146 useCanvasForClip = false;
2096 } else { 2147 } else {
2097 SkTScopedComPtr<IXpsOMMatrixTransform> xpsMatrixToUse; 2148 SkTScopedComPtr<IXpsOMMatrixTransform> xpsMatrixToUse;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
2275 XPS_POINT origin = { 2326 XPS_POINT origin = {
2276 procs.xpsGlyphs[0].horizontalOffset / procs.centemPerUnit, 2327 procs.xpsGlyphs[0].horizontalOffset / procs.centemPerUnit,
2277 procs.xpsGlyphs[0].verticalOffset / -procs.centemPerUnit, 2328 procs.xpsGlyphs[0].verticalOffset / -procs.centemPerUnit,
2278 }; 2329 };
2279 procs.xpsGlyphs[0].horizontalOffset = 0.0f; 2330 procs.xpsGlyphs[0].horizontalOffset = 0.0f;
2280 procs.xpsGlyphs[0].verticalOffset = 0.0f; 2331 procs.xpsGlyphs[0].verticalOffset = 0.0f;
2281 2332
2282 HRV(AddGlyphs(d, 2333 HRV(AddGlyphs(d,
2283 this->fXpsFactory.get(), 2334 this->fXpsFactory.get(),
2284 this->fCurrentXpsCanvas.get(), 2335 this->fCurrentXpsCanvas.get(),
2285 typeface->xpsFont, 2336 typeface,
2286 NULL, 2337 NULL,
2287 procs.xpsGlyphs.begin(), procs.xpsGlyphs.count(), 2338 procs.xpsGlyphs.begin(), procs.xpsGlyphs.count(),
2288 &origin, 2339 &origin,
2289 SkScalarToFLOAT(paint.getTextSize()), 2340 SkScalarToFLOAT(paint.getTextSize()),
2290 XPS_STYLE_SIMULATION_NONE, 2341 XPS_STYLE_SIMULATION_NONE,
2291 *d.fMatrix, 2342 *d.fMatrix,
2292 paint)); 2343 paint));
2293 } 2344 }
2294 2345
2295 void SkXPSDevice::drawPosText(const SkDraw& d, 2346 void SkXPSDevice::drawPosText(const SkDraw& d,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2327 XPS_POINT origin = { 2378 XPS_POINT origin = {
2328 procs.xpsGlyphs[0].horizontalOffset / procs.centemPerUnit, 2379 procs.xpsGlyphs[0].horizontalOffset / procs.centemPerUnit,
2329 procs.xpsGlyphs[0].verticalOffset / -procs.centemPerUnit, 2380 procs.xpsGlyphs[0].verticalOffset / -procs.centemPerUnit,
2330 }; 2381 };
2331 procs.xpsGlyphs[0].horizontalOffset = 0.0f; 2382 procs.xpsGlyphs[0].horizontalOffset = 0.0f;
2332 procs.xpsGlyphs[0].verticalOffset = 0.0f; 2383 procs.xpsGlyphs[0].verticalOffset = 0.0f;
2333 2384
2334 HRV(AddGlyphs(d, 2385 HRV(AddGlyphs(d,
2335 this->fXpsFactory.get(), 2386 this->fXpsFactory.get(),
2336 this->fCurrentXpsCanvas.get(), 2387 this->fCurrentXpsCanvas.get(),
2337 typeface->xpsFont, 2388 typeface,
2338 NULL, 2389 NULL,
2339 procs.xpsGlyphs.begin(), procs.xpsGlyphs.count(), 2390 procs.xpsGlyphs.begin(), procs.xpsGlyphs.count(),
2340 &origin, 2391 &origin,
2341 SkScalarToFLOAT(paint.getTextSize()), 2392 SkScalarToFLOAT(paint.getTextSize()),
2342 XPS_STYLE_SIMULATION_NONE, 2393 XPS_STYLE_SIMULATION_NONE,
2343 *d.fMatrix, 2394 *d.fMatrix,
2344 paint)); 2395 paint));
2345 } 2396 }
2346 2397
2347 void SkXPSDevice::drawTextOnPath(const SkDraw& d, const void* text, size_t len, 2398 void SkXPSDevice::drawTextOnPath(const SkDraw& d, const void* text, size_t len,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2411 IID_PPV_ARGS(&this->fXpsFactory)), 2462 IID_PPV_ARGS(&this->fXpsFactory)),
2412 "Could not create factory for layer."); 2463 "Could not create factory for layer.");
2413 2464
2414 HRVM(this->fXpsFactory->CreateCanvas(&this->fCurrentXpsCanvas), 2465 HRVM(this->fXpsFactory->CreateCanvas(&this->fCurrentXpsCanvas),
2415 "Could not create canvas for layer."); 2466 "Could not create canvas for layer.");
2416 } 2467 }
2417 2468
2418 bool SkXPSDevice::allowImageFilter(SkImageFilter*) { 2469 bool SkXPSDevice::allowImageFilter(SkImageFilter*) {
2419 return false; 2470 return false;
2420 } 2471 }
OLDNEW
« no previous file with comments | « include/device/xps/SkXPSDevice.h ('k') | src/sfnt/SkOTTable_name.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698