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