Cleanup: spelling, punctuation & repeated words in comments

This commit is contained in:
2022-09-17 14:46:50 +10:00
parent 5f6f2e106c
commit d9930d5fd0
31 changed files with 48 additions and 46 deletions

View File

@@ -515,7 +515,7 @@ void BVHSpatialSplit::split_reference(const BVHBuild &builder,
int dim, int dim,
float pos) float pos)
{ {
/* initialize boundboxes */ /* Initialize bounding-boxes. */
BoundBox left_bounds = BoundBox::empty; BoundBox left_bounds = BoundBox::empty;
BoundBox right_bounds = BoundBox::empty; BoundBox right_bounds = BoundBox::empty;

View File

@@ -137,7 +137,7 @@ void CustomData_data_add(int type, void *data1, const void *data2);
/** /**
* Initializes a CustomData object with the same layer setup as source. * Initializes a CustomData object with the same layer setup as source.
* mask is a bitfield where `(mask & (1 << (layer type)))` indicates * mask is a bit-field where `(mask & (1 << (layer type)))` indicates
* if a layer should be copied or not. alloctype must be one of the above. * if a layer should be copied or not. alloctype must be one of the above.
*/ */
void CustomData_copy(const struct CustomData *source, void CustomData_copy(const struct CustomData *source,

View File

@@ -538,7 +538,7 @@ typedef struct SculptAttribute {
: \ : \
"You misspelled the layer name key") "You misspelled the layer name key")
/* Convienence pointers for standard sculpt attributes. */ /* Convenience pointers for standard sculpt attributes. */
typedef struct SculptAttributePointers { typedef struct SculptAttributePointers {
/* Persistent base. */ /* Persistent base. */
@@ -728,7 +728,7 @@ typedef struct SculptSession {
*/ */
struct SculptAttribute temp_attributes[SCULPT_MAX_ATTRIBUTES]; struct SculptAttribute temp_attributes[SCULPT_MAX_ATTRIBUTES];
/* Convienence SculptAttribute pointers. */ /* Convenience #SculptAttribute pointers. */
SculptAttributePointers attrs; SculptAttributePointers attrs;
/** /**
@@ -753,7 +753,7 @@ void BKE_sculptsession_bm_to_me(struct Object *ob, bool reorder);
void BKE_sculptsession_bm_to_me_for_render(struct Object *object); void BKE_sculptsession_bm_to_me_for_render(struct Object *object);
int BKE_sculptsession_vertex_count(const SculptSession *ss); int BKE_sculptsession_vertex_count(const SculptSession *ss);
/* Ensure an attribute layer exists.*/ /* Ensure an attribute layer exists. */
SculptAttribute *BKE_sculpt_attribute_ensure(struct Object *ob, SculptAttribute *BKE_sculpt_attribute_ensure(struct Object *ob,
eAttrDomain domain, eAttrDomain domain,
eCustomDataType proptype, eCustomDataType proptype,
@@ -773,7 +773,7 @@ bool BKE_sculpt_attribute_exists(struct Object *ob,
bool BKE_sculpt_attribute_destroy(struct Object *ob, SculptAttribute *attr); bool BKE_sculpt_attribute_destroy(struct Object *ob, SculptAttribute *attr);
/* Destroy all attributes and psuedo-attributes created by sculpt mode.*/ /* Destroy all attributes and pseudo-attributes created by sculpt mode. */
void BKE_sculpt_attribute_destroy_temporary_all(struct Object *ob); void BKE_sculpt_attribute_destroy_temporary_all(struct Object *ob);
/* Destroy attributes that were marked as stroke only in SculptAttributeParams. */ /* Destroy attributes that were marked as stroke only in SculptAttributeParams. */

View File

@@ -888,7 +888,7 @@ void BKE_appdir_program_path_init(const char *argv0)
const char *BKE_appdir_program_path(void) const char *BKE_appdir_program_path(void)
{ {
#ifndef WITH_PYTHON_MODULE /* Default's to empty when building as as Python module. */ #ifndef WITH_PYTHON_MODULE /* Default's to empty when building as a Python module. */
BLI_assert(g_app.program_filepath[0]); BLI_assert(g_app.program_filepath[0]);
#endif #endif
return g_app.program_filepath; return g_app.program_filepath;

View File

@@ -62,7 +62,7 @@ typedef enum {
static void multiresModifier_disp_run( static void multiresModifier_disp_run(
DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl); DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl);
/** Customdata */ /** Custom-data. */
void multires_customdata_delete(Mesh *me) void multires_customdata_delete(Mesh *me)
{ {

View File

@@ -2816,7 +2816,7 @@ bool BKE_sculpt_attribute_destroy(Object *ob, SculptAttribute *attr)
BLI_assert(attr->used); BLI_assert(attr->used);
/* Remove from convienience pointer struct. */ /* Remove from convenience pointer struct. */
SculptAttribute **ptrs = (SculptAttribute **)&ss->attrs; SculptAttribute **ptrs = (SculptAttribute **)&ss->attrs;
int ptrs_num = sizeof(ss->attrs) / sizeof(void *); int ptrs_num = sizeof(ss->attrs) / sizeof(void *);

View File

@@ -10,7 +10,7 @@
* can combine the logged value with a `ComputeContext`, which identifies the place where the value * can combine the logged value with a `ComputeContext`, which identifies the place where the value
* was computed. * was computed.
* *
* This is not a trivial problem because e.g. just storing storing a pointer to the socket a value * This is not a trivial problem because e.g. just storing a pointer to the socket a value
* belongs to is not enough. That's because the same socket may correspond to many different values * belongs to is not enough. That's because the same socket may correspond to many different values
* when the socket is used in a node group that is used multiple times. In this case, not only does * when the socket is used in a node group that is used multiple times. In this case, not only does
* the socket have to be stored but also the entire nested node group path that led to the * the socket have to be stored but also the entire nested node group path that led to the

View File

@@ -106,10 +106,10 @@ size_t BLI_path_join(char *__restrict dst, size_t dst_len, const char *path, ...
const char *BLI_path_basename(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; const char *BLI_path_basename(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
/** /**
* Get an element of the path at an index, eg: * Get an element of the path at an index, eg:
* "/some/path/file.txt" where an index of: * `/some/path/file.txt` where an index of:
* - 0 or -3: "some" * - 0 or -3: `some`
* - 1 or -2: "path" * - 1 or -2: `path`
* - 2 or -1: "file.txt" * - 2 or -1: `file.txt`
* *
* Ignores multiple slashes at any point in the path (including start/end). * Ignores multiple slashes at any point in the path (including start/end).
*/ */

View File

@@ -466,8 +466,8 @@ void BLI_path_rel(char *file, const char *relfile)
#ifdef WIN32 #ifdef WIN32
if (BLI_strnlen(relfile, 3) > 2 && !BLI_path_is_abs(relfile)) { if (BLI_strnlen(relfile, 3) > 2 && !BLI_path_is_abs(relfile)) {
char *ptemp; char *ptemp;
/* fix missing volume name in relative base, /* Fix missing volume name in relative base,
* can happen with old recent-files.txt files */ * can happen with old `recent-files.txt` files. */
BLI_windows_get_default_root_dir(temp); BLI_windows_get_default_root_dir(temp);
ptemp = &temp[2]; ptemp = &temp[2];
if (!ELEM(relfile[0], '\\', '/')) { if (!ELEM(relfile[0], '\\', '/')) {

View File

@@ -22,7 +22,9 @@
#include "intern/bmesh_operators_private.h" /* own include */ #include "intern/bmesh_operators_private.h" /* own include */
/* assumes edges are validated before reaching this poin */ /**
* \note Assumes edges are validated before reaching this point.
*/
static float quad_calc_error(const float v1[3], static float quad_calc_error(const float v1[3],
const float v2[3], const float v2[3],
const float v3[3], const float v3[3],

View File

@@ -86,7 +86,7 @@ typedef struct SubDPattern {
* split the edge only? * split the edge only?
*/ */
/* flags for all elements share a common bitfield space */ /** Flags for all elements share a common bit-field space. */
#define SUBD_SPLIT 1 #define SUBD_SPLIT 1
#define EDGE_PERCENT 2 #define EDGE_PERCENT 2

View File

@@ -541,7 +541,7 @@ static void updateDuplicateActionConstraintSettings(
} }
BLI_freelistN(&ani_curves); BLI_freelistN(&ani_curves);
/* Make deps graph aware of our changes */ /* Make depsgraph aware of our changes. */
DEG_id_tag_update(&act->id, ID_RECALC_ANIMATION_NO_FLUSH); DEG_id_tag_update(&act->id, ID_RECALC_ANIMATION_NO_FLUSH);
} }

View File

@@ -235,7 +235,7 @@ typedef enum eKeyPasteError {
KEYFRAME_PASTE_OK, KEYFRAME_PASTE_OK,
/* Nothing was copied */ /* Nothing was copied */
KEYFRAME_PASTE_NOTHING_TO_PASTE, KEYFRAME_PASTE_NOTHING_TO_PASTE,
/* No F-curves was selected to paste into*/ /* No F-curves was selected to paste into. */
KEYFRAME_PASTE_NOWHERE_TO_PASTE KEYFRAME_PASTE_NOWHERE_TO_PASTE
} eKeyPasteError; } eKeyPasteError;

View File

@@ -3307,7 +3307,7 @@ static int object_convert_exec(bContext *C, wmOperator *op)
baseob = BKE_mball_basis_find(scene, ob); baseob = BKE_mball_basis_find(scene, ob);
if (ob != baseob) { if (ob != baseob) {
/* if motherball is converting it would be marked as done later */ /* If mother-ball is converting it would be marked as done later. */
ob->flag |= OB_DONE; ob->flag |= OB_DONE;
} }

View File

@@ -26,7 +26,7 @@ struct SpaceProperties_Runtime {
/** For filtering properties displayed in the space. */ /** For filtering properties displayed in the space. */
char search_string[UI_MAX_NAME_STR]; char search_string[UI_MAX_NAME_STR];
/** /**
* Bitfield (in the same order as the tabs) for whether each tab has properties * Bit-field (in the same order as the tabs) for whether each tab has properties
* that match the search filter. Only valid when #search_string is set. * that match the search filter. Only valid when #search_string is set.
*/ */
BLI_bitmap *tab_search_results; BLI_bitmap *tab_search_results;

View File

@@ -641,7 +641,7 @@ static void do_graph_region_driver_buttons(bContext *C, void *id_v, int event)
ID *id = id_v; ID *id = id_v;
AnimData *adt = BKE_animdata_from_id(id); AnimData *adt = BKE_animdata_from_id(id);
/* rebuild depsgraph for the new deps, and ensure COW copies get flushed. */ /* Rebuild depsgraph for the new dependencies, and ensure COW copies get flushed. */
DEG_relations_tag_update(bmain); DEG_relations_tag_update(bmain);
DEG_id_tag_update_ex(bmain, id, ID_RECALC_COPY_ON_WRITE); DEG_id_tag_update_ex(bmain, id, ID_RECALC_COPY_ON_WRITE);
if (adt != NULL) { if (adt != NULL) {

View File

@@ -3020,7 +3020,7 @@ static int graph_driver_vars_paste_exec(bContext *C, wmOperator *op)
/* Successful or not? */ /* Successful or not? */
if (ok) { if (ok) {
/* Rebuild depsgraph, now that there are extra deps here. */ /* Rebuild depsgraph, now that there are extra dependencies here. */
DEG_relations_tag_update(CTX_data_main(C)); DEG_relations_tag_update(CTX_data_main(C));
/* Set notifier that keyframes have changed. */ /* Set notifier that keyframes have changed. */

View File

@@ -1510,7 +1510,7 @@ static void view3d_header_region_listener(const wmRegionListenerParams *params)
break; break;
} }
/* From topbar, which ones are needed? split per header? */ /* From top-bar, which ones are needed? split per header? */
/* Disable for now, re-enable if needed, or remove - campbell. */ /* Disable for now, re-enable if needed, or remove - campbell. */
#if 0 #if 0
/* context changes */ /* context changes */

View File

@@ -728,7 +728,7 @@ static void sample_interval_bezier(const Span<float3> src_positions,
} }
else { else {
/* Trimmed in both ends within the same (and only) segment! Ensure both end points is not a /* Trimmed in both ends within the same (and only) segment! Ensure both end points is not a
* loop.*/ * loop. */
if (start_point_trimmed && start_point.index == end_point.index && if (start_point_trimmed && start_point.index == end_point.index &&
start_point.parameter <= end_point.parameter) { start_point.parameter <= end_point.parameter) {

View File

@@ -498,7 +498,7 @@ bool MTLCommandBufferManager::insert_memory_barrier(eGPUBarrier barrier_bits,
/* Rendering. */ /* Rendering. */
case MTL_RENDER_COMMAND_ENCODER: { case MTL_RENDER_COMMAND_ENCODER: {
/* Currently flagging both stages -- can use bits above to filter on stage type -- /* Currently flagging both stages -- can use bits above to filter on stage type --
* though full barrier is safe for now*/ * though full barrier is safe for now. */
MTLRenderStages before_stage_flags = 0; MTLRenderStages before_stage_flags = 0;
MTLRenderStages after_stage_flags = 0; MTLRenderStages after_stage_flags = 0;
if (before_stages & GPU_BARRIER_STAGE_VERTEX && if (before_stages & GPU_BARRIER_STAGE_VERTEX &&

View File

@@ -248,7 +248,7 @@ struct MTLContextTextureUtils {
/* Depth texture updates are not directly supported with Blit operations, similarly, we cannot /* Depth texture updates are not directly supported with Blit operations, similarly, we cannot
* use a compute shader to write to depth, so we must instead render to a depth target. * use a compute shader to write to depth, so we must instead render to a depth target.
* These processes use vertex/fragment shaders to render texture data from an intermediate * These processes use vertex/fragment shaders to render texture data from an intermediate
* source, in order to prime the depth buffer*/ * source, in order to prime the depth buffer. */
blender::Map<DepthTextureUpdateRoutineSpecialisation, GPUShader *> depth_2d_update_shaders; blender::Map<DepthTextureUpdateRoutineSpecialisation, GPUShader *> depth_2d_update_shaders;
GPUShader *fullscreen_blit_shader = nullptr; GPUShader *fullscreen_blit_shader = nullptr;

View File

@@ -138,7 +138,7 @@ void MTLIndexBuf::update_sub(uint32_t start, uint32_t len, const void *data)
BLI_assert(ibo_ != nullptr); BLI_assert(ibo_ != nullptr);
/* Otherwise, we will inject a data update, using staged data, into the command stream. /* Otherwise, we will inject a data update, using staged data, into the command stream.
* Stage update contents in temporary buffer*/ * Stage update contents in temporary buffer. */
MTLContext *ctx = static_cast<MTLContext *>(unwrap(GPU_context_active_get())); MTLContext *ctx = static_cast<MTLContext *>(unwrap(GPU_context_active_get()));
BLI_assert(ctx); BLI_assert(ctx);
MTLTemporaryBuffer range = ctx->get_scratchbuffer_manager().scratch_buffer_allocate_range(len); MTLTemporaryBuffer range = ctx->get_scratchbuffer_manager().scratch_buffer_allocate_range(len);

View File

@@ -247,7 +247,7 @@ class MTLTexture : public Texture {
void mip_range_set(int min, int max) override; void mip_range_set(int min, int max) override;
void *read(int mip, eGPUDataFormat type) override; void *read(int mip, eGPUDataFormat type) override;
/* Remove once no longer required -- will just return 0 for now in MTL path*/ /* Remove once no longer required -- will just return 0 for now in MTL path. */
uint gl_bindcode_get() const override; uint gl_bindcode_get() const override;
bool texture_is_baked(); bool texture_is_baked();
@@ -357,9 +357,9 @@ class MTLTexture : public Texture {
*/ */
struct TextureUpdateParams { struct TextureUpdateParams {
int mip_index; int mip_index;
int extent[3]; /* Width, Height, Slice on 2D Array tex*/ int extent[3]; /* Width, Height, Slice on 2D Array tex. */
int offset[3]; /* Width, Height, Slice on 2D Array tex*/ int offset[3]; /* Width, Height, Slice on 2D Array tex. */
uint unpack_row_length; /* Number of pixels between bytes in input data */ uint unpack_row_length; /* Number of pixels between bytes in input data. */
}; };
id<MTLComputePipelineState> texture_update_1d_get_kernel( id<MTLComputePipelineState> texture_update_1d_get_kernel(
@@ -383,7 +383,7 @@ class MTLTexture : public Texture {
/* Depth texture updates are not directly supported with Blit operations, similarly, we cannot /* Depth texture updates are not directly supported with Blit operations, similarly, we cannot
* use a compute shader to write to depth, so we must instead render to a depth target. * use a compute shader to write to depth, so we must instead render to a depth target.
* These processes use vertex/fragment shaders to render texture data from an intermediate * These processes use vertex/fragment shaders to render texture data from an intermediate
* source, in order to prime the depth buffer*/ * source, in order to prime the depth buffer. */
GPUShader *depth_2d_update_sh_get(DepthTextureUpdateRoutineSpecialisation specialization); GPUShader *depth_2d_update_sh_get(DepthTextureUpdateRoutineSpecialisation specialization);
void update_sub_depth_2d( void update_sub_depth_2d(
@@ -392,8 +392,8 @@ class MTLTexture : public Texture {
/* Texture Read function utilities -- Follows a similar mechanism to the updating routines */ /* Texture Read function utilities -- Follows a similar mechanism to the updating routines */
struct TextureReadParams { struct TextureReadParams {
int mip_index; int mip_index;
int extent[3]; /* Width, Height, Slice on 2D Array tex*/ int extent[3]; /* Width, Height, Slice on 2D Array tex. */
int offset[3]; /* Width, Height, Slice on 2D Array tex*/ int offset[3]; /* Width, Height, Slice on 2D Array tex. */
}; };
id<MTLComputePipelineState> texture_read_1d_get_kernel( id<MTLComputePipelineState> texture_read_1d_get_kernel(

View File

@@ -285,7 +285,7 @@ typedef struct Mesh {
struct MVert *mvert DNA_DEPRECATED; struct MVert *mvert DNA_DEPRECATED;
/** Deprecated array of mesh edges, kept for reading old files, now stored in #CustomData. */ /** Deprecated array of mesh edges, kept for reading old files, now stored in #CustomData. */
struct MEdge *medge DNA_DEPRECATED; struct MEdge *medge DNA_DEPRECATED;
/** Deprecated "Vertex group" data. Kept for reading old files, now stored in #CustomData.*/ /** Deprecated "Vertex group" data. Kept for reading old files, now stored in #CustomData. */
struct MDeformVert *dvert DNA_DEPRECATED; struct MDeformVert *dvert DNA_DEPRECATED;
/** Deprecated runtime data for tessellation face UVs and texture, kept for reading old files. */ /** Deprecated runtime data for tessellation face UVs and texture, kept for reading old files. */
struct MTFace *mtface DNA_DEPRECATED; struct MTFace *mtface DNA_DEPRECATED;

View File

@@ -159,7 +159,7 @@ typedef struct SPHFluidSettings {
char _pad[6]; char _pad[6];
} SPHFluidSettings; } SPHFluidSettings;
/* fluid->flag */ /** #SPHFluidSettings.flag */
#define SPH_VISCOELASTIC_SPRINGS 1 #define SPH_VISCOELASTIC_SPRINGS 1
#define SPH_CURRENT_REST_LENGTH 2 #define SPH_CURRENT_REST_LENGTH 2
#define SPH_FAC_REPULSION 4 #define SPH_FAC_REPULSION 4
@@ -168,7 +168,7 @@ typedef struct SPHFluidSettings {
#define SPH_FAC_VISCOSITY 32 #define SPH_FAC_VISCOSITY 32
#define SPH_FAC_REST_LENGTH 64 #define SPH_FAC_REST_LENGTH 64
/* fluid->solver (numerical ID field, not bitfield) */ /** #SPHFluidSettings.solver (numerical ID field, not bit-field). */
#define SPH_SOLVER_DDR 0 #define SPH_SOLVER_DDR 0
#define SPH_SOLVER_CLASSICAL 1 #define SPH_SOLVER_CLASSICAL 1

View File

@@ -78,7 +78,7 @@ typedef struct bSound {
/* XXX unused currently (SOUND_TYPE_LIMITER) */ /* XXX unused currently (SOUND_TYPE_LIMITER) */
/* float start, end; */ /* float start, end; */
/* Description of Audio channels, as of eSoundChannels*/ /* Description of Audio channels, as of #eSoundChannels. */
int audio_channels; int audio_channels;
int samplerate; int samplerate;

View File

@@ -115,7 +115,7 @@ typedef struct PointDensity {
/** for 'Object' or 'Particle system' type - source object */ /** for 'Object' or 'Particle system' type - source object */
struct Object *object; struct Object *object;
/** `index + 1` in ob.particlesystem, non-ID pointer not allowed */ /** `index + 1` in ob.particle-system, non-ID pointer not allowed. */
int psys; int psys;
/** cache points in world-space, object space, ... ? */ /** cache points in world-space, object space, ... ? */
short psys_cache_space; short psys_cache_space;

View File

@@ -159,10 +159,10 @@ PropertyScaleType RNA_property_ui_scale(PropertyRNA *prop);
int RNA_property_flag(PropertyRNA *prop); int RNA_property_flag(PropertyRNA *prop);
int RNA_property_override_flag(PropertyRNA *prop); int RNA_property_override_flag(PropertyRNA *prop);
/** /**
* Get the tags set for \a prop as int bitfield. * Get the tags set for \a prop as int bit-field.
* \note Doesn't perform any validity check on the set bits. #RNA_def_property_tags does this * \note Doesn't perform any validity check on the set bits. #RNA_def_property_tags does this
* in debug builds (to avoid performance issues in non-debug builds), which should be * in debug builds (to avoid performance issues in non-debug builds), which should be
* the only way to set tags. Hence, at this point we assume the tag bitfield to be valid. * the only way to set tags. Hence, at this point we assume the tag bit-field to be valid.
*/ */
int RNA_property_tags(PropertyRNA *prop); int RNA_property_tags(PropertyRNA *prop);
bool RNA_property_builtin(PropertyRNA *prop); bool RNA_property_builtin(PropertyRNA *prop);

View File

@@ -381,7 +381,7 @@ static void rna_MaterialIndex_update(Main *UNUSED(bmain), Scene *UNUSED(scene),
{ {
Object *ob = (Object *)ptr->owner_id; Object *ob = (Object *)ptr->owner_id;
if (ob && ob->type == OB_GPENCIL) { if (ob && ob->type == OB_GPENCIL) {
/* notifying material property in topbar */ /* Notifying material property in top-bar. */
WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL); WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL);
} }
} }

View File

@@ -412,7 +412,7 @@ static bool calc_tangent_loop(const float v_dir_prev[3],
* NOTE: while it seems more logical to use `v_dir_prev` & `v_dir_next` as separate X/Y axis * NOTE: while it seems more logical to use `v_dir_prev` & `v_dir_next` as separate X/Y axis
* (instead of combining them as is done here). It's not necessary as the directions of the * (instead of combining them as is done here). It's not necessary as the directions of the
* axis aren't important as long as the difference between tangent matrices is equivalent. * axis aren't important as long as the difference between tangent matrices is equivalent.
* Some computations can be skipped by combining the the two directions, * Some computations can be skipped by combining the two directions,
* using the cross product for the 3rd axes. */ * using the cross product for the 3rd axes. */
add_v3_v3(r_tspace[0], r_tspace[1]); add_v3_v3(r_tspace[0], r_tspace[1]);
normalize_v3(r_tspace[0]); normalize_v3(r_tspace[0]);

View File

@@ -1783,7 +1783,7 @@ static bool wm_file_write(bContext *C,
/* NOTE: Ideally we would call `WM_redraw_windows` here to remove any open menus. /* NOTE: Ideally we would call `WM_redraw_windows` here to remove any open menus.
* But we can crash if saving from a script, see T92704 & T97627. * But we can crash if saving from a script, see T92704 & T97627.
* Just checking `!G.background && BLI_thread_is_main()` is not sufficient to fix this. * Just checking `!G.background && BLI_thread_is_main()` is not sufficient to fix this.
* Additionally some some EGL configurations don't support reading the front-buffer * Additionally some EGL configurations don't support reading the front-buffer
* immediately after drawing, see: T98462. In that case off-screen drawing is necessary. */ * immediately after drawing, see: T98462. In that case off-screen drawing is necessary. */
/* don't forget not to return without! */ /* don't forget not to return without! */