| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2011 Google Inc. | 2  * Copyright 2011 Google Inc. | 
| 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 #include "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" | 
| 9 | 9 | 
| 10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" | 
| (...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1868         entry->fNext.reset(contentEntries->detach()); | 1868         entry->fNext.reset(contentEntries->detach()); | 
| 1869         contentEntries->reset(entry); | 1869         contentEntries->reset(entry); | 
| 1870     } else { | 1870     } else { | 
| 1871         lastContentEntry->fNext.reset(entry); | 1871         lastContentEntry->fNext.reset(entry); | 
| 1872         setLastContentEntry(entry); | 1872         setLastContentEntry(entry); | 
| 1873     } | 1873     } | 
| 1874     newEntry.detach(); | 1874     newEntry.detach(); | 
| 1875     return entry; | 1875     return entry; | 
| 1876 } | 1876 } | 
| 1877 | 1877 | 
| 1878 void SkPDFDevice::finishContentEntry(const SkXfermode::Mode xfermode, | 1878 void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, | 
| 1879                                      SkPDFFormXObject* dst, | 1879                                      SkPDFFormXObject* dst, | 
| 1880                                      SkPath* shape) { | 1880                                      SkPath* shape) { | 
| 1881     if (xfermode != SkXfermode::kClear_Mode       && | 1881     if (xfermode != SkXfermode::kClear_Mode       && | 
| 1882             xfermode != SkXfermode::kSrc_Mode     && | 1882             xfermode != SkXfermode::kSrc_Mode     && | 
|  | 1883             xfermode != SkXfermode::kDstOver_Mode && | 
| 1883             xfermode != SkXfermode::kSrcIn_Mode   && | 1884             xfermode != SkXfermode::kSrcIn_Mode   && | 
| 1884             xfermode != SkXfermode::kDstIn_Mode   && | 1885             xfermode != SkXfermode::kDstIn_Mode   && | 
| 1885             xfermode != SkXfermode::kSrcOut_Mode  && | 1886             xfermode != SkXfermode::kSrcOut_Mode  && | 
| 1886             xfermode != SkXfermode::kDstOut_Mode  && | 1887             xfermode != SkXfermode::kDstOut_Mode  && | 
| 1887             xfermode != SkXfermode::kSrcATop_Mode && | 1888             xfermode != SkXfermode::kSrcATop_Mode && | 
| 1888             xfermode != SkXfermode::kDstATop_Mode && | 1889             xfermode != SkXfermode::kDstATop_Mode && | 
| 1889             xfermode != SkXfermode::kModulate_Mode) { | 1890             xfermode != SkXfermode::kModulate_Mode) { | 
| 1890         SkASSERT(!dst); | 1891         SkASSERT(!dst); | 
| 1891         return; | 1892         return; | 
| 1892     } | 1893     } | 
|  | 1894     if (xfermode == SkXfermode::kDstOver_Mode) { | 
|  | 1895         SkASSERT(!dst); | 
|  | 1896         ContentEntry* firstContentEntry = getContentEntries()->get(); | 
|  | 1897         if (firstContentEntry->fContent.getOffset() == 0) { | 
|  | 1898             // For DstOver, an empty content entry was inserted before the rest | 
|  | 1899             // of the content entries. If nothing was drawn, it needs to be | 
|  | 1900             // removed. | 
|  | 1901             SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries(); | 
|  | 1902             contentEntries->reset(firstContentEntry->fNext.detach()); | 
|  | 1903         } | 
|  | 1904         return; | 
|  | 1905     } | 
| 1893     if (!dst) { | 1906     if (!dst) { | 
| 1894         SkASSERT(xfermode == SkXfermode::kSrc_Mode || | 1907         SkASSERT(xfermode == SkXfermode::kSrc_Mode || | 
| 1895                  xfermode == SkXfermode::kSrcOut_Mode); | 1908                  xfermode == SkXfermode::kSrcOut_Mode); | 
| 1896         return; | 1909         return; | 
| 1897     } | 1910     } | 
| 1898 | 1911 | 
| 1899     ContentEntry* contentEntries = getContentEntries()->get(); | 1912     ContentEntry* contentEntries = getContentEntries()->get(); | 
| 1900     SkASSERT(dst); | 1913     SkASSERT(dst); | 
| 1901     SkASSERT(!contentEntries->fNext.get()); | 1914     SkASSERT(!contentEntries->fNext.get()); | 
| 1902     // We have to make a copy of these here because changing the current | 1915     // We have to make a copy of these here because changing the current | 
| 1903     // content into a form-xobject will destroy them. | 1916     // content into a form-xobject will destroy them. | 
| 1904     SkClipStack clipStack = contentEntries->fState.fClipStack; | 1917     SkClipStack clipStack = contentEntries->fState.fClipStack; | 
| 1905     SkRegion clipRegion = contentEntries->fState.fClipRegion; | 1918     SkRegion clipRegion = contentEntries->fState.fClipRegion; | 
| 1906 | 1919 | 
|  | 1920     SkMatrix identity; | 
|  | 1921     identity.reset(); | 
|  | 1922     SkPaint stockPaint; | 
|  | 1923 | 
| 1907     SkAutoTUnref<SkPDFFormXObject> srcFormXObject; | 1924     SkAutoTUnref<SkPDFFormXObject> srcFormXObject; | 
| 1908     if (isContentEmpty()) { | 1925     if (isContentEmpty()) { | 
| 1909         SkASSERT(xfermode == SkXfermode::kClear_Mode); | 1926         // If nothing was drawn and there's no shape, then the draw was a | 
|  | 1927         // no-op, but dst needs to be restored for that to be true. | 
|  | 1928         // If there is shape, then an empty source with Src, SrcIn, SrcOut, | 
|  | 1929         // DstIn, DstAtop or Modulate reduces to Clear and DstOut or SrcAtop | 
|  | 1930         // reduces to Dst. | 
|  | 1931         if (shape == NULL || xfermode == SkXfermode::kDstOut_Mode || | 
|  | 1932                 xfermode == SkXfermode::kSrcATop_Mode) { | 
|  | 1933             ScopedContentEntry content(this, &clipStack, clipRegion, identity, | 
|  | 1934                                        stockPaint); | 
|  | 1935             SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), | 
|  | 1936                                         &content.entry()->fContent); | 
|  | 1937             return; | 
|  | 1938         } else { | 
|  | 1939             xfermode = SkXfermode::kClear_Mode; | 
|  | 1940         } | 
| 1910     } else { | 1941     } else { | 
| 1911         SkASSERT(!fContentEntries->fNext.get()); | 1942         SkASSERT(!fContentEntries->fNext.get()); | 
| 1912         srcFormXObject.reset(createFormXObjectFromDevice()); | 1943         srcFormXObject.reset(createFormXObjectFromDevice()); | 
| 1913     } | 1944     } | 
| 1914 | 1945 | 
| 1915     SkMatrix identity; |  | 
| 1916     identity.reset(); |  | 
| 1917 |  | 
| 1918     // TODO(vandebo) srcFormXObject may contain alpha, but here we want it | 1946     // TODO(vandebo) srcFormXObject may contain alpha, but here we want it | 
| 1919     // without alpha. | 1947     // without alpha. | 
| 1920     if (xfermode == SkXfermode::kSrcATop_Mode) { | 1948     if (xfermode == SkXfermode::kSrcATop_Mode) { | 
| 1921         // TODO(vandebo): In order to properly support SrcATop we have to track | 1949         // TODO(vandebo): In order to properly support SrcATop we have to track | 
| 1922         // the shape of what's been drawn at all times. It's the intersection of | 1950         // the shape of what's been drawn at all times. It's the intersection of | 
| 1923         // the non-transparent parts of the device and the outlines (shape) of | 1951         // the non-transparent parts of the device and the outlines (shape) of | 
| 1924         // all images and devices drawn. | 1952         // all images and devices drawn. | 
| 1925         drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, | 1953         drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, | 
| 1926                                 &clipStack, clipRegion, | 1954                                 &clipStack, clipRegion, | 
| 1927                                 SkXfermode::kSrcOver_Mode, true); | 1955                                 SkXfermode::kSrcOver_Mode, true); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1939             filledPaint.setStyle(SkPaint::kFill_Style); | 1967             filledPaint.setStyle(SkPaint::kFill_Style); | 
| 1940             this->drawPath(d, *shape, filledPaint, NULL, true); | 1968             this->drawPath(d, *shape, filledPaint, NULL, true); | 
| 1941 | 1969 | 
| 1942             dstMaskStorage.reset(createFormXObjectFromDevice()); | 1970             dstMaskStorage.reset(createFormXObjectFromDevice()); | 
| 1943             dstMask = dstMaskStorage.get(); | 1971             dstMask = dstMaskStorage.get(); | 
| 1944         } | 1972         } | 
| 1945         drawFormXObjectWithMask(addXObjectResource(dst), dstMask, &clipStack, | 1973         drawFormXObjectWithMask(addXObjectResource(dst), dstMask, &clipStack, | 
| 1946                                 clipRegion, SkXfermode::kSrcOver_Mode, true); | 1974                                 clipRegion, SkXfermode::kSrcOver_Mode, true); | 
| 1947     } | 1975     } | 
| 1948 | 1976 | 
| 1949     SkPaint stockPaint; | 1977     if (xfermode == SkXfermode::kClear_Mode) { | 
| 1950 |  | 
| 1951     if (xfermode == SkXfermode::kSrcATop_Mode) { |  | 
| 1952         ScopedContentEntry content(this, &clipStack, clipRegion, identity, |  | 
| 1953                                    stockPaint); |  | 
| 1954         if (content.entry()) { |  | 
| 1955             SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), |  | 
| 1956                                         &content.entry()->fContent); |  | 
| 1957         } |  | 
| 1958     } else if (xfermode == SkXfermode::kClear_Mode || !srcFormXObject.get()) { |  | 
| 1959         return; | 1978         return; | 
| 1960     } else if (xfermode == SkXfermode::kSrc_Mode || | 1979     } else if (xfermode == SkXfermode::kSrc_Mode || | 
| 1961             xfermode == SkXfermode::kDstATop_Mode) { | 1980             xfermode == SkXfermode::kDstATop_Mode) { | 
| 1962         ScopedContentEntry content(this, &clipStack, clipRegion, identity, | 1981         ScopedContentEntry content(this, &clipStack, clipRegion, identity, | 
| 1963                                    stockPaint); | 1982                                    stockPaint); | 
| 1964         if (content.entry()) { | 1983         if (content.entry()) { | 
| 1965             SkPDFUtils::DrawFormXObject( | 1984             SkPDFUtils::DrawFormXObject( | 
| 1966                     this->addXObjectResource(srcFormXObject.get()), | 1985                     this->addXObjectResource(srcFormXObject.get()), | 
| 1967                     &content.entry()->fContent); | 1986                     &content.entry()->fContent); | 
| 1968         } | 1987         } | 
| 1969         if (xfermode == SkXfermode::kSrc_Mode) { | 1988         if (xfermode == SkXfermode::kSrc_Mode) { | 
| 1970             return; | 1989             return; | 
| 1971         } | 1990         } | 
|  | 1991     } else if (xfermode == SkXfermode::kSrcATop_Mode) { | 
|  | 1992         ScopedContentEntry content(this, &clipStack, clipRegion, identity, | 
|  | 1993                                    stockPaint); | 
|  | 1994         if (content.entry()) { | 
|  | 1995             SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), | 
|  | 1996                                         &content.entry()->fContent); | 
|  | 1997         } | 
| 1972     } | 1998     } | 
| 1973 | 1999 | 
| 1974     SkASSERT(xfermode == SkXfermode::kSrcIn_Mode   || | 2000     SkASSERT(xfermode == SkXfermode::kSrcIn_Mode   || | 
| 1975              xfermode == SkXfermode::kDstIn_Mode   || | 2001              xfermode == SkXfermode::kDstIn_Mode   || | 
| 1976              xfermode == SkXfermode::kSrcOut_Mode  || | 2002              xfermode == SkXfermode::kSrcOut_Mode  || | 
| 1977              xfermode == SkXfermode::kDstOut_Mode  || | 2003              xfermode == SkXfermode::kDstOut_Mode  || | 
| 1978              xfermode == SkXfermode::kSrcATop_Mode || | 2004              xfermode == SkXfermode::kSrcATop_Mode || | 
| 1979              xfermode == SkXfermode::kDstATop_Mode || | 2005              xfermode == SkXfermode::kDstATop_Mode || | 
| 1980              xfermode == SkXfermode::kModulate_Mode); | 2006              xfermode == SkXfermode::kModulate_Mode); | 
| 1981 | 2007 | 
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2304 } | 2330 } | 
| 2305 | 2331 | 
| 2306 bool SkPDFDevice::onReadPixels(const SkBitmap& bitmap, int x, int y, | 2332 bool SkPDFDevice::onReadPixels(const SkBitmap& bitmap, int x, int y, | 
| 2307                                SkCanvas::Config8888) { | 2333                                SkCanvas::Config8888) { | 
| 2308     return false; | 2334     return false; | 
| 2309 } | 2335 } | 
| 2310 | 2336 | 
| 2311 bool SkPDFDevice::allowImageFilter(SkImageFilter*) { | 2337 bool SkPDFDevice::allowImageFilter(SkImageFilter*) { | 
| 2312     return false; | 2338     return false; | 
| 2313 } | 2339 } | 
| OLD | NEW | 
|---|