OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 #include "GrStencilAndCoverTextContext.h" | 8 #include "GrStencilAndCoverTextContext.h" |
9 #include "GrBitmapTextContext.h" | 9 #include "GrBitmapTextContext.h" |
10 #include "GrDrawTarget.h" | 10 #include "GrDrawTarget.h" |
11 #include "GrGpu.h" | 11 #include "GrGpu.h" |
12 #include "GrPath.h" | 12 #include "GrPath.h" |
13 #include "GrPathRange.h" | 13 #include "GrPathRange.h" |
14 #include "SkAutoKern.h" | |
15 #include "SkDraw.h" | 14 #include "SkDraw.h" |
16 #include "SkDrawProcs.h" | 15 #include "SkDrawProcs.h" |
17 #include "SkGlyphCache.h" | 16 #include "SkGlyphCache.h" |
18 #include "SkGpuDevice.h" | 17 #include "SkGpuDevice.h" |
19 #include "SkPath.h" | 18 #include "SkPath.h" |
20 #include "SkTextMapStateProc.h" | 19 #include "SkTextMapStateProc.h" |
21 #include "SkTextFormatParams.h" | 20 #include "SkTextFormatParams.h" |
22 | 21 |
23 GrStencilAndCoverTextContext::GrStencilAndCoverTextContext( | 22 GrStencilAndCoverTextContext::GrStencilAndCoverTextContext( |
24 GrContext* context, const SkDeviceProperties& properties) | 23 GrContext* context, const SkDeviceProperties& properties) |
(...skipping 30 matching lines...) Expand all Loading... |
55 && fContext->getMatrix().hasPerspective()) { | 54 && fContext->getMatrix().hasPerspective()) { |
56 return false; | 55 return false; |
57 } | 56 } |
58 | 57 |
59 // No color bitmap fonts. | 58 // No color bitmap fonts. |
60 SkScalerContext::Rec rec; | 59 SkScalerContext::Rec rec; |
61 SkScalerContext::MakeRec(paint, &fDeviceProperties, NULL, &rec); | 60 SkScalerContext::MakeRec(paint, &fDeviceProperties, NULL, &rec); |
62 return rec.getFormat() != SkMask::kARGB32_Format; | 61 return rec.getFormat() != SkMask::kARGB32_Format; |
63 } | 62 } |
64 | 63 |
65 void GrStencilAndCoverTextContext::onDrawText(const GrPaint& paint, | |
66 const SkPaint& skPaint, | |
67 const char text[], | |
68 size_t byteLength, | |
69 SkScalar x, SkScalar y) { | |
70 SkASSERT(byteLength == 0 || text != NULL); | |
71 | |
72 if (text == NULL || byteLength == 0 /*|| fRC->isEmpty()*/) { | |
73 return; | |
74 } | |
75 | |
76 // This is the slow path, mainly used by Skia unit tests. The other | |
77 // backends (8888, gpu, ...) use device-space dependent glyph caches. In | |
78 // order to match the glyph positions that the other code paths produce, we | |
79 // must also use device-space dependent glyph cache. This has the | |
80 // side-effect that the glyph shape outline will be in device-space, | |
81 // too. This in turn has the side-effect that NVPR can not stroke the paths, | |
82 // as the stroke in NVPR is defined in object-space. | |
83 // NOTE: here we have following coincidence that works at the moment: | |
84 // - When using the device-space glyphs, the transforms we pass to NVPR | |
85 // instanced drawing are the global transforms, and the view transform is | |
86 // identity. NVPR can not use non-affine transforms in the instanced | |
87 // drawing. This is taken care of by SkDraw::ShouldDrawTextAsPaths since it | |
88 // will turn off the use of device-space glyphs when perspective transforms | |
89 // are in use. | |
90 | |
91 this->init(paint, skPaint, byteLength, kMaxAccuracy_RenderMode, SkPoint::Mak
e(0, 0)); | |
92 | |
93 // Transform our starting point. | |
94 if (fNeedsDeviceSpaceGlyphs) { | |
95 SkPoint loc; | |
96 fContextInitialMatrix.mapXY(x, y, &loc); | |
97 x = loc.fX; | |
98 y = loc.fY; | |
99 } | |
100 | |
101 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); | |
102 | |
103 fTransformType = GrPathRendering::kTranslate_PathTransformType; | |
104 | |
105 const char* stop = text + byteLength; | |
106 | |
107 // Measure first if needed. | |
108 if (fSkPaint.getTextAlign() != SkPaint::kLeft_Align) { | |
109 SkFixed stopX = 0; | |
110 SkFixed stopY = 0; | |
111 | |
112 const char* textPtr = text; | |
113 while (textPtr < stop) { | |
114 // We don't need x, y here, since all subpixel variants will have th
e | |
115 // same advance. | |
116 const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &textPtr, 0, 0); | |
117 | |
118 stopX += glyph.fAdvanceX; | |
119 stopY += glyph.fAdvanceY; | |
120 } | |
121 SkASSERT(textPtr == stop); | |
122 | |
123 SkScalar alignX = SkFixedToScalar(stopX) * fTextRatio; | |
124 SkScalar alignY = SkFixedToScalar(stopY) * fTextRatio; | |
125 | |
126 if (fSkPaint.getTextAlign() == SkPaint::kCenter_Align) { | |
127 alignX = SkScalarHalf(alignX); | |
128 alignY = SkScalarHalf(alignY); | |
129 } | |
130 | |
131 x -= alignX; | |
132 y -= alignY; | |
133 } | |
134 | |
135 SkAutoKern autokern; | |
136 | |
137 SkFixed fixedSizeRatio = SkScalarToFixed(fTextRatio); | |
138 | |
139 SkFixed fx = SkScalarToFixed(x); | |
140 SkFixed fy = SkScalarToFixed(y); | |
141 while (text < stop) { | |
142 const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0); | |
143 fx += SkFixedMul_portable(autokern.adjust(glyph), fixedSizeRatio); | |
144 if (glyph.fWidth) { | |
145 this->appendGlyph(glyph.getGlyphID(), SkFixedToScalar(fx), SkFixedTo
Scalar(fy)); | |
146 } | |
147 | |
148 fx += SkFixedMul_portable(glyph.fAdvanceX, fixedSizeRatio); | |
149 fy += SkFixedMul_portable(glyph.fAdvanceY, fixedSizeRatio); | |
150 } | |
151 | |
152 this->finish(); | |
153 } | |
154 | |
155 void GrStencilAndCoverTextContext::onDrawPosText(const GrPaint& paint, | 64 void GrStencilAndCoverTextContext::onDrawPosText(const GrPaint& paint, |
156 const SkPaint& skPaint, | 65 const SkPaint& skPaint, |
157 const char text[], | 66 const char text[], |
158 size_t byteLength, | 67 size_t byteLength, |
159 const SkScalar pos[], | 68 const SkScalar pos[], |
160 int scalarsPerPosition, | 69 int scalarsPerPosition, |
161 const SkPoint& offset) { | 70 const SkPoint& offset) { |
162 SkASSERT(byteLength == 0 || text != NULL); | 71 SkASSERT(byteLength == 0 || text != NULL); |
163 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); | 72 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
164 | 73 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 | 335 |
427 SkGlyphCache::AttachCache(fGlyphCache); | 336 SkGlyphCache::AttachCache(fGlyphCache); |
428 fGlyphCache = NULL; | 337 fGlyphCache = NULL; |
429 | 338 |
430 fDrawTarget->drawState()->stencil()->setDisabled(); | 339 fDrawTarget->drawState()->stencil()->setDisabled(); |
431 fStateRestore.set(NULL); | 340 fStateRestore.set(NULL); |
432 fContext->setMatrix(fContextInitialMatrix); | 341 fContext->setMatrix(fContextInitialMatrix); |
433 GrTextContext::finish(); | 342 GrTextContext::finish(); |
434 } | 343 } |
435 | 344 |
OLD | NEW |