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

Side by Side Diff: src/core/SkShader.cpp

Issue 272593002: add localmatrix-shader (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 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
« include/core/SkShader.h ('K') | « samplecode/SamplePatch.cpp ('k') | no next file » | 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 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 "SkBitmapProcShader.h" 8 #include "SkBitmapProcShader.h"
9 #include "SkEmptyShader.h" 9 #include "SkEmptyShader.h"
10 #include "SkReadBuffer.h" 10 #include "SkReadBuffer.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 } 68 }
69 69
70 SkShader::Context* SkShader::onCreateContext(const ContextRec& rec, void*) const { 70 SkShader::Context* SkShader::onCreateContext(const ContextRec& rec, void*) const {
71 return NULL; 71 return NULL;
72 } 72 }
73 73
74 size_t SkShader::contextSize() const { 74 size_t SkShader::contextSize() const {
75 return 0; 75 return 0;
76 } 76 }
77 77
78 SkShader* SkShader::refLocalMatrixShader(SkMatrix*) const {
79 return false;
80 }
81
78 SkShader::Context::Context(const SkShader& shader, const ContextRec& rec) 82 SkShader::Context::Context(const SkShader& shader, const ContextRec& rec)
79 : fShader(shader), fCTM(*rec.fMatrix) 83 : fShader(shader), fCTM(*rec.fMatrix)
80 { 84 {
81 // Because the context parameters must be valid at this point, we know that the matrix is 85 // Because the context parameters must be valid at this point, we know that the matrix is
82 // invertible. 86 // invertible.
83 SkAssertResult(fShader.computeTotalInverse(rec, &fTotalInverse)); 87 SkAssertResult(fShader.computeTotalInverse(rec, &fTotalInverse));
84 fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse); 88 fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse);
85 89
86 fPaintAlpha = rec.fPaint->getAlpha(); 90 fPaintAlpha = rec.fPaint->getAlpha();
87 } 91 }
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 #include "SkEmptyShader.h" 341 #include "SkEmptyShader.h"
338 342
339 void SkEmptyShader::toString(SkString* str) const { 343 void SkEmptyShader::toString(SkString* str) const {
340 str->append("SkEmptyShader: ("); 344 str->append("SkEmptyShader: (");
341 345
342 this->INHERITED::toString(str); 346 this->INHERITED::toString(str);
343 347
344 str->append(")"); 348 str->append(")");
345 } 349 }
346 #endif 350 #endif
351
352 //////////////////////////////////////////////////////////////////////////////// //
353
354 class SkLocalMatrixShader : public SkShader {
scroggo 2014/05/07 14:15:41 Would it make sense to put this in its own file?
reed1 2014/05/07 20:37:31 If it get big enough, yes. When I begin, it was pr
355 public:
356 SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
357 : fProxyShader(SkRef(proxy))
358 , fProxyLocalMatrix(localMatrix)
359 {}
360
361 virtual size_t contextSize() const SK_OVERRIDE {
362 return fProxyShader->contextSize();
363 }
364
365 virtual SkShader* refLocalMatrixShader(SkMatrix* localMatrix) const SK_OVERR IDE {
366 if (localMatrix) {
367 *localMatrix = fProxyLocalMatrix;
368 }
369 return SkRef(fProxyShader.get());
370 }
371
372 SK_TO_STRING_OVERRIDE()
373 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
374
375 protected:
376 SkLocalMatrixShader(SkReadBuffer&);
377 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
378 virtual Context* onCreateContext(const ContextRec&, void*) const SK_OVERRIDE ;
379
380 private:
381 SkAutoTUnref<SkShader> fProxyShader;
382 SkMatrix fProxyLocalMatrix;
383
384 typedef SkShader INHERITED;
385 };
386
387 SkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffe r) {
388 buffer.readMatrix(&fProxyLocalMatrix);
389 fProxyShader.reset(buffer.readFlattenable<SkShader>());
390 if (NULL == fProxyShader.get()) {
391 sk_throw();
392 }
393 }
394
395 void SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const {
396 this->INHERITED::flatten(buffer);
397 buffer.writeMatrix(fProxyLocalMatrix);
398 buffer.writeFlattenable(fProxyShader.get());
399 }
400
401 SkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec,
scroggo 2014/05/07 14:15:41 Doesn't this class need to also override asNewEffe
reed1 2014/05/07 20:37:31 Indeed, I need to forward all of those guys. Maybe
402 void* storage) const {
403 ContextRec newRec(rec);
404 SkMatrix tmp;
405 if (rec.fLocalMatrix) {
406 tmp.setConcat(*rec.fLocalMatrix, fProxyLocalMatrix);
scroggo 2014/05/07 14:15:41 This ordering seems backwards to me. It appears to
reed1 2014/05/07 20:37:31 Good catch. Done.
407 newRec.fLocalMatrix = &tmp;
408 } else {
409 newRec.fLocalMatrix = &fProxyLocalMatrix;
410 }
411 return fProxyShader->createContext(newRec, storage);
412 }
413
414 #ifndef SK_IGNORE_TO_STRING
415 void SkLocalMatrixShader::toString(SkString* str) const {
416 str->append("SkLocalMatrixShader: (");
417
418 fProxyShader->toString(str);
419
420 this->INHERITED::toString(str);
421
422 str->append(")");
423 }
424 #endif
425
426 SkShader* SkShader::CreateLocalMatrixShader(SkShader* proxy, const SkMatrix& loc alMatrix) {
427 if (localMatrix.isIdentity()) {
428 return SkRef(proxy);
429 }
430
431 const SkMatrix* lm = &localMatrix;
432
433 SkMatrix otherLocalMatrix;
434 SkAutoTUnref<SkShader> otherProxy(proxy->refLocalMatrixShader(&otherLocalMat rix));
435 if (otherProxy.get()) {
436 otherLocalMatrix.postConcat(localMatrix);
437 lm = &otherLocalMatrix;
438 proxy = otherProxy.get();
439 }
440
441 return SkNEW_ARGS(SkLocalMatrixShader, (proxy, *lm));
442 }
443
OLDNEW
« include/core/SkShader.h ('K') | « samplecode/SamplePatch.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698