1 /* 2 ** Copyright 2007, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 #ifndef SkBitmapProcState_DEFINED 18 #define SkBitmapProcState_DEFINED 19 20 #include "SkBitmap.h" 21 #include "SkMatrix.h" 22 23 class SkPaint; 24 25 struct SkBitmapProcState { 26 27 typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y, 28 SkPMColor[], int count); 29 30 typedef void (*ShaderProc16)(const SkBitmapProcState&, int x, int y, 31 uint16_t[], int count); 32 33 typedef void (*MatrixProc)(const SkBitmapProcState&, 34 uint32_t bitmapXY[], 35 int count, 36 int x, int y); 37 38 typedef void (*SampleProc32)(const SkBitmapProcState&, 39 const uint32_t[], 40 int count, 41 SkPMColor colors[]); 42 43 typedef void (*SampleProc16)(const SkBitmapProcState&, 44 const uint32_t[], 45 int count, 46 uint16_t colors[]); 47 48 typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF 49 typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 50 51 // If a shader proc is present, then the corresponding matrix/sample procs 52 // are ignored 53 ShaderProc32 fShaderProc32; // chooseProcs 54 ShaderProc16 fShaderProc16; // chooseProcs 55 // These are used if the shaderproc is NULL 56 MatrixProc fMatrixProc; // chooseProcs 57 SampleProc32 fSampleProc32; // chooseProcs 58 SampleProc16 fSampleProc16; // chooseProcs 59 60 const SkBitmap* fBitmap; // chooseProcs - orig or mip 61 const SkMatrix* fInvMatrix; // chooseProcs 62 SkMatrix::MapXYProc fInvProc; // chooseProcs 63 64 FixedTileProc fTileProcX; // chooseProcs 65 FixedTileProc fTileProcY; // chooseProcs 66 IntTileProc fIntTileProcY; // chooseProcs 67 SkFixed fFilterOneX; 68 SkFixed fFilterOneY; 69 70 SkPMColor fPaintPMColor; // chooseProcs - A8 config 71 SkFixed fInvSx; // chooseProcs 72 SkFixed fInvKy; // chooseProcs 73 uint16_t fAlphaScale; // chooseProcs 74 uint8_t fInvType; // chooseProcs 75 uint8_t fTileModeX; // CONSTRUCTOR 76 uint8_t fTileModeY; // CONSTRUCTOR 77 SkBool8 fDoFilter; // chooseProcs 78 79 /** Platforms implement this, and can optionally overwrite only the 80 following fields: 81 82 fShaderProc32 83 fShaderProc16 84 fMatrixProc 85 fSampleProc32 86 fSampleProc32 87 88 They will already have valid function pointers, so a platform that does 89 not have an accelerated version can just leave that field as is. A valid 90 implementation can do nothing (see SkBitmapProcState_opts_none.cpp) 91 */ 92 void platformProcs(); 93 94 /** Given the size of a buffer, to be used for calling the matrix and 95 sample procs, this return the maximum count that can be stored in the 96 buffer, taking into account that filtering and scale-vs-affine affect 97 this value. 98 99 Only valid to call after chooseProcs (setContext) has been called. It is 100 safe to call this inside the shader's shadeSpan() method. 101 */ 102 int maxCountForBufferSize(size_t bufferSize) const; 103 104 private: 105 friend class SkBitmapProcShader; 106 107 SkMatrix fUnitInvMatrix; // chooseProcs 108 SkBitmap fOrigBitmap; // CONSTRUCTOR 109 SkBitmap fMipBitmap; 110 111 MatrixProc chooseMatrixProc(bool trivial_matrix); 112 bool chooseProcs(const SkMatrix& inv, const SkPaint&); 113 }; 114 115 /* Macros for packing and unpacking pairs of 16bit values in a 32bit uint. 116 Used to allow access to a stream of uint16_t either one at a time, or 117 2 at a time by unpacking a uint32_t 118 */ 119 #ifdef SK_CPU_BENDIAN 120 #define PACK_TWO_SHORTS(pri, sec) ((pri) << 16 | (sec)) 121 #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16) 122 #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF) 123 #else 124 #define PACK_TWO_SHORTS(pri, sec) ((pri) | ((sec) << 16)) 125 #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF) 126 #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16) 127 #endif 128 129 #ifdef SK_DEBUG pack_two_shorts(U16CPU pri,U16CPU sec)130 static inline uint32_t pack_two_shorts(U16CPU pri, U16CPU sec) { 131 SkASSERT((uint16_t)pri == pri); 132 SkASSERT((uint16_t)sec == sec); 133 return PACK_TWO_SHORTS(pri, sec); 134 } 135 #else 136 #define pack_two_shorts(pri, sec) PACK_TWO_SHORTS(pri, sec) 137 #endif 138 139 // These functions are generated via macros, but are exposed here so that 140 // platformProcs may test for them by name. 141 void S32_opaque_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 142 int count, SkPMColor colors[]); 143 void S32_alpha_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 144 int count, SkPMColor colors[]); 145 146 #endif 147