Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(810)

Side by Side Diff: src/core/SkDraw.cpp

Issue 14637007: Detect color masks, and divert to draw-sprite instead of maskblitters (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « include/core/SkMask.h ('k') | src/core/SkDrawProcs.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "SkDraw.h" 9 #include "SkDraw.h"
10 #include "SkBlitter.h" 10 #include "SkBlitter.h"
(...skipping 1471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 if (NULL == aa) { 1482 if (NULL == aa) {
1483 aa = (uint8_t*)state.fCache->findImage(glyph); 1483 aa = (uint8_t*)state.fCache->findImage(glyph);
1484 if (NULL == aa) { 1484 if (NULL == aa) {
1485 return; // can't rasterize glyph 1485 return; // can't rasterize glyph
1486 } 1486 }
1487 } 1487 }
1488 1488
1489 mask.fRowBytes = glyph.rowBytes(); 1489 mask.fRowBytes = glyph.rowBytes();
1490 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); 1490 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat);
1491 mask.fImage = aa; 1491 mask.fImage = aa;
1492 state.fBlitter->blitMask(mask, *bounds); 1492 state.blitMask(mask, *bounds);
1493 } 1493 }
1494 1494
1495 static void D1G_NoBounder_RgnClip(const SkDraw1Glyph& state, 1495 static void D1G_NoBounder_RgnClip(const SkDraw1Glyph& state,
1496 SkFixed fx, SkFixed fy, 1496 SkFixed fx, SkFixed fy,
1497 const SkGlyph& glyph) { 1497 const SkGlyph& glyph) {
1498 int left = SkFixedFloor(fx); 1498 int left = SkFixedFloor(fx);
1499 int top = SkFixedFloor(fy); 1499 int top = SkFixedFloor(fy);
1500 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); 1500 SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0);
1501 SkASSERT(!state.fClip->isRect()); 1501 SkASSERT(!state.fClip->isRect());
1502 SkASSERT(NULL == state.fBounder); 1502 SkASSERT(NULL == state.fBounder);
(...skipping 13 matching lines...) Expand all
1516 aa = (uint8_t*)state.fCache->findImage(glyph); 1516 aa = (uint8_t*)state.fCache->findImage(glyph);
1517 if (NULL == aa) { 1517 if (NULL == aa) {
1518 return; 1518 return;
1519 } 1519 }
1520 } 1520 }
1521 1521
1522 mask.fRowBytes = glyph.rowBytes(); 1522 mask.fRowBytes = glyph.rowBytes();
1523 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); 1523 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat);
1524 mask.fImage = (uint8_t*)aa; 1524 mask.fImage = (uint8_t*)aa;
1525 do { 1525 do {
1526 state.fBlitter->blitMask(mask, cr); 1526 state.blitMask(mask, cr);
1527 clipper.next(); 1527 clipper.next();
1528 } while (!clipper.done()); 1528 } while (!clipper.done());
1529 } 1529 }
1530 } 1530 }
1531 1531
1532 static void D1G_Bounder(const SkDraw1Glyph& state, 1532 static void D1G_Bounder(const SkDraw1Glyph& state,
1533 SkFixed fx, SkFixed fy, 1533 SkFixed fx, SkFixed fy,
1534 const SkGlyph& glyph) { 1534 const SkGlyph& glyph) {
1535 int left = SkFixedFloor(fx); 1535 int left = SkFixedFloor(fx);
1536 int top = SkFixedFloor(fy); 1536 int top = SkFixedFloor(fy);
(...skipping 19 matching lines...) Expand all
1556 1556
1557 // we need to pass the origin, which we approximate with our 1557 // we need to pass the origin, which we approximate with our
1558 // (unadjusted) left,top coordinates (the caller called fixedfloor) 1558 // (unadjusted) left,top coordinates (the caller called fixedfloor)
1559 if (state.fBounder->doIRectGlyph(cr, 1559 if (state.fBounder->doIRectGlyph(cr,
1560 left - glyph.fLeft, 1560 left - glyph.fLeft,
1561 top - glyph.fTop, glyph)) { 1561 top - glyph.fTop, glyph)) {
1562 mask.fRowBytes = glyph.rowBytes(); 1562 mask.fRowBytes = glyph.rowBytes();
1563 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); 1563 mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat);
1564 mask.fImage = (uint8_t*)aa; 1564 mask.fImage = (uint8_t*)aa;
1565 do { 1565 do {
1566 state.fBlitter->blitMask(mask, cr); 1566 state.blitMask(mask, cr);
1567 clipper.next(); 1567 clipper.next();
1568 } while (!clipper.done()); 1568 } while (!clipper.done());
1569 } 1569 }
1570 } 1570 }
1571 } 1571 }
1572 1572
1573 static void D1G_Bounder_AAClip(const SkDraw1Glyph& state, 1573 static void D1G_Bounder_AAClip(const SkDraw1Glyph& state,
1574 SkFixed fx, SkFixed fy, 1574 SkFixed fx, SkFixed fy,
1575 const SkGlyph& glyph) { 1575 const SkGlyph& glyph) {
1576 int left = SkFixedFloor(fx); 1576 int left = SkFixedFloor(fx);
1577 int top = SkFixedFloor(fy); 1577 int top = SkFixedFloor(fy);
1578 SkIRect bounds; 1578 SkIRect bounds;
1579 bounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight); 1579 bounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight);
1580 1580
1581 if (state.fBounder->doIRectGlyph(bounds, left, top, glyph)) { 1581 if (state.fBounder->doIRectGlyph(bounds, left, top, glyph)) {
1582 D1G_NoBounder_RectClip(state, fx, fy, glyph); 1582 D1G_NoBounder_RectClip(state, fx, fy, glyph);
1583 } 1583 }
1584 } 1584 }
1585 1585
1586 static bool hasCustomD1GProc(const SkDraw& draw) { 1586 static bool hasCustomD1GProc(const SkDraw& draw) {
1587 return draw.fProcs && draw.fProcs->fD1GProc; 1587 return draw.fProcs && draw.fProcs->fD1GProc;
1588 } 1588 }
1589 1589
1590 static bool needsRasterTextBlit(const SkDraw& draw) { 1590 static bool needsRasterTextBlit(const SkDraw& draw) {
1591 return !hasCustomD1GProc(draw); 1591 return !hasCustomD1GProc(draw);
1592 } 1592 }
1593 1593
1594 SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, 1594 SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter,
1595 SkGlyphCache* cache) { 1595 SkGlyphCache* cache, const SkPaint& pnt) {
1596 fDraw = draw; 1596 fDraw = draw;
1597 fBounder = draw->fBounder; 1597 fBounder = draw->fBounder;
1598 fBlitter = blitter; 1598 fBlitter = blitter;
1599 fCache = cache; 1599 fCache = cache;
1600 fPaint = &pnt;
1600 1601
1601 if (cache->isSubpixel()) { 1602 if (cache->isSubpixel()) {
1602 fHalfSampleX = fHalfSampleY = (SK_FixedHalf >> SkGlyph::kSubBits); 1603 fHalfSampleX = fHalfSampleY = (SK_FixedHalf >> SkGlyph::kSubBits);
1603 } else { 1604 } else {
1604 fHalfSampleX = fHalfSampleY = SK_FixedHalf; 1605 fHalfSampleX = fHalfSampleY = SK_FixedHalf;
1605 } 1606 }
1606 1607
1607 if (hasCustomD1GProc(*draw)) { 1608 if (hasCustomD1GProc(*draw)) {
1608 // todo: fix this assumption about clips w/ custom 1609 // todo: fix this assumption about clips w/ custom
1609 fClip = draw->fClip; 1610 fClip = draw->fClip;
(...skipping 19 matching lines...) Expand all
1629 fClip = NULL; 1630 fClip = NULL;
1630 fClipBounds = fAAClip->getBounds(); 1631 fClipBounds = fAAClip->getBounds();
1631 if (NULL == fBounder) { 1632 if (NULL == fBounder) {
1632 return D1G_NoBounder_RectClip; 1633 return D1G_NoBounder_RectClip;
1633 } else { 1634 } else {
1634 return D1G_Bounder_AAClip; 1635 return D1G_Bounder_AAClip;
1635 } 1636 }
1636 } 1637 }
1637 } 1638 }
1638 1639
1640 void SkDraw1Glyph::blitMaskAsSprite(const SkMask& mask) const {
1641 SkASSERT(SkMask::kARGB32_Format == mask.fFormat);
1642
1643 SkBitmap bm;
1644 bm.setConfig(SkBitmap::kARGB_8888_Config,
1645 mask.fBounds.width(), mask.fBounds.height(), mask.fRowBytes);
1646 bm.setPixels((SkPMColor*)mask.fImage);
1647
1648 fDraw->drawSprite(bm, mask.fBounds.x(), mask.fBounds.y(), *fPaint);
1649 }
1650
1639 /////////////////////////////////////////////////////////////////////////////// 1651 ///////////////////////////////////////////////////////////////////////////////
1640 1652
1641 void SkDraw::drawText(const char text[], size_t byteLength, 1653 void SkDraw::drawText(const char text[], size_t byteLength,
1642 SkScalar x, SkScalar y, const SkPaint& paint) const { 1654 SkScalar x, SkScalar y, const SkPaint& paint) const {
1643 SkASSERT(byteLength == 0 || text != NULL); 1655 SkASSERT(byteLength == 0 || text != NULL);
1644 1656
1645 SkDEBUGCODE(this->validate();) 1657 SkDEBUGCODE(this->validate();)
1646 1658
1647 // nothing to draw 1659 // nothing to draw
1648 if (text == NULL || byteLength == 0 || fRC->isEmpty()) { 1660 if (text == NULL || byteLength == 0 || fRC->isEmpty()) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1697 blitterChooser.choose(*fBitmap, *fMatrix, paint); 1709 blitterChooser.choose(*fBitmap, *fMatrix, paint);
1698 blitter = blitterChooser.get(); 1710 blitter = blitterChooser.get();
1699 if (fRC->isAA()) { 1711 if (fRC->isAA()) {
1700 aaBlitter.init(blitter, &fRC->aaRgn()); 1712 aaBlitter.init(blitter, &fRC->aaRgn());
1701 blitter = &aaBlitter; 1713 blitter = &aaBlitter;
1702 } 1714 }
1703 } 1715 }
1704 1716
1705 SkAutoKern autokern; 1717 SkAutoKern autokern;
1706 SkDraw1Glyph d1g; 1718 SkDraw1Glyph d1g;
1707 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache); 1719 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint);
1708 1720
1709 SkFixed fxMask = ~0; 1721 SkFixed fxMask = ~0;
1710 SkFixed fyMask = ~0; 1722 SkFixed fyMask = ~0;
1711 if (cache->isSubpixel()) { 1723 if (cache->isSubpixel()) {
1712 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); 1724 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix);
1713 if (kX_SkAxisAlignment == baseline) { 1725 if (kX_SkAxisAlignment == baseline) {
1714 fyMask = 0; 1726 fyMask = 0;
1715 d1g.fHalfSampleY = SK_FixedHalf; 1727 d1g.fHalfSampleY = SK_FixedHalf;
1716 } else if (kY_SkAxisAlignment == baseline) { 1728 } else if (kY_SkAxisAlignment == baseline) {
1717 fxMask = 0; 1729 fxMask = 0;
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1859 blitter = blitterChooser.get(); 1871 blitter = blitterChooser.get();
1860 if (fRC->isAA()) { 1872 if (fRC->isAA()) {
1861 wrapper.init(*fRC, blitter); 1873 wrapper.init(*fRC, blitter);
1862 blitter = wrapper.getBlitter(); 1874 blitter = wrapper.getBlitter();
1863 } 1875 }
1864 } 1876 }
1865 1877
1866 const char* stop = text + byteLength; 1878 const char* stop = text + byteLength;
1867 AlignProc alignProc = pick_align_proc(paint.getTextAlign()); 1879 AlignProc alignProc = pick_align_proc(paint.getTextAlign());
1868 SkDraw1Glyph d1g; 1880 SkDraw1Glyph d1g;
1869 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache); 1881 SkDraw1Glyph::Proc proc = d1g.init(this, blitter, cache, paint);
1870 TextMapState tms(*fMatrix, constY); 1882 TextMapState tms(*fMatrix, constY);
1871 TextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition); 1883 TextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition);
1872 1884
1873 if (cache->isSubpixel()) { 1885 if (cache->isSubpixel()) {
1874 // maybe we should skip the rounding if linearText is set 1886 // maybe we should skip the rounding if linearText is set
1875 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); 1887 SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix);
1876 1888
1877 SkFixed fxMask = ~0; 1889 SkFixed fxMask = ~0;
1878 SkFixed fyMask = ~0; 1890 SkFixed fyMask = ~0;
1879 if (kX_SkAxisAlignment == baseline) { 1891 if (kX_SkAxisAlignment == baseline) {
(...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
2765 mask->fImage = SkMask::AllocImage(size); 2777 mask->fImage = SkMask::AllocImage(size);
2766 memset(mask->fImage, 0, mask->computeImageSize()); 2778 memset(mask->fImage, 0, mask->computeImageSize());
2767 } 2779 }
2768 2780
2769 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2781 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2770 draw_into_mask(*mask, devPath, style); 2782 draw_into_mask(*mask, devPath, style);
2771 } 2783 }
2772 2784
2773 return true; 2785 return true;
2774 } 2786 }
OLDNEW
« no previous file with comments | « include/core/SkMask.h ('k') | src/core/SkDrawProcs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698