| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkPath.h" | 8 #include "SkPath.h" |
| 9 #include "SkRect.h" | 9 #include "SkRect.h" |
| 10 #include "SkRemote.h" | 10 #include "SkRemote.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 | 96 |
| 97 Cache* Cache::CreateNeverCache() { | 97 Cache* Cache::CreateNeverCache() { |
| 98 struct NeverCache final : public Cache { | 98 struct NeverCache final : public Cache { |
| 99 NeverCache() | 99 NeverCache() |
| 100 : fNextMatrix (Type::kMatrix) | 100 : fNextMatrix (Type::kMatrix) |
| 101 , fNextMisc (Type::kMisc) | 101 , fNextMisc (Type::kMisc) |
| 102 , fNextPath (Type::kPath) | 102 , fNextPath (Type::kPath) |
| 103 , fNextStroke (Type::kStroke) | 103 , fNextStroke (Type::kStroke) |
| 104 , fNextShader (Type::kShader) |
| 104 , fNextXfermode(Type::kXfermode) | 105 , fNextXfermode(Type::kXfermode) |
| 105 {} | 106 {} |
| 106 void cleanup(Encoder*) override {} | 107 void cleanup(Encoder*) override {} |
| 107 | 108 |
| 108 static bool Helper(ID* next, ID* id, LookupScope* ls) { | 109 static bool Helper(ID* next, ID* id, LookupScope* ls) { |
| 109 *id = ++(*next); | 110 *id = ++(*next); |
| 110 ls->undefineWhenDone(*id); | 111 ls->undefineWhenDone(*id); |
| 111 return false; | 112 return false; |
| 112 } | 113 } |
| 113 | 114 |
| 114 bool lookup(const SkMatrix&, ID* id, LookupScope* ls) override { | 115 bool lookup(const SkMatrix&, ID* id, LookupScope* ls) override { |
| 115 return Helper(&fNextMatrix, id, ls); | 116 return Helper(&fNextMatrix, id, ls); |
| 116 } | 117 } |
| 117 bool lookup(const Misc&, ID* id, LookupScope* ls) override { | 118 bool lookup(const Misc&, ID* id, LookupScope* ls) override { |
| 118 return Helper(&fNextMisc, id, ls); | 119 return Helper(&fNextMisc, id, ls); |
| 119 } | 120 } |
| 120 bool lookup(const SkPath&, ID* id, LookupScope* ls) override { | 121 bool lookup(const SkPath&, ID* id, LookupScope* ls) override { |
| 121 return Helper(&fNextPath, id, ls); | 122 return Helper(&fNextPath, id, ls); |
| 122 } | 123 } |
| 123 bool lookup(const Stroke&, ID* id, LookupScope* ls) override { | 124 bool lookup(const Stroke&, ID* id, LookupScope* ls) override { |
| 124 return Helper(&fNextStroke, id, ls); | 125 return Helper(&fNextStroke, id, ls); |
| 125 } | 126 } |
| 127 bool lookup(const SkShader* shader, ID* id, LookupScope* ls) overrid
e { |
| 128 if (!shader) { |
| 129 *id = ID(Type::kShader); |
| 130 return true; // Null IDs are always defined. |
| 131 } |
| 132 return Helper(&fNextShader, id, ls); |
| 133 } |
| 126 bool lookup(const SkXfermode* xfermode, ID* id, LookupScope* ls) ove
rride { | 134 bool lookup(const SkXfermode* xfermode, ID* id, LookupScope* ls) ove
rride { |
| 127 if (!xfermode) { | 135 if (!xfermode) { |
| 128 *id = ID(Type::kXfermode); | 136 *id = ID(Type::kXfermode); |
| 129 return true; // Null IDs are always defined. | 137 return true; // Null IDs are always defined. |
| 130 } | 138 } |
| 131 return Helper(&fNextXfermode, id, ls); | 139 return Helper(&fNextXfermode, id, ls); |
| 132 } | 140 } |
| 133 | 141 |
| 134 ID fNextMatrix, | 142 ID fNextMatrix, |
| 135 fNextMisc, | 143 fNextMisc, |
| 136 fNextPath, | 144 fNextPath, |
| 137 fNextStroke, | 145 fNextStroke, |
| 146 fNextShader, |
| 138 fNextXfermode; | 147 fNextXfermode; |
| 139 }; | 148 }; |
| 140 return new NeverCache; | 149 return new NeverCache; |
| 141 } | 150 } |
| 142 | 151 |
| 143 // These can't be declared locally inside AlwaysCache because of the templat
ing. :( | 152 // These can't be declared locally inside AlwaysCache because of the templat
ing. :( |
| 144 namespace { | 153 namespace { |
| 145 template <typename T, typename Map> | 154 template <typename T, typename Map> |
| 146 static bool always_cache_lookup(const T& val, Map* map, ID* next, ID* id
) { | 155 static bool always_cache_lookup(const T& val, Map* map, ID* next, ID* id
) { |
| 147 if (const ID* found = map->find(val)) { | 156 if (const ID* found = map->find(val)) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 }; | 199 }; |
| 191 } // namespace | 200 } // namespace |
| 192 | 201 |
| 193 Cache* Cache::CreateAlwaysCache() { | 202 Cache* Cache::CreateAlwaysCache() { |
| 194 struct AlwaysCache final : public Cache { | 203 struct AlwaysCache final : public Cache { |
| 195 AlwaysCache() | 204 AlwaysCache() |
| 196 : fNextMatrix (Type::kMatrix) | 205 : fNextMatrix (Type::kMatrix) |
| 197 , fNextMisc (Type::kMisc) | 206 , fNextMisc (Type::kMisc) |
| 198 , fNextPath (Type::kPath) | 207 , fNextPath (Type::kPath) |
| 199 , fNextStroke (Type::kStroke) | 208 , fNextStroke (Type::kStroke) |
| 209 , fNextShader (Type::kShader) |
| 200 , fNextXfermode(Type::kXfermode) | 210 , fNextXfermode(Type::kXfermode) |
| 201 {} | 211 {} |
| 202 | 212 |
| 203 void cleanup(Encoder* encoder) override { | 213 void cleanup(Encoder* encoder) override { |
| 204 Undefiner undef{encoder}; | 214 Undefiner undef{encoder}; |
| 205 fMatrix .foreach(undef); | 215 fMatrix .foreach(undef); |
| 206 fMisc .foreach(undef); | 216 fMisc .foreach(undef); |
| 207 fPath .foreach(undef); | 217 fPath .foreach(undef); |
| 208 fStroke .foreach(undef); | 218 fStroke .foreach(undef); |
| 219 fShader .foreach(undef); |
| 209 fXfermode.foreach(undef); | 220 fXfermode.foreach(undef); |
| 210 } | 221 } |
| 211 | 222 |
| 212 | 223 |
| 213 bool lookup(const SkMatrix& matrix, ID* id, LookupScope*) override { | 224 bool lookup(const SkMatrix& matrix, ID* id, LookupScope*) override { |
| 214 return always_cache_lookup(matrix, &fMatrix, &fNextMatrix, id); | 225 return always_cache_lookup(matrix, &fMatrix, &fNextMatrix, id); |
| 215 } | 226 } |
| 216 bool lookup(const Misc& misc, ID* id, LookupScope*) override { | 227 bool lookup(const Misc& misc, ID* id, LookupScope*) override { |
| 217 return always_cache_lookup(misc, &fMisc, &fNextMisc, id); | 228 return always_cache_lookup(misc, &fMisc, &fNextMisc, id); |
| 218 } | 229 } |
| 219 bool lookup(const SkPath& path, ID* id, LookupScope*) override { | 230 bool lookup(const SkPath& path, ID* id, LookupScope*) override { |
| 220 return always_cache_lookup(path, &fPath, &fNextPath, id); | 231 return always_cache_lookup(path, &fPath, &fNextPath, id); |
| 221 } | 232 } |
| 222 bool lookup(const Stroke& stroke, ID* id, LookupScope*) override { | 233 bool lookup(const Stroke& stroke, ID* id, LookupScope*) override { |
| 223 return always_cache_lookup(stroke, &fStroke, &fNextStroke, id); | 234 return always_cache_lookup(stroke, &fStroke, &fNextStroke, id); |
| 224 } | 235 } |
| 236 bool lookup(const SkShader* shader, ID* id, LookupScope*) override { |
| 237 return always_cache_lookup(shader, &fShader, &fNextShader, id); |
| 238 } |
| 225 bool lookup(const SkXfermode* xfermode, ID* id, LookupScope*) overri
de { | 239 bool lookup(const SkXfermode* xfermode, ID* id, LookupScope*) overri
de { |
| 226 return always_cache_lookup(xfermode, &fXfermode, &fNextXfermode,
id); | 240 return always_cache_lookup(xfermode, &fXfermode, &fNextXfermode,
id); |
| 227 } | 241 } |
| 228 | 242 |
| 229 SkTHashMap<SkMatrix, ID> fMatrix; | 243 SkTHashMap<SkMatrix, ID> fMatrix; |
| 230 SkTHashMap<Misc, ID, MiscHash> fMisc; | 244 SkTHashMap<Misc, ID, MiscHash> fMisc; |
| 231 SkTHashMap<SkPath, ID> fPath; | 245 SkTHashMap<SkPath, ID> fPath; |
| 232 SkTHashMap<Stroke, ID> fStroke; | 246 SkTHashMap<Stroke, ID> fStroke; |
| 247 RefKeyMap<SkShader, Type::kShader> fShader; |
| 233 RefKeyMap<SkXfermode, Type::kXfermode> fXfermode; | 248 RefKeyMap<SkXfermode, Type::kXfermode> fXfermode; |
| 234 | 249 |
| 235 ID fNextMatrix, | 250 ID fNextMatrix, |
| 236 fNextMisc, | 251 fNextMisc, |
| 237 fNextPath, | 252 fNextPath, |
| 238 fNextStroke, | 253 fNextStroke, |
| 254 fNextShader, |
| 239 fNextXfermode; | 255 fNextXfermode; |
| 240 }; | 256 }; |
| 241 return new AlwaysCache; | 257 return new AlwaysCache; |
| 242 } | 258 } |
| 243 | 259 |
| 244 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // | 260 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // |
| 245 | 261 |
| 246 Client::Client(Cache* cache, Encoder* encoder) | 262 Client::Client(Cache* cache, Encoder* encoder) |
| 247 : SkCanvas(1,1) | 263 : SkCanvas(1,1) |
| 248 , fCache(cache) | 264 , fCache(cache) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 SkPath path; | 302 SkPath path; |
| 287 path.addRRect(outside); | 303 path.addRRect(outside); |
| 288 path.addRRect(inside, SkPath::kCCW_Direction); | 304 path.addRRect(inside, SkPath::kCCW_Direction); |
| 289 this->onDrawPath(path, paint); | 305 this->onDrawPath(path, paint); |
| 290 } | 306 } |
| 291 | 307 |
| 292 void Client::onDrawPath(const SkPath& path, const SkPaint& paint) { | 308 void Client::onDrawPath(const SkPath& path, const SkPaint& paint) { |
| 293 LookupScope ls(fCache, fEncoder); | 309 LookupScope ls(fCache, fEncoder); |
| 294 ID p = ls.lookup(path), | 310 ID p = ls.lookup(path), |
| 295 m = ls.lookup(Misc::CreateFrom(paint)), | 311 m = ls.lookup(Misc::CreateFrom(paint)), |
| 312 s = ls.lookup(paint.getShader()), |
| 296 x = ls.lookup(paint.getXfermode()); | 313 x = ls.lookup(paint.getXfermode()); |
| 297 | 314 |
| 298 if (paint.getStyle() == SkPaint::kFill_Style) { | 315 if (paint.getStyle() == SkPaint::kFill_Style) { |
| 299 fEncoder->fillPath(p, m, x); | 316 fEncoder->fillPath(p, m, s, x); |
| 300 } else { | 317 } else { |
| 301 // TODO: handle kStrokeAndFill_Style | 318 // TODO: handle kStrokeAndFill_Style |
| 302 fEncoder->strokePath(p, m, x, ls.lookup(Stroke::CreateFrom(paint))); | 319 fEncoder->strokePath(p, m, s, x, ls.lookup(Stroke::CreateFrom(paint)
)); |
| 303 } | 320 } |
| 304 } | 321 } |
| 305 | 322 |
| 306 void Client::onDrawPaint(const SkPaint& paint) { | 323 void Client::onDrawPaint(const SkPaint& paint) { |
| 307 SkPath path; | 324 SkPath path; |
| 308 path.setFillType(SkPath::kInverseWinding_FillType); // Either inverse F
illType works fine. | 325 path.setFillType(SkPath::kInverseWinding_FillType); // Either inverse F
illType works fine. |
| 309 this->onDrawPath(path, paint); | 326 this->onDrawPath(path, paint); |
| 310 } | 327 } |
| 311 | 328 |
| 312 void Client::onDrawText(const void* text, size_t byteLength, SkScalar x, | 329 void Client::onDrawText(const void* text, size_t byteLength, SkScalar x, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } | 373 } |
| 357 | 374 |
| 358 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // | 375 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // |
| 359 | 376 |
| 360 Server::Server(SkCanvas* canvas) : fCanvas(canvas) {} | 377 Server::Server(SkCanvas* canvas) : fCanvas(canvas) {} |
| 361 | 378 |
| 362 void Server::define(ID id, const SkMatrix& v) { fMatrix .set(id, v); } | 379 void Server::define(ID id, const SkMatrix& v) { fMatrix .set(id, v); } |
| 363 void Server::define(ID id, const Misc& v) { fMisc .set(id, v); } | 380 void Server::define(ID id, const Misc& v) { fMisc .set(id, v); } |
| 364 void Server::define(ID id, const SkPath& v) { fPath .set(id, v); } | 381 void Server::define(ID id, const SkPath& v) { fPath .set(id, v); } |
| 365 void Server::define(ID id, const Stroke& v) { fStroke .set(id, v); } | 382 void Server::define(ID id, const Stroke& v) { fStroke .set(id, v); } |
| 383 void Server::define(ID id, SkShader* v) { fShader .set(id, v); } |
| 366 void Server::define(ID id, SkXfermode* v) { fXfermode.set(id, v); } | 384 void Server::define(ID id, SkXfermode* v) { fXfermode.set(id, v); } |
| 367 | 385 |
| 368 void Server::undefine(ID id) { | 386 void Server::undefine(ID id) { |
| 369 switch(id.type()) { | 387 switch(id.type()) { |
| 370 case Type::kMatrix: return fMatrix .remove(id); | 388 case Type::kMatrix: return fMatrix .remove(id); |
| 371 case Type::kMisc: return fMisc .remove(id); | 389 case Type::kMisc: return fMisc .remove(id); |
| 372 case Type::kPath: return fPath .remove(id); | 390 case Type::kPath: return fPath .remove(id); |
| 373 case Type::kStroke: return fStroke .remove(id); | 391 case Type::kStroke: return fStroke .remove(id); |
| 392 case Type::kShader: return fShader .remove(id); |
| 374 case Type::kXfermode: return fXfermode.remove(id); | 393 case Type::kXfermode: return fXfermode.remove(id); |
| 375 | 394 |
| 376 case Type::kNone: SkASSERT(false); | 395 case Type::kNone: SkASSERT(false); |
| 377 }; | 396 }; |
| 378 } | 397 } |
| 379 | 398 |
| 380 void Server:: save() { fCanvas->save(); } | 399 void Server:: save() { fCanvas->save(); } |
| 381 void Server::restore() { fCanvas->restore(); } | 400 void Server::restore() { fCanvas->restore(); } |
| 382 | 401 |
| 383 void Server::setMatrix(ID matrix) { fCanvas->setMatrix(fMatrix.find(matrix))
; } | 402 void Server::setMatrix(ID matrix) { fCanvas->setMatrix(fMatrix.find(matrix))
; } |
| 384 | 403 |
| 385 void Server::clipPath(ID path, SkRegion::Op op, bool aa) { | 404 void Server::clipPath(ID path, SkRegion::Op op, bool aa) { |
| 386 fCanvas->clipPath(fPath.find(path), op, aa); | 405 fCanvas->clipPath(fPath.find(path), op, aa); |
| 387 } | 406 } |
| 388 void Server::fillPath(ID path, ID misc, ID xfermode) { | 407 void Server::fillPath(ID path, ID misc, ID shader, ID xfermode) { |
| 389 SkPaint paint; | 408 SkPaint paint; |
| 390 paint.setStyle(SkPaint::kFill_Style); | 409 paint.setStyle(SkPaint::kFill_Style); |
| 391 fMisc.find(misc).applyTo(&paint); | 410 fMisc.find(misc).applyTo(&paint); |
| 411 paint.setShader (fShader .find(shader)); |
| 392 paint.setXfermode(fXfermode.find(xfermode)); | 412 paint.setXfermode(fXfermode.find(xfermode)); |
| 393 fCanvas->drawPath(fPath.find(path), paint); | 413 fCanvas->drawPath(fPath.find(path), paint); |
| 394 } | 414 } |
| 395 void Server::strokePath(ID path, ID misc, ID xfermode, ID stroke) { | 415 void Server::strokePath(ID path, ID misc, ID shader, ID xfermode, ID stroke)
{ |
| 396 SkPaint paint; | 416 SkPaint paint; |
| 397 paint.setStyle(SkPaint::kStroke_Style); | 417 paint.setStyle(SkPaint::kStroke_Style); |
| 398 fMisc .find(misc ).applyTo(&paint); | 418 fMisc .find(misc ).applyTo(&paint); |
| 399 fStroke.find(stroke).applyTo(&paint); | 419 fStroke.find(stroke).applyTo(&paint); |
| 420 paint.setShader (fShader .find(shader)); |
| 400 paint.setXfermode(fXfermode.find(xfermode)); | 421 paint.setXfermode(fXfermode.find(xfermode)); |
| 401 fCanvas->drawPath(fPath.find(path), paint); | 422 fCanvas->drawPath(fPath.find(path), paint); |
| 402 } | 423 } |
| 403 | 424 |
| 404 } // namespace SkRemote | 425 } // namespace SkRemote |
| OLD | NEW |