1cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen/* 2cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen * Copyright 2014 Google Inc. 3cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen * 4cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen * Use of this source code is governed by a BSD-style license that can be 5cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen * found in the LICENSE file. 6cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen */ 7cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 8cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#ifndef SkTextMapStateProc_DEFINED 9cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#define SkTextMapStateProc_DEFINED 10cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 11cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#include "SkPoint.h" 12cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#include "SkMatrix.h" 13cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 14cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunenclass SkTextMapStateProc { 15cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunenpublic: 16cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkTextMapStateProc(const SkMatrix& matrix, SkScalar y, int scalarsPerPosition) 17cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen : fMatrix(matrix) 18cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen , fProc(matrix.getMapXYProc()) 19cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen , fY(y) 20cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen , fScaleX(fMatrix.getScaleX()) 21cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen , fTransX(fMatrix.getTranslateX()) { 22cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 23cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (1 == scalarsPerPosition) { 24cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen unsigned mtype = fMatrix.getType(); 25cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { 26cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kX; 27cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 28cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fY = SkScalarMul(y, fMatrix.getScaleY()) + 29cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMatrix.getTranslateY(); 30cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (mtype & SkMatrix::kScale_Mask) { 31cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kOnlyScaleX; 32cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 33cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kOnlyTransX; 34cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 35cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 36cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 37cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kXY; 38cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 39cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 40cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 41cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen void operator()(const SkScalar pos[], SkPoint* loc) const; 42cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 43cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunenprivate: 44cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen const SkMatrix& fMatrix; 45cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen enum { 46cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kXY, 47cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kOnlyScaleX, 48cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kOnlyTransX, 49cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kX 50cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } fMapCase; 51cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen const SkMatrix::MapXYProc fProc; 52cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkScalar fY; // Ignored by kXY case. 53cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkScalar fScaleX, fTransX; // These are only used by Only... cases. 54cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen}; 55cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 56cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnuneninline void SkTextMapStateProc::operator()(const SkScalar pos[], SkPoint* loc) const { 57cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen switch(fMapCase) { 58cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kXY: 59cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fProc(fMatrix, pos[0], pos[1], loc); 60cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 61cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kOnlyScaleX: 62cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen loc->set(SkScalarMul(fScaleX, *pos) + fTransX, fY); 63cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 64cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kOnlyTransX: 65cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen loc->set(*pos + fTransX, fY); 66cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 67cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen default: 68cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkASSERT(false); 69cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kX: 70cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fProc(fMatrix, *pos, fY, loc); 71cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 72cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 73cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen} 74cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 75cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#endif 76cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 77