のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

DrawTextOp

DrawTextOpあとで調べよう。

   1425 class DrawTextOp : public DrawBoundedOp {
   1426 public:
   1427     DrawTextOp(const char* text, int bytesCount, int count, float x, float y,
   1428             const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds)
   1429             : DrawBoundedOp(bounds, paint), mText(text), mBytesCount(bytesCount), mCount(count),
   1430             mX(x), mY(y), mPositions(positions), mTotalAdvance(totalAdvance) {
   1431         memset(&mPrecacheTransform.data[0], 0xff, 16 * sizeof(float));
   1432     }
   1433 
   1434     virtual void onDefer(OpenGLRenderer& renderer, DeferInfo& deferInfo,
   1435             const DeferredDisplayState& state) {
   1436         SkPaint* paint = getPaint(renderer);
   1437         FontRenderer& fontRenderer = renderer.getCaches().fontRenderer->getFontRenderer(paint);
   1438         const mat4& transform = renderer.findBestFontTransform(state.mMatrix);
   1439         if (mPrecacheTransform != transform) {
   1440             fontRenderer.precache(paint, mText, mCount, transform);
   1441             mPrecacheTransform = transform;
   1442         }
   1443         deferInfo.batchId = mPaint->getColor() == 0xff000000 ?
   1444                 DeferredDisplayList::kOpBatch_Text :
   1445                 DeferredDisplayList::kOpBatch_ColorText;
   1446 
   1447         deferInfo.mergeId = (mergeid_t)mPaint->getColor();
   1448 
   1449         // don't merge decorated text - the decorations won't draw in order
   1450         bool noDecorations = !(mPaint->getFlags() & (SkPaint::kUnderlineText_Flag |
   1451                         SkPaint::kStrikeThruText_Flag));
   1452         deferInfo.mergeable = state.mMatrix.isPureTranslate() && noDecorations &&
   1453                 OpenGLRenderer::getXfermodeDirect(mPaint) == SkXfermode::kSrcOver_Mode;
   1454     }
   1455 
   1456     virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
   1457         Rect bounds;
   1458         getLocalBounds(renderer.getDrawModifiers(), bounds);
   1459         return renderer.drawText(mText, mBytesCount, mCount, mX, mY,
   1460                 mPositions, getPaint(renderer), mTotalAdvance, bounds);
   1461     }
   1462 
   1463     virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty,
   1464             const Vector<OpStatePair>& ops, const Rect& bounds) {
   1465         status_t status = DrawGlInfo::kStatusDone;
   1466         for (unsigned int i = 0; i < ops.size(); i++) {
   1467             const DeferredDisplayState& state = *(ops[i].state);
   1468             DrawOpMode drawOpMode = (i == ops.size() - 1) ? kDrawOpMode_Flush : kDrawOpMode_Defer;
   1469             renderer.restoreDisplayState(state, true); // restore all but the clip
   1470 
   1471             DrawTextOp& op = *((DrawTextOp*)ops[i].op);
   1472             // quickReject() will not occure in drawText() so we can use mLocalBounds
   1473             // directly, we do not need to account for shadow by calling getLocalBounds()
   1474             status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY,
   1475                     op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds,
   1476                     drawOpMode);
   1477         }
   1478         return status;
   1479     }
   1480 
   1481     virtual void output(int level, uint32_t logFlags) const {
   1482         OP_LOG("Draw Text of count %d, bytes %d", mCount, mBytesCount);
   1483     }
   1484 
   1485     virtual const char* name() { return "DrawText"; }
   1486 
   1487 private:
   1488     const char* mText;
   1489     int mBytesCount;
   1490     int mCount;
   1491     float mX;
   1492     float mY;
   1493     const float* mPositions;
   1494     float mTotalAdvance;
   1495     mat4 mPrecacheTransform;
   1496 };