working on SkImage docs

also fix minor break in SkSurface

TBR=caryclark@google.com
Docs-Preview: https://skia.org/?cl=105021
Bug: skia:
Change-Id: I0cfc01ab5ba4df13a9e84f8dd2904d32e5726a5b
Reviewed-on: https://skia-review.googlesource.com/105021
Reviewed-by: Cary Clark <caryclark@skia.org>
Commit-Queue: Cary Clark <caryclark@skia.org>
This commit is contained in:
Cary Clark 2018-02-08 14:45:18 -05:00 committed by Skia Commit-Bot
parent db9ee2d202
commit 5635631c88
11 changed files with 401 additions and 180 deletions

View File

@ -418,7 +418,7 @@ canvas->scale(.25f, .25f);
int x = 0;
for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
origin, kOpaque_SkAlphaType, nullptr);
origin, kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
canvas->drawImage(image, x, 0);
x += 512;
}
@ -817,7 +817,7 @@ should this be moved to chrome only?
# currently uncalled by any test or client ##
#Bug 7424
#Enum BitDepth
#EnumClass BitDepth
#Code
enum class BitDepth {
@ -838,7 +838,7 @@ Use 16 bits per Color_ARGB component using half-precision floating point format.
#SeeAlso MakeFromPicture
#Enum ##
#EnumClass ##
# ------------------------------------------------------------------------------
@ -2001,7 +2001,7 @@ Returns nullptr if backed by GPU_Texture and copy fails.
drawImage(textureImage, "backEndTexture");
##
#SeeAlso incomplete
#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
#Method ##
@ -2064,19 +2064,17 @@ required storage for translation of returned Image.
Returns nullptr if Image could not be created. If nullptr is returned, outSubset
and offset are undefined.
makeWithFilter is optimized to support Image backed by GPU_Texture drawn in an
animation with SkImageFilter that vary in size from one frame to the next. The
created Image is drawn at an increased size so that GPU_Texture can be reused
with different sized effects. outSubset describes the valid bounds of GPU_Texture
returned. The returned Image may be much larger than required for the filter.
offset translates the returned Image to keep subsequent animation frames
aligned with respect to each other.
Useful for animation of SkImageFilter that varies size from frame to frame.
Returned Image is created larger than required by filter so that GPU_Texture
can be reused with different sized effects. outSubset describes the valid bounds
of GPU_Texture returned. offset translates the returned Image to keep subsequent
animation frames aligned with respect to each other.
#Param filter how Image is sampled when transformed ##
#Param subset incomplete ##
#Param clipBounds incomplete ##
#Param outSubset incomplete ##
#Param offset incomplete ##
#Param subset bounds of Image processed by filter ##
#Param clipBounds expected bounds of filtered Image ##
#Param outSubset storage for returned Image bounds ##
#Param offset storage for returned Image translation ##
#Return filtered Image, or nullptr ##
@ -2109,7 +2107,7 @@ By translating canvas by returned offset, Image appears stationary.
canvas->drawRect(SkRect::MakeFromIRect(outSubset), paint);
##
#SeeAlso SkPaint::setImageFilter
#SeeAlso makeShader SkPaint::setImageFilter
#Method ##
@ -2155,64 +2153,86 @@ Used only by Chrome.
#In Constructor
#Line # creates GPU_Texture from Image ##
Creates a GrBackendTexture from the provided SkImage. Returns true on success. The
GrBackendTexture and BackendTextureReleaseProc are populated on success. It is the callers
responsibility to call the BackendTextureReleaseProc once they have deleted the texture.
Note that the BackendTextureReleaseProc allows Skia to clean up auxiliary data related
to the GrBackendTexture, and is not a substitute for the client deleting the GrBackendTexture
themselves.
Creates a GrBackendTexture from the provided SkImage. Returns true and
stores result in backendTexture and backendTextureReleaseProc if
texture is created; otherwise, returns false and leaves
backendTexture and backendTextureReleaseProc unmodified.
If image is both texture backed and singly referenced; that is, its only
reference was transferred using std::move(): image is returned in backendTexture
without conversion or making a copy.
Call backendTextureReleaseProc after deleting backendTexture.
backendTextureReleaseProc cleans up auxiliary data related to returned
backendTexture. The caller must delete returned backendTexture after use.
If Image is not texture backed, this function returns texture with Image
contents.
If Image is both texture backed and singly referenced, image is returned in
backendTexture without conversion or making a copy. Image is singly referenced
if its was transferred solely using std::move().
If Image is not texture backed, returns texture with Image contents.
#Param context GPU_Context ##
#Param image incomplete ##
#Param backendTexture incomplete ##
#Param backendTextureReleaseProc incomplete ##
#Param image Image used for texture ##
#Param backendTexture storage for backend texture ##
#Param backendTextureReleaseProc storage for clean up function ##
#Return incomplete ##
#Return true if backend texture was created ##
#Example
// incomplete
#Platform gpu
#Height 64
#Function
static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
SkCanvas* canvas = surface->getCanvas();
canvas->clear(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
return surface->makeImageSnapshot();
}
##
void draw(SkCanvas* canvas) {
GrContext* grContext = canvas->getGrContext();
if (!grContext) {
return;
}
sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
canvas->drawImage(backEndImage, 0, 0);
GrBackendTexture texture;
SkImage::BackendTextureReleaseProc proc;
if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
&texture, &proc)) {
return;
}
sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
canvas->drawImage(i2, 30, 30);
}
##
#SeeAlso incomplete
#SeeAlso MakeFromTexture makeTextureImage
#Method ##
# ------------------------------------------------------------------------------
#Enum LegacyBitmapMode
#Deprecated soon
#Code
enum LegacyBitmapMode {
kRO_LegacyBitmapMode,
kRW_LegacyBitmapMode,
};
##
Helper functions to convert to SkBitmap
#Const kRO_LegacyBitmapMode 0
Returned bitmap is read-only and immutable.
##
#Const kRW_LegacyBitmapMode 1
##
#Example
// incomplete
##
#SeeAlso incomplete
#Enum ##
# ------------------------------------------------------------------------------
#Method bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode) const
#Method bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const
#In Constructor
#Line # returns as Raster_Bitmap ##
Creates raster Bitmap with same pixels as Image. If legacyBitmapMode is
@ -2221,15 +2241,30 @@ Returns true if Bitmap is stored in bitmap. Returns false and resets bitmap if
Bitmap write did not succeed.
#Param bitmap storage for legacy Bitmap ##
#Param legacyBitmapMode one of: kRO_LegacyBitmapMode, kRW_LegacyBitmapMode ##
#Param legacyBitmapMode to be deprecated ##
#Return true if Bitmap was created ##
#Example
// incomplete
#Image 4
#Platform gpu
SkBitmap bitImage;
if (image->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
canvas->drawBitmap(bitImage, 0, 0);
}
GrContext* grContext = canvas->getGrContext();
if (!grContext) {
return;
}
sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(grContext, backEndTexture,
kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType, nullptr));
canvas->drawImage(textureImage, 45, 45);
if (textureImage->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
canvas->drawBitmap(bitImage, 90, 90);
}
##
#SeeAlso incomplete
#SeeAlso MakeRasterData makeRasterImage makeNonTextureImage
#Method ##

View File

@ -1968,7 +1968,7 @@ a fill draw.
#Const kStroke_Style 1
Set to stroke geometry.
Applies to Rect, Region, Round_Rect, Arcs, Circles, Ovals, Path, and Text.
Arcs, Lines, and Points, are always drawn as if kStroke_Style is set,
Arcs, Lines, and points, are always drawn as if kStroke_Style is set,
and ignore the set Style.
The stroke construction is unaffected by the Path_Fill_Type.
##

View File

@ -1582,11 +1582,16 @@ Does not copy, and returns false if:
# ------------------------------------------------------------------------------
#Method void writePixels(const SkPixmap& src, int dstX, int dstY)
#In Pixels
#Line # copies Rect of pixels ##
Copies Rect of pixels from the src Pixmap to the Surface.
Source Rect corners are (0, 0) and (src.width(), src.height()).
Destination Rect corners are (dstX, dstY) and (dstX + Surface width(), dstY + Surface height()).
Destination Rect corners are (dstX, dstY) and
#Formula
(dstX + Surface width(), dstY + Surface height())
##
.
Copies each readable pixel intersecting both rectangles, without scaling,
converting to Surface colorType() and Surface alphaType() if required.
@ -1595,7 +1600,7 @@ converting to Surface colorType() and Surface alphaType() if required.
#Param dstY x position relative to Surface to begin copy; may be negative ##
#Example
// todo
// incomplete
##
#SeeAlso readPixels peekPixels
@ -1609,7 +1614,11 @@ converting to Surface colorType() and Surface alphaType() if required.
Copies Rect of pixels from the src Bitmap to the Surface.
Source Rect corners are (0, 0) and (src.width(), src.height()).
Destination Rect corners are (dstX, dstY) and (dstX + Surface width(), dstY + Surface height()).
Destination Rect corners are (dstX, dstY) and
#Formula
(dstX + Surface width(), dstY + Surface height())
##
.
Copies each readable pixel intersecting both rectangles, without scaling,
converting to Surface colorType() and Surface alphaType() if required.
@ -1618,7 +1627,7 @@ converting to Surface colorType() and Surface alphaType() if required.
#Param dstY x position relative to Surface to begin copy; may be negative ##
#Example
// todo
// incomplete
##
#SeeAlso readPixels peekPixels

View File

@ -4,6 +4,7 @@
"core": [
"SkBitmap.h",
"SkCanvas.h",
"SkImage.h",
"SkMatrix.h",
"SkPaint.h",
"SkPath.h",
@ -20,6 +21,7 @@
"SkPaint_Reference.bmh",
"SkPoint_Reference.bmh",
"SkIRect_Reference.bmh",
"SkImage_Reference.bmh",
"SkPath_Reference.bmh",
"SkRect_Reference.bmh",
"SkBitmap_Reference.bmh",
@ -33,12 +35,10 @@
"InProgress": {
"include": {
"core": [
"SkImage.h",
"SkImageInfo.h"
]
},
"docs": [
"SkImage_Reference.bmh",
"SkImageInfo_Reference.bmh",
"overview.bmh",
"usingBookmaker.bmh"

View File

@ -480,7 +480,7 @@ created <a href="#Image">Image</a>, or nullptr
### Example
<div><fiddle-embed name="d5e43961a54548f445eece91d517381c" gpu="true"><div>A back-end texture has been created and uploaded to the GPU outside of this example.</div></fiddle-embed></div>
<div><fiddle-embed name="fdc498de45b53569743ec13012bf476c" gpu="true"><div>A back-end texture has been created and uploaded to the GPU outside of this example.</div></fiddle-embed></div>
### See Also
@ -736,8 +736,8 @@ zero but may differ from plane to plane. Returned <a href="#Image">Image</a> has
<table> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_context"> <code><strong>context </strong></code> </a></td> <td>
<a href="undocumented#GPU_Context">GPU Context</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_yuvColorSpace"> <code><strong>yuvColorSpace </strong></code> </a></td> <td>
one of: <a href="undocumented#YUV_ColorSpace">kJPEG SkYUVColorSpace</a>, <a href="undocumented#YUV_ColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="undocumented#YUV_ColorSpace">kRec709 SkYUVColorSpace</a></td>
one of: <a href="SkImageInfo_Reference#SkYUVColorSpace">kJPEG SkYUVColorSpace</a>, <a href="SkImageInfo_Reference#SkYUVColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="SkImageInfo_Reference#SkYUVColorSpace">kRec709 SkYUVColorSpace</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_yuvTextureHandles"> <code><strong>yuvTextureHandles </strong></code> </a></td> <td>
array of YUV textures on GPU</td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_yuvSizes"> <code><strong>yuvSizes </strong></code> </a></td> <td>
@ -780,8 +780,8 @@ zero but may differ from plane to plane. Returned <a href="#Image">Image</a> has
<table> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_2_context"> <code><strong>context </strong></code> </a></td> <td>
<a href="undocumented#GPU_Context">GPU Context</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_2_yuvColorSpace"> <code><strong>yuvColorSpace </strong></code> </a></td> <td>
one of: <a href="undocumented#YUV_ColorSpace">kJPEG SkYUVColorSpace</a>, <a href="undocumented#YUV_ColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="undocumented#YUV_ColorSpace">kRec709 SkYUVColorSpace</a></td>
one of: <a href="SkImageInfo_Reference#SkYUVColorSpace">kJPEG SkYUVColorSpace</a>, <a href="SkImageInfo_Reference#SkYUVColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="SkImageInfo_Reference#SkYUVColorSpace">kRec709 SkYUVColorSpace</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_2_yuvTextureHandles"> <code><strong>yuvTextureHandles </strong></code> </a></td> <td>
array of YUV textures on GPU</td>
</tr> <tr> <td><a name="SkImage_MakeFromYUVTexturesCopy_2_yuvSizes"> <code><strong>yuvSizes </strong></code> </a></td> <td>
@ -827,8 +827,8 @@ zero but may differ from plane to plane. Returned <a href="#Image">Image</a> has
<table> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_context"> <code><strong>context </strong></code> </a></td> <td>
<a href="undocumented#GPU_Context">GPU Context</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_yuvColorSpace"> <code><strong>yuvColorSpace </strong></code> </a></td> <td>
one of: <a href="undocumented#YUV_ColorSpace">kJPEG SkYUVColorSpace</a>, <a href="undocumented#YUV_ColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="undocumented#YUV_ColorSpace">kRec709 SkYUVColorSpace</a></td>
one of: <a href="SkImageInfo_Reference#SkYUVColorSpace">kJPEG SkYUVColorSpace</a>, <a href="SkImageInfo_Reference#SkYUVColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="SkImageInfo_Reference#SkYUVColorSpace">kRec709 SkYUVColorSpace</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_nv12TextureHandles"> <code><strong>nv12TextureHandles </strong></code> </a></td> <td>
array of YUV textures on GPU</td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_nv12Sizes"> <code><strong>nv12Sizes </strong></code> </a></td> <td>
@ -873,8 +873,8 @@ zero but may differ from plane to plane. Returned <a href="#Image">Image</a> has
<table> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_2_context"> <code><strong>context </strong></code> </a></td> <td>
<a href="undocumented#GPU_Context">GPU Context</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_2_yuvColorSpace"> <code><strong>yuvColorSpace </strong></code> </a></td> <td>
one of: <a href="undocumented#YUV_ColorSpace">kJPEG SkYUVColorSpace</a>, <a href="undocumented#YUV_ColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="undocumented#YUV_ColorSpace">kRec709 SkYUVColorSpace</a></td>
one of: <a href="SkImageInfo_Reference#SkYUVColorSpace">kJPEG SkYUVColorSpace</a>, <a href="SkImageInfo_Reference#SkYUVColorSpace">kRec601 SkYUVColorSpace</a>,
<a href="SkImageInfo_Reference#SkYUVColorSpace">kRec709 SkYUVColorSpace</a></td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_2_nv12TextureHandles"> <code><strong>nv12TextureHandles </strong></code> </a></td> <td>
array of YUV textures on GPU</td>
</tr> <tr> <td><a name="SkImage_MakeFromNV12TexturesCopy_2_nv12Sizes"> <code><strong>nv12Sizes </strong></code> </a></td> <td>
@ -900,18 +900,18 @@ created <a href="#Image">Image</a>, or nullptr
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
enum class <a href="#SkImage_BitDepth">BitDepth</a> {
<a href="#SkImage_kU8">kU8</a>,
<a href="#SkImage_kF16">kF16</a>,
<a href="#SkImage_BitDepth_kU8">kU8</a>,
<a href="#SkImage_BitDepth_kF16">kF16</a>,
};</pre>
### Constants
<table>
<tr>
<td><a name="SkImage_kU8"> <code><strong>SkImage::kU8 </strong></code> </a></td><td>0</td><td>Use 8 bits per <a href="#ARGB">Color ARGB</a> component using unsigned integer format.</td>
<td><a name="SkImage_BitDepth_kU8"> <code><strong>SkImage::BitDepth::kU8 </strong></code> </a></td><td>0</td><td>Use 8 bits per <a href="#ARGB">Color ARGB</a> component using unsigned integer format.</td>
</tr>
<tr>
<td><a name="SkImage_kF16"> <code><strong>SkImage::kF16 </strong></code> </a></td><td>1</td><td>Use 16 bits per <a href="#ARGB">Color ARGB</a> component using half-precision floating point format.</td>
<td><a name="SkImage_BitDepth_kF16"> <code><strong>SkImage::BitDepth::kF16 </strong></code> </a></td><td>1</td><td>Use 16 bits per <a href="#ARGB">Color ARGB</a> component using half-precision floating point format.</td>
</tr>
</table>
@ -1984,7 +1984,7 @@ Returns nullptr if backed by <a href="undocumented#GPU_Texture">GPU Texture</a>
### See Also
incomplete
<a href="#SkImage_makeTextureImage">makeTextureImage</a> <a href="#SkImage_makeRasterImage">makeRasterImage</a> <a href="#SkImage_MakeBackendTextureFromSkImage">MakeBackendTextureFromSkImage</a>
---
@ -2032,26 +2032,24 @@ required storage for translation of returned <a href="#Image">Image</a>.
Returns nullptr if <a href="#Image">Image</a> could not be created. If nullptr is returned, <a href="#SkImage_makeWithFilter_outSubset">outSubset</a>
and <a href="#SkImage_makeWithFilter_offset">offset</a> are undefined.
<a href="#SkImage_makeWithFilter">makeWithFilter</a> is optimized to support <a href="#Image">Image</a> backed by <a href="undocumented#GPU_Texture">GPU Texture</a> drawn in an
animation with <a href="undocumented#SkImageFilter">SkImageFilter</a> that vary in size from one frame to the next. The
created <a href="#Image">Image</a> is drawn at an increased size so that <a href="undocumented#GPU_Texture">GPU Texture</a> can be reused
with different sized effects. <a href="#SkImage_makeWithFilter_outSubset">outSubset</a> describes the valid bounds of <a href="undocumented#GPU_Texture">GPU Texture</a>
returned. The returned <a href="#Image">Image</a> may be much larger than required for the <a href="#SkImage_makeWithFilter_filter">filter</a>.
<a href="#SkImage_makeWithFilter_offset">offset</a> translates the returned <a href="#Image">Image</a> to keep subsequent animation frames
aligned with respect to each other.
Useful for animation of <a href="undocumented#SkImageFilter">SkImageFilter</a> that varies size from frame to frame.
Returned <a href="#Image">Image</a> is created larger than required by <a href="#SkImage_makeWithFilter_filter">filter</a> so that <a href="undocumented#GPU_Texture">GPU Texture</a>
can be reused with different sized effects. <a href="#SkImage_makeWithFilter_outSubset">outSubset</a> describes the valid bounds
of <a href="undocumented#GPU_Texture">GPU Texture</a> returned. <a href="#SkImage_makeWithFilter_offset">offset</a> translates the returned <a href="#Image">Image</a> to keep subsequent
animation frames aligned with respect to each other.
### Parameters
<table> <tr> <td><a name="SkImage_makeWithFilter_filter"> <code><strong>filter </strong></code> </a></td> <td>
how <a href="#Image">Image</a> is sampled when transformed</td>
</tr> <tr> <td><a name="SkImage_makeWithFilter_subset"> <code><strong>subset </strong></code> </a></td> <td>
incomplete</td>
bounds of <a href="#Image">Image</a> processed by <a href="#SkImage_makeWithFilter_filter">filter</a></td>
</tr> <tr> <td><a name="SkImage_makeWithFilter_clipBounds"> <code><strong>clipBounds </strong></code> </a></td> <td>
incomplete</td>
expected bounds of filtered <a href="#Image">Image</a></td>
</tr> <tr> <td><a name="SkImage_makeWithFilter_outSubset"> <code><strong>outSubset </strong></code> </a></td> <td>
incomplete</td>
storage for returned <a href="#Image">Image</a> bounds</td>
</tr> <tr> <td><a name="SkImage_makeWithFilter_offset"> <code><strong>offset </strong></code> </a></td> <td>
incomplete</td>
storage for returned <a href="#Image">Image</a> translation</td>
</tr>
</table>
@ -2066,7 +2064,7 @@ By translating canvas by returned <a href="#SkImage_makeWithFilter_offset">offse
### See Also
<a href="#SkPaint_setImageFilter">SkPaint::setImageFilter</a>
<a href="#SkImage_makeShader">makeShader</a><sup><a href="#SkImage_makeShader_2">[2]</a></sup> <a href="#SkPaint_setImageFilter">SkPaint::setImageFilter</a>
---
@ -2110,83 +2108,71 @@ static bool MakeBackendTextureFromSkImage(GrContext* context, sk_sp&lt;SkImage&g
BackendTextureReleaseProc* backendTextureReleaseProc)
</pre>
Creates a <a href="undocumented#GrBackendTexture">GrBackendTexture</a> from the provided <a href="#SkImage">SkImage</a>. Returns true on success. The
<a href="undocumented#GrBackendTexture">GrBackendTexture</a> and <a href="#SkImage_BackendTextureReleaseProc">BackendTextureReleaseProc</a> are populated on success. It is the callers
responsibility to call the <a href="#SkImage_BackendTextureReleaseProc">BackendTextureReleaseProc</a> once they have deleted the texture.
Note that the <a href="#SkImage_BackendTextureReleaseProc">BackendTextureReleaseProc</a> allows Skia to clean up auxiliary data related
to the <a href="undocumented#GrBackendTexture">GrBackendTexture</a>, and is not a substitute for the client deleting the <a href="undocumented#GrBackendTexture">GrBackendTexture</a>
themselves.
Creates a <a href="undocumented#GrBackendTexture">GrBackendTexture</a> from the provided <a href="#SkImage">SkImage</a>. Returns true and
stores result in <a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a> and <a href="#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc">backendTextureReleaseProc</a> if
texture is created; otherwise, returns false and leaves
<a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a> and <a href="#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc">backendTextureReleaseProc</a> unmodified.
If <a href="#SkImage_MakeBackendTextureFromSkImage_image">image</a> is both texture backed and singly referenced; that is, its only
reference was transferred using std::move(): <a href="#SkImage_MakeBackendTextureFromSkImage_image">image</a> is returned in <a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a>
without conversion or making a copy.
Call <a href="#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc">backendTextureReleaseProc</a> after deleting <a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a>.
<a href="#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc">backendTextureReleaseProc</a> cleans up auxiliary data related to returned
<a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a>. The caller must delete returned <a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a> after use.
If <a href="#Image">Image</a> is not texture backed, this function returns texture with <a href="#Image">Image</a>
contents.
If <a href="#Image">Image</a> is both texture backed and singly referenced, <a href="#SkImage_MakeBackendTextureFromSkImage_image">image</a> is returned in
<a href="#SkImage_MakeBackendTextureFromSkImage_backendTexture">backendTexture</a> without conversion or making a copy. <a href="#Image">Image</a> is singly referenced
if its was transferred solely using std::move().
If <a href="#Image">Image</a> is not texture backed, returns texture with <a href="#Image">Image</a> contents.
### Parameters
<table> <tr> <td><a name="SkImage_MakeBackendTextureFromSkImage_context"> <code><strong>context </strong></code> </a></td> <td>
<a href="undocumented#GPU_Context">GPU Context</a></td>
</tr> <tr> <td><a name="SkImage_MakeBackendTextureFromSkImage_image"> <code><strong>image </strong></code> </a></td> <td>
incomplete</td>
<a href="#Image">Image</a> used for texture</td>
</tr> <tr> <td><a name="SkImage_MakeBackendTextureFromSkImage_backendTexture"> <code><strong>backendTexture </strong></code> </a></td> <td>
incomplete</td>
storage for backend texture</td>
</tr> <tr> <td><a name="SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc"> <code><strong>backendTextureReleaseProc </strong></code> </a></td> <td>
incomplete</td>
storage for clean up function</td>
</tr>
</table>
### Return Value
incomplete
true if backend texture was created
### Example
<div><fiddle-embed name="882e8e0103048009a25cfc20400492f7"></fiddle-embed></div>
<div><fiddle-embed name="98e70337c2964abd2624239d28bbecd7" gpu="true"></fiddle-embed></div>
### See Also
incomplete
<a href="#SkImage_MakeFromTexture">MakeFromTexture</a><sup><a href="#SkImage_MakeFromTexture_2">[2]</a></sup><sup><a href="#SkImage_MakeFromTexture_3">[3]</a></sup><sup><a href="#SkImage_MakeFromTexture_4">[4]</a></sup> <a href="#SkImage_makeTextureImage">makeTextureImage</a>
---
## <a name="SkImage_LegacyBitmapMode"></a> Enum SkImage::LegacyBitmapMode
soon
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
enum <a href="#SkImage_LegacyBitmapMode">LegacyBitmapMode</a> {
<a href="#SkImage_kRO_LegacyBitmapMode">kRO LegacyBitmapMode</a>,
<a href="#SkImage_kRW_LegacyBitmapMode">kRW LegacyBitmapMode</a>,
};</pre>
Helper functions to convert to <a href="SkBitmap_Reference#SkBitmap">SkBitmap</a>
### Constants
<table>
<tr>
<td><a name="SkImage_kRO_LegacyBitmapMode"> <code><strong>SkImage::kRO_LegacyBitmapMode </strong></code> </a></td><td>0</td><td></td>
</tr>
<tr>
<td><a name="SkImage_kRW_LegacyBitmapMode"> <code><strong>SkImage::kRW_LegacyBitmapMode </strong></code> </a></td><td>1</td><td></td>
<td><a name="SkImage_kRO_LegacyBitmapMode"> <code><strong>SkImage::kRO_LegacyBitmapMode </strong></code> </a></td><td>0</td><td>Returned bitmap is read-only and immutable.</td>
</tr>
</table>
### Example
<div><fiddle-embed name="882e8e0103048009a25cfc20400492f7"></fiddle-embed></div>
### See Also
incomplete
<a name="SkImage_asLegacyBitmap"></a>
## asLegacyBitmap
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode) const
bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const
</pre>
Creates raster <a href="SkBitmap_Reference#Bitmap">Bitmap</a> with same pixels as <a href="#Image">Image</a>. If <a href="#SkImage_asLegacyBitmap_legacyBitmapMode">legacyBitmapMode</a> is
@ -2199,7 +2185,7 @@ Returns true if <a href="SkBitmap_Reference#Bitmap">Bitmap</a> is stored in <a h
<table> <tr> <td><a name="SkImage_asLegacyBitmap_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
storage for legacy <a href="SkBitmap_Reference#Bitmap">Bitmap</a></td>
</tr> <tr> <td><a name="SkImage_asLegacyBitmap_legacyBitmapMode"> <code><strong>legacyBitmapMode </strong></code> </a></td> <td>
one of: <a href="#SkImage_kRO_LegacyBitmapMode">kRO LegacyBitmapMode</a>, <a href="#SkImage_kRW_LegacyBitmapMode">kRW LegacyBitmapMode</a></td>
to be deprecated</td>
</tr>
</table>
@ -2209,11 +2195,11 @@ true if <a href="SkBitmap_Reference#Bitmap">Bitmap</a> was created
### Example
<div><fiddle-embed name="882e8e0103048009a25cfc20400492f7"></fiddle-embed></div>
<div><fiddle-embed name="eddfe9735342052ce2f8869ee5eb737a" gpu="true"></fiddle-embed></div>
### See Also
incomplete
<a href="#SkImage_MakeRasterData">MakeRasterData</a> <a href="#SkImage_makeRasterImage">makeRasterImage</a> <a href="#SkImage_makeNonTextureImage">makeNonTextureImage</a>
---

View File

@ -2134,7 +2134,7 @@ and to create an unfilled hole inside the shape.
<tr>
<td><a name="SkPaint_kStroke_Style"> <code><strong>SkPaint::kStroke_Style </strong></code> </a></td><td>1</td><td>Set to stroke geometry.
Applies to <a href="SkRect_Reference#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="#Arc">Arcs</a>, <a href="#Circle">Circles</a>, <a href="#Oval">Ovals</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="#Arc">Arcs</a>, <a href="#Line">Lines</a>, and <a href="#Point">Points</a>, are always drawn as if <a href="#SkPaint_kStroke_Style">kStroke Style</a> is set,
<a href="#Arc">Arcs</a>, <a href="#Line">Lines</a>, and points, are always drawn as if <a href="#SkPaint_kStroke_Style">kStroke Style</a> is set,
and ignore the set <a href="#SkPaint_Style">Style</a>.
The stroke construction is unaffected by the <a href="#Fill_Type">Path Fill Type</a>.</td>
</tr>

View File

@ -61,6 +61,7 @@ of the requested dimensions are zero, then nullptr will be returned.
| <a href="#SkSurface_readPixels">readPixels</a> | copies <a href="SkRect_Reference#Rect">Rect</a> of pixels |
| <a href="#SkSurface_wait">wait</a> | rause commands until signaled |
| <a href="#SkSurface_width">width</a> | returns pixel column count |
| <a href="#SkSurface_writePixels">writePixels</a> | copies <a href="SkRect_Reference#Rect">Rect</a> of pixels |
## <a name="Constructor"></a> Constructor
@ -1396,6 +1397,9 @@ are not captured. <a href="SkImage_Reference#Image">Image</a> allocation is acco
| | <a href="#SkSurface_readPixels">readPixels(const SkPixmap& dst, int srcX, int srcY)</a> |
| | <a href="#SkSurface_readPixels_2">readPixels(const SkImageInfo& dstInfo, void* dstPixels, size t dstRowBytes, int srcX, int srcY)</a> |
| | <a href="#SkSurface_readPixels_3">readPixels(const SkBitmap& dst, int srcX, int srcY)</a> |
| <a href="#SkSurface_writePixels">writePixels</a> | copies <a href="SkRect_Reference#Rect">Rect</a> of pixels |
| | <a href="#SkSurface_writePixels">writePixels(const SkPixmap& src, int dstX, int dstY)</a> |
| | <a href="#SkSurface_writePixels_2">writePixels(const SkBitmap& src, int dstX, int dstY)</a> |
<a name="SkSurface_draw"></a>
## draw
@ -1463,7 +1467,7 @@ true if <a href="#Surface">Surface</a> has direct access to pixels
### See Also
<a href="#SkSurface_readPixels">readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup>
<a href="#SkSurface_readPixels">readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup> <a href="#SkSurface_writePixels">writePixels</a><sup><a href="#SkSurface_writePixels_2">[2]</a></sup>
---
@ -1520,7 +1524,7 @@ true if pixels were copied
### See Also
<a href="#SkSurface_peekPixels">peekPixels</a>
<a href="#SkSurface_peekPixels">peekPixels</a> <a href="#SkSurface_writePixels">writePixels</a><sup><a href="#SkSurface_writePixels_2">[2]</a></sup>
---
@ -1582,7 +1586,7 @@ The copied quarter ovals overdraw the original oval.</div></fiddle-embed></div>
### See Also
<a href="#SkSurface_peekPixels">peekPixels</a>
<a href="#SkSurface_peekPixels">peekPixels</a> <a href="#SkSurface_writePixels">writePixels</a><sup><a href="#SkSurface_writePixels_2">[2]</a></sup>
---
@ -1639,7 +1643,78 @@ true if pixels were copied
### See Also
<a href="#SkSurface_peekPixels">peekPixels</a>
<a href="#SkSurface_peekPixels">peekPixels</a> <a href="#SkSurface_writePixels">writePixels</a><sup><a href="#SkSurface_writePixels_2">[2]</a></sup>
---
<a name="SkSurface_writePixels"></a>
## writePixels
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
void writePixels(const SkPixmap& src, int dstX, int dstY)
</pre>
Copies <a href="SkRect_Reference#Rect">Rect</a> of pixels from the <a href="#SkSurface_writePixels_src">src</a> <a href="SkPixmap_Reference#Pixmap">Pixmap</a> to the <a href="#Surface">Surface</a>.
Source <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkSurface_writePixels_src">src</a>.<a href="#SkSurface_width">width</a>, <a href="#SkSurface_writePixels_src">src</a>.<a href="#SkSurface_height">height</a>).
Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkSurface_writePixels_dstX">dstX</a>, <a href="#SkSurface_writePixels_dstY">dstY</a>) and(<a href="#SkSurface_writePixels_dstX">dstX</a> + <a href="#Surface">Surface</a> <a href="#SkSurface_width">width</a>, <a href="#SkSurface_writePixels_dstY">dstY</a> + <a href="#Surface">Surface</a> <a href="#SkSurface_height">height</a>).
Copies each readable pixel intersecting both rectangles, without scaling,
converting to <a href="#Surface">Surface</a> colorType() and <a href="#Surface">Surface</a> alphaType() if required.
### Parameters
<table> <tr> <td><a name="SkSurface_writePixels_src"> <code><strong>src </strong></code> </a></td> <td>
storage for pixels to copy to <a href="#Surface">Surface</a></td>
</tr> <tr> <td><a name="SkSurface_writePixels_dstX"> <code><strong>dstX </strong></code> </a></td> <td>
x position relative to <a href="#Surface">Surface</a> to begin copy; may be negative</td>
</tr> <tr> <td><a name="SkSurface_writePixels_dstY"> <code><strong>dstY </strong></code> </a></td> <td>
x position relative to <a href="#Surface">Surface</a> to begin copy; may be negative</td>
</tr>
</table>
### Example
<div><fiddle-embed name="882e8e0103048009a25cfc20400492f7"></fiddle-embed></div>
### See Also
<a href="#SkSurface_readPixels">readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup> <a href="#SkSurface_peekPixels">peekPixels</a>
---
<a name="SkSurface_writePixels_2"></a>
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
void writePixels(const SkBitmap& src, int dstX, int dstY)
</pre>
Copies <a href="SkRect_Reference#Rect">Rect</a> of pixels from the <a href="#SkSurface_writePixels_2_src">src</a> <a href="SkBitmap_Reference#Bitmap">Bitmap</a> to the <a href="#Surface">Surface</a>.
Source <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkSurface_writePixels_2_src">src</a>.<a href="#SkSurface_width">width</a>, <a href="#SkSurface_writePixels_2_src">src</a>.<a href="#SkSurface_height">height</a>).
Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkSurface_writePixels_2_dstX">dstX</a>, <a href="#SkSurface_writePixels_2_dstY">dstY</a>) and(<a href="#SkSurface_writePixels_2_dstX">dstX</a> + <a href="#Surface">Surface</a> <a href="#SkSurface_width">width</a>, <a href="#SkSurface_writePixels_2_dstY">dstY</a> + <a href="#Surface">Surface</a> <a href="#SkSurface_height">height</a>).
Copies each readable pixel intersecting both rectangles, without scaling,
converting to <a href="#Surface">Surface</a> colorType() and <a href="#Surface">Surface</a> alphaType() if required.
### Parameters
<table> <tr> <td><a name="SkSurface_writePixels_2_src"> <code><strong>src </strong></code> </a></td> <td>
storage for pixels to copy to <a href="#Surface">Surface</a></td>
</tr> <tr> <td><a name="SkSurface_writePixels_2_dstX"> <code><strong>dstX </strong></code> </a></td> <td>
x position relative to <a href="#Surface">Surface</a> to begin copy; may be negative</td>
</tr> <tr> <td><a name="SkSurface_writePixels_2_dstY"> <code><strong>dstY </strong></code> </a></td> <td>
x position relative to <a href="#Surface">Surface</a> to begin copy; may be negative</td>
</tr>
</table>
### Example
<div><fiddle-embed name="882e8e0103048009a25cfc20400492f7"></fiddle-embed></div>
### See Also
<a href="#SkSurface_readPixels">readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup> <a href="#SkSurface_peekPixels">peekPixels</a>
---

View File

@ -373,7 +373,7 @@
},
"SkCanvas_SaveLayerRec_SaveLayerRec": {
"code": "void draw(SkCanvas* canvas) {\n SkCanvas::SaveLayerRec rec1;\n rec1.fSaveLayerFlags = SkCanvas::kPreserveLCDText_SaveLayerFlag;\n SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kPreserveLCDText_SaveLayerFlag);\n SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n && rec1.fPaint == rec2.fPaint\n && rec1.fBackdrop == rec2.fBackdrop\n && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}",
"hash": "ac7c834dce2eac6ef49c15e820e94003",
"hash": "b5cea1eed80a0eb04ddbab3f36dff73f",
"file": "SkCanvas_Reference",
"name": "SkCanvas::SaveLayerRec::SaveLayerRec",
"stdout": "rec1 == rec2\\n"
@ -4949,20 +4949,12 @@
"hash": "882e8e0103048009a25cfc20400492f7",
"file": "SkImageInfo_Reference",
"name": "SkImageInfo::width()"
},
"SkImage_LegacyBitmapMode": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
"width": 256,
"height": 256,
"hash": "882e8e0103048009a25cfc20400492f7",
"file": "SkImage_Reference",
"name": "SkImage::LegacyBitmapMode"
},
"SkImage_MakeBackendTextureFromSkImage": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
"code": "static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {\n const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);\n auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));\n SkCanvas* canvas = surface->getCanvas();\n canvas->clear(SK_ColorWHITE);\n SkPaint paint;\n paint.setColor(SK_ColorBLACK);\n canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);\n return surface->makeImageSnapshot();\n}\n\nvoid draw(SkCanvas* canvas) { \n GrContext* grContext = canvas->getGrContext();\n if (!grContext) {\n return;\n }\n sk_sp<SkImage> backEndImage = create_gpu_image(grContext);\n canvas->drawImage(backEndImage, 0, 0);\n GrBackendTexture texture;\n SkImage::BackendTextureReleaseProc proc;\n if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),\n &texture, &proc)) {\n return;\n }\n sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,\n kN32_SkColorType, kOpaque_SkAlphaType, nullptr);\n canvas->drawImage(i2, 30, 30);\n}\n",
"width": 256,
"height": 256,
"hash": "882e8e0103048009a25cfc20400492f7",
"height": 64,
"hash": "98e70337c2964abd2624239d28bbecd7",
"file": "SkImage_Reference",
"name": "SkImage::MakeBackendTextureFromSkImage"
},
@ -5023,10 +5015,10 @@
"name": "SkImage::MakeFromPicture"
},
"SkImage_MakeFromTexture_3": {
"code": "void draw(SkCanvas* canvas) {\n GrContext* context = canvas->getGrContext();\n if (!context) {\n return;\n }\n canvas->scale(.25f, .25f);\n int x = 0;\n for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {\n sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,\n origin, kOpaque_SkAlphaType, nullptr);\n canvas->drawImage(image, x, 0);\n x += 512;\n }\n}",
"code": "void draw(SkCanvas* canvas) {\n GrContext* context = canvas->getGrContext();\n if (!context) {\n return;\n }\n canvas->scale(.25f, .25f);\n int x = 0;\n for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {\n sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,\n origin, kN32_SkColorType, kOpaque_SkAlphaType, nullptr);\n canvas->drawImage(image, x, 0);\n x += 512;\n }\n}",
"width": 256,
"height": 128,
"hash": "d5e43961a54548f445eece91d517381c",
"hash": "fdc498de45b53569743ec13012bf476c",
"file": "SkImage_Reference",
"name": "SkImage::MakeFromTexture_3"
},
@ -5063,10 +5055,10 @@
"name": "SkImage::alphaType"
},
"SkImage_asLegacyBitmap": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
"code": "void draw(SkCanvas* canvas) {\n SkBitmap bitImage;\n if (image->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {\n canvas->drawBitmap(bitImage, 0, 0);\n }\n GrContext* grContext = canvas->getGrContext();\n if (!grContext) {\n return;\n }\n sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(grContext, backEndTexture,\n kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType, nullptr));\n canvas->drawImage(textureImage, 45, 45);\n if (textureImage->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {\n canvas->drawBitmap(bitImage, 90, 90);\n }\n}",
"width": 256,
"height": 256,
"hash": "882e8e0103048009a25cfc20400492f7",
"hash": "eddfe9735342052ce2f8869ee5eb737a",
"file": "SkImage_Reference",
"name": "SkImage::asLegacyBitmap"
},
@ -7005,6 +6997,22 @@
"hash": "c9033080af68efc0f270d748f1c0e011",
"file": "SkSurface_Reference",
"name": "SkSurface::wait()"
},
"SkSurface_writePixels": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
"width": 256,
"height": 256,
"hash": "882e8e0103048009a25cfc20400492f7",
"file": "SkSurface_Reference",
"name": "SkSurface::writePixels"
},
"SkSurface_writePixels_2": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
"width": 256,
"height": 256,
"hash": "882e8e0103048009a25cfc20400492f7",
"file": "SkSurface_Reference",
"name": "SkSurface::writePixels_2"
},
"SkYUVColorSpace": {
"code": "void draw(SkCanvas* canvas) {\n // incomplete\n}",
@ -7231,4 +7239,4 @@ onclick="handleMouseClick()"
></canvas >
</body>
</html>

View File

@ -1822,6 +1822,11 @@ public:
kExternal,
};
enum class SkipFirstLine {
kNo,
kYes,
};
enum class Wrote {
kNone,
kLF,
@ -1859,7 +1864,9 @@ public:
return 0 == size;
}
void descriptionOut(const Definition* def);
void constOut(const Definition* memberStart, const Definition& child,
const Definition* bmhConst);
void descriptionOut(const Definition* def, SkipFirstLine );
void enumHeaderOut(const RootDefinition* root, const Definition& child);
void enumMembersOut(const RootDefinition* root, Definition& child);
void enumSizeItems(const Definition& child);

View File

@ -342,8 +342,10 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
def = root->find(withParens, RootDefinition::AllowParens::kNo);
}
if (!def) {
SkDebugf("method missing from bmh: %s\n", fullName.c_str());
fFailed = true;
if (!root->fDeprecated) {
SkDebugf("method missing from bmh: %s\n", fullName.c_str());
fFailed = true;
}
break;
}
if (def->crossCheck2(token)) {
@ -389,8 +391,10 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
def = root->find(anonName, RootDefinition::AllowParens::kYes);
}
if (!def) {
SkDebugf("enum missing from bmh: %s\n", fullName.c_str());
fFailed = true;
if (!root->fDeprecated) {
SkDebugf("enum missing from bmh: %s\n", fullName.c_str());
fFailed = true;
}
break;
}
}
@ -402,8 +406,10 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
}
if (MarkType::kCode != def->fMarkType) {
SkDebugf("enum code missing from bmh: %s\n", fullName.c_str());
fFailed = true;
if (!root->fDeprecated) {
SkDebugf("enum code missing from bmh: %s\n", fullName.c_str());
fFailed = true;
}
break;
}
if (def->crossCheck(token)) {
@ -423,8 +429,10 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
if (!def) {
if (string::npos == child->fName.find("Legacy_")) {
SkDebugf("const missing from bmh: %s\n", constName.c_str());
fFailed = true;
if (!root->fDeprecated) {
SkDebugf("const missing from bmh: %s\n", constName.c_str());
fFailed = true;
}
}
} else {
def->fVisited = true;
@ -434,7 +442,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
case MarkType::kMember:
if (def) {
def->fVisited = true;
} else {
} else if (!root->fDeprecated) {
SkDebugf("member missing from bmh: %s\n", fullName.c_str());
fFailed = true;
}
@ -442,7 +450,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
case MarkType::kTypedef:
if (def) {
def->fVisited = true;
} else {
} else if (!root->fDeprecated) {
SkDebugf("typedef missing from bmh: %s\n", fullName.c_str());
fFailed = true;
}
@ -475,7 +483,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
if (crossChecks) {
if (1 == crossChecks) {
SkDebugf("%s", firstCheck.c_str());
SkDebugf(" %s", firstCheck.c_str());
}
SkDebugf("\n");
}

View File

@ -7,11 +7,34 @@
#include "bookmaker.h"
void IncludeWriter::descriptionOut(const Definition* def) {
void IncludeWriter::constOut(const Definition* memberStart, const Definition& child,
const Definition* bmhConst) {
const char* bodyEnd = fDeferComment ? fDeferComment->fContentStart - 1 :
memberStart->fContentStart;
this->writeBlockTrim((int) (bodyEnd - fStart), fStart); // may write nothing
this->lf(2);
this->writeCommentHeader();
fIndent += 4;
this->descriptionOut(bmhConst, SkipFirstLine::kYes);
fIndent -= 4;
this->writeCommentTrailer();
fStart = memberStart->fContentStart;
}
void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirstLine) {
const char* commentStart = def->fContentStart;
int commentLen = (int) (def->fContentEnd - commentStart);
bool breakOut = false;
if (SkipFirstLine::kYes == skipFirstLine) {
TextParser parser(def);
SkAssertResult(parser.skipLine());
commentStart = parser.fChar;
}
int commentLen = (int) (def->fContentEnd - commentStart);
bool breakOut = false;
SkDEBUGCODE(bool wroteCode = false);
if (def->fDeprecated) {
this->writeString(def->fToBeDeprecated ? "To be deprecated soon." : "Deprecated.");
this->lfcr();
}
for (auto prop : def->fChildren) {
switch (prop->fMarkType) {
case MarkType::kCode: {
@ -52,14 +75,13 @@ void IncludeWriter::descriptionOut(const Definition* def) {
case MarkType::kDefinedBy:
commentStart = prop->fTerminator;
break;
case MarkType::kBug: {
string bugstr("(see skbug.com/" + string(prop->fContentStart,
prop->fContentEnd - prop->fContentStart) + ')');
this->writeString(bugstr);
this->lfcr();
}
case MarkType::kDeprecated:
SkASSERT(def->fDeprecated);
if (def->fToBeDeprecated) {
this->writeString("To be deprecated soon.");
} else {
this->writeString("Deprecated.");
}
this->lfcr();
case MarkType::kPrivate:
commentLen = (int) (prop->fStart - commentStart);
if (commentLen > 0) {
@ -71,7 +93,9 @@ void IncludeWriter::descriptionOut(const Definition* def) {
commentStart = prop->fContentStart;
if (def->fToBeDeprecated) {
commentStart += 4; // skip over "soon" // FIXME: this is awkward
}
} else if (MarkType::kBug == prop->fMarkType) {
commentStart = prop->fContentEnd;
}
commentLen = (int) (prop->fContentEnd - commentStart);
if (commentLen > 0) {
this->writeBlockIndent(commentLen, commentStart);
@ -151,7 +175,7 @@ void IncludeWriter::descriptionOut(const Definition* def) {
SkASSERT(MarkType::kColumn == column->fMarkType);
this->writeString("-");
this->writeSpace();
this->descriptionOut(column);
this->descriptionOut(column, SkipFirstLine::kNo);
this->lf(1);
}
}
@ -396,9 +420,16 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
SkASSERT(currentEnumItem);
if (currentEnumItem->fShort) {
this->indentToColumn(fEnumItemCommentTab);
this->writeString("//!<");
this->writeSpace();
this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
if (commentLen || currentEnumItem->fDeprecated) {
this->writeString("//!<");
this->writeSpace();
if (currentEnumItem->fDeprecated) {
this->writeString(child.fToBeDeprecated ? "to be deprecated soon"
: "deprecated");
} else {
this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
}
}
}
if (onePast) {
fIndent -= 4;
@ -623,7 +654,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
}
this->writeCommentHeader();
fIndent += 4;
this->descriptionOut(method);
this->descriptionOut(method, SkipFirstLine::kNo);
// compute indention column
size_t column = 0;
bool hasParmReturn = false;
@ -687,7 +718,11 @@ void IncludeWriter::structOut(const Definition* root, const Definition& child,
this->writeString(child.fName.c_str());
fIndent += 4;
this->lfcr();
this->rewriteBlock((int) (commentEnd - commentStart), commentStart, Phrase::kNo);
if (child.fDeprecated) {
this->writeString(child.fToBeDeprecated ? "to be deprecated soon" : "deprecated");
} else {
this->rewriteBlock((int)(commentEnd - commentStart), commentStart, Phrase::kNo);
}
fIndent -= 4;
this->lfcr();
this->writeCommentTrailer();
@ -929,6 +964,9 @@ static bool find_start(const Definition* startDef, const char* start) {
}
bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefinition* root) {
if (!def->fTokens.size()) {
return true;
}
ParentPair pair = { def, prevPair };
// write bulk of original include up to class, method, enum, etc., excepting preceding comment
// find associated bmh object
@ -945,6 +983,8 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
bool inConstructor = false;
bool inInline = false;
bool eatOperator = false;
bool sawConst = false;
bool staticOnly = false;
const Definition* requireDense = nullptr;
const Definition* startDef = nullptr;
for (auto& child : def->fTokens) {
@ -1070,6 +1110,10 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
methodName += string(fContinuation, continueEnd - fContinuation);
method = root->find(methodName, RootDefinition::AllowParens::kNo);
if (!method) {
if (fBmhStructDef && fBmhStructDef->fDeprecated) {
fContinuation = nullptr;
continue;
}
fLineCount = child.fLineCount;
return this->reportError<bool>("method not found");
}
@ -1095,6 +1139,9 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
this->methodOut(method, child);
continue;
} else if (fBmhStructDef && fBmhStructDef->fDeprecated) {
fContinuation = nullptr;
continue;
}
fLineCount = child.fLineCount;
return this->reportError<bool>("method not found");
@ -1270,9 +1317,14 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
}
// FIXME: trigger error earlier if inner #Struct or #Class is missing #Code
SkASSERT(nextBlock); // FIXME: check enum for correct order earlier
const char* commentStart = codeBlock->fTerminator;
const char* commentEnd = nextBlock->fStart;
const char* commentStart;
const char* commentEnd;
if (!fBmhStructDef->fDeprecated) {
SkASSERT(codeBlock);
SkASSERT(nextBlock); // FIXME: check enum for correct order earlier
commentStart = codeBlock->fTerminator;
commentEnd = nextBlock->fStart;
}
if (fIndentNext) {
// fIndent += 4;
}
@ -1291,7 +1343,18 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
} break;
case KeyWord::kConst:
case KeyWord::kConstExpr:
sawConst = !memberStart || staticOnly;
if (!memberStart) {
memberStart = &child;
staticOnly = true;
}
break;
case KeyWord::kStatic:
if (!memberStart) {
memberStart = &child;
staticOnly = true;
}
break;
case KeyWord::kInt:
case KeyWord::kUint8_t:
case KeyWord::kUint16_t:
@ -1301,7 +1364,9 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
case KeyWord::kSize_t:
case KeyWord::kFloat:
case KeyWord::kBool:
case KeyWord::kChar:
case KeyWord::kVoid:
staticOnly = false;
if (!memberStart) {
memberStart = &child;
}
@ -1412,6 +1477,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
auto iter = def->fTokens.begin();
std::advance(iter, child.fParentIndex - 1);
memberStart = &*iter;
staticOnly = false;
if (!fStructMemberTab) {
SkASSERT(KeyWord::kStruct == def->fParent->fKeyWord);
fIndent += 4;
@ -1421,13 +1487,38 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
fIndentNext = true;
}
}
memberEnd = this->structMemberOut(memberStart, child);
startDef = &child;
fStart = child.fContentEnd + 1;
fDeferComment = nullptr;
}
SkASSERT(fBmhStructDef);
if (fBmhStructDef->fDeprecated) {
SkDebugf("");
} else {
memberEnd = this->structMemberOut(memberStart, child);
startDef = &child;
fStart = child.fContentEnd + 1;
fDeferComment = nullptr;
}
} else if (MarkType::kNone == child.fMarkType && sawConst
&& fEnumDef && !fEnumDef->fDeprecated) {
const Definition* bmhConst = nullptr;
string match;
if (root) {
match = root->fName + "::";
}
match += string(child.fContentStart, child.fContentEnd - child.fContentStart);
for (auto enumChild : fEnumDef->fChildren) {
if (MarkType::kConst == enumChild->fMarkType && enumChild->fName == match) {
bmhConst = enumChild;
break;
}
}
if (bmhConst) {
this->constOut(memberStart, child, bmhConst);
fDeferComment = nullptr;
sawConst = false;
}
}
if (child.fMemberStart) {
memberStart = &child;
staticOnly = false;
}
const char attrDeprecated[] = "SK_ATTR_DEPRECATED";
const size_t attrDeprecatedLen = sizeof(attrDeprecated) - 1;
@ -1440,6 +1531,8 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
if (Definition::Type::kPunctuation == child.fType) {
if (Punctuation::kSemicolon == child.fPunctuation) {
memberStart = nullptr;
sawConst = false;
staticOnly = false;
if (inStruct) {
fInStruct = false;
}