| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrDrawState.h" | 8 #include "GrDrawState.h" |
| 9 #include "GrPaint.h" | 9 #include "GrPaint.h" |
| 10 | 10 |
| 11 bool GrDrawState::setIdentityViewMatrix() { |
| 12 SkMatrix invVM; |
| 13 bool inverted = false; |
| 14 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
| 15 if (this->isStageEnabled(s)) { |
| 16 if (!inverted) { |
| 17 if (!fCommon.fViewMatrix.invert(&invVM)) { |
| 18 // sad trombone sound |
| 19 return false; |
| 20 } |
| 21 inverted = true; |
| 22 } |
| 23 fStages[s].localCoordChange(invVM); |
| 24 } |
| 25 } |
| 26 fCommon.fViewMatrix.reset(); |
| 27 return true; |
| 28 } |
| 29 |
| 11 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
rTarget* rt) { | 30 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
rTarget* rt) { |
| 12 for (int i = 0; i < GrPaint::kMaxColorStages; ++i) { | 31 for (int i = 0; i < GrPaint::kMaxColorStages; ++i) { |
| 13 int s = i + GrPaint::kFirstColorStage; | 32 int s = i + GrPaint::kFirstColorStage; |
| 14 if (paint.isColorStageEnabled(i)) { | 33 if (paint.isColorStageEnabled(i)) { |
| 15 fStages[s] = paint.getColorStage(i); | 34 fStages[s] = paint.getColorStage(i); |
| 16 } else { | 35 } else { |
| 17 fStages[s].setEffect(NULL); | 36 fStages[s].setEffect(NULL); |
| 18 } | 37 } |
| 19 } | 38 } |
| 20 | 39 |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 // need blending. | 407 // need blending. |
| 389 return kDisableBlend_BlendOptFlag; | 408 return kDisableBlend_BlendOptFlag; |
| 390 } | 409 } |
| 391 return kNone_BlendOpt; | 410 return kNone_BlendOpt; |
| 392 } | 411 } |
| 393 | 412 |
| 394 //////////////////////////////////////////////////////////////////////////////// | 413 //////////////////////////////////////////////////////////////////////////////// |
| 395 | 414 |
| 396 void GrDrawState::AutoViewMatrixRestore::restore() { | 415 void GrDrawState::AutoViewMatrixRestore::restore() { |
| 397 if (NULL != fDrawState) { | 416 if (NULL != fDrawState) { |
| 398 fDrawState->setViewMatrix(fViewMatrix); | 417 fDrawState->fCommon.fViewMatrix = fViewMatrix; |
| 399 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | 418 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
| 400 if (fRestoreMask & (1 << s)) { | 419 if (fRestoreMask & (1 << s)) { |
| 401 fDrawState->fStages[s].restoreCoordChange(fSavedCoordChanges[s])
; | 420 fDrawState->fStages[s].restoreCoordChange(fSavedCoordChanges[s])
; |
| 402 } | 421 } |
| 403 } | 422 } |
| 423 fDrawState = NULL; |
| 404 } | 424 } |
| 405 fDrawState = NULL; | |
| 406 } | 425 } |
| 407 | 426 |
| 408 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState, | 427 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState, |
| 409 const SkMatrix& preconcatMatrix) { | 428 const SkMatrix& preconcatMatrix) { |
| 410 this->restore(); | 429 this->restore(); |
| 411 | 430 |
| 412 fDrawState = drawState; | 431 if (NULL == drawState || preconcatMatrix.isIdentity()) { |
| 413 if (NULL == drawState) { | |
| 414 return; | 432 return; |
| 415 } | 433 } |
| 434 fDrawState = drawState; |
| 416 | 435 |
| 417 fRestoreMask = 0; | 436 fRestoreMask = 0; |
| 418 fViewMatrix = drawState->getViewMatrix(); | 437 fViewMatrix = drawState->getViewMatrix(); |
| 419 drawState->preConcatViewMatrix(preconcatMatrix); | 438 drawState->fCommon.fViewMatrix.preConcat(preconcatMatrix); |
| 420 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | 439 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
| 421 if (drawState->isStageEnabled(s)) { | 440 if (drawState->isStageEnabled(s)) { |
| 422 fRestoreMask |= (1 << s); | 441 fRestoreMask |= (1 << s); |
| 423 fDrawState->fStages[s].saveCoordChange(&fSavedCoordChanges[s]); | 442 drawState->fStages[s].saveCoordChange(&fSavedCoordChanges[s]); |
| 424 drawState->fStages[s].localCoordChange(preconcatMatrix); | 443 drawState->fStages[s].localCoordChange(preconcatMatrix); |
| 425 } | 444 } |
| 426 } | 445 } |
| 427 } | 446 } |
| 428 | 447 |
| 429 //////////////////////////////////////////////////////////////////////////////// | 448 bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) { |
| 430 | |
| 431 void GrDrawState::AutoDeviceCoordDraw::restore() { | |
| 432 if (NULL != fDrawState) { | |
| 433 fDrawState->setViewMatrix(fViewMatrix); | |
| 434 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | |
| 435 if (fRestoreMask & (1 << s)) { | |
| 436 fDrawState->fStages[s].restoreCoordChange(fSavedCoordChanges[s])
; | |
| 437 } | |
| 438 } | |
| 439 } | |
| 440 fDrawState = NULL; | |
| 441 } | |
| 442 | |
| 443 bool GrDrawState::AutoDeviceCoordDraw::set(GrDrawState* drawState) { | |
| 444 GrAssert(NULL != drawState); | |
| 445 | |
| 446 this->restore(); | 449 this->restore(); |
| 447 | 450 |
| 448 fDrawState = drawState; | 451 if (NULL == drawState) { |
| 449 if (NULL == fDrawState) { | |
| 450 return false; | 452 return false; |
| 451 } | 453 } |
| 452 | 454 |
| 455 if (drawState->getViewMatrix().isIdentity()) { |
| 456 return true; |
| 457 } |
| 458 |
| 453 fViewMatrix = drawState->getViewMatrix(); | 459 fViewMatrix = drawState->getViewMatrix(); |
| 454 fRestoreMask = 0; | 460 fRestoreMask = 0; |
| 455 SkMatrix invVM; | |
| 456 bool inverted = false; | |
| 457 | |
| 458 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | 461 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
| 459 if (drawState->isStageEnabled(s)) { | 462 if (drawState->isStageEnabled(s)) { |
| 460 if (!inverted && !fViewMatrix.invert(&invVM)) { | |
| 461 // sad trombone sound | |
| 462 fDrawState = NULL; | |
| 463 return false; | |
| 464 } else { | |
| 465 inverted = true; | |
| 466 } | |
| 467 fRestoreMask |= (1 << s); | 463 fRestoreMask |= (1 << s); |
| 468 GrEffectStage* stage = drawState->fStages + s; | 464 drawState->fStages[s].saveCoordChange(&fSavedCoordChanges[s]); |
| 469 stage->saveCoordChange(&fSavedCoordChanges[s]); | |
| 470 stage->localCoordChange(invVM); | |
| 471 } | 465 } |
| 472 } | 466 } |
| 473 drawState->viewMatrix()->reset(); | 467 if (!drawState->setIdentityViewMatrix()) { |
| 468 return false; |
| 469 } |
| 470 fDrawState = drawState; |
| 474 return true; | 471 return true; |
| 475 } | 472 } |
| OLD | NEW |