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: 1605c4a4322e7d4f3417b7df33825bab8603d52051fmalita SkTextMapStateProc(const SkMatrix& matrix, const SkPoint& offset, int scalarsPerPosition) 17cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen : fMatrix(matrix) 18cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen , fProc(matrix.getMapXYProc()) 1905c4a4322e7d4f3417b7df33825bab8603d52051fmalita , fOffset(offset) 2005c4a4322e7d4f3417b7df33825bab8603d52051fmalita , fScaleX(fMatrix.getScaleX()) { 21cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 22cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (1 == scalarsPerPosition) { 23cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen unsigned mtype = fMatrix.getType(); 24cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { 25cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kX; 26cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 2705c4a4322e7d4f3417b7df33825bab8603d52051fmalita // Bake the matrix scale/translation components into fOffset, 2805c4a4322e7d4f3417b7df33825bab8603d52051fmalita // to expedite proc computations. 29a99b6ceff92183b424634f2e7276b9ea1d59e69dMike Reed fOffset.set(offset.x() * fMatrix.getScaleX() + fMatrix.getTranslateX(), 30a99b6ceff92183b424634f2e7276b9ea1d59e69dMike Reed offset.y() * fMatrix.getScaleY() + fMatrix.getTranslateY()); 3105c4a4322e7d4f3417b7df33825bab8603d52051fmalita 32cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen if (mtype & SkMatrix::kScale_Mask) { 33cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kOnlyScaleX; 34cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 35cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kOnlyTransX; 36cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 37cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 38cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } else { 39cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen fMapCase = kXY; 40cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 41cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 42cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 43cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen void operator()(const SkScalar pos[], SkPoint* loc) const; 44cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 45cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunenprivate: 46cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen const SkMatrix& fMatrix; 47cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen enum { 48cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kXY, 49cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kOnlyScaleX, 50cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kOnlyTransX, 51cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen kX 52cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } fMapCase; 53cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen const SkMatrix::MapXYProc fProc; 5405c4a4322e7d4f3417b7df33825bab8603d52051fmalita SkPoint fOffset; // In kOnly* mode, this includes the matrix translation component. 5505c4a4322e7d4f3417b7df33825bab8603d52051fmalita SkScalar fScaleX; // This is only used by kOnly... cases. 56cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen}; 57cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 58cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnuneninline void SkTextMapStateProc::operator()(const SkScalar pos[], SkPoint* loc) const { 59cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen switch(fMapCase) { 60cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kXY: 6105c4a4322e7d4f3417b7df33825bab8603d52051fmalita fProc(fMatrix, pos[0] + fOffset.x(), pos[1] + fOffset.y(), loc); 62cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 63cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kOnlyScaleX: 64a99b6ceff92183b424634f2e7276b9ea1d59e69dMike Reed loc->set(fScaleX * *pos + fOffset.x(), fOffset.y()); 65cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 66cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kOnlyTransX: 6705c4a4322e7d4f3417b7df33825bab8603d52051fmalita loc->set(*pos + fOffset.x(), fOffset.y()); 68cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 69cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen default: 70cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen SkASSERT(false); 71cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen case kX: 7205c4a4322e7d4f3417b7df33825bab8603d52051fmalita fProc(fMatrix, *pos + fOffset.x(), fOffset.y(), loc); 73cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen break; 74cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen } 75cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen} 76cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen 77cb9a2c8934f009b6ee1ca73d662ac18b285085d9kkinnunen#endif 78